diff --git a/.gitignore b/.gitignore index ef7958cd..d1a1484c 100644 --- a/.gitignore +++ b/.gitignore @@ -3,12 +3,16 @@ node_modules package-lock.json pnpm-lock.yaml .pnpm-store - # build output + /**/lib +packages/browser/dist # testing .nyc_output +.parcel-cache +junit_results.xml +/**/test-results/**/* # pnpm .pnpm-debug.log diff --git a/common/changes/@itwin/browser-authorization/bdp-add-browser-auth-integration-test_2023-03-03-22-12.json b/common/changes/@itwin/browser-authorization/bdp-add-browser-auth-integration-test_2023-03-03-22-12.json new file mode 100644 index 00000000..74d07ea4 --- /dev/null +++ b/common/changes/@itwin/browser-authorization/bdp-add-browser-auth-integration-test_2023-03-03-22-12.json @@ -0,0 +1,10 @@ +{ + "changes": [ + { + "packageName": "@itwin/browser-authorization", + "comment": "", + "type": "none" + } + ], + "packageName": "@itwin/browser-authorization" +} \ No newline at end of file diff --git a/common/config/azure-pipelines/integration-test.yaml b/common/config/azure-pipelines/integration-test.yaml index 33e98f5c..dfddfb6e 100644 --- a/common/config/azure-pipelines/integration-test.yaml +++ b/common/config/azure-pipelines/integration-test.yaml @@ -35,6 +35,8 @@ jobs: echo "##vso[task.setvariable variable=IMJS_TEST_MANAGER_USER_PASSWORD;]$test_manager_user_password" echo "##vso[task.setvariable variable=IMJS_TEST_REGULAR_USER_PASSWORD;]$test_reg_password" echo "##vso[task.setvariable variable=IMJS_TEST_AZUREAD_USER_PASSWORD;]$test_azuread_user_password" + echo "##vso[task.setvariable variable=PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD;]1" + echo "##vso[task.setvariable variable=PLAYWRIGHT_BROWSERS_PATH;]$(Build.BinariesDirectory)/pw-browsers" export displayName: 'Add config to environment' env: @@ -55,6 +57,9 @@ jobs: Write-Host "##vso[task.setvariable variable=IMJS_TEST_MANAGER_USER_PASSWORD;]$Env:test_manager_user_password" Write-Host "##vso[task.setvariable variable=IMJS_TEST_REGULAR_USER_PASSWORD;]$Env:test_reg_password" Write-Host "##vso[task.setvariable variable=IMJS_TEST_AZUREAD_USER_PASSWORD;]$Env:test_azuread_user_password" + Write-Host "##vso[task.setvariable variable=IMJS_TEST_AZUREAD_USER_PASSWORD;]$Env:test_azuread_user_password" + Write-Host "##vso[task.setvariable variable=PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD;]1" + Write-Host "##vso[task.setvariable variable=PLAYWRIGHT_BROWSERS_PATH;]$(Build.BinariesDirectory)/pw-browsers" displayName: 'Add config to environment' env: test_super_manager_password: $(IMJS_SUPER_MANAGER_USER_PASSWORD) @@ -72,6 +77,9 @@ jobs: - script: node common/scripts/install-run-rush.js install displayName: Rush Install + - script: npx playwright install + displayName: Install Playwright + - script: node common/scripts/install-run-rush.js build -v --to oidc-signin-tool displayName: Rush Build @@ -80,10 +88,19 @@ jobs: env: # Couldn't get this variable to be ingested in the steps above, but this works IMJS_TEST_AZUREAD_USER_PASSWORD: $(IMJS_TEST_AZUREAD_USER_PASSWORD) + IMJS_TEST_REGULAR_USER_PASSWORD: $(IMJS_TEST_REGULAR_USER_PASSWORD) + DEBUG: pw:api - task: PublishTestResults@2 - displayName: "Publish OIDC Signin Tool Test Results" + displayName: "Publish Integration Test Results" inputs: - testResultsFiles: "packages/oidc-signin-tool/lib/test/junit_results.xml" - testRunTitle: "Tools - OIDC Signin Tool - $(Agent.OS)" + testResultsFiles: "packages/**/junit_results.xml" + testRunTitle: "Tools - auth-clients - $(Agent.OS)" condition: succeededOrFailed() + + - task: PublishBuildArtifacts@1 + inputs: + PathtoPublish: '$(Build.SourcesDirectory)/packages/browser/test-results' + ArtifactName: 'screenshots' + publishLocation: 'Container' + condition: Failed() diff --git a/common/config/rush/command-line.json b/common/config/rush/command-line.json index 7be0b645..04b3a35e 100644 --- a/common/config/rush/command-line.json +++ b/common/config/rush/command-line.json @@ -26,7 +26,7 @@ "commandKind": "bulk", "summary": "Run test:integration script for each package", "description": "Iterates through each package in the monorepo and runs the 'test:integration' script", - "enableParallelism": true, + "enableParallelism": false, "ignoreMissingScript": true, "ignoreDependencyOrder": true, "allowWarningsInSuccessfulBuild": true @@ -62,4 +62,4 @@ "allowWarningsInSuccessfulBuild": true } ] -} \ No newline at end of file +} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index d7939475..4ce2a49a 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -11,15 +11,20 @@ importers: '@itwin/core-bentley': ^3.0.0 '@itwin/core-common': ^3.0.0 '@itwin/eslint-plugin': ^3.0.0 + '@playwright/test': ~1.31.1 '@types/chai': ^4.2.22 '@types/mocha': ^8.2.3 '@types/node': 14.14.31 '@types/sinon': ^10.0.13 + buffer: ~6.0.3 chai: ^4.2.22 + dotenv: ~16.0.3 eslint: ^7.32.0 mocha: ^8.2.3 nyc: ^15.1.0 oidc-client-ts: ^2.2.0 + parcel: ~2.8.3 + process: ~0.11.10 rimraf: ^3.0.2 sinon: ^15.0.1 typescript: ~4.3.5 @@ -30,14 +35,19 @@ importers: '@itwin/core-bentley': 3.5.1 '@itwin/core-common': 3.5.1_@itwin+core-bentley@3.5.1 '@itwin/eslint-plugin': 3.5.1_eslint@7.32.0+typescript@4.3.5 + '@playwright/test': 1.31.1 '@types/chai': 4.3.4 '@types/mocha': 8.2.3 '@types/node': 14.14.31 '@types/sinon': 10.0.13 + buffer: 6.0.3 chai: 4.3.7 + dotenv: 16.0.3 eslint: 7.32.0 mocha: 8.4.0 nyc: 15.1.0 + parcel: 2.8.3 + process: 0.11.10 rimraf: 3.0.2 sinon: 15.0.1 typescript: 4.3.5 @@ -649,7 +659,7 @@ packages: dev: true /@jridgewell/gen-mapping/0.3.2: - resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} + resolution: {integrity: sha1-wa7cYehT8rufXf5tRELTtWWyU7k=} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 @@ -658,26 +668,85 @@ packages: dev: true /@jridgewell/resolve-uri/3.1.0: - resolution: {integrity: sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==} + resolution: {integrity: sha1-IgOxGMFXchrd/mnUe3BGVGMGbXg=} engines: {node: '>=6.0.0'} dev: true /@jridgewell/set-array/1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + resolution: {integrity: sha1-fGz5mNbSC5FMClWpGuko/yWWXnI=} engines: {node: '>=6.0.0'} dev: true + /@jridgewell/source-map/0.3.2: + resolution: {integrity: sha1-9FNRqu1FJ6KYUS7HL4EEDJmFgPs=} + dependencies: + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + dev: true + /@jridgewell/sourcemap-codec/1.4.14: - resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} + resolution: {integrity: sha1-rdTJjTQUcqKJGQtCTvvbCWmRuyQ=} dev: true /@jridgewell/trace-mapping/0.3.17: - resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} + resolution: {integrity: sha1-eTBBJ3r5BzsJUaf+Dw2MTJjDaYU=} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 dev: true + /@lezer/common/0.15.12: + resolution: {integrity: sha1-LyGuxVHdX9fSTrBp+Q9U1bxu5ek=} + dev: true + + /@lezer/lr/0.15.8: + resolution: {integrity: sha1-FWSpEeYrCg91ymN5Smqoxdxj2yE=} + dependencies: + '@lezer/common': 0.15.12 + dev: true + + /@lmdb/lmdb-darwin-arm64/2.5.2: + resolution: {integrity: sha1-vGb6QyhrXAguj+4OrMF5lYBrb74=} + cpu: [arm64] + os: [darwin] + dev: true + optional: true + + /@lmdb/lmdb-darwin-x64/2.5.2: + resolution: {integrity: sha1-idg5AEG85rqySoKiA5K+Ivr1T/w=} + cpu: [x64] + os: [darwin] + dev: true + optional: true + + /@lmdb/lmdb-linux-arm/2.5.2: + resolution: {integrity: sha1-Bb3kVzqxDPIYJzOf5ocUjyWQz6E=} + cpu: [arm] + os: [linux] + dev: true + optional: true + + /@lmdb/lmdb-linux-arm64/2.5.2: + resolution: {integrity: sha1-FP5MlsK7EoX5N5f0WRX6Ne4Ecmg=} + cpu: [arm64] + os: [linux] + dev: true + optional: true + + /@lmdb/lmdb-linux-x64/2.5.2: + resolution: {integrity: sha1-0vha/YV9LDPSyqWwV5RFdO2vz+4=} + cpu: [x64] + os: [linux] + dev: true + optional: true + + /@lmdb/lmdb-win32-x64/2.5.2: + resolution: {integrity: sha1-KPZD+8C+wwsH++lbE3h5trTRycU=} + cpu: [x64] + os: [win32] + dev: true + optional: true + /@microsoft/api-extractor-model/7.17.3: resolution: {integrity: sha512-ETslFxVEZTEK6mrOARxM34Ll2W/5H2aTk9Pe9dxsMCnthE8O/CaStV4WZAGsvvZKyjelSWgPVYGowxGVnwOMlQ==} dependencies: @@ -721,6 +790,57 @@ packages: resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} dev: true + /@mischnic/json-sourcemap/0.1.0: + resolution: {integrity: sha1-OK9le+QQgUClSGOCZ9AqLqMzZQc=} + engines: {node: '>=12.0.0'} + dependencies: + '@lezer/common': 0.15.12 + '@lezer/lr': 0.15.8 + json5: 2.2.3 + dev: true + + /@msgpackr-extract/msgpackr-extract-darwin-arm64/3.0.0: + resolution: {integrity: sha1-0xojjJQ//DS6tzrWznpkZtZYiO8=} + cpu: [arm64] + os: [darwin] + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-darwin-x64/3.0.0: + resolution: {integrity: sha1-L2+77D0/C76cZnjImfHBpuJe2YA=} + cpu: [x64] + os: [darwin] + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm/3.0.0: + resolution: {integrity: sha1-O4VaxyzBbonbL3Kt9H3clkwgpT0=} + cpu: [arm] + os: [linux] + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-arm64/3.0.0: + resolution: {integrity: sha1-GYdUQdpQuaqPjnJusJekzq1DWj8=} + cpu: [arm64] + os: [linux] + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-linux-x64/3.0.0: + resolution: {integrity: sha1-RV8dW7AOh/eMZ3EfJue/+fFFdoQ=} + cpu: [x64] + os: [linux] + dev: true + optional: true + + /@msgpackr-extract/msgpackr-extract-win32-x64/3.0.0: + resolution: {integrity: sha1-A8a/zTrLF56mlUbCDVCJW51iOto=} + cpu: [x64] + os: [win32] + dev: true + optional: true + /@nodelib/fs.scandir/2.1.5: resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -760,6 +880,688 @@ packages: engines: {node: '>=10.13.0'} dev: false + /@parcel/bundler-default/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-1kc528Lb1Z1mKYYb93qAg6ztUik=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/graph': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/cache/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-Fp4TDPWZE8Dtn63OGkUOaPcQ4W8=} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/utils': 2.8.3 + lmdb: 2.5.2 + dev: true + + /@parcel/codeframe/2.8.3: + resolution: {integrity: sha1-hPtSnvcN739bxk9sWbGNJIJvX8w=} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/compressor-raw/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-MBdT34xt6WdVMUljnopBebiPDJU=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/config-default/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-mkNIbnxwLpbGgFLDe3kJjXJA41s=} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/bundler-default': 2.8.3_@parcel+core@2.8.3 + '@parcel/compressor-raw': 2.8.3_@parcel+core@2.8.3 + '@parcel/core': 2.8.3 + '@parcel/namer-default': 2.8.3_@parcel+core@2.8.3 + '@parcel/optimizer-css': 2.8.3_@parcel+core@2.8.3 + '@parcel/optimizer-htmlnano': 2.8.3_@parcel+core@2.8.3 + '@parcel/optimizer-image': 2.8.3_@parcel+core@2.8.3 + '@parcel/optimizer-svgo': 2.8.3_@parcel+core@2.8.3 + '@parcel/optimizer-terser': 2.8.3_@parcel+core@2.8.3 + '@parcel/packager-css': 2.8.3_@parcel+core@2.8.3 + '@parcel/packager-html': 2.8.3_@parcel+core@2.8.3 + '@parcel/packager-js': 2.8.3_@parcel+core@2.8.3 + '@parcel/packager-raw': 2.8.3_@parcel+core@2.8.3 + '@parcel/packager-svg': 2.8.3_@parcel+core@2.8.3 + '@parcel/reporter-dev-server': 2.8.3_@parcel+core@2.8.3 + '@parcel/resolver-default': 2.8.3_@parcel+core@2.8.3 + '@parcel/runtime-browser-hmr': 2.8.3_@parcel+core@2.8.3 + '@parcel/runtime-js': 2.8.3_@parcel+core@2.8.3 + '@parcel/runtime-react-refresh': 2.8.3_@parcel+core@2.8.3 + '@parcel/runtime-service-worker': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-babel': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-css': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-html': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-image': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-js': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-json': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-postcss': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-posthtml': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-raw': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-react-refresh-wrap': 2.8.3_@parcel+core@2.8.3 + '@parcel/transformer-svg': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + + /@parcel/core/2.8.3: + resolution: {integrity: sha1-IqafNgldU3NqsQv0JpfZql9OOCs=} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + '@parcel/cache': 2.8.3_@parcel+core@2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/graph': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + abortcontroller-polyfill: 1.7.5 + base-x: 3.0.9 + browserslist: 4.21.4 + clone: 2.1.2 + dotenv: 7.0.0 + dotenv-expand: 5.1.0 + json5: 2.2.3 + msgpackr: 1.8.3 + nullthrows: 1.1.1 + semver: 5.7.1 + dev: true + + /@parcel/diagnostic/2.8.3: + resolution: {integrity: sha1-1WAnbV0oBLSL6vof6vP8ayrF450=} + engines: {node: '>= 12.0.0'} + dependencies: + '@mischnic/json-sourcemap': 0.1.0 + nullthrows: 1.1.1 + dev: true + + /@parcel/events/2.8.3: + resolution: {integrity: sha1-IF+Nh05uzCy9uUG/jVS65mnlca8=} + engines: {node: '>= 12.0.0'} + dev: true + + /@parcel/fs-search/2.8.3: + resolution: {integrity: sha1-HH2BLBELgIdY9ExW5h3//bCelFE=} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + dev: true + + /@parcel/fs/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-gFNq/od/yKK9Jr5Vdrm6J7tMV1Q=} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/fs-search': 2.8.3 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + '@parcel/watcher': 2.1.0 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + dev: true + + /@parcel/graph/2.8.3: + resolution: {integrity: sha1-AP/o7AMudP7lcZnlRSnx2nMiVx0=} + engines: {node: '>= 12.0.0'} + dependencies: + nullthrows: 1.1.1 + dev: true + + /@parcel/hash/2.8.3: + resolution: {integrity: sha1-vCSZonOVFpYWytKpnhnmm5CY9uk=} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + xxhash-wasm: 0.4.2 + dev: true + + /@parcel/logger/2.8.3: + resolution: {integrity: sha1-4U5N66+zyp6HwHwGeA+a/DiycSw=} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + dev: true + + /@parcel/markdown-ansi/2.8.3: + resolution: {integrity: sha1-EzfUIbsRM60Xjzhqjht0ZjG7pKE=} + engines: {node: '>= 12.0.0'} + dependencies: + chalk: 4.1.2 + dev: true + + /@parcel/namer-default/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-UwS+50vrS5wYgHgb2+Nb4GVjcvQ=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/node-resolver-core/2.8.3: + resolution: {integrity: sha1-WB3wdKJ2RkALP+2dqVKXthan248=} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + semver: 5.7.1 + dev: true + + /@parcel/optimizer-css/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-QgozP0t49/8V5pIX3+00QhsRQ+4=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + browserslist: 4.21.4 + lightningcss: 1.19.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/optimizer-htmlnano/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-pxq28PJBYO+fVzJmBkQ47/ZeltA=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + htmlnano: 2.0.3_svgo@2.8.0 + nullthrows: 1.1.1 + posthtml: 0.16.6 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + + /@parcel/optimizer-image/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-6km0JFtPfWCzjHWFxjEfsh00G6o=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + detect-libc: 1.0.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/optimizer-svgo/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-BNpO/sa2I2eVOahJYb/2mYA0uoo=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + svgo: 2.8.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/optimizer-terser/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-OgbZjQk4ahoK4b6FN2qHOb+6lhg=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + terser: 5.16.5 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/package-manager/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-3dDWL+rjzw+2zAU3eRs6Filq1Fg=} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + semver: 5.7.1 + dev: true + + /@parcel/packager-css/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-Dv80Joy09d+1PBu8qF9VZ66xg1o=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-html/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-+SY7iRqk3UbG4vorBwJaSCEy//E=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-js/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-PtEVZZFdc9EhkraQHHWmuCDkqDo=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + globals: 13.19.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-raw/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-veyCbfmR4YbLWGkcxF0SrVwGZ24=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/packager-svg/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-cjMxUpYAHFMctVypa18u9nI0NjA=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + posthtml: 0.16.6 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/plugin/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-e7MKV3Xqpkc8J/ACoKPucwjW1mk=} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/reporter-cli/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-EqR0O1G4/mg39Twg4Bu/H3M26OQ=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/types': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + chalk: 4.1.2 + term-size: 2.2.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/reporter-dev-server/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-oNqlzAFWQmhM6lYfTg5xFrv/3Bw=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/resolver-default/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-WuQeU3rkp5PBq7R/CUSCueKsNTU=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/node-resolver-core': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-browser-hmr/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-H6dOH70QMLCpIMWK+jqet9xLzR4=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-js/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-C6pMj7936rzgXQHMwYZhSWj/wM0=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-react-refresh/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-OBqUL7gej1rGx+DuG5Hb80djw/g=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + react-error-overlay: 6.0.9 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/runtime-service-worker/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-VNktqf8d+9J9sOhBZKIvpZ6Zs0g=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/source-map/2.1.1: + resolution: {integrity: sha1-+xk7gtum3WLMenazJvV7s1AAp4I=} + engines: {node: ^12.18.3 || >=14} + dependencies: + detect-libc: 1.0.3 + dev: true + + /@parcel/transformer-babel/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-KGvGy5r+TAJZ8LKODy9HMioksTA=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + browserslist: 4.21.4 + json5: 2.2.3 + nullthrows: 1.1.1 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-css/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-1sRBACBOc4Qa2OD5BHIXLqi5Egw=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + browserslist: 4.21.4 + lightningcss: 1.19.0 + nullthrows: 1.1.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-html/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-XGiyjua4x6E7iu6H95V60yJ72D8=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + srcset: 4.0.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-image/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-c4BbK/w8iRnXc3VE5fi+OePzA/4=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + nullthrows: 1.1.1 + dev: true + + /@parcel/transformer-js/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-/kAN9Cg5TR5/5a+23qXHyFjkTwM=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/utils': 2.8.3 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + '@swc/helpers': 0.4.14 + browserslist: 4.21.4 + detect-libc: 1.0.3 + nullthrows: 1.1.1 + regenerator-runtime: 0.13.11 + semver: 5.7.1 + dev: true + + /@parcel/transformer-json/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-Jd6zpROMxwqDJp/F051WRgk1TTY=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + json5: 2.2.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-postcss/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-30/cHJCJOCNEXyqOuOK90DSczFg=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + clone: 2.1.2 + nullthrows: 1.1.1 + postcss-value-parser: 4.2.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-posthtml/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-fDkSpaYxyyZIX2Rk4Nbuq7bx5xg=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-raw/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-OiIhP+GKX4P9eIictJ8G4FnP6tc=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-react-refresh-wrap/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-iwOSY4QF3UcKiGACIp94idVGSCI=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + react-refresh: 0.9.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/transformer-svg/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-TflZy6Tr9F16rd1UD3UuboTfOLI=} + engines: {node: '>= 12.0.0', parcel: ^2.8.3} + dependencies: + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/plugin': 2.8.3_@parcel+core@2.8.3 + nullthrows: 1.1.1 + posthtml: 0.16.6 + posthtml-parser: 0.10.2 + posthtml-render: 3.0.0 + semver: 5.7.1 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/types/2.8.3: + resolution: {integrity: sha1-Mwa8U5G2kTvWGZFIlLjNhKJLMPo=} + dependencies: + '@parcel/cache': 2.8.3_@parcel+core@2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + utility-types: 3.10.0 + dev: true + + /@parcel/types/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-Mwa8U5G2kTvWGZFIlLjNhKJLMPo=} + dependencies: + '@parcel/cache': 2.8.3_@parcel+core@2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3 + '@parcel/source-map': 2.1.1 + '@parcel/workers': 2.8.3_@parcel+core@2.8.3 + utility-types: 3.10.0 + transitivePeerDependencies: + - '@parcel/core' + dev: true + + /@parcel/utils/2.8.3: + resolution: {integrity: sha1-DVbJ6OIsEZWQpeBEoOAQMZZdpA4=} + engines: {node: '>= 12.0.0'} + dependencies: + '@parcel/codeframe': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/hash': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/markdown-ansi': 2.8.3 + '@parcel/source-map': 2.1.1 + chalk: 4.1.2 + dev: true + + /@parcel/watcher/2.1.0: + resolution: {integrity: sha1-XzKWk2LbSJOSLFJqhC2K96hThUU=} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + is-glob: 4.0.3 + micromatch: 4.0.5 + node-addon-api: 3.2.1 + node-gyp-build: 4.6.0 + dev: true + + /@parcel/workers/2.8.3_@parcel+core@2.8.3: + resolution: {integrity: sha1-JVRQzPTbI0CCQH5N3aX9V18IwjU=} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@parcel/core': ^2.8.3 + dependencies: + '@parcel/core': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/types': 2.8.3 + '@parcel/utils': 2.8.3 + chrome-trace-event: 1.0.3 + nullthrows: 1.1.1 + dev: true + + /@playwright/test/1.31.1: + resolution: {integrity: sha1-OdaHPcRq8TXxJFHXlwfbfRNXRV0=} + engines: {node: '>=14'} + hasBin: true + dependencies: + '@types/node': 18.11.18 + playwright-core: 1.31.1 + optionalDependencies: + fsevents: 2.3.2 + dev: true + /@rushstack/node-core-library/3.45.5: resolution: {integrity: sha512-KbN7Hp9vH3bD3YJfv6RnVtzzTAwGYIBl7y2HQLY4WEQqRbvE3LgI78W9l9X+cTAXCX//p0EeoiUYNTFdqJrMZg==} dependencies: @@ -818,12 +1620,23 @@ packages: resolution: {integrity: sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==} dev: true + /@swc/helpers/0.4.14: + resolution: {integrity: sha1-E1KsbZXjYXzLfBSY/wGWVPHhKnQ=} + dependencies: + tslib: 2.5.0 + dev: true + /@szmarczak/http-timer/4.0.6: resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} engines: {node: '>=10'} dependencies: defer-to-connect: 2.0.1 + /@trysound/sax/0.2.0: + resolution: {integrity: sha1-zMqrdYr1Z2Hre/N69vA/Mm3XmK0=} + engines: {node: '>=10.13.0'} + dev: true + /@types/argparse/1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} dev: true @@ -931,7 +1744,11 @@ packages: dev: true /@types/node/18.11.18: - resolution: {integrity: sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==} + resolution: {integrity: sha1-jfuX8Nojwik+VUxaUNYe8TTXaX8=} + + /@types/parse-json/4.0.0: + resolution: {integrity: sha1-L4u0QUNNFjs1+4/9zNcTiSf/uMA=} + dev: true /@types/qs/6.9.7: resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} @@ -1133,6 +1950,10 @@ packages: resolution: {integrity: sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==} dev: true + /abortcontroller-polyfill/1.7.5: + resolution: {integrity: sha1-ZzhJX06QH7tXtsBhHQx192xIW+0=} + dev: true + /accepts/1.3.8: resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} engines: {node: '>= 0.6'} @@ -1155,6 +1976,12 @@ packages: hasBin: true dev: true + /acorn/8.8.2: + resolution: {integrity: sha1-Gy8l2wKvllOZuXdrDCw5EnbTfEo=} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + /address/1.2.2: resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==} engines: {node: '>= 10.0.0'} @@ -1220,7 +2047,7 @@ packages: dev: true /ansi-styles/4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + resolution: {integrity: sha1-7dgDYornHATIWuegkG7a00tkiTc=} engines: {node: '>=8'} dependencies: color-convert: 2.0.1 @@ -1342,9 +2169,14 @@ packages: /balanced-match/1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + /base-x/3.0.9: + resolution: {integrity: sha1-Y0mqq7WFJjMt6fYJleVIpT/iEyA=} + dependencies: + safe-buffer: 5.2.1 + dev: true + /base64-js/1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: false /binary-extensions/2.2.0: resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} @@ -1376,6 +2208,10 @@ packages: unpipe: 1.0.0 dev: false + /boolbase/1.0.0: + resolution: {integrity: sha1-aN/1++YMUes3cl6p4+0xDcwed24=} + dev: true + /boolean/3.2.0: resolution: {integrity: sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==} dev: true @@ -1393,7 +2229,7 @@ packages: balanced-match: 1.0.2 /braces/3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + resolution: {integrity: sha1-NFThpGLujVmeI23zNs2epPiv4Qc=} engines: {node: '>=8'} dependencies: fill-range: 7.0.1 @@ -1429,6 +2265,13 @@ packages: ieee754: 1.2.1 dev: false + /buffer/6.0.3: + resolution: {integrity: sha1-Ks5XhFnMj74qcKqo9S7mO2p0xsY=} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: true + /bytes/3.1.2: resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} engines: {node: '>= 0.8'} @@ -1461,7 +2304,7 @@ packages: dev: true /call-bind/1.0.2: - resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + resolution: {integrity: sha1-sdTonmiBGcPJqQOtMKuy9qkZvjw=} dependencies: function-bind: 1.1.1 get-intrinsic: 1.1.3 @@ -1524,7 +2367,7 @@ packages: dev: true /chalk/4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + resolution: {integrity: sha1-qsTit3NKdAhnrrFr8CqtVWoeegE=} engines: {node: '>=10'} dependencies: ansi-styles: 4.3.0 @@ -1571,6 +2414,11 @@ packages: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} dev: false + /chrome-trace-event/1.0.3: + resolution: {integrity: sha1-EBXs7UdB4V0GZkqVfbv1DQQeJqw=} + engines: {node: '>=6.0'} + dev: true + /clean-stack/2.2.0: resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} engines: {node: '>=6'} @@ -1603,6 +2451,11 @@ packages: dependencies: mimic-response: 1.0.1 + /clone/2.1.2: + resolution: {integrity: sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=} + engines: {node: '>=0.8'} + dev: true + /co/4.6.0: resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} @@ -1615,7 +2468,7 @@ packages: dev: true /color-convert/2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + resolution: {integrity: sha1-ctOmjVmMm9s68q0ehPIdiWq9TeM=} engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 @@ -1625,7 +2478,7 @@ packages: dev: true /color-name/1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + resolution: {integrity: sha1-wqCah6y95pVD3m9j+jmVyCbFNqI=} /colors/1.2.5: resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} @@ -1638,6 +2491,15 @@ packages: dependencies: delayed-stream: 1.0.0 + /commander/2.20.3: + resolution: {integrity: sha1-/UhehMA+tIgcIHIrpIA16FMa6zM=} + dev: true + + /commander/7.2.0: + resolution: {integrity: sha1-o2y1fQtQHOEI5NIFWaFQo5HZerc=} + engines: {node: '>= 10'} + dev: true + /commander/9.5.0: resolution: {integrity: sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==} engines: {node: ^12.20.0 || >=14} @@ -1686,6 +2548,17 @@ packages: requiresBuild: true dev: true + /cosmiconfig/7.1.0: + resolution: {integrity: sha1-FEO5r6WWtnAILqRsvY9qYrhGNfY=} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + dev: true + /cpx2/3.0.2: resolution: {integrity: sha512-xVmdulZJVGSV+c8KkZ9IQY+RgyL9sGeVqScI2e7NtsEY9SVKcQXM4v0/9OLU0W0YtL9nmmqrtWjs5rpvgHn9Hg==} engines: {node: '>=6.5'} @@ -1743,6 +2616,36 @@ packages: resolution: {integrity: sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==} dev: false + /css-select/4.3.0: + resolution: {integrity: sha1-23EpsoRmYv2GKM/ElquytZ5BUps=} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 4.3.1 + domutils: 2.8.0 + nth-check: 2.1.1 + dev: true + + /css-tree/1.1.3: + resolution: {integrity: sha1-60hw+2/XcHMn7JXC/yqwm16NuR0=} + engines: {node: '>=8.0.0'} + dependencies: + mdn-data: 2.0.14 + source-map: 0.6.1 + dev: true + + /css-what/6.1.0: + resolution: {integrity: sha1-+17/z3bx3eosgb36pN5E55uscPQ=} + engines: {node: '>= 6'} + dev: true + + /csso/4.2.0: + resolution: {integrity: sha1-6jpWE0bo3J9UbW/r7dUBh884lSk=} + engines: {node: '>=8.0.0'} + dependencies: + css-tree: 1.1.3 + dev: true + /damerau-levenshtein/1.0.8: resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} dev: true @@ -1867,6 +2770,12 @@ packages: engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} dev: false + /detect-libc/1.0.3: + resolution: {integrity: sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=} + engines: {node: '>=0.10'} + hasBin: true + dev: true + /detect-libc/2.0.1: resolution: {integrity: sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==} engines: {node: '>=8'} @@ -1924,15 +2833,51 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer/1.4.1: + resolution: {integrity: sha1-3l1Bsa6ikCFdxFptrorc8dMuLTA=} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + + /domelementtype/2.3.0: + resolution: {integrity: sha1-XEXo6GmVJiYzHXqrMm0B2vZdWJ0=} + dev: true + + /domhandler/4.3.1: + resolution: {integrity: sha1-jXkgM0FvWdaLwDpap7AYwcqJJ5w=} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils/2.8.0: + resolution: {integrity: sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=} + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + /dotenv-expand/5.1.0: resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} - dev: false /dotenv/10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} dev: false + /dotenv/16.0.3: + resolution: {integrity: sha1-EVrsQrrFBT2zxFbbMMwkOlqDagc=} + engines: {node: '>=12'} + dev: true + + /dotenv/7.0.0: + resolution: {integrity: sha1-or481Sc2ZzIG6KhftSEO6ilijnw=} + engines: {node: '>=6'} + dev: true + /duplexer/0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} dev: true @@ -1988,13 +2933,22 @@ packages: ansi-colors: 4.1.3 dev: true + /entities/2.2.0: + resolution: {integrity: sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=} + dev: true + + /entities/3.0.1: + resolution: {integrity: sha1-K4h8piWF6W2zkDSC0zbBAGwwAdQ=} + engines: {node: '>=0.12'} + dev: true + /env-paths/2.2.1: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} dev: true /error-ex/1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + resolution: {integrity: sha1-tKxAZIEH/c3PriQvQovqihTU8b8=} dependencies: is-arrayish: 0.2.1 dev: true @@ -2490,7 +3444,7 @@ packages: dev: true /fill-range/7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + resolution: {integrity: sha1-GRmmp8df44ssfHflGYU12prN2kA=} engines: {node: '>=8'} dependencies: to-regex-range: 5.0.1 @@ -2642,13 +3596,13 @@ packages: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} /fsevents/2.3.2: - resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==} + resolution: {integrity: sha1-ilJveLj99GI7cJ4Ll1xSwkwC/Ro=} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} os: [darwin] optional: true /function-bind/1.1.1: - resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + resolution: {integrity: sha1-pWiZ0+o8m6uHS7l3O3xe3pL0iV0=} /function.prototype.name/1.1.5: resolution: {integrity: sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==} @@ -2682,7 +3636,7 @@ packages: dev: true /get-intrinsic/1.1.3: - resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + resolution: {integrity: sha1-BjyEMprZPoOJPH9PJD72P/o1E4U=} dependencies: function-bind: 1.1.1 has: 1.0.3 @@ -2693,6 +3647,11 @@ packages: engines: {node: '>=8.0.0'} dev: true + /get-port/4.2.0: + resolution: {integrity: sha1-43Nosehjt2KcQ8WjI2Jflc8ksRk=} + engines: {node: '>=6'} + dev: true + /get-stream/4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -2858,7 +3817,7 @@ packages: dev: true /has-flag/4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + resolution: {integrity: sha1-lEdx/ZyByBJlxNaUGGDaBrtZR5s=} engines: {node: '>=8'} /has-property-descriptors/1.0.0: @@ -2873,7 +3832,7 @@ packages: dev: true /has-symbols/1.0.3: - resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + resolution: {integrity: sha1-u3ssQ0klHc6HsSX3vfh0qnyLOfg=} engines: {node: '>= 0.4'} /has-tostringtag/1.0.0: @@ -2909,6 +3868,50 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /htmlnano/2.0.3_svgo@2.8.0: + resolution: {integrity: sha1-UO5jntYzV9SmwBMJ9So1iS5O3C4=} + peerDependencies: + cssnano: ^5.0.11 + postcss: ^8.3.11 + purgecss: ^5.0.0 + relateurl: ^0.2.7 + srcset: 4.0.0 + svgo: ^2.8.0 + terser: ^5.10.0 + uncss: ^0.17.3 + peerDependenciesMeta: + cssnano: + optional: true + postcss: + optional: true + purgecss: + optional: true + relateurl: + optional: true + srcset: + optional: true + svgo: + optional: true + terser: + optional: true + uncss: + optional: true + dependencies: + cosmiconfig: 7.1.0 + posthtml: 0.16.6 + svgo: 2.8.0 + timsort: 0.3.0 + dev: true + + /htmlparser2/7.2.0: + resolution: {integrity: sha1-iBfN6ji7wyQ5KpCxmQkI6Bpl9aU=} + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + domutils: 2.8.0 + entities: 3.0.1 + dev: true + /http-cache-semantics/4.1.0: resolution: {integrity: sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==} @@ -2948,8 +3951,7 @@ packages: dev: false /ieee754/1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: false + resolution: {integrity: sha1-jrehCmP/8l0VpXsAFYbRd9Gw01I=} /ignore/4.0.6: resolution: {integrity: sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==} @@ -3023,7 +4025,7 @@ packages: dev: true /is-arrayish/0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + resolution: {integrity: sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=} dev: true /is-bigint/1.0.4: @@ -3093,6 +4095,10 @@ packages: dependencies: is-extglob: 2.1.1 + /is-json/2.0.1: + resolution: {integrity: sha1-a+Fm0USCihMdaGiRuYPfYsOUkf8=} + dev: true + /is-negative-zero/2.0.2: resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} engines: {node: '>= 0.4'} @@ -3106,7 +4112,7 @@ packages: dev: true /is-number/7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + resolution: {integrity: sha1-dTU0W4lnNNX4DE0GxQlVUnoU8Ss=} engines: {node: '>=0.12.0'} /is-plain-obj/2.1.0: @@ -3322,6 +4328,10 @@ packages: resolution: {integrity: sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==} dev: true + /json-parse-even-better-errors/2.3.1: + resolution: {integrity: sha1-fEeAWpQxmSjgV3dAXcEuH3pO4C0=} + dev: true + /json-schema-traverse/0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} dev: true @@ -3460,10 +4470,112 @@ packages: type-check: 0.4.0 dev: true + /lightningcss-darwin-arm64/1.19.0: + resolution: {integrity: sha1-VqsHHpMvhF27dmf0T1t4RBF1o0M=} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + dev: true + optional: true + + /lightningcss-darwin-x64/1.19.0: + resolution: {integrity: sha1-yGcwi4iFm6YaLEbIKxylL/c6G9A=} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + dev: true + optional: true + + /lightningcss-linux-arm-gnueabihf/1.19.0: + resolution: {integrity: sha1-D5IdxF8uXDrqcPq5iESsDl8vgb4=} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + dev: true + optional: true + + /lightningcss-linux-arm64-gnu/1.19.0: + resolution: {integrity: sha1-An+d+cf0/6Enw3pxcmJFpXlNe6I=} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + dev: true + optional: true + + /lightningcss-linux-arm64-musl/1.19.0: + resolution: {integrity: sha1-heqYfahoUk6sbblPjh6qI9C2iKM=} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + dev: true + optional: true + + /lightningcss-linux-x64-gnu/1.19.0: + resolution: {integrity: sha1-Ar7IlXmrQVPczA3vdV0f2ePufzw=} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + dev: true + optional: true + + /lightningcss-linux-x64-musl/1.19.0: + resolution: {integrity: sha1-42pd+Bk66WHSKXRjXkwQChgju4w=} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + dev: true + optional: true + + /lightningcss-win32-x64-msvc/1.19.0: + resolution: {integrity: sha1-CFTb0VMDXsoTluIifHCK1DZVphw=} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + dev: true + optional: true + + /lightningcss/1.19.0: + resolution: {integrity: sha1-+7rQl13mYlLjjZa1vdKmLy3Q/78=} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.19.0 + lightningcss-darwin-x64: 1.19.0 + lightningcss-linux-arm-gnueabihf: 1.19.0 + lightningcss-linux-arm64-gnu: 1.19.0 + lightningcss-linux-arm64-musl: 1.19.0 + lightningcss-linux-x64-gnu: 1.19.0 + lightningcss-linux-x64-musl: 1.19.0 + lightningcss-win32-x64-msvc: 1.19.0 + dev: true + /limiter/1.1.5: resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} dev: false + /lines-and-columns/1.2.4: + resolution: {integrity: sha1-7KKE910pZQeTCdwK2SVauy68FjI=} + dev: true + + /lmdb/2.5.2: + resolution: {integrity: sha1-N+KKn7Q0BfTcSMRM7A4ToUxKb/E=} + requiresBuild: true + dependencies: + msgpackr: 1.8.3 + node-addon-api: 4.3.0 + node-gyp-build-optional-packages: 5.0.3 + ordered-binary: 1.4.0 + weak-lru-cache: 1.2.2 + optionalDependencies: + '@lmdb/lmdb-darwin-arm64': 2.5.2 + '@lmdb/lmdb-darwin-x64': 2.5.2 + '@lmdb/lmdb-linux-arm': 2.5.2 + '@lmdb/lmdb-linux-arm64': 2.5.2 + '@lmdb/lmdb-linux-x64': 2.5.2 + '@lmdb/lmdb-win32-x64': 2.5.2 + dev: true + /load-json-file/4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -3622,6 +4734,10 @@ packages: is-buffer: 1.1.6 dev: true + /mdn-data/2.0.14: + resolution: {integrity: sha1-cRP8QoGRfWPOKbQ0RvcB5owlulA=} + dev: true + /media-typer/0.3.0: resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} @@ -3651,7 +4767,7 @@ packages: dev: false /micromatch/4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + resolution: {integrity: sha1-vImZp8u/d83InxMvbkZwUbSQkMY=} engines: {node: '>=8.6'} dependencies: braces: 3.0.2 @@ -3669,7 +4785,7 @@ packages: mime-db: 1.52.0 /mime/1.6.0: - resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + resolution: {integrity: sha1-Ms2eXGRVO9WNGaVor0Uqz/BJgbE=} engines: {node: '>=4'} hasBin: true dev: false @@ -3712,7 +4828,7 @@ packages: dev: true /minimist/1.2.7: - resolution: {integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==} + resolution: {integrity: sha1-2qHE2R9Qc5BDfGqLwBB45wAMTRg=} /mkdirp-classic/0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} @@ -3807,6 +4923,28 @@ packages: /ms/2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + /msgpackr-extract/3.0.0: + resolution: {integrity: sha1-W1xfv/8lvl7ltagqnL4C439yvtA=} + hasBin: true + requiresBuild: true + dependencies: + node-gyp-build-optional-packages: 5.0.7 + optionalDependencies: + '@msgpackr-extract/msgpackr-extract-darwin-arm64': 3.0.0 + '@msgpackr-extract/msgpackr-extract-darwin-x64': 3.0.0 + '@msgpackr-extract/msgpackr-extract-linux-arm': 3.0.0 + '@msgpackr-extract/msgpackr-extract-linux-arm64': 3.0.0 + '@msgpackr-extract/msgpackr-extract-linux-x64': 3.0.0 + '@msgpackr-extract/msgpackr-extract-win32-x64': 3.0.0 + dev: true + optional: true + + /msgpackr/1.8.3: + resolution: {integrity: sha1-eMG5E1n3Jwf0q+rKQMxCO9LXUYU=} + optionalDependencies: + msgpackr-extract: 3.0.0 + dev: true + /nanoid/3.1.20: resolution: {integrity: sha512-a1cQNyczgKbLX9jwbS/+d7W8fX/RfgYR7lVWwWOGIPNgK2m0MWvrGF6/m4kk6U3QcFMnZf3RIhL0v2Jgh/0Uxw==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3852,9 +4990,12 @@ packages: semver: 7.3.8 dev: false + /node-addon-api/3.2.1: + resolution: {integrity: sha1-gTJeCiEXeJwBKNq2Xn448HzroWE=} + dev: true + /node-addon-api/4.3.0: - resolution: {integrity: sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==} - dev: false + resolution: {integrity: sha1-UqGgtHUZPgko6Y4EJqDRJUeCt38=} /node-fetch/2.6.7: resolution: {integrity: sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==} @@ -3868,6 +5009,22 @@ packages: whatwg-url: 5.0.0 dev: false + /node-gyp-build-optional-packages/5.0.3: + resolution: {integrity: sha1-kqidQANSxErTl1AQNoBytBrWbBc=} + hasBin: true + dev: true + + /node-gyp-build-optional-packages/5.0.7: + resolution: {integrity: sha1-XSYyu94KsvbiLxu6whmbByRK4LM=} + hasBin: true + dev: true + optional: true + + /node-gyp-build/4.6.0: + resolution: {integrity: sha1-DFLky/VLvSi3CYIO97ajwtYgkFU=} + hasBin: true + dev: true + /node-preload/0.2.1: resolution: {integrity: sha512-RM5oyBy45cLEoHqCeh+MNuFAxO0vTFBLskvQbOKnEE7YTTSN4tbN8QWDIPQ6L+WvKsB/qLEGpYe2ZZ9d4W9OIQ==} engines: {node: '>=8'} @@ -3903,6 +5060,16 @@ packages: path-key: 2.0.1 dev: false + /nth-check/2.1.1: + resolution: {integrity: sha1-yeq0KO/842zWuSySS9sADvHx7R0=} + dependencies: + boolbase: 1.0.0 + dev: true + + /nullthrows/1.1.1: + resolution: {integrity: sha1-eBgliEOFaulx6uQgitfX6xmkMbE=} + dev: true + /nyc/15.1.0: resolution: {integrity: sha512-jMW04n9SxKdKi1ZMGhvUTHBN0EICCRkHemEoE5jm6mTYcqcdas0ATzgUgejlQUHMvpnOZqGB5Xxsv9KxJW1j8A==} engines: {node: '>=8.9'} @@ -3950,7 +5117,7 @@ packages: dev: false /object-inspect/1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + resolution: {integrity: sha1-wGQfJjlFMvKKuNeWq5VOQ8AJqOo=} /object-keys/1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} @@ -4058,6 +5225,10 @@ packages: word-wrap: 1.2.3 dev: true + /ordered-binary/1.4.0: + resolution: {integrity: sha1-a7U9RJJfO4r8M9Hu0PoVaTshE4k=} + dev: true + /p-cancelable/2.1.1: resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} engines: {node: '>=8'} @@ -4141,6 +5312,35 @@ packages: release-zalgo: 1.0.0 dev: true + /parcel/2.8.3: + resolution: {integrity: sha1-H/cdcxcnT9NnN5vHMQpSxrddMMI=} + engines: {node: '>= 12.0.0'} + hasBin: true + dependencies: + '@parcel/config-default': 2.8.3_@parcel+core@2.8.3 + '@parcel/core': 2.8.3 + '@parcel/diagnostic': 2.8.3 + '@parcel/events': 2.8.3 + '@parcel/fs': 2.8.3_@parcel+core@2.8.3 + '@parcel/logger': 2.8.3 + '@parcel/package-manager': 2.8.3_@parcel+core@2.8.3 + '@parcel/reporter-cli': 2.8.3_@parcel+core@2.8.3 + '@parcel/reporter-dev-server': 2.8.3_@parcel+core@2.8.3 + '@parcel/utils': 2.8.3 + chalk: 4.1.2 + commander: 7.2.0 + get-port: 4.2.0 + v8-compile-cache: 2.3.0 + transitivePeerDependencies: + - cssnano + - postcss + - purgecss + - relateurl + - srcset + - terser + - uncss + dev: true + /parent-module/1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -4156,6 +5356,16 @@ packages: json-parse-better-errors: 1.0.2 dev: true + /parse-json/5.2.0: + resolution: {integrity: sha1-x2/Gbe5UIxyWKyK8yKcs8vmXU80=} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.18.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + dev: true + /parseurl/1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -4206,7 +5416,7 @@ packages: dev: true /path-type/4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + resolution: {integrity: sha1-hO0BwKe6OAr+CdkKjBgNzZ0DBDs=} engines: {node: '>=8'} dev: true @@ -4222,7 +5432,7 @@ packages: dev: true /picomatch/2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + resolution: {integrity: sha1-O6ODNzNkbZ0+SZWUbBNlpn+wekI=} engines: {node: '>=8.6'} /pify/3.0.0: @@ -4243,6 +5453,45 @@ packages: find-up: 2.1.0 dev: true + /playwright-core/1.31.1: + resolution: {integrity: sha1-Te7ru4+3O1Elk/4kvqIG2P2F/38=} + engines: {node: '>=14'} + hasBin: true + dev: true + + /postcss-value-parser/4.2.0: + resolution: {integrity: sha1-cjwJkgg2um0+WvAZ+SvAlxwC5RQ=} + dev: true + + /posthtml-parser/0.10.2: + resolution: {integrity: sha1-3zZNexefKmvwRmtWvnuY/U6XxXM=} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-parser/0.11.0: + resolution: {integrity: sha1-JdHHv4EeqDVZvEwhwYmil0eiS3o=} + engines: {node: '>=12'} + dependencies: + htmlparser2: 7.2.0 + dev: true + + /posthtml-render/3.0.0: + resolution: {integrity: sha1-l75EkxSW9JW08HuZ6QPMcK1qMgU=} + engines: {node: '>=12'} + dependencies: + is-json: 2.0.1 + dev: true + + /posthtml/0.16.6: + resolution: {integrity: sha1-4vxAf2emTS+jVnr+dwQJ/9ra/lk=} + engines: {node: '>=12.0.0'} + dependencies: + posthtml-parser: 0.11.0 + posthtml-render: 3.0.0 + dev: true + /prebuild-install/7.1.1: resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} engines: {node: '>=10'} @@ -4274,6 +5523,11 @@ packages: fromentries: 1.3.2 dev: true + /process/0.11.10: + resolution: {integrity: sha1-czIwDoQBYb2j5podHZGn1LwW8YI=} + engines: {node: '>= 0.6.0'} + dev: true + /progress/2.0.3: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} @@ -4364,7 +5618,7 @@ packages: dev: false /qs/6.11.0: - resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + resolution: {integrity: sha1-/Q2WNEb3pl4TZ+AavYVClFPww3o=} engines: {node: '>=0.6'} dependencies: side-channel: 1.0.4 @@ -4408,10 +5662,19 @@ packages: strip-json-comments: 2.0.1 dev: false + /react-error-overlay/6.0.9: + resolution: {integrity: sha1-PHQwEMk1lgjDdezWvHbzXZOZWwo=} + dev: true + /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} dev: true + /react-refresh/0.9.0: + resolution: {integrity: sha1-cYYzN63D5cL4pr/d0Srjv+Mqr78=} + engines: {node: '>=0.10.0'} + dev: true + /read-pkg-up/3.0.0: resolution: {integrity: sha512-YFzFrVvpC6frF1sz8psoHDBGF7fLPc+llq/8NB43oagqWkx8ar5zYtsTORtOjw9W2RHLpWP+zTWwBvf1bCmcSw==} engines: {node: '>=4'} @@ -4456,7 +5719,7 @@ packages: dev: true /regenerator-runtime/0.13.11: - resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + resolution: {integrity: sha1-9tyj587sIFkNB62nhWNqkM3KF/k=} dev: true /regexp.prototype.flags/1.4.3: @@ -4598,7 +5861,7 @@ packages: dev: true /safer-buffer/2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + resolution: {integrity: sha1-RPoWGwGHuVSd2Eu5GAL5vYOFzWo=} dev: false /semver-compare/1.0.0: @@ -4607,7 +5870,7 @@ packages: optional: true /semver/5.7.1: - resolution: {integrity: sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==} + resolution: {integrity: sha1-qVT5Ma66UI0we78Gnv8MAclhFvc=} hasBin: true /semver/6.3.0: @@ -4715,7 +5978,7 @@ packages: dev: true /side-channel/1.0.4: - resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + resolution: {integrity: sha1-785cj9wQTudRslxY1CkAEfpeos8=} dependencies: call-bind: 1.0.2 get-intrinsic: 1.1.3 @@ -4814,6 +6077,15 @@ packages: dev: true optional: true + /srcset/4.0.0: + resolution: {integrity: sha1-M2gWtmWxTNATulRbb+YjV/huZfQ=} + engines: {node: '>=12'} + dev: true + + /stable/0.1.8: + resolution: {integrity: sha1-g26zyDgv4pNv6vVEYxAXzn1Ho88=} + dev: true + /statuses/2.0.1: resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} engines: {node: '>= 0.8'} @@ -4935,7 +6207,7 @@ packages: dev: true /supports-color/7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + resolution: {integrity: sha1-G33NyzK4E4gBs+R4umpRyqiWSNo=} engines: {node: '>=8'} dependencies: has-flag: 4.0.0 @@ -4951,6 +6223,20 @@ packages: engines: {node: '>= 0.4'} dev: true + /svgo/2.8.0: + resolution: {integrity: sha1-T/gMzmcQ3CeV8MfHQQHmdkz8zSQ=} + engines: {node: '>=10.13.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 4.3.0 + css-tree: 1.1.3 + csso: 4.2.0 + picocolors: 1.0.0 + stable: 0.1.8 + dev: true + /table/6.8.1: resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==} engines: {node: '>=10.0.0'} @@ -4982,6 +6268,22 @@ packages: readable-stream: 3.6.0 dev: false + /term-size/2.2.1: + resolution: {integrity: sha1-KmpUhAQywvtjIP6g9BVTHpAYn1Q=} + engines: {node: '>=8'} + dev: true + + /terser/5.16.5: + resolution: {integrity: sha1-HChcoGVfRn+Srxu6tGq3LRywjlo=} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.2 + acorn: 8.8.2 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: true + /test-exclude/6.0.0: resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} engines: {node: '>=8'} @@ -5000,7 +6302,7 @@ packages: dev: false /timsort/0.3.0: - resolution: {integrity: sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==} + resolution: {integrity: sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=} dev: true /to-fast-properties/2.0.0: @@ -5009,7 +6311,7 @@ packages: dev: true /to-regex-range/5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + resolution: {integrity: sha1-FkjESq58jZiKMmAY7XL1tN0DkuQ=} engines: {node: '>=8.0'} dependencies: is-number: 7.0.0 @@ -5041,6 +6343,10 @@ packages: resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} dev: true + /tslib/2.5.0: + resolution: {integrity: sha1-Qr/thvV4eutB0DGGbI9AJCng/d8=} + dev: true + /tsutils/3.21.0_typescript@4.3.5: resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} engines: {node: '>= 6'} @@ -5208,6 +6514,11 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} dev: false + /utility-types/3.10.0: + resolution: {integrity: sha1-6kFI+adBAV8F7XT9YV4dIOa+2Cs=} + engines: {node: '>= 4'} + dev: true + /utils-merge/1.0.1: resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} @@ -5252,6 +6563,10 @@ packages: resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} dev: true + /weak-lru-cache/1.2.2: + resolution: {integrity: sha1-/btnQfNrrpVA0S9IDOglQGDczRk=} + dev: true + /webidl-conversions/3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -5386,6 +6701,10 @@ packages: resolution: {integrity: sha512-huCv9IH9Tcf95zuYCsQraZtWnJvBtLVE0QHMOs8bWyZAFZNDcYjsPq1nEx8jKA9y+Beo9v+7OBPRisQTjinQMw==} dev: true + /xxhash-wasm/0.4.2: + resolution: {integrity: sha1-dSOYwTGk3UB7UTK6Yq03ICm+b3k=} + dev: true + /y18n/4.0.3: resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} dev: true @@ -5405,6 +6724,11 @@ packages: /yallist/4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + /yaml/1.10.2: + resolution: {integrity: sha1-IwHF/78StGfejaIzOkWeKeeSDks=} + engines: {node: '>= 6'} + dev: true + /yargs-parser/18.1.3: resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} engines: {node: '>=6'} diff --git a/packages/browser/.env.example b/packages/browser/.env.example new file mode 100644 index 00000000..437064eb --- /dev/null +++ b/packages/browser/.env.example @@ -0,0 +1,7 @@ +# for integration tests + +IMJS_TEST_REGULAR_USER_NAME="" +IMJS_TEST_REGULAR_USER_PASSWORD="" +ITJS_AUTH_CLIENTS_BROWSER_BASE_URL = "" +ITJS_AUTH_CLIENTS_BROWSER_CLIENT_ID = "" +IMJS_URL_PREFIX = "" \ No newline at end of file diff --git a/packages/browser/.npmignore b/packages/browser/.npmignore index 63a761c5..fc5ce207 100644 --- a/packages/browser/.npmignore +++ b/packages/browser/.npmignore @@ -5,3 +5,4 @@ !lib/**/*.js !lib/**/*.js.map !*.md +lib/**/*test*/**/* \ No newline at end of file diff --git a/packages/browser/README.md b/packages/browser/README.md index d8321083..899750dd 100644 --- a/packages/browser/README.md +++ b/packages/browser/README.md @@ -4,8 +4,19 @@ Copyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md ## Description -The __@itwin/browser-authorization__ package contains a browser based client for authorization with the iTwin platform. +The **@itwin/browser-authorization** package contains a browser based client for authorization with the iTwin platform. ## Documentation For information about the browser authorization workflow please visit the [Authorization Overview Page](https://developer.bentley.com/apis/overview/authorization/#authorizingwebapplications). + +## Running integration tests + +- Ensure you've run `rush update` (or `rush install`) and `rush build` +- Install playwright binaries - `npx install playwright` +- Create an .env file based on .env.example - ask Arun G or Ben P for the values. +- `rush test:integration` will run integration tests for the entire repo. +- `rushx test:integration` runs the tests only in the Browser package. +- Playwright options are in playwright.config.ts (head-ful vs headless, timeouts, etc). +- The tests start the /test-app using parcel before running. +- To run only the test app: `rushx test:integration:start-test-app` and access localhost:1234 in your browser. diff --git a/packages/browser/package.json b/packages/browser/package.json index d3d55e90..37efbc1a 100644 --- a/packages/browser/package.json +++ b/packages/browser/package.json @@ -13,6 +13,8 @@ "lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2", "lint:fix": "npm run lint -- --fix", "test": "mocha \"./lib/cjs/test/**/*.test.js\"", + "test:integration:start-test-app": "parcel src/integration-tests/test-app/index.html", + "test:integration": "playwright test src/integration-tests", "cover": "nyc npm test", "pack": "npm pack", "rebuild": "npm run clean && npm run build" @@ -34,16 +36,21 @@ "@itwin/core-bentley": "^3.0.0", "@itwin/core-common": "^3.0.0", "@itwin/eslint-plugin": "^3.0.0", + "@playwright/test": "~1.31.1", "@types/chai": "^4.2.22", "@types/mocha": "^8.2.3", "@types/node": "14.14.31", "@types/sinon": "^10.0.13", + "buffer": "~6.0.3", "chai": "^4.2.22", + "dotenv": "~16.0.3", + "eslint": "^7.32.0", "mocha": "^8.2.3", "nyc": "^15.1.0", - "sinon": "^15.0.1", - "eslint": "^7.32.0", + "parcel": "~2.8.3", + "process": "~0.11.10", "rimraf": "^3.0.2", + "sinon": "^15.0.1", "typescript": "~4.3.5" }, "peerDependencies": { diff --git a/packages/browser/playwright.config.ts b/packages/browser/playwright.config.ts new file mode 100644 index 00000000..6310d969 --- /dev/null +++ b/packages/browser/playwright.config.ts @@ -0,0 +1,21 @@ +import { defineConfig } from "@playwright/test"; + +// playwright types here are... not cooperating +const reporter: any = process.env.AGENT_ID + ? [ + ["junit", { outputFile: "junit_results.xml" }], + ["dot", []], + ] + : "list"; + +export default defineConfig({ + timeout: 30000, + webServer: { + command: "npm run test:integration:start-test-app", + url: "http://localhost:1234", + }, + reporter, + use: { + screenshot: "only-on-failure", + }, +}); diff --git a/packages/browser/src/integration-tests/helpers/TestHelper.ts b/packages/browser/src/integration-tests/helpers/TestHelper.ts new file mode 100644 index 00000000..595e772d --- /dev/null +++ b/packages/browser/src/integration-tests/helpers/TestHelper.ts @@ -0,0 +1,69 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { expect } from "@playwright/test"; +import type { Page } from "@playwright/test"; +import { User } from "oidc-client-ts"; +import { AuthType } from "../types"; +import type { SignInOptions } from "../types"; + +export class TestHelper { + constructor(private _signInOptions: SignInOptions) {} + + public async signIn(page: Page) { + await page.getByLabel("Email address").fill(this._signInOptions.email); + await page.getByLabel("Email address").press("Enter"); + await page.getByLabel("Password").fill(this._signInOptions.password); + await page.getByText("Sign In").click(); + + const url = page.url(); + if (url.endsWith("resume/as/authorization.ping")) { + await this.handleConsentScreen(page); + } + } + + public async getUserFromLocalStorage(page: Page): Promise { + const storageState = await page.context().storageState(); + const localStorage = storageState.origins.find( + (o) => o.origin === this._signInOptions.url + )?.localStorage; + + if (!localStorage) + throw new Error( + `Could not find local storage for origin: ${this._signInOptions.url}` + ); + + const user = localStorage.find((s) => s.name.startsWith("oidc.user")); + + if (!user) + throw new Error("Could not find user in localStorage"); + + return User.fromStorageString(user.value); + } + + public async validateAuthenticated( + page: Page, + authType: AuthType = AuthType.Redirect + ) { + const locator = page.getByTestId("content"); + await expect(locator).toContainText("Authorized"); + const user = await this.getUserFromLocalStorage(page); + expect(user.access_token).toBeDefined(); + + let url = `${this._signInOptions.url}/`; + if (authType === AuthType.PopUp) + url += "signin-via-popup"; + + expect(page.url()).toEqual(url); + } + + private async handleConsentScreen(page: Page) { + const consentAcceptButton = page.getByRole("link", { + name: "Accept", + }); + if (consentAcceptButton) + await consentAcceptButton.click(); + } +} diff --git a/packages/browser/src/integration-tests/helpers/loadConfig.ts b/packages/browser/src/integration-tests/helpers/loadConfig.ts new file mode 100644 index 00000000..72f98454 --- /dev/null +++ b/packages/browser/src/integration-tests/helpers/loadConfig.ts @@ -0,0 +1,30 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +// eslint@typescript-eslint/naming-convention +import { config } from "dotenv"; + +export function loadConfig() { + config(); + + if ( + !process.env.IMJS_TEST_REGULAR_USER_NAME || + !process.env.IMJS_TEST_REGULAR_USER_PASSWORD || + !process.env.ITJS_AUTH_CLIENTS_BROWSER_BASE_URL || + !process.env.ITJS_AUTH_CLIENTS_BROWSER_CLIENT_ID + ) { + throw new Error( + "Please expose IMJS_TEST_REGULAR_USER_NAME, IMJS_TEST_REGULAR_USER_PASSWORD, BASE_URL, and CLIENT_ID as env variables" + ); + } + + return { + email: process.env.IMJS_TEST_REGULAR_USER_NAME, + password: process.env.IMJS_TEST_REGULAR_USER_PASSWORD, + url: process.env.ITJS_AUTH_CLIENTS_BROWSER_BASE_URL, + clientId: process.env.ITJS_AUTH_CLIENTS_BROWSER_CLIENT_ID, + envPrefix: process.env.IMJS_URL_PREFIX || "", + }; +} diff --git a/packages/browser/src/integration-tests/integration.test.ts b/packages/browser/src/integration-tests/integration.test.ts new file mode 100644 index 00000000..55285f25 --- /dev/null +++ b/packages/browser/src/integration-tests/integration.test.ts @@ -0,0 +1,80 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { expect, test } from "@playwright/test"; +import { TestHelper } from "./helpers/TestHelper"; +import { AuthType } from "./types"; +import type { SignInOptions } from "./types"; +import { loadConfig } from "./helpers/loadConfig"; + +const { url, clientId, envPrefix, email, password } = loadConfig(); + +const signInOptions: SignInOptions = { + email, + password, + url, + clientId, + envPrefix: envPrefix || "", +}; + +const testHelper = new TestHelper(signInOptions); + +test("signin redirect", async ({ page }) => { + await page.goto(signInOptions.url); + await testHelper.signIn(page); + await page.waitForURL(signInOptions.url); + + await testHelper.validateAuthenticated(page); +}); + +test("signout redirect", async ({ page }) => { + await page.goto(signInOptions.url); + await testHelper.signIn(page); + await page.waitForURL(signInOptions.url); + + const locator = page.getByTestId("signout-button"); + await locator.click(); + + const content = page.getByText("Sign Off Successful"); + expect(content).toBeDefined(); + + // Cannot get the below working on QA... + // We'll have to settle for the above check + // await expect(content).toContainText("Signed Out!"); + // const user = await testHelper.getUserFromLocalStorage(page); + // expect(user).not.toBeDefined(); +}); + +test("signin popup", async ({ page }) => { + await page.goto(`${signInOptions.url}/signin-via-popup`); + const popupPromise = page.waitForEvent("popup"); + const el = page.getByText("Signin via Popup"); + await el.click(); + const popup = await popupPromise; + await popup.waitForLoadState(); + await testHelper.signIn(popup); + await popup.waitForEvent("close"); + await testHelper.validateAuthenticated(page, AuthType.PopUp); +}); + +test("signout popup", async ({ page }) => { + await page.goto(`${signInOptions.url}/signin-via-popup`); + const popupPromise = page.waitForEvent("popup"); + const el = page.getByText("Signin via Popup"); + await el.click(); + const popup = await popupPromise; + await popup.waitForLoadState(); + await testHelper.signIn(popup); + await popup.waitForEvent("close"); + await testHelper.validateAuthenticated(page, AuthType.PopUp); + + const signoutPopupPromise = page.waitForEvent("popup"); + const locator = page.getByTestId("signout-button-popup"); + await locator.click(); + const signOutPopup = await signoutPopupPromise; + + const content = signOutPopup.getByText("Sign Off Successful"); + expect(content).toBeDefined(); +}); diff --git a/packages/browser/src/integration-tests/test-app/index.html b/packages/browser/src/integration-tests/test-app/index.html new file mode 100644 index 00000000..a5aa7cd3 --- /dev/null +++ b/packages/browser/src/integration-tests/test-app/index.html @@ -0,0 +1,18 @@ + + + + + + + + @iTwin/auth-clients browser integration tests + + +
Unauthorized
+ + + + diff --git a/packages/browser/src/integration-tests/test-app/index.ts b/packages/browser/src/integration-tests/test-app/index.ts new file mode 100644 index 00000000..c08de54a --- /dev/null +++ b/packages/browser/src/integration-tests/test-app/index.ts @@ -0,0 +1,111 @@ +/*--------------------------------------------------------------------------------------------- + * Copyright (c) Bentley Systems, Incorporated. All rights reserved. + * See LICENSE.md in the project root for license terms and full copyright notice. + *--------------------------------------------------------------------------------------------*/ + +import { + BrowserAuthorizationCallbackHandler, +} from "../../CallbackHandler"; +import { BrowserAuthorizationClient } from "../../Client"; + +const oidcCallbackUrl = `${process.env.ITJS_AUTH_CLIENTS_BROWSER_BASE_URL}/oidc-callback`; +const authority = `https://${process.env.IMJS_URL_PREFIX}ims.bentley.com`; +const client = new BrowserAuthorizationClient({ + clientId: process.env.ITJS_AUTH_CLIENTS_BROWSER_CLIENT_ID!, + redirectUri: oidcCallbackUrl, + scope: "itwins:read projects:read itwins:modify projects:modify users:read", + authority, + postSignoutRedirectUri: "", + responseType: "code", + silentRedirectUri: oidcCallbackUrl, +}); + +const contentArea = document.querySelector("div[data-testid='content']"); + +async function initialize() { + if (isSignoutPage()) { + if (contentArea) + contentArea.textContent = "Signed Out!"; + } else if (isSigninViaPopupPage()) { + const popupButton = document.getElementById("popup"); + if (popupButton) + popupButton.addEventListener("click", async () => { + await client.signInPopup(); + await client.signInSilent(); // effectively loads the current user. + popupButton.parentElement?.removeChild(popupButton); + await validateAuthenticated(); + }); + } else if (!isOidcCallbackPage()) { + await authenticateRedirect(); + } + + if (isOidcCallbackPage()) { + await BrowserAuthorizationCallbackHandler.handleSigninCallback({ + clientId: process.env.ITJS_AUTH_CLIENTS_BROWSER_CLIENT_ID!, + redirectUri: oidcCallbackUrl, + authority, + responseMode: "query", + }); + } +} + +async function authenticateRedirect() { + try { + await client.signInSilent(); + } catch (err) { + await client.signInRedirect(); + } + await validateAuthenticated(); +} + +async function validateAuthenticated() { + try { + await client.getAccessToken(); + displayAuthorized(); + } catch (error) { + // eslint-disable-next-line no-console + console.log("issue getting access token after non interactive signin"); + } +} + +async function signout(popup: boolean) { + if (popup) + await client.signOutPopup(); + else + await client.signOutRedirect(); +} + +function displayAuthorized() { + if (contentArea) { + contentArea.textContent = "Authorized!"; + + appendButton(contentArea, "Signout", "signout-button"); + appendButton(contentArea, "Signout Popup", "signout-button-popup", true); + } +} + +function appendButton(parent: Element, text: string, testId: string, popup: boolean = false){ + const button = document.createElement("button"); + button.textContent = text; + button.setAttribute("data-testid", testId); + button.addEventListener("click", async () => { + await signout(popup); + }); + parent.appendChild(button); +} + +function isSignoutPage() { + return window.location.href.includes("signout"); +} + +function isSigninViaPopupPage() { + return window.location.href.includes("signin-via-popup"); +} + +function isOidcCallbackPage() { + return window.location.href.includes("oidc-callback"); +} + +void initialize().then(() => { + // Finished +}); diff --git a/packages/browser/src/integration-tests/types.ts b/packages/browser/src/integration-tests/types.ts new file mode 100644 index 00000000..9e12ad35 --- /dev/null +++ b/packages/browser/src/integration-tests/types.ts @@ -0,0 +1,12 @@ +export interface SignInOptions { + email: string; + password: string; + url: string; + clientId: string; + envPrefix: string; +} + +export enum AuthType { + Redirect, + PopUp, +}