diff --git a/.github/workflows/daily_tests.yml b/.github/workflows/daily_tests.yml index 4bc2c2c4cc..db774a8529 100644 --- a/.github/workflows/daily_tests.yml +++ b/.github/workflows/daily_tests.yml @@ -20,6 +20,11 @@ jobs: uses: ./.github/workflows/testing_dev_with_live_services.yml secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + E2ELiveServices: + uses: ./.github/workflows/testing_dev_e2e_with_live_services.yml + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} DANDI_STAGING_API_KEY: ${{ secrets.DANDI_STAGING_API_KEY }} BuildTests: diff --git a/.github/workflows/deploy_tests_on_pull_request.yml b/.github/workflows/deploy_tests_on_pull_request.yml index f006b1d2b3..9d59d44c6d 100644 --- a/.github/workflows/deploy_tests_on_pull_request.yml +++ b/.github/workflows/deploy_tests_on_pull_request.yml @@ -18,6 +18,11 @@ jobs: uses: ./.github/workflows/testing_dev_with_live_services.yml secrets: CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + + E2ELiveServices: + uses: ./.github/workflows/testing_dev_e2e_with_live_services.yml + secrets: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} DANDI_STAGING_API_KEY: ${{ secrets.DANDI_STAGING_API_KEY }} BuildTests: diff --git a/.github/workflows/testing_dev.yml b/.github/workflows/testing_dev.yml index 782dcc330b..561f2b38be 100644 --- a/.github/workflows/testing_dev.yml +++ b/.github/workflows/testing_dev.yml @@ -29,8 +29,8 @@ jobs: - os: macos-13 # Mac x64 runner label: environments/environment-MAC-intel.yml -# - os: windows-latest -# label: environments/environment-Windows.yml + - os: windows-latest + label: environments/environment-Windows.yml steps: - uses: actions/checkout@v4 @@ -83,16 +83,6 @@ jobs: name: Run tests with xvfb run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:coverage - - name: Archive E2E Test Screenshots - if: always() - uses: actions/upload-artifact@v4 - with: - name: test-screenshots-${{ matrix.os }} - path: docs/assets/tutorials - retention-days: 1 - overwrite: true - - - name: Upload coverage reports to Codecov uses: codecov/codecov-action@v4 env: diff --git a/.github/workflows/testing_dev_e2e_with_live_services.yml b/.github/workflows/testing_dev_e2e_with_live_services.yml new file mode 100644 index 0000000000..bd10f5f351 --- /dev/null +++ b/.github/workflows/testing_dev_e2e_with_live_services.yml @@ -0,0 +1,106 @@ +name: End-to-end tests with live services +on: + workflow_call: + secrets: + CODECOV_TOKEN: + required: true + DANDI_STAGING_API_KEY: + required: true + +jobs: + + run: + # Will read on PR dashboard as 'Deploy / E2ELiveServices / {os}' + # Action dashboard identified by 'End-to-end tests with live services' + # Requirement settings identified as 'E2ELiveServices / {os}' + name: ${{ matrix.os }} + runs-on: ${{ matrix.os }} + defaults: + run: + shell: bash -l {0} + strategy: + fail-fast: false + matrix: + include: + - os: ubuntu-latest + label: environments/environment-Linux.yml + + - os: macos-latest # Mac arm64 runner + label: environments/environment-MAC-apple-silicon.yml + + - os: macos-13 # Mac x64 runner + label: environments/environment-MAC-intel.yml + + - os: windows-latest + label: environments/environment-Windows.yml + + steps: + - uses: actions/checkout@v4 + - run: git fetch --prune --unshallow --tags + + # see https://github.com/conda-incubator/setup-miniconda#caching-environments + - name: Setup Mambaforge + uses: conda-incubator/setup-miniconda@v3 + with: + miniforge-variant: Mambaforge + miniforge-version: latest + activate-environment: nwb-guide + use-mamba: true + + - name: Set cache date + id: get-date + run: echo "today=$(/bin/date -u '+%Y%m%d')" >> $GITHUB_OUTPUT + shell: bash + + - name: Cache Conda env + uses: actions/cache@v4 + with: + path: ${{ env.CONDA }}/envs + key: conda-${{ runner.os }}-${{ runner.arch }}-${{steps.get-date.outputs.today }}-${{ hashFiles(matrix.label) }}-${{ env.CACHE_NUMBER }} + id: cache + + - if: steps.cache.outputs.cache-hit != 'true' + name: Create and activate environment + run: mamba env update -n nwb-guide -f ${{ matrix.label }} + + - name: Use Node.js 20 + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install GUIDE + run: npm ci --verbose + + - name: Install testing dependencies + run: pip install pytest pytest-cov + + - name: Manually remove matplotlib + run: pip uninstall matplotlib --yes + + - name: Create env file + run: | + touch .env + echo DANDI_STAGING_API_KEY=${{ secrets.DANDI_STAGING_API_KEY }} >> .env + + - if: matrix.os != 'ubuntu-latest' + name: Run tests + run: npm run coverage:tutorial + + - if: matrix.os == 'ubuntu-latest' + name: Run tests with xvfb + run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run coverage:tutorial + + - name: Archive E2E Test Screenshots + uses: actions/upload-artifact@v4 + with: + name: test-screenshots-${{ matrix.os }} + path: docs/assets/tutorials + retention-days: 1 + overwrite: true + + - name: Upload coverage reports to Codecov + uses: codecov/codecov-action@v4 + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} + with: + fail_ci_if_error: true diff --git a/.github/workflows/testing_dev_with_live_services.yml b/.github/workflows/testing_dev_with_live_services.yml index 2fc1fe27cb..020db13911 100644 --- a/.github/workflows/testing_dev_with_live_services.yml +++ b/.github/workflows/testing_dev_with_live_services.yml @@ -4,8 +4,6 @@ on: secrets: CODECOV_TOKEN: required: true - DANDI_STAGING_API_KEY: - required: true jobs: @@ -31,8 +29,8 @@ jobs: - os: macos-13 # Mac x64 runner label: environments/environment-MAC-intel.yml -# - os: windows-latest -# label: environments/environment-Windows.yml + - os: windows-latest + label: environments/environment-Windows.yml steps: - uses: actions/checkout@v4 @@ -77,11 +75,6 @@ jobs: - name: Manually remove matplotlib run: pip uninstall matplotlib --yes - - name: Create env file - run: | - touch .env - echo DANDI_STAGING_API_KEY=${{ secrets.DANDI_STAGING_API_KEY }} >> .env - - if: matrix.os != 'ubuntu-latest' name: Run tests run: npm run coverage:app diff --git a/docs/assets/tutorials/dandi/create-dandiset.png b/docs/assets/tutorials/dandi/create-dandiset.png index 33360bfe91..25591f0834 100644 Binary files a/docs/assets/tutorials/dandi/create-dandiset.png and b/docs/assets/tutorials/dandi/create-dandiset.png differ diff --git a/docs/assets/tutorials/dandi/dandiset-id.png b/docs/assets/tutorials/dandi/dandiset-id.png index 8d871a04f3..857568610c 100644 Binary files a/docs/assets/tutorials/dandi/dandiset-id.png and b/docs/assets/tutorials/dandi/dandiset-id.png differ diff --git a/docs/assets/tutorials/dandi/review-page.png b/docs/assets/tutorials/dandi/review-page.png index c4ce9c2da2..bb59b5bda9 100644 Binary files a/docs/assets/tutorials/dandi/review-page.png and b/docs/assets/tutorials/dandi/review-page.png differ diff --git a/docs/assets/tutorials/dataset-created.png b/docs/assets/tutorials/dataset-created.png index 716344593c..e319cfa14f 100644 Binary files a/docs/assets/tutorials/dataset-created.png and b/docs/assets/tutorials/dataset-created.png differ diff --git a/docs/assets/tutorials/dataset-creation.png b/docs/assets/tutorials/dataset-creation.png index f69e72a31d..f785673438 100644 Binary files a/docs/assets/tutorials/dataset-creation.png and b/docs/assets/tutorials/dataset-creation.png differ diff --git a/docs/assets/tutorials/home-page.png b/docs/assets/tutorials/home-page.png index 924a4a6407..b3208b0a84 100644 Binary files a/docs/assets/tutorials/home-page.png and b/docs/assets/tutorials/home-page.png differ diff --git a/docs/assets/tutorials/multiple/conversion-results-page.png b/docs/assets/tutorials/multiple/conversion-results-page.png index 7d5daf094d..73ea06d734 100644 Binary files a/docs/assets/tutorials/multiple/conversion-results-page.png and b/docs/assets/tutorials/multiple/conversion-results-page.png differ diff --git a/docs/assets/tutorials/multiple/fail-name.png b/docs/assets/tutorials/multiple/fail-name.png index 27f7e33665..3419a2a906 100644 Binary files a/docs/assets/tutorials/multiple/fail-name.png and b/docs/assets/tutorials/multiple/fail-name.png differ diff --git a/docs/assets/tutorials/multiple/home-page-complete.png b/docs/assets/tutorials/multiple/home-page-complete.png index ca650959e5..6204a2888b 100644 Binary files a/docs/assets/tutorials/multiple/home-page-complete.png and b/docs/assets/tutorials/multiple/home-page-complete.png differ diff --git a/docs/assets/tutorials/multiple/inspect-page.png b/docs/assets/tutorials/multiple/inspect-page.png index 7e778b01aa..794a1c1005 100644 Binary files a/docs/assets/tutorials/multiple/inspect-page.png and b/docs/assets/tutorials/multiple/inspect-page.png differ diff --git a/docs/assets/tutorials/multiple/metadata-ecephys.png b/docs/assets/tutorials/multiple/metadata-ecephys.png index 835f0f365c..3ab764ee41 100644 Binary files a/docs/assets/tutorials/multiple/metadata-ecephys.png and b/docs/assets/tutorials/multiple/metadata-ecephys.png differ diff --git a/docs/assets/tutorials/multiple/metadata-nwbfile.png b/docs/assets/tutorials/multiple/metadata-nwbfile.png index a0ae0b25ff..4210a22016 100644 Binary files a/docs/assets/tutorials/multiple/metadata-nwbfile.png and b/docs/assets/tutorials/multiple/metadata-nwbfile.png differ diff --git a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-filled.png b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-filled.png index 72e53d3615..211848e6ba 100644 Binary files a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-filled.png and b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-filled.png differ diff --git a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-open.png b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-open.png index 397bb6b70c..6c63aecdf4 100644 Binary files a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-open.png and b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-open.png differ diff --git a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-submitted.png b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-submitted.png index 649aefc4d0..1079239e71 100644 Binary files a/docs/assets/tutorials/multiple/pathexpansion-autocomplete-submitted.png and b/docs/assets/tutorials/multiple/pathexpansion-autocomplete-submitted.png differ diff --git a/docs/assets/tutorials/multiple/pathexpansion-completed.png b/docs/assets/tutorials/multiple/pathexpansion-completed.png index 873565b57f..289685090d 100644 Binary files a/docs/assets/tutorials/multiple/pathexpansion-completed.png and b/docs/assets/tutorials/multiple/pathexpansion-completed.png differ diff --git a/docs/assets/tutorials/multiple/pathexpansion-page.png b/docs/assets/tutorials/multiple/pathexpansion-page.png index ffd2152e02..39a3ad9189 100644 Binary files a/docs/assets/tutorials/multiple/pathexpansion-page.png and b/docs/assets/tutorials/multiple/pathexpansion-page.png differ diff --git a/docs/assets/tutorials/multiple/preview-page.png b/docs/assets/tutorials/multiple/preview-page.png index 861647edc8..8950697b00 100644 Binary files a/docs/assets/tutorials/multiple/preview-page.png and b/docs/assets/tutorials/multiple/preview-page.png differ diff --git a/docs/assets/tutorials/multiple/subject-complete.png b/docs/assets/tutorials/multiple/subject-complete.png index 1a5d4ed67a..76a5875e5e 100644 Binary files a/docs/assets/tutorials/multiple/subject-complete.png and b/docs/assets/tutorials/multiple/subject-complete.png differ diff --git a/docs/assets/tutorials/multiple/subject-error.png b/docs/assets/tutorials/multiple/subject-error.png index 6e2d60667c..9f2fa4c27d 100644 Binary files a/docs/assets/tutorials/multiple/subject-error.png and b/docs/assets/tutorials/multiple/subject-error.png differ diff --git a/docs/assets/tutorials/multiple/subject-invalid.png b/docs/assets/tutorials/multiple/subject-invalid.png index 39fe3da0a8..c8d3d8a366 100644 Binary files a/docs/assets/tutorials/multiple/subject-invalid.png and b/docs/assets/tutorials/multiple/subject-invalid.png differ diff --git a/docs/assets/tutorials/multiple/subject-page.png b/docs/assets/tutorials/multiple/subject-page.png index e5db16cf25..2d8828d735 100644 Binary files a/docs/assets/tutorials/multiple/subject-page.png and b/docs/assets/tutorials/multiple/subject-page.png differ diff --git a/docs/assets/tutorials/multiple/workflow-page.png b/docs/assets/tutorials/multiple/workflow-page.png index 6049565d4e..c5ca85f1bc 100644 Binary files a/docs/assets/tutorials/multiple/workflow-page.png and b/docs/assets/tutorials/multiple/workflow-page.png differ diff --git a/docs/assets/tutorials/single/conversion-results-page.png b/docs/assets/tutorials/single/conversion-results-page.png index cc30f9aced..bc8f2d0594 100644 Binary files a/docs/assets/tutorials/single/conversion-results-page.png and b/docs/assets/tutorials/single/conversion-results-page.png differ diff --git a/docs/assets/tutorials/single/home-page-complete.png b/docs/assets/tutorials/single/home-page-complete.png index 1a409e7295..4b4bd58f28 100644 Binary files a/docs/assets/tutorials/single/home-page-complete.png and b/docs/assets/tutorials/single/home-page-complete.png differ diff --git a/docs/assets/tutorials/single/inspect-page.png b/docs/assets/tutorials/single/inspect-page.png index 51a1e6c728..b9e7cdcec2 100644 Binary files a/docs/assets/tutorials/single/inspect-page.png and b/docs/assets/tutorials/single/inspect-page.png differ diff --git a/docs/assets/tutorials/single/metadata-ecephys.png b/docs/assets/tutorials/single/metadata-ecephys.png index f63bf9a403..0b71fe238c 100644 Binary files a/docs/assets/tutorials/single/metadata-ecephys.png and b/docs/assets/tutorials/single/metadata-ecephys.png differ diff --git a/docs/assets/tutorials/single/metadata-nwbfile.png b/docs/assets/tutorials/single/metadata-nwbfile.png index 8ef3ddb7b8..c77ffb5507 100644 Binary files a/docs/assets/tutorials/single/metadata-nwbfile.png and b/docs/assets/tutorials/single/metadata-nwbfile.png differ diff --git a/docs/assets/tutorials/single/preview-page.png b/docs/assets/tutorials/single/preview-page.png index fcd25df164..a0f316a462 100644 Binary files a/docs/assets/tutorials/single/preview-page.png and b/docs/assets/tutorials/single/preview-page.png differ diff --git a/docs/assets/tutorials/single/sourcedata-page-specified.png b/docs/assets/tutorials/single/sourcedata-page-specified.png index 3a5e509a15..be5de05379 100644 Binary files a/docs/assets/tutorials/single/sourcedata-page-specified.png and b/docs/assets/tutorials/single/sourcedata-page-specified.png differ diff --git a/docs/developer_guide.rst b/docs/developer_guide.rst index ab1c8161a0..6b772b4174 100644 --- a/docs/developer_guide.rst +++ b/docs/developer_guide.rst @@ -253,8 +253,9 @@ Updating Tutorial Screenshots ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Before a release, you'll want to update the tutorial screenshots to reflect the latest changes in the application. -#. To regenerate the dataset, you'll need to change ``regenerateTestData`` in the ``tests/e2e/config.ts`` to ``true``. -#. Run the End-to-End Tests locally using ``npm test:app``. +#. To regenerate the dataset, you'll need to change ``regenerateTestData`` in the ``tests/e2e/config.ts`` to ``true`` or delete the test dataset directory ``rm -rf ~/NWB_GUIDE/.test``. +#. Create a ``.env`` file with the following content: ``DANDI_STAGING_API_KEY={your_dandi_staging_api_key}`` where ``{your_dandi_staging_api_key}`` is your DANDI staging API key from https://gui-staging.dandiarchive.org. +#. Run the End-to-End Tests locally using ``npm test:tutorial``. - This will generate new screenshots in the ``docs/assets/tutorials`` directory. #. Review the new screenshots to ensure they are accurate. #. If the screenshots are accurate, commit them to the repository. Their paths should be consistent across runs—allowing the new versions to show up on the tutorial. diff --git a/package-lock.json b/package-lock.json index 60375dab41..43a8bcb368 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,7 +25,6 @@ "lit": "^2.6.1", "lottie-web": "^5.9.5", "notyf": "^3.9.0", - "puppeteer": "^22.15.0", "sweetalert2": "^11.6.13", "tippy.js": "^6.3.7", "url": "^0.11.3", @@ -48,6 +47,7 @@ "electron-vite": "^1.0.28", "jsdom": "^22.0.0", "prettier": "^2.3.2", + "puppeteer": "^22.15.0", "react": "^18.2.0", "react-dom": "^18.2.0", "storybook": "^7.6.10", @@ -111,6 +111,7 @@ }, "node_modules/@babel/code-frame": { "version": "7.23.5", + "dev": true, "license": "MIT", "dependencies": { "@babel/highlight": "^7.23.4", @@ -124,6 +125,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -136,6 +138,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -150,6 +153,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -159,12 +163,14 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, "license": "MIT" }, "node_modules/@babel/code-frame/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -174,6 +180,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -552,6 +559,7 @@ }, "node_modules/@babel/highlight": { "version": "7.23.4", + "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", @@ -566,6 +574,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, "license": "MIT", "dependencies": { "color-convert": "^1.9.0" @@ -578,6 +587,7 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^3.2.1", @@ -592,6 +602,7 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, "license": "MIT", "dependencies": { "color-name": "1.1.3" @@ -601,12 +612,14 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true, "license": "MIT" }, "node_modules/@babel/highlight/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -616,6 +629,7 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, "license": "MIT", "dependencies": { "has-flag": "^3.0.0" @@ -3477,6 +3491,7 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.3.0.tgz", "integrity": "sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA==", + "dev": true, "dependencies": { "debug": "^4.3.5", "extract-zip": "^2.0.1", @@ -3498,6 +3513,7 @@ "version": "7.6.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -5670,7 +5686,8 @@ "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", - "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==" + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "dev": true }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -6696,6 +6713,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, "license": "Python-2.0" }, "node_modules/aria-hidden": { @@ -6924,6 +6942,7 @@ "version": "0.13.4", "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "dev": true, "dependencies": { "tslib": "^2.0.1" }, @@ -7093,7 +7112,8 @@ "node_modules/b4a": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "dev": true }, "node_modules/babel-core": { "version": "7.0.0-bridge.0", @@ -7188,12 +7208,14 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "dev": true, "optional": true }, "node_modules/bare-fs": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "dev": true, "optional": true, "dependencies": { "bare-events": "^2.0.0", @@ -7205,12 +7227,14 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "dev": true, "optional": true }, "node_modules/bare-path": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, "optional": true, "dependencies": { "bare-os": "^2.1.0" @@ -7220,6 +7244,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "dev": true, "optional": true, "dependencies": { "streamx": "^2.18.0" @@ -7279,6 +7304,7 @@ "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "dev": true, "engines": { "node": ">=10.0.0" } @@ -7831,6 +7857,7 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -7974,6 +8001,7 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.6.3.tgz", "integrity": "sha512-qXlsCmpCZJAnoTYI83Iu6EdYQpMYdVkCfq08KDh2pmlVqK5t5IA9mGs4/LwCwp4fqisSOMXZxP3HIh8w8aRn0A==", + "dev": true, "dependencies": { "mitt": "3.0.1", "urlpattern-polyfill": "10.0.0", @@ -8673,6 +8701,7 @@ "version": "9.0.0", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, "license": "MIT", "dependencies": { "env-paths": "^2.2.1", @@ -8804,6 +8833,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "dev": true, "engines": { "node": ">= 14" } @@ -9078,6 +9108,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "dev": true, "dependencies": { "ast-types": "^0.13.4", "escodegen": "^2.1.0", @@ -9219,7 +9250,8 @@ "node_modules/devtools-protocol": { "version": "0.0.1312386", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", - "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==" + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", + "dev": true }, "node_modules/diff": { "version": "1.0.8", @@ -10381,6 +10413,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", @@ -10401,6 +10434,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -10414,6 +10448,7 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { "node": ">=4.0" } @@ -10429,6 +10464,7 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, "license": "BSD-2-Clause", "engines": { "node": ">=0.10.0" @@ -10835,7 +10871,8 @@ "node_modules/fast-fifo": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", - "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "dev": true }, "node_modules/fast-glob": { "version": "3.3.2", @@ -11954,6 +11991,7 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "dev": true, "dependencies": { "basic-ftp": "^5.0.2", "data-uri-to-buffer": "^6.0.2", @@ -11968,6 +12006,7 @@ "version": "11.2.0", "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", @@ -14510,6 +14549,7 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -14526,6 +14566,7 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -14644,6 +14685,7 @@ "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -15437,12 +15479,14 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true, "license": "MIT" }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -15454,7 +15498,8 @@ "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", - "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==" + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true }, "node_modules/jscodeshift": { "version": "0.15.1", @@ -15572,6 +15617,7 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, "license": "MIT" }, "node_modules/json-schema-traverse": { @@ -15851,6 +15897,7 @@ "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true, "license": "MIT" }, "node_modules/lit": { @@ -16781,7 +16828,8 @@ "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", - "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==" + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true }, "node_modules/mixin-deep": { "version": "1.3.2", @@ -16957,6 +17005,7 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "dev": true, "engines": { "node": ">= 0.4.0" } @@ -17727,6 +17776,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz", "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==", + "dev": true, "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", "agent-base": "^7.0.2", @@ -17745,6 +17795,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -17756,6 +17807,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -17768,6 +17820,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -17780,6 +17833,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "dev": true, "dependencies": { "degenerator": "^5.0.0", "netmask": "^2.0.2" @@ -17799,6 +17853,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -17850,6 +17905,7 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", @@ -18353,6 +18409,7 @@ "version": "6.4.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", @@ -18371,6 +18428,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -18382,6 +18440,7 @@ "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -18394,6 +18453,7 @@ "version": "7.0.5", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz", "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==", + "dev": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -18406,6 +18466,7 @@ "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true, "engines": { "node": ">=12" } @@ -18414,6 +18475,7 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true, "license": "MIT" }, "node_modules/prr": { @@ -18475,6 +18537,7 @@ "version": "22.15.0", "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.15.0.tgz", "integrity": "sha512-XjCY1SiSEi1T7iSYuxS82ft85kwDJUS7wj1Z0eGVXKdtr5g4xnVcbjwxhq5xBnpK/E7x1VZZoJDxpjAOasHT4Q==", + "dev": true, "hasInstallScript": true, "dependencies": { "@puppeteer/browsers": "2.3.0", @@ -18493,6 +18556,7 @@ "version": "22.15.0", "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.15.0.tgz", "integrity": "sha512-cHArnywCiAAVXa3t4GGL2vttNxh7GqXtIYGym99egkNJ3oG//wL9LkvO4WE8W1TJe95t1F1ocu9X4xWaGsOKOA==", + "dev": true, "dependencies": { "@puppeteer/browsers": "2.3.0", "chromium-bidi": "0.6.3", @@ -18547,7 +18611,8 @@ "node_modules/queue-tick": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", - "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "dev": true }, "node_modules/quick-lru": { "version": "5.1.1", @@ -20056,6 +20121,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, "license": "MIT", "engines": { "node": ">= 6.0.0", @@ -20205,6 +20271,7 @@ "version": "2.8.3", "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "dev": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -20218,6 +20285,7 @@ "version": "8.0.4", "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz", "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==", + "dev": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -20231,6 +20299,7 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "dev": true, "dependencies": { "debug": "^4.3.4" }, @@ -20355,6 +20424,7 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "devOptional": true, "license": "BSD-3-Clause" }, "node_modules/stack-trace": { @@ -20473,6 +20543,7 @@ "version": "2.18.0", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "dev": true, "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -20719,6 +20790,7 @@ "version": "3.0.6", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", + "dev": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -20732,6 +20804,7 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "dev": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -20984,6 +21057,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.1.tgz", "integrity": "sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA==", + "dev": true, "dependencies": { "b4a": "^1.6.4" } @@ -21406,7 +21480,7 @@ }, "node_modules/typescript": { "version": "5.3.3", - "devOptional": true, + "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", @@ -21437,6 +21511,7 @@ "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dev": true, "dependencies": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -21828,7 +21903,8 @@ "node_modules/urlpattern-polyfill": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true }, "node_modules/use": { "version": "3.1.1", @@ -22921,6 +22997,7 @@ "version": "8.18.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "devOptional": true, "engines": { "node": ">=10.0.0" }, @@ -23113,6 +23190,7 @@ "version": "3.23.8", "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/package.json b/package.json index 68a9174e15..f2c0a165ed 100644 --- a/package.json +++ b/package.json @@ -22,18 +22,17 @@ "build:electron:mac": "electron-builder build --mac --publish never", "build:electron:linux": "electron-builder build --linux --publish never", "test": "npm run test:app && npm run test:server", - "test:app": "vitest run --exclude \"**/pipelines.test.ts\"", - "test:app:covered": "vitest run --exclude \"**/e2e/*.test.ts\"", + "test:app": "vitest run --exclude \"**/e2e/*.test.ts\"", "test:tutorial": "vitest tutorial", "test:pipelines": "vitest pipelines", "test:progress": "vitest progress", "test:metadata": "vitest metadata", - "test:coverage:minimal": "npm run test:app:covered && npm run coverage:server", "test:server": "pytest src/pyflask/tests/ -s -vv", "wait5s": "node -e \"setTimeout(() => process.exit(0),5000)\"", "test:executable": "concurrently -n EXE,TEST --kill-others --success first \"node tests/testPyinstallerExecutable.js --port 3434 --forever\" \"npm run wait5s && pytest src/pyflask/tests/ -s --target http://localhost:3434\"", "test:coverage": "npm run coverage:app && npm run coverage:server", "coverage:app": "npm run test:app -- --coverage", + "coverage:tutorial": "npm run test:tutorial -- --coverage", "coverage:server": "pytest src/pyflask/tests/ -s --cov=pyflask --cov-report=xml", "deploy:win": "npm run build && npm run build:flask && npm run deploy:electron:win", "deploy:mac": "npm run build && npm run build:flask && npm run deploy:electron:mac", @@ -156,7 +155,6 @@ "lit": "^2.6.1", "lottie-web": "^5.9.5", "notyf": "^3.9.0", - "puppeteer": "^22.15.0", "sweetalert2": "^11.6.13", "tippy.js": "^6.3.7", "url": "^0.11.3", @@ -179,6 +177,7 @@ "electron-vite": "^1.0.28", "jsdom": "^22.0.0", "prettier": "^2.3.2", + "puppeteer": "^22.15.0", "react": "^18.2.0", "react-dom": "^18.2.0", "storybook": "^7.6.10", diff --git a/tests/components/forms.test.ts b/tests/components/forms.test.ts index f4d32ea281..028edc446e 100644 --- a/tests/components/forms.test.ts +++ b/tests/components/forms.test.ts @@ -6,9 +6,8 @@ import { SimpleTable } from '../../src/electron/frontend/core/components/SimpleT import baseMetadataSchema from '../../src/schemas/base-metadata.schema' -function sleep(ms) { - return new Promise(resolve => setTimeout(resolve, ms)); -} +import { sleep } from '../utils.js'; + const NWBFileSchemaProperties = baseMetadataSchema.properties.NWBFile.properties diff --git a/tests/components/table.test.ts b/tests/components/table.test.ts index b281e9f01b..612f65cb02 100644 --- a/tests/components/table.test.ts +++ b/tests/components/table.test.ts @@ -1,7 +1,7 @@ // tests/table.test.js import { expect, test, describe, vi, beforeEach, afterEach } from 'vitest'; import { Table, sortTable } from '../../src/electron/frontend/core/components/Table.js'; -import { sleep } from '../puppeteer.js'; +import { sleep } from '../utils.js'; global.ResizeObserver = global.IntersectionObserver = vi.fn().mockImplementation(() => ({ observe: vi.fn(), diff --git a/tests/e2e/config.ts b/tests/e2e/config.ts index 6826a3f9bd..8bf6e1cdb4 100644 --- a/tests/e2e/config.ts +++ b/tests/e2e/config.ts @@ -4,7 +4,7 @@ import { homedir } from 'node:os' import { existsSync } from 'node:fs' import paths from "../../src/paths.config.json" assert { type: "json" }; -import { connect as connectToElectron } from '../puppeteer'; +import { connect as connectToElectron } from './puppeteer'; // ------------------------------------------------------------------ // ------------------------ Path Definitions ------------------------ @@ -106,7 +106,7 @@ export const regenerateTestData = !existsSync(testDataPath) || !existsSync(testD // export const regenerateTestData = true // Force regeneration export const dandiInfo = { - id: '212750', + id: '215297', // this dandiset is used for testing and owned by Ryan token: process.env.DANDI_STAGING_API_KEY } diff --git a/tests/e2e/pipelines.test.ts b/tests/e2e/pipelines.test.ts index 053cfcc9cd..6f89cf8d3e 100644 --- a/tests/e2e/pipelines.test.ts +++ b/tests/e2e/pipelines.test.ts @@ -11,7 +11,7 @@ import paths from "../../src/paths.config.json" assert { type: "json" }; import { evaluate, initTests, takeScreenshot } from './utils' import { header } from '../../src/electron/frontend/utils/text' -import { sleep } from '../puppeteer'; +import { sleep } from '../utils.js' // NOTE: We assume the user has put the GIN data in ~/NWB_GUIDE/test-data/GIN diff --git a/tests/puppeteer.ts b/tests/e2e/puppeteer.ts similarity index 81% rename from tests/puppeteer.ts rename to tests/e2e/puppeteer.ts index 0a1077590a..2f39a21165 100644 --- a/tests/puppeteer.ts +++ b/tests/e2e/puppeteer.ts @@ -4,11 +4,11 @@ import { afterAll, beforeAll, expect, describe, vi, test } from 'vitest' import * as puppeteer from 'puppeteer' import { exec } from 'child_process' -import { electronDebugPort } from './globals' +import { electronDebugPort } from '../globals.js' export const sharePort = 1234 -export const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)) +import { sleep } from '../utils.js'; const beforeStart = (timeout) => new Promise(async (resolve, reject) => { @@ -33,7 +33,8 @@ type BrowserTestOutput = { browser?: puppeteer.Browser, } -const timeout = 60 * 1000 // Wait for 1 minute for Electron to open (mostly for Windows) +const beforeStartTimeout = 60 * 1000 // Wait for 1 minute for Electron to open (mostly for Windows) +const launchProtocolTimeout = 6 * 60 * 1000 // Creating the test dataset can take up to 6 minutes (mostly for Windows) export const connect = () => { @@ -43,9 +44,7 @@ export const connect = () => { beforeAll(async () => { - await beforeStart(timeout) - - + await beforeStart(beforeStartTimeout) // Ensure Electron will exit gracefully const mockExit = vi.spyOn(process, 'exit').mockImplementation(() => { @@ -53,7 +52,7 @@ export const connect = () => { }); const browserURL = `http://localhost:${electronDebugPort}` - const browser = output.browser = await puppeteer.launch({ headless: 'new' }) + const browser = output.browser = await puppeteer.launch({ headless: 'new', protocolTimeout: launchProtocolTimeout}) const page = output.page = await browser.newPage(); await page.goto(browserURL); const endpoint = await page.evaluate(() => fetch(`json/version`).then(res => res.json()).then(res => res.webSocketDebuggerUrl)) @@ -68,7 +67,7 @@ export const connect = () => { const pages = await output.browser.pages() output.page = pages[0] - }, timeout + 1000) + }, beforeStartTimeout + 1000) afterAll(async () => { if (output.browser) await output.browser.close() // Will also exit the Electron instance diff --git a/tests/e2e/tutorial.test.ts b/tests/e2e/tutorial.test.ts index 280424265d..67354b0d66 100644 --- a/tests/e2e/tutorial.test.ts +++ b/tests/e2e/tutorial.test.ts @@ -1,5 +1,5 @@ import { beforeAll, describe, expect, test } from 'vitest' -import { sleep } from '../puppeteer' +import { sleep } from '../utils.js' import { existsSync } from 'node:fs' import { join } from 'node:path' @@ -38,7 +38,6 @@ describe('E2E Test', () => { datasetTestFunction('Create tutorial dataset', async () => { - await evaluate(async () => { // Transition to settings page diff --git a/tests/e2e/utils.ts b/tests/e2e/utils.ts index 18d6b45ce3..22896b2cc3 100644 --- a/tests/e2e/utils.ts +++ b/tests/e2e/utils.ts @@ -1,7 +1,7 @@ import { expect } from "vitest" import { ScreenshotOptions } from 'puppeteer' -import { sleep } from '../puppeteer' +import { sleep } from '../utils.js' import { mkdirSync, existsSync, rmSync } from 'node:fs' import { join, sep } from 'node:path' diff --git a/tests/e2e/workflow.ts b/tests/e2e/workflow.ts index ae89265949..dad33a46b8 100644 --- a/tests/e2e/workflow.ts +++ b/tests/e2e/workflow.ts @@ -1,6 +1,6 @@ import { describe, expect, test } from "vitest" -import { sleep } from '../puppeteer' +import { sleep } from '../utils.js' import { join } from 'node:path' import { evaluate, takeScreenshot, toNextPage } from "./utils" diff --git a/tests/utils.ts b/tests/utils.ts index aebca5ad85..7cc75e68aa 100644 --- a/tests/utils.ts +++ b/tests/utils.ts @@ -1,3 +1,5 @@ +export const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms)) + export function createMockGlobalState() { const globalState = {