diff --git a/.github/workflows/build_test_deploy.yml b/.github/workflows/build_test_deploy.yml index d74d4da95102b..0d6149ba67b81 100644 --- a/.github/workflows/build_test_deploy.yml +++ b/.github/workflows/build_test_deploy.yml @@ -347,35 +347,6 @@ jobs: - run: xvfb-run node run-tests.js test/integration/with-electron/test/index.test.js if: ${{needs.build.outputs.docsChange != 'docs only change'}} - testYarnPnP: - runs-on: ubuntu-latest - needs: [build, build-native-dev] - env: - NODE_OPTIONS: '--unhandled-rejections=strict' - YARN_COMPRESSION_LEVEL: '0' - steps: - - name: Setup node - uses: actions/setup-node@v2 - if: ${{ steps.docs-change.outputs.docsChange != 'docs only change' }} - with: - node-version: 14 - - - uses: actions/cache@v2 - if: ${{needs.build.outputs.docsChange != 'docs only change'}} - id: restore-build - with: - path: ./* - key: ${{ github.sha }}-${{ github.run_number }}-${{ github.run_attempt }} - - - uses: actions/download-artifact@v2 - if: ${{needs.build.outputs.docsChange != 'docs only change'}} - with: - name: next-swc-dev-binary - path: packages/next-swc/native - - - run: bash ./scripts/test-pnp.sh - if: ${{needs.build.outputs.docsChange != 'docs only change'}} - testsPass: name: thank you, next runs-on: ubuntu-latest @@ -387,7 +358,6 @@ jobs: checkPrecompiled, testIntegration, testUnit, - testYarnPnP, testDev, testProd, ] diff --git a/contributing.md b/contributing.md index 041321c789898..1fd1133aee776 100644 --- a/contributing.md +++ b/contributing.md @@ -6,10 +6,9 @@ examples](#adding-examples)** below. ## Developing -The development branch is `canary`, and this is the branch that all pull -requests should be made against. After publishing a stable release, the changes -in the `canary` branch are rebased into `master`. The changes on the `canary` -branch are published to the `@canary` dist-tag daily. +The development branch is `canary`. This is the branch that all pull +requests should be made against. The changes on the `canary` +branch are published to the `@canary` tag on npm regularly. To develop locally: diff --git a/docs/advanced-features/compiler.md b/docs/advanced-features/compiler.md index 58b540ebf725c..ac07f30fe24c1 100644 --- a/docs/advanced-features/compiler.md +++ b/docs/advanced-features/compiler.md @@ -94,6 +94,34 @@ const customJestConfig = { module.exports = createJestConfig(customJestConfig) ``` +### Remove React Properties + +Allows to remove JSX properties. This is often used for testing. Similar to `babel-plugin-react-remove-properties`. + +To remove properties matching the default regex `^data-test`: + +```js +// next.config.js +module.exports = { + experimental: { + reactRemoveProperties: true, + }, +} +``` + +To remove custom properties: + +```js +// next.config.js +module.exports = { + experimental: { + // The regexes defined here are processed in Rust so the syntax is different from + // JavaScript `RegExp`s. See https://docs.rs/regex. + reactRemoveProperties: { properties: ['^data-custom$'] }, + }, +} +``` + ### Legacy Decorators Next.js will automatically detect `experimentalDecorators` in `jsconfig.json` or `tsconfig.json` and apply that. This is commonly used with older versions of libraries like `mobx`. @@ -110,6 +138,34 @@ First, update to the latest version of Next.js: `npm install next@latest`. Then, } ``` +### Remove Console + +This transform allows for removing all `console.*` calls in application code (not `node_modules`). Similar to `babel-plugin-transform-remove-console`. + +Remove all `console.*` calls: + +```js +// next.config.js +module.exports = { + experimental: { + removeConsole: true, + }, +} +``` + +Remove `console.*` output except `console.error`: + +```js +// next.config.js +module.exports = { + experimental: { + removeConsole: { + exclude: ['error'], + }, + }, +} +``` + ### importSource Next.js will automatically detect `jsxImportSource` in `jsconfig.json` or `tsconfig.json` and apply that. This is commonly used with libraries like Theme UI. diff --git a/docs/advanced-features/security-headers.md b/docs/advanced-features/security-headers.md index c51718bdcb08e..9a3165c0e9ead 100644 --- a/docs/advanced-features/security-headers.md +++ b/docs/advanced-features/security-headers.md @@ -18,7 +18,7 @@ module.exports = { return [ { // Apply these headers to all routes in your application. - source: '/(.*)', + source: '/:path*', headers: securityHeaders, }, ] diff --git a/docs/api-reference/next/script.md b/docs/api-reference/next/script.md index 49fe558c6b163..79c83341f8876 100644 --- a/docs/api-reference/next/script.md +++ b/docs/api-reference/next/script.md @@ -46,6 +46,8 @@ The loading strategy of the script. A method that returns additional JavaScript that should be executed after the script has finished loading. +> **Note: `onLoad` can't be used with the `beforeInteractive` loading strategy.** + The following is an example of how to use the `onLoad` property: ```jsx diff --git a/errors/export-image-api.md b/errors/export-image-api.md index dae959c90dcaf..caedb06791479 100644 --- a/errors/export-image-api.md +++ b/errors/export-image-api.md @@ -2,7 +2,7 @@ #### Why This Error Occurred -You are attempting to run `next export` while importing the `next/image` component configured using the default `loader`. +You are attempting to run `next export` while importing the `next/image` component using the default `loader` configuration. However, the default `loader` relies on the Image Optimization API which is not available for exported applications. @@ -10,15 +10,15 @@ This is because Next.js optimizes images on-demand, as users request them (not a #### Possible Ways to Fix It -- Use `next start` to run a server, which includes the Image Optimization API. -- Use any provider which supports Image Optimization (like [Vercel](https://vercel.com/docs/next.js/image-optimization)). -- Configure a third-party [loader](https://nextjs.org/docs/basic-features/image-optimization#loader) in `next.config.js`. -- Use the [`loader`](https://nextjs.org/docs/api-reference/next/image#loader) prop for `next/image`. +- Use [`next start`](https://nextjs.org/docs/api-reference/cli#production) to run a server, which includes the Image Optimization API. +- Use any provider which supports Image Optimization (such as [Vercel](https://vercel.com)). +- [Configure the loader](https://nextjs.org/docs/api-reference/next/image#loader-configuration) in `next.config.js`. +- Use the [`loader`](https://nextjs.org/docs/api-reference/next/image#loader) prop for each instance of `next/image`. ### Useful Links -- [Deployment Documentation](https://nextjs.org/docs/deployment#vercel-recommended) +- [Deployment Documentation](https://nextjs.org/docs/deployment#managed-nextjs-with-vercel) - [Image Optimization Documentation](https://nextjs.org/docs/basic-features/image-optimization) - [`next export` Documentation](https://nextjs.org/docs/advanced-features/static-html-export) - [`next/image` Documentation](https://nextjs.org/docs/api-reference/next/image) -- [Vercel Documentation](https://vercel.com/docs/next.js/image-optimization) +- [Vercel Documentation](https://vercel.com/docs/concepts/next.js/image-optimization) diff --git a/examples/blog-starter/package.json b/examples/blog-starter/package.json index 1e6a6ae24c82c..fed5332dfbe15 100644 --- a/examples/blog-starter/package.json +++ b/examples/blog-starter/package.json @@ -13,7 +13,7 @@ "react": "^17.0.2", "react-dom": "^17.0.2", "remark": "13.0.0", - "remark-html": "13.0.1" + "remark-html": "13.0.2" }, "devDependencies": { "autoprefixer": "^10.4.0", diff --git a/examples/with-supabase-auth-realtime-db/package.json b/examples/with-supabase-auth-realtime-db/package.json index 09e60a1f263f5..d09d6caf0e1dd 100644 --- a/examples/with-supabase-auth-realtime-db/package.json +++ b/examples/with-supabase-auth-realtime-db/package.json @@ -7,10 +7,10 @@ }, "dependencies": { "@supabase/supabase-js": "^1.2.1", - "@supabase/ui": "^0.6.1", + "@supabase/ui": "^0.36.2", "next": "latest", "react": "^17.0.2", "react-dom": "^17.0.2", - "swr": "0.2.3" + "swr": "1.1.2" } } diff --git a/lerna.json b/lerna.json index 7ad8784a0b0fd..d161466be92b5 100644 --- a/lerna.json +++ b/lerna.json @@ -16,5 +16,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "12.0.8" + "version": "12.0.9-canary.0" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index a9e734cb8f24d..6ea0bb6aeb2aa 100644 --- a/packages/create-next-app/package.json +++ b/packages/create-next-app/package.json @@ -1,6 +1,6 @@ { "name": "create-next-app", - "version": "12.0.8", + "version": "12.0.9-canary.0", "keywords": [ "react", "next", diff --git a/packages/eslint-config-next/package.json b/packages/eslint-config-next/package.json index 0ab87c3a9fd6e..7711ae008e6c7 100644 --- a/packages/eslint-config-next/package.json +++ b/packages/eslint-config-next/package.json @@ -1,6 +1,6 @@ { "name": "eslint-config-next", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "ESLint configuration used by NextJS.", "main": "index.js", "license": "MIT", @@ -9,7 +9,7 @@ "directory": "packages/eslint-config-next" }, "dependencies": { - "@next/eslint-plugin-next": "12.0.8", + "@next/eslint-plugin-next": "12.0.9-canary.0", "@rushstack/eslint-patch": "^1.0.8", "@typescript-eslint/parser": "^5.0.0", "eslint-import-resolver-node": "^0.3.4", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index ec7c69977f263..82d7351e4aca9 100644 --- a/packages/eslint-plugin-next/package.json +++ b/packages/eslint-plugin-next/package.json @@ -1,6 +1,6 @@ { "name": "@next/eslint-plugin-next", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "ESLint plugin for NextJS.", "main": "lib/index.js", "license": "MIT", diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index deddc3d78fba5..d50bd70cf7f9a 100644 --- a/packages/next-bundle-analyzer/package.json +++ b/packages/next-bundle-analyzer/package.json @@ -1,6 +1,6 @@ { "name": "@next/bundle-analyzer", - "version": "12.0.8", + "version": "12.0.9-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index 43d1a6f8ec1cf..2140330310ce4 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "12.0.8", + "version": "12.0.9-canary.0", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index c662fc293a015..0a671f7bc75fb 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "12.0.8", + "version": "12.0.9-canary.0", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index 1565ef3139fe2..b610462cd9514 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "12.0.8", + "version": "12.0.9-canary.0", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 1c46fa1ccf542..058f55304176d 100644 --- a/packages/next-plugin-storybook/package.json +++ b/packages/next-plugin-storybook/package.json @@ -1,6 +1,6 @@ { "name": "@next/plugin-storybook", - "version": "12.0.8", + "version": "12.0.9-canary.0", "repository": { "url": "vercel/next.js", "directory": "packages/next-plugin-storybook" diff --git a/packages/next-polyfill-module/package.json b/packages/next-polyfill-module/package.json index 0001eceb52051..82f802743d70f 100644 --- a/packages/next-polyfill-module/package.json +++ b/packages/next-polyfill-module/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-module", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "A standard library polyfill for ES Modules supporting browsers (Edge 16+, Firefox 60+, Chrome 61+, Safari 10.1+)", "main": "dist/polyfill-module.js", "license": "MIT", diff --git a/packages/next-polyfill-nomodule/package.json b/packages/next-polyfill-nomodule/package.json index de645743cfd89..35b7d12b74f8c 100644 --- a/packages/next-polyfill-nomodule/package.json +++ b/packages/next-polyfill-nomodule/package.json @@ -1,6 +1,6 @@ { "name": "@next/polyfill-nomodule", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next-swc/Cargo.lock b/packages/next-swc/Cargo.lock index 69e5bb882a8f6..b17955ae4c704 100644 --- a/packages/next-swc/Cargo.lock +++ b/packages/next-swc/Cargo.lock @@ -588,9 +588,9 @@ dependencies = [ [[package]] name = "is-macro" -version = "0.1.9" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a322dd16d960e322c3d92f541b4c1a4f0a2e81e1fdeee430d8cecc8b72e8015f" +checksum = "94b2c46692aee0d1b3aad44e781ac0f0e7db42ef27adaa0a877b627040019813" dependencies = [ "Inflector", "pmutil", @@ -1578,9 +1578,9 @@ checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "styled_components" -version = "0.9.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03481b5475b58a779b5a01a1a4d73af4cd4a558293a8f63013dc13ded66858ad" +checksum = "a1f35439f191ee7605b2d07d3e9de27d5bb2059a92bb9b25c83724ba51bd0192" dependencies = [ "Inflector", "once_cell", @@ -1594,9 +1594,9 @@ dependencies = [ [[package]] name = "swc" -version = "0.110.0" +version = "0.114.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28fbf5ca7965aa18b1da211c28ad9b0e7c27c9b4fdcaa5f0f462d838a300bd20" +checksum = "80324824bb4f2b00fbcf224bd03981f0d48b73dcd9e72290664bb99dd03de9d8" dependencies = [ "ahash", "anyhow", @@ -1645,9 +1645,9 @@ dependencies = [ [[package]] name = "swc_bundler" -version = "0.98.0" +version = "0.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c259a985448bbb72521da3a4fdbe664980e055a422214fe871a428fb7091068" +checksum = "7e4ba80b219e651c3eeb830abc7caa391e55c9ff1fd4370e5723a2cbd752ea93" dependencies = [ "ahash", "anyhow", @@ -1679,9 +1679,9 @@ dependencies = [ [[package]] name = "swc_common" -version = "0.16.1" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "df9aa1afd061fdc6e73c8dd0a0cd3bc4c36f1e40e61427a7033f2e9b70ce2269" +checksum = "015b0c14152981b1590d05c6073ac602008e5fc414b7cc4b2bbae60220d27ff2" dependencies = [ "ahash", "ast_node", @@ -1709,9 +1709,9 @@ dependencies = [ [[package]] name = "swc_css" -version = "0.45.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e34ca99200f5b09af8ce689f75a568dd07cdb1719b4e78c5d844ae1f96790bf" +checksum = "75a4e8913ddbf92a39e087996c30a80dfcac5192adc3fb63cd3beabe8975b0c8" dependencies = [ "swc_css_ast", "swc_css_codegen", @@ -1722,9 +1722,9 @@ dependencies = [ [[package]] name = "swc_css_ast" -version = "0.41.0" +version = "0.42.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d09734736a9b06e9fd3ab9c63c3edc7c5439d5ad74212feb250bd6e66ddf41c" +checksum = "b0861c74eba5c61ade5c1ef3a14e3e0fd0699f20e5619bbc292c2ac4f9463617" dependencies = [ "is-macro", "serde", @@ -1735,9 +1735,9 @@ dependencies = [ [[package]] name = "swc_css_codegen" -version = "0.43.0" +version = "0.44.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d9d1dcb76300069a43fa9dbb88b6582e75fafb9d21252983e273839932359a33" +checksum = "de309d82614f8d3613c27f4ccafbacc1ed524ca5bfd7792387f76314d5131df2" dependencies = [ "auto_impl", "bitflags", @@ -1762,9 +1762,9 @@ dependencies = [ [[package]] name = "swc_css_parser" -version = "0.45.0" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd34959a0fdb90445abf51d6669840d9344ab9d1766703259cb45e1c462384bb" +checksum = "ac061b34fb0a3afa4ac5777b705c149f91c2ab29fc5f8463acb2bf8a17e02938" dependencies = [ "bitflags", "lexical", @@ -1775,9 +1775,9 @@ dependencies = [ [[package]] name = "swc_css_utils" -version = "0.38.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "824eeca37d946b192d754b5527ee14ab5d3b65faa1e9e6c6426420ff17ae64f2" +checksum = "94cdc01e5631f63f8d4c52545d9a61ed5a6616a2d8d4d4b6235ea2ff779ae80c" dependencies = [ "swc_atoms", "swc_common", @@ -1787,9 +1787,9 @@ dependencies = [ [[package]] name = "swc_css_visit" -version = "0.40.0" +version = "0.41.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b6005fda07744627afc7f96801856eeb2bcfba4a1e369bfa1439d40f7b37848" +checksum = "ce49ce82798c85e1a8f2a46552b6ef9530868302c333f8b135da3b5c9d5b1ca8" dependencies = [ "swc_atoms", "swc_common", @@ -1799,9 +1799,9 @@ dependencies = [ [[package]] name = "swc_ecma_ast" -version = "0.63.1" +version = "0.65.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79606092f73c188dfd4897cc63ff613c6967fd5f822cb407d2b6b96d4093b211" +checksum = "accaa4affdc0e2f3693c9d3b325ad97e9d9534e01abe5564b9b85c5d1cacdcbb" dependencies = [ "is-macro", "num-bigint", @@ -1814,9 +1814,9 @@ dependencies = [ [[package]] name = "swc_ecma_codegen" -version = "0.87.0" +version = "0.89.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "661dcec97d229f6bca1ea4d28e88364ff3512142afeb05e467cfc925a724937c" +checksum = "667e9174226b2228b5ddc850f59db0b2689652efa0b5d5d3c072d1caba256cb7" dependencies = [ "bitflags", "memchr", @@ -1846,9 +1846,9 @@ dependencies = [ [[package]] name = "swc_ecma_ext_transforms" -version = "0.47.0" +version = "0.49.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f22be85d48703ed980e523bfcf0cf60fdd59386470b9a2e6fdb3f01e72922ac1" +checksum = "453b8fe0dc9c5b86d4436d992f9f31a079ebbba2d47a57ff92629f68ac9f1bd8" dependencies = [ "phf", "swc_atoms", @@ -1860,9 +1860,9 @@ dependencies = [ [[package]] name = "swc_ecma_lints" -version = "0.6.0" +version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6569b03f6232db62f3520e6344d33a13c18b3bca356eca9137ad1c6087b54b62" +checksum = "9cfc9ff5b9bc4ad3a104191744ed2fe41f7346fd9679a51c7dba26a77492dc47" dependencies = [ "auto_impl", "parking_lot", @@ -1876,9 +1876,9 @@ dependencies = [ [[package]] name = "swc_ecma_loader" -version = "0.26.0" +version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61e4a236d9fc809d88e8d346381e72936dc8a4e4a2418d1f66ea8acb6ed298be" +checksum = "764c8e31524d35722aacdbee51e132424798365ddfd75deb81634f342c5fdce3" dependencies = [ "ahash", "anyhow", @@ -1896,9 +1896,9 @@ dependencies = [ [[package]] name = "swc_ecma_minifier" -version = "0.65.0" +version = "0.68.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c20d75221fe940ed8ffeae15d591a28bfa87ea64ab1bb5f09ed791e66f044604" +checksum = "436620800b966cd41e509ba51da2ad4c2c31a3d13c48230c448019655aa7ee7b" dependencies = [ "ahash", "indexmap", @@ -1925,9 +1925,9 @@ dependencies = [ [[package]] name = "swc_ecma_parser" -version = "0.85.0" +version = "0.87.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a61cbbfd77c475564b745ad782e177d3c5ee3503308150eed78fc264f40809f1" +checksum = "3c454cbd95ab84fd9ffc5059cffad80b7711bd4b8732257a7c83f4b2c809dfa1" dependencies = [ "either", "enum_kind", @@ -1945,9 +1945,9 @@ dependencies = [ [[package]] name = "swc_ecma_preset_env" -version = "0.81.0" +version = "0.84.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa0b09466dbea47b04178cfd0262999c2a9cebe67e6fb8869c7267ac166f7daa" +checksum = "b064eca226637af7fa7f734fc6dd0d01b50c90418d7fce2c64da26ff89d2e4f1" dependencies = [ "ahash", "anyhow", @@ -1971,9 +1971,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms" -version = "0.108.0" +version = "0.111.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693c0fc3090c7a4dd3fcea703b58bb3b7e12eb75c1b561ed185dd4359db3e78c" +checksum = "ae472031803e9fddb9f9141edc3ec0c3bff5904cd08e0509f2ad88689678ce7c" dependencies = [ "swc_atoms", "swc_common", @@ -1993,9 +1993,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_base" -version = "0.54.0" +version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53a60add62a482d233e666ac14756251f7559fef66671e345ad935f2e18cc71" +checksum = "74824b2df0931ed3d84201e50138b68d1dc78a802aef9dbdec4ea0ffcea8a28b" dependencies = [ "once_cell", "phf", @@ -2014,9 +2014,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_classes" -version = "0.41.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b0cbea86bae526d5c640ee8d3cbcb7726f907277225ffcca363796a6985f19" +checksum = "8a972a157b9104b7979a34556841f93e98d18d70b83c9e625b35dd390b57e59f" dependencies = [ "swc_atoms", "swc_common", @@ -2028,9 +2028,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_compat" -version = "0.64.0" +version = "0.67.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712770f8f1fc14e632b5f96a2b2f1d1d9fe037c669cbd62a7990c23d7e55a13a" +checksum = "584f0f1af7e7ebf403c1205176afb122dbca97a018c09af8c2be578a2c294ac8" dependencies = [ "ahash", "arrayvec 0.7.2", @@ -2066,9 +2066,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_module" -version = "0.70.0" +version = "0.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83a8d5053c0b3383f3292eea14cbe3d349b98fba3249fbd12323182d6aede4e4" +checksum = "7bf082852cca04cd3b7031ddd786fc1432a3c99727bada49cd68caf473b64617" dependencies = [ "Inflector", "ahash", @@ -2088,9 +2088,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_optimization" -version = "0.78.0" +version = "0.81.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "139ace7ce4991532297ff1af7b960799988cba058cb49926b4951a67a0c2fa0d" +checksum = "3af299ad73dc689a0516950613a9262203feff76adc3f2f14307a12bdd5835c9" dependencies = [ "ahash", "dashmap", @@ -2111,9 +2111,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_proposal" -version = "0.70.0" +version = "0.73.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e7e3f58a2b0ba87389826ca1a0552457f7e9cd7cc4c1d717b0addbc86fc424" +checksum = "fe1cf222cfe757700ffea622589990b1b0ef0a18c85ffe6e8442ba515257aa98" dependencies = [ "either", "serde", @@ -2131,9 +2131,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_react" -version = "0.72.0" +version = "0.75.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d98cab103d93cfffca8938819fad7f5df4a16deb75956770ae6cbfc5b71f68" +checksum = "cee01d3f5c0f424a199a4d13fc6fbe14cfd88ccff0b778558311075477e25310" dependencies = [ "ahash", "base64 0.13.0", @@ -2156,9 +2156,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_testing" -version = "0.56.0" +version = "0.58.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ca6d81a864fab16bce9b86cbc921297256b6bf0f532bab621a6dbf04ecde366" +checksum = "460535faa436986fb82adbf52ba09309038b2f4fc96f00e67e837853a93b448e" dependencies = [ "ansi_term", "anyhow", @@ -2179,9 +2179,9 @@ dependencies = [ [[package]] name = "swc_ecma_transforms_typescript" -version = "0.74.0" +version = "0.77.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37457c86bc39bf18d54995fb7d55d68a95d2f6ebb8d00ebffdd0f2419db1220d" +checksum = "50560b92ecbd43ee4dea19ae763d0bde8d753c8401d76115c714cfb51f838e76" dependencies = [ "serde", "swc_atoms", @@ -2196,9 +2196,9 @@ dependencies = [ [[package]] name = "swc_ecma_utils" -version = "0.61.0" +version = "0.63.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "164f22342740e5b299f215a511aefa4dbb9be3586248d05d4249c56964815197" +checksum = "a05826c1edd7d58ec97af8be523c9c15e24e6dc4c1762435bb12573d716dd7ba" dependencies = [ "once_cell", "rayon", @@ -2211,9 +2211,9 @@ dependencies = [ [[package]] name = "swc_ecma_visit" -version = "0.49.0" +version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7637451decd27af9db5ded9eb4ce2c071be4df68108e1221722033c0fab3e18" +checksum = "95cf6f39cd1c3682885125955e881bec872e0c1743eb1a31735da69b894f065e" dependencies = [ "num-bigint", "swc_atoms", @@ -2225,9 +2225,9 @@ dependencies = [ [[package]] name = "swc_ecmascript" -version = "0.105.0" +version = "0.108.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67db9c61ea3694375eed4ce95a916201b37470b19dad709c84087ebe8cd20c33" +checksum = "36c59346416fc6010a59c0fa10f19b8ba9a45bed7199005b7c452b68400fc345" dependencies = [ "swc_ecma_ast", "swc_ecma_codegen", @@ -2252,9 +2252,9 @@ dependencies = [ [[package]] name = "swc_fast_graph" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857942a9c79e9836f51dca4ca0df89f354acfedc573708006c4365bad07083c" +checksum = "1d53bbcbb4b055c547f283af1f84211f425b95ac59e02d8b70c94b8a63a4704f" dependencies = [ "ahash", "indexmap", @@ -2264,9 +2264,9 @@ dependencies = [ [[package]] name = "swc_graph_analyzer" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c5f079d9350dee80a59ac2f8be9867ed0a8ac9fb0023461b173e9e42168ff30" +checksum = "83b42a8b13068dd90dec954ec44576d5922914687bc34277f3b0f8d0bbeb4e83" dependencies = [ "ahash", "auto_impl", @@ -2298,9 +2298,9 @@ dependencies = [ [[package]] name = "swc_node_comments" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d526bfa1fde8b608352393c404071117c89170ae1e79b2fc97283d6a4bcd3cad" +checksum = "2cb940728fcaa85b619ae43c23110a2e88c1cd90e9a873bebb0f9f80e5ecd7e6" dependencies = [ "ahash", "dashmap", @@ -2309,9 +2309,9 @@ dependencies = [ [[package]] name = "swc_stylis" -version = "0.42.0" +version = "0.43.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26b09b0bdc59e26768e9e2bbcf8b1b722f0798cc0b12856f43e3e610bf4f0eb8" +checksum = "75fd0f4f37579b15bbcd762b0fd1ae3fc6ef29215777b96cbc2bcdfaacd439ab" dependencies = [ "swc_atoms", "swc_common", @@ -2322,9 +2322,9 @@ dependencies = [ [[package]] name = "swc_timer" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81ea392f1e84a0195aa2d06e8c445751bdb1b93a1f6b156500fbf25965679e57" +checksum = "1371a950402552de1a2bf7beeb619b7fff9e4ab7e50f516db9a791869a4f731f" dependencies = [ "tracing", ] @@ -2389,9 +2389,9 @@ dependencies = [ [[package]] name = "testing" -version = "0.17.0" +version = "0.18.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b1398e0c651977e82840793e12605221139aeadbe63cf5c3704a38934fa1656" +checksum = "c77495bc9f7737f9a958ec3cf2fba2f0c2296867018c8b4da6ce01d008b93e5e" dependencies = [ "ansi_term", "difference", diff --git a/packages/next-swc/crates/core/Cargo.toml b/packages/next-swc/crates/core/Cargo.toml index 4300161a6ee72..e50cd9e2d9874 100644 --- a/packages/next-swc/crates/core/Cargo.toml +++ b/packages/next-swc/crates/core/Cargo.toml @@ -14,21 +14,21 @@ fxhash = "0.2.1" pathdiff = "0.2.0" serde = "1" serde_json = "1" -styled_components = "0.9.0" -swc = "0.110.0" +styled_components = "0.11.0" +swc = "0.114.0" swc_atoms = "0.2.7" -swc_common = { version = "0.16.0", features = ["concurrent", "sourcemap"] } -swc_css = "0.45.0" -swc_ecma_loader = { version = "0.26.0", features = ["node", "lru"] } -swc_ecmascript = { version = "0.105.0", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } +swc_common = { version = "0.17.0", features = ["concurrent", "sourcemap"] } +swc_css = "0.46.0" +swc_ecma_loader = { version = "0.27.0", features = ["node", "lru"] } +swc_ecmascript = { version = "0.108.1", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } swc_node_base = "0.5.1" -swc_stylis = "0.42.0" +swc_stylis = "0.43.0" tracing = {version = "0.1.28", features = ["release_max_level_off"]} regex = "1.5" [dev-dependencies] -swc_ecma_transforms_testing = "0.56.0" -testing = "0.17.0" +swc_ecma_transforms_testing = "0.58.0" +testing = "0.18.0" walkdir = "2.3.2" diff --git a/packages/next-swc/crates/core/src/auto_cjs/mod.rs b/packages/next-swc/crates/core/src/auto_cjs/mod.rs index 746f4357c62de..3c885940fd778 100644 --- a/packages/next-swc/crates/core/src/auto_cjs/mod.rs +++ b/packages/next-swc/crates/core/src/auto_cjs/mod.rs @@ -18,28 +18,20 @@ struct CjsFinder { /// does not support changing configuration based on content of the file. impl Visit for CjsFinder { fn visit_member_expr(&mut self, e: &MemberExpr) { - if !e.computed { - match &e.obj { - ExprOrSuper::Super(_) => {} - ExprOrSuper::Expr(obj) => match &**obj { - Expr::Ident(obj) => match &*e.prop { - Expr::Ident(prop) => { - if &*obj.sym == "module" && &*prop.sym == "exports" { - self.found = true; - return; - } - } - _ => {} - }, - _ => {} - }, - } + match &*e.obj { + Expr::Ident(obj) => match &e.prop { + MemberProp::Ident(prop) => { + if &*obj.sym == "module" && &*prop.sym == "exports" { + self.found = true; + return; + } + } + _ => {} + }, + _ => {} } e.obj.visit_with(self); - - if e.computed { - e.prop.visit_with(self); - } + e.prop.visit_with(self); } } diff --git a/packages/next-swc/crates/core/src/hook_optimizer.rs b/packages/next-swc/crates/core/src/hook_optimizer.rs index 4bb9791562b2f..0516fc8e1b48e 100644 --- a/packages/next-swc/crates/core/src/hook_optimizer.rs +++ b/packages/next-swc/crates/core/src/hook_optimizer.rs @@ -1,119 +1,119 @@ use swc_atoms::JsWord; use swc_common::DUMMY_SP; use swc_ecmascript::ast::{ - ArrayPat, Decl, Expr, ExprOrSuper, Ident, ImportDecl, ImportSpecifier, KeyValuePatProp, Number, - ObjectPat, ObjectPatProp, Pat, PropName, VarDecl, VarDeclarator, + ArrayPat, Callee, Decl, Expr, Ident, ImportDecl, ImportSpecifier, KeyValuePatProp, Number, + ObjectPat, ObjectPatProp, Pat, PropName, VarDecl, VarDeclarator, }; use swc_ecmascript::visit::{Fold, FoldWith}; pub fn hook_optimizer() -> impl Fold { - HookOptimizer::default() + HookOptimizer::default() } #[derive(Debug, Default)] struct HookOptimizer { - hooks: Vec, + hooks: Vec, } impl Fold for HookOptimizer { - // Find hooks imported from react/preact - fn fold_import_decl(&mut self, decl: ImportDecl) -> ImportDecl { - let ImportDecl { - ref src, - ref specifiers, - .. - } = decl; - if &src.value == "react" || &src.value == "preact/hooks" { - for specifier in specifiers { - if let ImportSpecifier::Named(named_specifier) = specifier { - if named_specifier.local.sym.starts_with("use") { - self.hooks.push(named_specifier.local.sym.clone()) - } + // Find hooks imported from react/preact + fn fold_import_decl(&mut self, decl: ImportDecl) -> ImportDecl { + let ImportDecl { + ref src, + ref specifiers, + .. + } = decl; + if &src.value == "react" || &src.value == "preact/hooks" { + for specifier in specifiers { + if let ImportSpecifier::Named(named_specifier) = specifier { + if named_specifier.local.sym.starts_with("use") { + self.hooks.push(named_specifier.local.sym.clone()) + } + } + } } - } + + decl } + // Transform array desctructing to object destructuring for relevant hooks + fn fold_decl(&mut self, node: Decl) -> Decl { + let node = node.fold_children_with(self); + match node { + Decl::Var(VarDecl { + decls, + span, + kind, + declare, + }) => { + let mut new_decls = Vec::with_capacity(decls.len()); + for decl in decls { + new_decls.push(self.get_decl(decl)); + } - decl - } - // Transform array desctructing to object destructuring for relevant hooks - fn fold_decl(&mut self, node: Decl) -> Decl { - let node = node.fold_children_with(self); - match node { - Decl::Var(VarDecl { - decls, - span, - kind, - declare, - }) => { - let mut new_decls = Vec::with_capacity(decls.len()); - for decl in decls { - new_decls.push(self.get_decl(decl)); + Decl::Var(VarDecl { + decls: new_decls, + span, + kind, + declare, + }) + } + _ => node, } - - Decl::Var(VarDecl { - decls: new_decls, - span, - kind, - declare, - }) - } - _ => node, } - } } impl HookOptimizer { - fn get_decl(&mut self, decl: VarDeclarator) -> VarDeclarator { - let VarDeclarator { - name, - init, - span, - definite, - } = &decl; - let init_clone = init.clone(); - if let Pat::Array(a) = name { - if let Expr::Call(c) = &*init.as_deref().unwrap() { - if let ExprOrSuper::Expr(i) = &c.callee { - if let Expr::Ident(Ident { sym, .. }) = &**i { - if self.hooks.contains(&sym) { - let name = get_object_pattern(&a); - return VarDeclarator { - name, - init: init_clone, - span: *span, - definite: *definite, - }; + fn get_decl(&mut self, decl: VarDeclarator) -> VarDeclarator { + let VarDeclarator { + name, + init, + span, + definite, + } = &decl; + let init_clone = init.clone(); + if let Pat::Array(a) = name { + if let Expr::Call(c) = &*init.as_deref().unwrap() { + if let Callee::Expr(i) = &c.callee { + if let Expr::Ident(Ident { sym, .. }) = &**i { + if self.hooks.contains(&sym) { + let name = get_object_pattern(&a); + return VarDeclarator { + name, + init: init_clone, + span: *span, + definite: *definite, + }; + } + } + } } - } } - } - } - return decl; - } + return decl; + } } fn get_object_pattern(array_pattern: &ArrayPat) -> Pat { - let props: Vec = array_pattern - .elems - .iter() - .enumerate() - .filter_map(|(i, elem)| match elem { - Some(elem) => Some(ObjectPatProp::KeyValue(KeyValuePatProp { - key: PropName::Num(Number { - value: i as f64, - span: DUMMY_SP, - }), - value: Box::new(elem.clone()), - })), - None => None, - }) - .collect(); + let props: Vec = array_pattern + .elems + .iter() + .enumerate() + .filter_map(|(i, elem)| match elem { + Some(elem) => Some(ObjectPatProp::KeyValue(KeyValuePatProp { + key: PropName::Num(Number { + value: i as f64, + span: DUMMY_SP, + }), + value: Box::new(elem.clone()), + })), + None => None, + }) + .collect(); - Pat::Object(ObjectPat { - props, - span: DUMMY_SP, - optional: false, - type_ann: None, - }) + Pat::Object(ObjectPat { + props, + span: DUMMY_SP, + optional: false, + type_ann: None, + }) } diff --git a/packages/next-swc/crates/core/src/next_dynamic.rs b/packages/next-swc/crates/core/src/next_dynamic.rs index 12cb475dfba54..01bff29ad322b 100644 --- a/packages/next-swc/crates/core/src/next_dynamic.rs +++ b/packages/next-swc/crates/core/src/next_dynamic.rs @@ -4,9 +4,9 @@ use pathdiff::diff_paths; use swc_atoms::js_word; use swc_common::{FileName, DUMMY_SP}; use swc_ecmascript::ast::{ - ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Expr, ExprOrSpread, - ExprOrSuper, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, Null, - ObjectLit, Prop, PropName, PropOrSpread, Str, StrKind, + ArrayLit, ArrowExpr, BinExpr, BinaryOp, BlockStmtOrExpr, Bool, CallExpr, Callee, Expr, + ExprOrSpread, Ident, ImportDecl, ImportSpecifier, KeyValueProp, Lit, MemberExpr, MemberProp, + Null, ObjectLit, Prop, PropName, PropOrSpread, Str, StrKind, }; use swc_ecmascript::utils::ExprFactory; use swc_ecmascript::utils::{ @@ -63,19 +63,15 @@ impl Fold for NextDynamicPatcher { fn fold_call_expr(&mut self, expr: CallExpr) -> CallExpr { if self.is_next_dynamic_first_arg { - if let ExprOrSuper::Expr(e) = &expr.callee { - if let Expr::Ident(Ident { sym, .. }) = &**e { - if sym == "import" { - if let Expr::Lit(Lit::Str(Str { value, .. })) = &*expr.args[0].expr { - self.dynamically_imported_specifier = Some(value.to_string()); - } - } + if let Callee::Import(..) = &expr.callee { + if let Expr::Lit(Lit::Str(Str { value, .. })) = &*expr.args[0].expr { + self.dynamically_imported_specifier = Some(value.to_string()); } } return expr.fold_children_with(self); } let mut expr = expr.fold_children_with(self); - if let ExprOrSuper::Expr(i) = &expr.callee { + if let Callee::Expr(i) = &expr.callee { if let Expr::Ident(identifier) = &**i { if self.dynamic_bindings.contains(&identifier.to_id()) { if expr.args.len() == 0 { @@ -182,21 +178,18 @@ impl Fold for NextDynamicPatcher { body: BlockStmtOrExpr::Expr(Box::new(Expr::Array(ArrayLit { elems: vec![Some(ExprOrSpread { expr: Box::new(Expr::Call(CallExpr { - callee: ExprOrSuper::Expr(Box::new(Expr::Member( + callee: Callee::Expr(Box::new(Expr::Member( MemberExpr { - obj: ExprOrSuper::Expr(Box::new( - Expr::Ident(Ident { - sym: js_word!("require"), - span: DUMMY_SP, - optional: false, - }), - )), - prop: Box::new(Expr::Ident(Ident { - sym: "resolveWeak".into(), + obj: Box::new(Expr::Ident(Ident { + sym: js_word!("require"), span: DUMMY_SP, optional: false, })), - computed: false, + prop: MemberProp::Ident(Ident { + sym: "resolveWeak".into(), + span: DUMMY_SP, + optional: false, + }), span: DUMMY_SP, }, ))), diff --git a/packages/next-swc/crates/core/src/next_ssg.rs b/packages/next-swc/crates/core/src/next_ssg.rs index 5d3647c8cc107..f744bc7e4e78f 100644 --- a/packages/next-swc/crates/core/src/next_ssg.rs +++ b/packages/next-swc/crates/core/src/next_ssg.rs @@ -144,12 +144,8 @@ impl Fold for Analyzer<'_> { fn fold_jsx_element(&mut self, jsx: JSXElement) -> JSXElement { fn get_leftmost_id_member_expr(e: &JSXMemberExpr) -> Id { match &e.obj { - JSXObject::Ident(i) => { - i.to_id() - } - JSXObject::JSXMemberExpr(e) => { - get_leftmost_id_member_expr(e) - } + JSXObject::Ident(i) => i.to_id(), + JSXObject::JSXMemberExpr(e) => get_leftmost_id_member_expr(e), } } @@ -202,16 +198,6 @@ impl Fold for Analyzer<'_> { f } - fn fold_member_expr(&mut self, mut e: MemberExpr) -> MemberExpr { - e.obj = e.obj.fold_with(self); - - if e.computed { - e.prop = e.prop.fold_with(self); - } - - e - } - /// Drops [ExportDecl] if all specifiers are removed. fn fold_module_item(&mut self, s: ModuleItem) -> ModuleItem { match s { diff --git a/packages/next-swc/crates/core/src/remove_console.rs b/packages/next-swc/crates/core/src/remove_console.rs index dd7cb46cb0f8a..11238eb037e4e 100644 --- a/packages/next-swc/crates/core/src/remove_console.rs +++ b/packages/next-swc/crates/core/src/remove_console.rs @@ -50,7 +50,7 @@ impl RemoveConsole { fn should_remove_call(&mut self, n: &CallExpr) -> bool { let callee = &n.callee; let member_expr = match callee { - ExprOrSuper::Expr(e) => match &**e { + Callee::Expr(e) => match &**e { Expr::Member(m) => m, _ => return false, }, @@ -58,24 +58,22 @@ impl RemoveConsole { }; // Don't attempt to evaluate computed properties. - if member_expr.computed { + + if matches!(&member_expr.prop, MemberProp::Computed(..)) { return false; } // Only proceed if the object is the global `console` object. - match &member_expr.obj { - ExprOrSuper::Expr(e) => match &**e { - Expr::Ident(i) if self.is_global_console(i) => {} - _ => return false, - }, + match &*member_expr.obj { + Expr::Ident(i) if self.is_global_console(i) => {} _ => return false, } // Check if the property is requested to be excluded. // Here we do an O(n) search on the list of excluded properties because the size // should be small. - match &*member_expr.prop { - Expr::Ident(i) if self.exclude.iter().find(|x| **x == i.sym).is_none() => {} + match &member_expr.prop { + MemberProp::Ident(i) if self.exclude.iter().find(|x| **x == i.sym).is_none() => {} _ => return false, } diff --git a/packages/next-swc/crates/core/src/styled_jsx/mod.rs b/packages/next-swc/crates/core/src/styled_jsx/mod.rs index b61d78aad9c64..667032d3e1996 100644 --- a/packages/next-swc/crates/core/src/styled_jsx/mod.rs +++ b/packages/next-swc/crates/core/src/styled_jsx/mod.rs @@ -227,8 +227,7 @@ impl Fold for StyledJSXTransformer { } } Expr::Member(MemberExpr { - obj: ExprOrSuper::Expr(boxed_ident), - .. + obj: boxed_ident, .. }) => { if let Expr::Ident(identifier) = &**boxed_ident { if self.external_bindings.contains(&identifier.to_id()) { @@ -284,7 +283,7 @@ impl Fold for StyledJSXTransformer { for stmt in block.stmts { new_stmts.push(stmt.fold_children_with(self)); if let Some(add_hash) = self.add_hash.take() { - new_stmts.push(add_hash_statment(add_hash)); + new_stmts.push(add_hash_statement(add_hash)); } } @@ -317,14 +316,14 @@ impl Fold for StyledJSXTransformer { })))); self.add_default_decl = None; if let Some(add_hash) = self.add_hash.take() { - new_items.push(ModuleItem::Stmt(add_hash_statment(add_hash))); + new_items.push(ModuleItem::Stmt(add_hash_statement(add_hash))); } } if !is_styled_css_import(&new_item) { new_items.push(new_item); } if let Some(add_hash) = self.add_hash.take() { - new_items.push(ModuleItem::Stmt(add_hash_statment(add_hash))); + new_items.push(ModuleItem::Stmt(add_hash_statement(add_hash))); } } @@ -489,13 +488,12 @@ impl StyledJSXTransformer { StyleExpr::Ident(ident) => { return JSXStyle::External(ExternalStyle { expr: Expr::Member(MemberExpr { - obj: ExprOrSuper::Expr(Box::new(Expr::Ident(ident.clone()))), - prop: Box::new(Expr::Ident(Ident { + obj: Box::new(Expr::Ident(ident.clone())), + prop: MemberProp::Ident(Ident { sym: "__hash".into(), span: DUMMY_SP, optional: false, - })), - computed: false, + }), span: DUMMY_SP, }), identifier: ident.clone(), @@ -571,13 +569,10 @@ impl StyledJSXTransformer { compute_class_names(&styles, &self.style_import_name.as_ref().unwrap()); let tag = match &*tagged_tpl.tag { Expr::Ident(Ident { sym, .. }) => sym.to_string(), - Expr::Member(MemberExpr { prop, .. }) => { - if let Expr::Ident(Ident { sym, .. }) = &**prop { - sym.to_string() - } else { - String::from("not_styled_jsx_tag") - } - } + Expr::Member(MemberExpr { + prop: MemberProp::Ident(Ident { sym, .. }), + .. + }) => sym.to_string(), _ => String::from("not_styled_jsx_tag"), }; let style = if let JSXStyle::Local(style) = &styles[0] { @@ -809,10 +804,9 @@ fn get_existing_class_name(el: &JSXOpeningElement) -> (Option, Option) -> Expr { new_expr } -fn add_hash_statment((id, hash): (Id, String)) -> Stmt { +fn add_hash_statement((id, hash): (Id, String)) -> Stmt { Stmt::Expr(ExprStmt { expr: Box::new(Expr::Assign(AssignExpr { left: PatOrExpr::Expr(Box::new(Expr::Member(MemberExpr { - obj: ExprOrSuper::Expr(Box::new(Expr::Ident(Ident { + obj: Box::new(Expr::Ident(Ident { sym: id.0, span: DUMMY_SP.with_ctxt(id.1), optional: false, - }))), - prop: Box::new(Expr::Ident(Ident { + })), + prop: MemberProp::Ident(Ident { sym: "__hash".into(), span: DUMMY_SP, optional: false, - })), + }), span: DUMMY_SP, - computed: false, }))), right: Box::new(string_literal_expr(&hash)), op: op!("="), diff --git a/packages/next-swc/crates/core/src/styled_jsx/utils.rs b/packages/next-swc/crates/core/src/styled_jsx/utils.rs index a79fe91e2c53c..f2acbf5f22bb1 100644 --- a/packages/next-swc/crates/core/src/styled_jsx/utils.rs +++ b/packages/next-swc/crates/core/src/styled_jsx/utils.rs @@ -68,19 +68,18 @@ pub fn compute_class_names( let dynamic_class_name = match dynamic_styles.len() { 0 => None, _ => Some(Expr::Call(CallExpr { - callee: ExprOrSuper::Expr(Box::new(Expr::Member(MemberExpr { - obj: ExprOrSuper::Expr(Box::new(Expr::Ident(Ident { + callee: Callee::Expr(Box::new(Expr::Member(MemberExpr { + obj: Box::new(Expr::Ident(Ident { sym: style_import_name.into(), span: DUMMY_SP, optional: false, - }))), - prop: Box::new(Expr::Ident(Ident { + })), + prop: MemberProp::Ident(Ident { sym: "dynamic".into(), span: DUMMY_SP, optional: false, - })), + }), span: DUMMY_SP, - computed: false, }))), args: vec![ExprOrSpread { expr: Box::new(Expr::Array(ArrayLit { diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/attribute-generation-modes/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/attribute-generation-modes/output.js index c06fbbcc4c512..ddee98e5fbd45 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/attribute-generation-modes/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/attribute-generation-modes/output.js @@ -23,7 +23,7 @@ export const Test2 = ()=>
external and dynamic

- <_JSXStyle id={"5cadd6714ea141b4"} dynamic={[ + <_JSXStyle id={"332b21af86b0ec6"} dynamic={[ color ]}>{`p.__jsx-style-dynamic-selector{color:${color}}`} @@ -49,7 +49,7 @@ export const Test3 = ({ color })=>
{"p.jsx-ceba8c9ce34e3d0c{display:inline-block}"} - <_JSXStyle id={"8f336bc49da94d3f"} dynamic={[ + <_JSXStyle id={"ec8f36d08fa7aa2c"} dynamic={[ color ]}>{`p.__jsx-style-dynamic-selector{color:${color}}`} @@ -87,7 +87,7 @@ export const Test5 = ()=>
; export const Test6 = ({ color })=>
{"p.jsx-ceba8c9ce34e3d0c{display:inline-block}"} - <_JSXStyle id={"8f336bc49da94d3f"} dynamic={[ + <_JSXStyle id={"ec8f36d08fa7aa2c"} dynamic={[ color ]}>{`p.__jsx-style-dynamic-selector{color:${color}}`} @@ -113,7 +113,7 @@ export const Test6 = ({ color })=>
dynamic only

- <_JSXStyle id={"5cadd6714ea141b4"} dynamic={[ + <_JSXStyle id={"332b21af86b0ec6"} dynamic={[ color ]}>{`p.__jsx-style-dynamic-selector{color:${color}}`} @@ -142,7 +142,7 @@ export const Test8 = ({ color })=>{ }; return
{

dynamic with scoped compound variable

- <_JSXStyle id={"6e7028e37f6f2a1c"} dynamic={[ + <_JSXStyle id={"c37e7ca12a9fbc5b"} dynamic={[ innerProps.color ]}>{`p.__jsx-style-dynamic-selector{color:${innerProps.color}}`} @@ -171,7 +171,7 @@ export const Test9 = ({ color })=>{ }; return
{

dynamic with compound variable

- <_JSXStyle id={"33344a45c20c74fe"} dynamic={[ + <_JSXStyle id={"59d22b990ceca2d7"} dynamic={[ innerProps.color ]}>{`p.__jsx-style-dynamic-selector{color:${innerProps.color}}`}
; }; const foo = "red"; -export const Test10 = ()=>
+export const Test10 = ()=>
-

dynamic with constant variable

+

dynamic with constant variable

- <_JSXStyle id={"e993bec5c22e1b75"}>{`p.jsx-e993bec5c22e1b75{color:${foo}}`} + <_JSXStyle id={"64eb0b4e09da0dd3"}>{`p.jsx-64eb0b4e09da0dd3{color:${foo}}`}
; @@ -207,14 +207,14 @@ export const Test11 = ({ color })=>{ length: 5 }).map((item, i)=>
  • - <_JSXStyle id={"5dc7166977a4514"} dynamic={[ + <_JSXStyle id={"93933d24284432d0"} dynamic={[ color ]}>{`.item.__jsx-style-dynamic-selector{color:${color}}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/different-jsx-ids/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/different-jsx-ids/output.js index 49c9cc0120fb8..f78146a476f13 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/different-jsx-ids/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/different-jsx-ids/output.js @@ -1,19 +1,19 @@ import _JSXStyle from "styled-jsx/style"; const color = "red"; const otherColor = "green"; -const A = ()=>
    +const A = ()=>
    -

    test

    +

    test

    - <_JSXStyle id={"f44d626e14f3cfbc"}>{`p.jsx-f44d626e14f3cfbc{color:${color}}`} + <_JSXStyle id={"319ecfcffea32bfb"}>{`p.jsx-319ecfcffea32bfb{color:${color}}`}
    ; -const B = ()=>
    +const B = ()=>
    -

    test

    +

    test

    - <_JSXStyle id={"9db1df72abe82640"}>{`p.jsx-9db1df72abe82640{color:${otherColor}}`} + <_JSXStyle id={"8a19b9bd65b986e0"}>{`p.jsx-8a19b9bd65b986e0{color:${otherColor}}`}
    ; diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/expressions/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/expressions/output.js index 91f35e2ea9b56..ea1779a5ca0e9 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/expressions/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/expressions/output.js @@ -9,85 +9,85 @@ const animationName = "my-cool-animation"; const obj = { display: "block" }; -export default (({ display })=>
    -

    test

    - <_JSXStyle id={"5df43f2861c900e6"}>{`p.${color}.jsx-843124768056a74c{color:${otherColor}; + <_JSXStyle id={"6116059e04f3bff7"}>{`p.${color}.jsx-1ada4ad4dab7822f{color:${otherColor}; display:${obj.display}}`} - <_JSXStyle id={"94239b6d6b42c9b5"}>{"p.jsx-843124768056a74c{color:red}"} + <_JSXStyle id={"94239b6d6b42c9b5"}>{"p.jsx-1ada4ad4dab7822f{color:red}"} - <_JSXStyle id={"a971cf00393d41be"}>{`body{background:${color}}`} + <_JSXStyle id={"171303fb0d7f788b"}>{`body{background:${color}}`} - <_JSXStyle id={"a971cf00393d41be"}>{`body{background:${color}}`} + <_JSXStyle id={"171303fb0d7f788b"}>{`body{background:${color}}`} // TODO: the next two should have the same hash - <_JSXStyle id={"5cadd6714ea141b4"}>{`p.jsx-843124768056a74c{color:${color}}`} + <_JSXStyle id={"332b21af86b0ec6"}>{`p.jsx-1ada4ad4dab7822f{color:${color}}`} - <_JSXStyle id={"5cadd6714ea141b4"}>{`p.jsx-843124768056a74c{color:${color}}`} + <_JSXStyle id={"332b21af86b0ec6"}>{`p.jsx-1ada4ad4dab7822f{color:${color}}`} - <_JSXStyle id={"785cf5e120672da8"} dynamic={[ + <_JSXStyle id={"50021e09364b96c8"} dynamic={[ darken(color) ]}>{`p.__jsx-style-dynamic-selector{color:${darken(color)}}`} - <_JSXStyle id={"108a316873f1c6fc"} dynamic={[ + <_JSXStyle id={"f07deae908c9294f"} dynamic={[ darken(color) + 2 ]}>{`p.__jsx-style-dynamic-selector{color:${darken(color) + 2}}`} - <_JSXStyle id={"bb5a8a5ee5cd36db"}>{`@media (min-width:${mediumScreen}) {p.jsx-843124768056a74c{color:green} -p.jsx-843124768056a74c{color:${`red`}}} -p.jsx-843124768056a74c{color:red}`} + <_JSXStyle id={"4e4be2da62837c76"}>{`@media (min-width:${mediumScreen}) {p.jsx-1ada4ad4dab7822f{color:green} +p.jsx-1ada4ad4dab7822f{color:${`red`}}} +p.jsx-1ada4ad4dab7822f{color:red}`} - <_JSXStyle id={"99746edba785c617"}>{`p.jsx-843124768056a74c{-webkit-animation-duration:${animationDuration}; + <_JSXStyle id={"27040f0829fb73d4"}>{`p.jsx-1ada4ad4dab7822f{-webkit-animation-duration:${animationDuration}; animation-duration:${animationDuration}}`} - <_JSXStyle id={"62d69d091a270e9d"}>{`p.jsx-843124768056a74c{-webkit-animation:${animationDuration} forwards ${animationName}; + <_JSXStyle id={"3e72d735e703a530"}>{`p.jsx-1ada4ad4dab7822f{-webkit-animation:${animationDuration} forwards ${animationName}; animation:${animationDuration} forwards ${animationName}} -div.jsx-843124768056a74c{background:${color}}`} +div.jsx-1ada4ad4dab7822f{background:${color}}`} - <_JSXStyle id={"a124d516c2c0707d"} dynamic={[ + <_JSXStyle id={"183a75aa3877c18a"} dynamic={[ display ? "block" : "none" ]}>{`span.__jsx-style-dynamic-selector{display:${display ? "block" : "none"}}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-30480/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-30480/output.js index 892df0b6ee3b3..d91b5759a1370 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-30480/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-30480/output.js @@ -1,14 +1,14 @@ import _JSXStyle from "styled-jsx/style"; export default (({ breakPoint })=>
    - <_JSXStyle id={"6b843a9852a4be26"} dynamic={[ + <_JSXStyle id={"42a6f8ca08e1a043"} dynamic={[ breakPoint ]}>{`@media (${breakPoint}) {}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-31562-interpolation-in-mdea/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-31562-interpolation-in-mdea/output.js index d44f9c1b2cfb1..fb59ef2071063 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-31562-interpolation-in-mdea/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/issue-31562-interpolation-in-mdea/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"a876575397b32eda"} dynamic={[ + <_JSXStyle id={"5bbb77b0f67942dc"} dynamic={[ Typography.base.size.default, Typography.base.lineHeight, Target.mediumPlus, diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/number-after-placeholder/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/number-after-placeholder/output.js index da1caf97d70e6..19b912eb01025 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/number-after-placeholder/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/number-after-placeholder/output.js @@ -1,17 +1,17 @@ import _JSXStyle from "styled-jsx/style"; import Link from "next/link"; export default function IndexPage() { - return
    + return
    Hello World.{" "} - Abound + Abound - <_JSXStyle id={"bc8a8bae32099ce8"}>{`a.jsx-bc8a8bae32099ce8{color:${"#abcdef"}12}`} + <_JSXStyle id={"b642661fd6426842"}>{`a.jsx-b642661fd6426842{color:${"#abcdef"}12}`}
    ; }; diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/styles/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/styles/output.js index 1e0ef8c9592f7..415058e5691e5 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/styles/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/styles/output.js @@ -6,29 +6,29 @@ bar.__hash = "aaed0341accea8f"; const baz = new String("div{font-size:3em}"); baz.__hash = "aaed0341accea8f"; const a = new String(`div{font-size:${size}em}`); -a.__hash = "f14cced97c082d2c"; +a.__hash = "5ba1fcb8b8f3d807"; export const uh = bar; -export const foo = new String(`div.jsx-a0d126276b085021{color:${color}}`); -foo.__hash = "a0d126276b085021"; +export const foo = new String(`div.jsx-945eaa83250ed332{color:${color}}`); +foo.__hash = "945eaa83250ed332"; ({ - styles: <_JSXStyle id={"47e08c293b53f262"}>{`div.jsx-47e08c293b53f262{color:${colors.green.light}} -a.jsx-47e08c293b53f262{color:red}`}, - className: "jsx-47e08c293b53f262" + styles: <_JSXStyle id={"c107a919a5b2943d"}>{`div.jsx-c107a919a5b2943d{color:${colors.green.light}} +a.jsx-c107a919a5b2943d{color:red}`}, + className: "jsx-c107a919a5b2943d" }); const b = { - styles: <_JSXStyle id={"47e08c293b53f262"}>{`div.jsx-47e08c293b53f262{color:${colors.green.light}} -a.jsx-47e08c293b53f262{color:red}`}, - className: "jsx-47e08c293b53f262" + styles: <_JSXStyle id={"c107a919a5b2943d"}>{`div.jsx-c107a919a5b2943d{color:${colors.green.light}} +a.jsx-c107a919a5b2943d{color:red}`}, + className: "jsx-c107a919a5b2943d" }; const dynamic = (colors1)=>{ const b = { - styles: <_JSXStyle id={"79d79305fa1611e"} dynamic={[ + styles: <_JSXStyle id={"60132422fc87f1d1"} dynamic={[ colors1.green.light ]}>{`div.__jsx-style-dynamic-selector{color:${colors1.green.light}} a.__jsx-style-dynamic-selector{color:red}`}, className: _JSXStyle.dynamic([ [ - "79d79305fa1611e", + "60132422fc87f1d1", [ colors1.green.light ] @@ -37,7 +37,7 @@ a.__jsx-style-dynamic-selector{color:red}`}, }; }; export default { - styles: <_JSXStyle id={"d9cea503e39c5315"}>{`div.jsx-d9cea503e39c5315{font-size:3em} -p.jsx-d9cea503e39c5315{color:${color}}`}, - className: "jsx-d9cea503e39c5315" + styles: <_JSXStyle id={"e5da8dd7ff5c7f39"}>{`div.jsx-e5da8dd7ff5c7f39{font-size:3em} +p.jsx-e5da8dd7ff5c7f39{color:${color}}`}, + className: "jsx-e5da8dd7ff5c7f39" }; diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/too-many/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/too-many/output.js index f239d71bf04f0..00ff7acd83a69 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/too-many/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/too-many/output.js @@ -2,7 +2,7 @@ import _JSXStyle from "styled-jsx/style"; export const Red = ({ Component ="button" })=>{ return { {} - <_JSXStyle id={"ab280f80c0d19763"} dynamic={[ + <_JSXStyle id={"ca900d186ad0e495"} dynamic={[ e1, e2, e3, diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-escape-2/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-escape-2/output.js index f9b09f84aa047..3e3ed2489c670 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-escape-2/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-escape-2/output.js @@ -2,14 +2,14 @@ import _JSXStyle from "styled-jsx/style"; export default function Home({ fontFamily }) { return
    - <_JSXStyle id={"d64fed44dbc5d8df"} dynamic={[ + <_JSXStyle id={"f804e2f486b6ac13"} dynamic={[ fontFamily ]}>{`body{font-family:${fontFamily}} code:before, code:after{content:'\`'}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-1-as-property/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-1-as-property/output.js index 7422567d0bb68..9d93281ced13f 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-1-as-property/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-1-as-property/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"8c1103276226be14"} dynamic={[ + <_JSXStyle id={"e359801ddd3b3cb6"} dynamic={[ inputSize ? "height: calc(2 * var(--a)) !important;" : "" ]}>{`@media only screen {a.__jsx-style-dynamic-selector{${inputSize ? "height: calc(2 * var(--a)) !important;" : ""} }}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-2-as-part-of-value/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-2-as-part-of-value/output.js index 49d6ac7b3a0bd..bc25a6c5235b4 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-2-as-part-of-value/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-2-as-part-of-value/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"1a8c0e5c60018729"} dynamic={[ + <_JSXStyle id={"1a799d9370a3a386"} dynamic={[ a[b], -1 * (c || 0), d diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-3-as-value/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-3-as-value/output.js index 5b7244f9e42c8..f311c35268813 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-3-as-value/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-3-as-value/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"1dd34a5c235f087f"} dynamic={[ + <_JSXStyle id={"4ca4ef3595473f53"} dynamic={[ a ]}>{`@media only screen {a.__jsx-style-dynamic-selector{color:${a}}}`} diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-4-as-part-of-value-in-multiple/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-4-as-part-of-value-in-multiple/output.js index 291494df4f020..4683d8c243062 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-4-as-part-of-value-in-multiple/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-4-as-part-of-value-in-multiple/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"35bb702eb335aa6f"} dynamic={[ + <_JSXStyle id={"97886c1e9511aafa"} dynamic={[ a || "var(--c)", b || "inherit" ]}>{`.a:hover .b.__jsx-style-dynamic-selector{display:inline-block; diff --git a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-5-values-of-multiple-properties/output.js b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-5-values-of-multiple-properties/output.js index 04c7ddfab3159..e009c13a74561 100644 --- a/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-5-values-of-multiple-properties/output.js +++ b/packages/next-swc/crates/core/tests/fixture/styled-jsx/tpl-placeholder-5-values-of-multiple-properties/output.js @@ -3,7 +3,7 @@ export default class { render() { return
    test

    - <_JSXStyle id={"21ae2868f133bbf6"} dynamic={[ + <_JSXStyle id={"bcc606c168bcd197"} dynamic={[ a ? "100%" : "200px", b ? "0" : "8px 20px" ]}>{`.item.__jsx-style-dynamic-selector{max-width:${a ? "100%" : "200px"}; diff --git a/packages/next-swc/crates/napi/Cargo.toml b/packages/next-swc/crates/napi/Cargo.toml index de8d313ea1ffb..8ea18d4264103 100644 --- a/packages/next-swc/crates/napi/Cargo.toml +++ b/packages/next-swc/crates/napi/Cargo.toml @@ -16,12 +16,12 @@ once_cell = "1.8.0" serde = "1" serde_json = "1" next-swc = { version = "0.0.0", path = "../core" } -swc = "0.110.0" +swc = "0.114.0" swc_atoms = "0.2.7" -swc_bundler = { version = "0.98.0", features = ["concurrent"] } -swc_common = { version = "0.16.0", features = ["concurrent", "sourcemap"] } -swc_ecma_loader = { version = "0.26.0", features = ["node", "lru"] } -swc_ecmascript = { version = "0.105.0", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } +swc_bundler = { version = "0.101.0", features = ["concurrent"] } +swc_common = { version = "0.17.0", features = ["concurrent", "sourcemap"] } +swc_ecma_loader = { version = "0.27.0", features = ["node", "lru"] } +swc_ecmascript = { version = "0.108.1", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } swc_node_base = "0.5.1" [build-dependencies] diff --git a/packages/next-swc/crates/wasm/Cargo.toml b/packages/next-swc/crates/wasm/Cargo.toml index 79ac28b8f5e19..eaad371053560 100644 --- a/packages/next-swc/crates/wasm/Cargo.toml +++ b/packages/next-swc/crates/wasm/Cargo.toml @@ -16,9 +16,9 @@ path-clean = "0.1" serde = {version = "1", features = ["derive"]} serde_json = "1" next-swc = { version = "0.0.0", path = "../core" } -swc = "0.110.0" -swc_common = { version = "0.16.0", features = ["concurrent", "sourcemap"] } -swc_ecmascript = { version = "0.105.0", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } +swc = "0.114.0" +swc_common = { version = "0.17.0", features = ["concurrent", "sourcemap"] } +swc_ecmascript = { version = "0.108.1", features = ["codegen", "minifier", "optimization", "parser", "react", "transforms", "typescript", "utils", "visit"] } tracing = {version = "0.1.28", features = ["release_max_level_off"]} wasm-bindgen = {version = "0.2", features = ["serde-serialize"]} wasm-bindgen-futures = "0.4.8" diff --git a/packages/next-swc/package.json b/packages/next-swc/package.json index 0660363ec97b8..82df474d59ea5 100644 --- a/packages/next-swc/package.json +++ b/packages/next-swc/package.json @@ -1,6 +1,6 @@ { "name": "@next/swc", - "version": "12.0.8", + "version": "12.0.9-canary.0", "private": true, "scripts": { "build-native": "napi build --platform --cargo-name next_swc_napi native", diff --git a/packages/next/build/entries.ts b/packages/next/build/entries.ts index c3045f7ecadd0..3779caae4ebbb 100644 --- a/packages/next/build/entries.ts +++ b/packages/next/build/entries.ts @@ -157,6 +157,7 @@ export function createEntrypoints( const isFlight = isFlightPage(config, absolutePagePath) const webServerRuntime = !!config.experimental.concurrentFeatures + const hasServerComponents = !!config.experimental.serverComponents if (page.match(MIDDLEWARE_ROUTE)) { const loaderOpts: MiddlewareLoaderOptions = { @@ -179,6 +180,7 @@ export function createEntrypoints( absolute500Path: pages['/500'] || '', absolutePagePath, isServerComponent: isFlight, + serverComponents: hasServerComponents, ...defaultServerlessOptions, } as any)}!`, isServer: false, diff --git a/packages/next/build/webpack/loaders/next-flight-server-loader.ts b/packages/next/build/webpack/loaders/next-flight-server-loader.ts index 732533120fccf..efc937d021bf7 100644 --- a/packages/next/build/webpack/loaders/next-flight-server-loader.ts +++ b/packages/next/build/webpack/loaders/next-flight-server-loader.ts @@ -32,7 +32,10 @@ async function parseImportsInfo( imports: Array, isClientCompilation: boolean, pageExtensions: string[] -): Promise { +): Promise<{ + source: string + defaultExportName: string +}> { const { body } = acorn.parse(source, { ecmaVersion: 11, sourceType: 'module', @@ -40,11 +43,12 @@ async function parseImportsInfo( let transformedSource = '' let lastIndex = 0 + let defaultExportName = 'RSComponent' for (let i = 0; i < body.length; i++) { const node = body[i] switch (node.type) { - case 'ImportDeclaration': + case 'ImportDeclaration': { const importSource = node.source.value if (!isClientCompilation) { @@ -57,9 +61,9 @@ async function parseImportsInfo( ) { continue } - transformedSource += source.substr( + transformedSource += source.substring( lastIndex, - node.source.start - lastIndex + node.source.start - 1 ) transformedSource += JSON.stringify(`${node.source.value}?flight`) } else { @@ -83,16 +87,21 @@ async function parseImportsInfo( lastIndex = node.source.end imports.push(`require(${JSON.stringify(importSource)})`) continue + } + case 'ExportDefaultDeclaration': { + defaultExportName = node.declaration.id.name + break + } default: break } } if (!isClientCompilation) { - transformedSource += source.substr(lastIndex) + transformedSource += source.substring(lastIndex) } - return transformedSource + return { source: transformedSource, defaultExportName } } export default async function transformSource( @@ -113,17 +122,32 @@ export default async function transformSource( } const imports: string[] = [] - const transformed = await parseImportsInfo( - source, - imports, - isClientCompilation, - getRawPageExtensions(pageExtensions) - ) - - const noop = `\nexport const __rsc_noop__=()=>{${imports.join(';')}}` + const { source: transformedSource, defaultExportName } = + await parseImportsInfo( + source, + imports, + isClientCompilation, + getRawPageExtensions(pageExtensions) + ) + + /** + * Server side component module output: + * + * export default function ServerComponent() { ... } + * + export const __rsc_noop__=()=>{ ... } + * + ServerComponent.__next_rsc__=1; + * + * Client side component module output: + * + * The function body of ServerComponent will be removed + */ + + const noop = `export const __rsc_noop__=()=>{${imports.join(';')}}` const defaultExportNoop = isClientCompilation - ? `\nexport default function Comp(){}\nComp.__next_rsc__=1` - : '' + ? `export default function ${defaultExportName}(){}\n${defaultExportName}.__next_rsc__=1;` + : `${defaultExportName}.__next_rsc__=1;` + + const transformed = transformedSource + '\n' + noop + '\n' + defaultExportNoop - return transformed + noop + defaultExportNoop + return transformed } diff --git a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts index e4826c61b0f88..cc0b4435deec2 100644 --- a/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts +++ b/packages/next/build/webpack/loaders/next-middleware-ssr-loader/index.ts @@ -50,7 +50,7 @@ export default async function middlewareSSRLoader(this: any) { buildManifest, reactLoadableManifest, rscManifest, - isServerComponent: ${JSON.stringify(isServerComponent)}, + isServerComponent: ${isServerComponent}, restRenderOpts: ${JSON.stringify(restRenderOpts)} }) diff --git a/packages/next/build/webpack/loaders/next-serverless-loader/api-handler.ts b/packages/next/build/webpack/loaders/next-serverless-loader/api-handler.ts index 6171c86a01f59..0d85e3731d89b 100644 --- a/packages/next/build/webpack/loaders/next-serverless-loader/api-handler.ts +++ b/packages/next/build/webpack/loaders/next-serverless-loader/api-handler.ts @@ -3,6 +3,7 @@ import { IncomingMessage, ServerResponse } from 'http' import { apiResolver } from '../../../../server/api-utils' import { getUtils, vercelHeader, ServerlessHandlerCtx } from './utils' import { DecodeError } from '../../../../shared/lib/utils' +import { NodeNextResponse, NodeNextRequest } from '../../../../server/base-http' export function getApiHandler(ctx: ServerlessHandlerCtx) { const { pageModule, encodedPreviewProps, pageIsDynamic } = ctx @@ -13,7 +14,15 @@ export function getApiHandler(ctx: ServerlessHandlerCtx) { normalizeDynamicRouteParams, } = getUtils(ctx) - return async (req: IncomingMessage, res: ServerResponse) => { + return async ( + rawReq: NodeNextRequest | IncomingMessage, + rawRes: NodeNextResponse | ServerResponse + ) => { + const req = + rawReq instanceof IncomingMessage ? new NodeNextRequest(rawReq) : rawReq + const res = + rawRes instanceof ServerResponse ? new NodeNextResponse(rawRes) : rawRes + try { // We need to trust the dynamic route params from the proxy // to ensure we are using the correct values @@ -41,8 +50,8 @@ export function getApiHandler(ctx: ServerlessHandlerCtx) { } await apiResolver( - req, - res, + req.originalRequest, + res.originalResponse, Object.assign({}, parsedUrl.query, params), await pageModule, encodedPreviewProps, @@ -53,7 +62,7 @@ export function getApiHandler(ctx: ServerlessHandlerCtx) { if (err instanceof DecodeError) { res.statusCode = 400 - res.end('Bad Request') + res.body('Bad Request').send() } else { // Throw the error to crash the serverless function throw err diff --git a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts index 92adf265a2788..28b1ce0953142 100644 --- a/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts +++ b/packages/next/build/webpack/loaders/next-serverless-loader/utils.ts @@ -25,6 +25,7 @@ import cookie from 'next/dist/compiled/cookie' import { TEMPORARY_REDIRECT_STATUS } from '../../../../shared/lib/constants' import { NextConfig } from '../../../../server/config' import { addRequestMeta } from '../../../../server/request-meta' +import { BaseNextRequest } from '../../../../server/base-http' const getCustomRouteMatcher = pathMatch(true) @@ -85,7 +86,10 @@ export function getUtils({ defaultRouteMatches = dynamicRouteMatcher(page) as ParsedUrlQuery } - function handleRewrites(req: IncomingMessage, parsedUrl: UrlWithParsedQuery) { + function handleRewrites( + req: BaseNextRequest | IncomingMessage, + parsedUrl: UrlWithParsedQuery + ) { for (const rewrite of rewrites) { const matcher = getCustomRouteMatcher(rewrite.source) let params = matcher(parsedUrl.pathname) @@ -150,7 +154,10 @@ export function getUtils({ return parsedUrl } - function handleBasePath(req: IncomingMessage, parsedUrl: UrlWithParsedQuery) { + function handleBasePath( + req: BaseNextRequest | IncomingMessage, + parsedUrl: UrlWithParsedQuery + ) { // always strip the basePath if configured since it is required req.url = req.url!.replace(new RegExp(`^${basePath}`), '') || '/' parsedUrl.pathname = @@ -158,7 +165,7 @@ export function getUtils({ } function getParamsFromRouteMatches( - req: IncomingMessage, + req: BaseNextRequest | IncomingMessage, renderOpts?: any, detectedLocale?: string ) { @@ -269,7 +276,10 @@ export function getUtils({ return pathname } - function normalizeVercelUrl(req: IncomingMessage, trustQuery: boolean) { + function normalizeVercelUrl( + req: BaseNextRequest | IncomingMessage, + trustQuery: boolean + ) { // make sure to normalize req.url on Vercel to strip dynamic params // from the query which are added during routing if (pageIsDynamic && trustQuery && defaultRouteRegex) { @@ -374,7 +384,7 @@ export function getUtils({ if (detectedDomain) { defaultLocale = detectedDomain.defaultLocale detectedLocale = defaultLocale - addRequestMeta(req, '__nextIsLocaleDomain', true) + addRequestMeta(req as any, '__nextIsLocaleDomain', true) } // if not domain specific locale use accept-language preferred @@ -394,7 +404,7 @@ export function getUtils({ ...parsedUrl, pathname: localePathResult.pathname, }) - addRequestMeta(req, '__nextStrippedLocale', true) + addRequestMeta(req as any, '__nextStrippedLocale', true) parsedUrl.pathname = localePathResult.pathname } diff --git a/packages/next/build/webpack/loaders/next-swc-loader.js b/packages/next/build/webpack/loaders/next-swc-loader.js index eeecab0f236e0..70e596102ed7e 100644 --- a/packages/next/build/webpack/loaders/next-swc-loader.js +++ b/packages/next/build/webpack/loaders/next-swc-loader.js @@ -101,6 +101,8 @@ export function pitch() { ;(async () => { let loaderOptions = this.getOptions() || {} if ( + // TODO: investigate swc file reading in PnP mode? + !process.versions.pnp && loaderOptions.fileReading && !EXCLUDED_PATHS.test(this.resourcePath) && this.loaders.length - 1 === this.loaderIndex && diff --git a/packages/next/client/dev/error-overlay/hot-dev-client.js b/packages/next/client/dev/error-overlay/hot-dev-client.js index dd986befdfc74..3260608b0966b 100644 --- a/packages/next/client/dev/error-overlay/hot-dev-client.js +++ b/packages/next/client/dev/error-overlay/hot-dev-client.js @@ -330,7 +330,12 @@ const FULL_REFRESH_STORAGE_KEY = '_has_warned_about_full_refresh' function performFullRefresh(err) { if (shouldWarnAboutFullRefresh()) { sessionStorage.setItem(FULL_REFRESH_STORAGE_KEY, 'true') - onFullRefreshNeeded(err.message) + const reason = + err && + ((err.stack && err.stack.split('\n').slice(0, 5).join('\n')) || + err.message || + err + '') + onFullRefreshNeeded(reason) } else { window.location.reload() } diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx index 0029830836994..aaa3fab2d8dd4 100644 --- a/packages/next/client/index.tsx +++ b/packages/next/client/index.tsx @@ -629,6 +629,15 @@ function AppContainer({ ) } +function renderApp(App: AppComponent, appProps: AppProps) { + if (process.env.__NEXT_RSC && (App as any).__next_rsc__) { + const { Component, err: _, router: __, ...props } = appProps + return + } else { + return + } +} + const wrapApp = (App: AppComponent) => (wrappedAppProps: Record): JSX.Element => { @@ -638,11 +647,7 @@ const wrapApp = err: hydrateErr, router, } - return ( - - - - ) + return {renderApp(App, appProps)} } let RSCComponent: (props: any) => JSX.Element @@ -957,7 +962,7 @@ function doRender(input: RenderRouteInfo): Promise { <> - + {renderApp(App, appProps)} diff --git a/packages/next/client/router.ts b/packages/next/client/router.ts index d4021e05e730b..22a8ada7b4220 100644 --- a/packages/next/client/router.ts +++ b/packages/next/client/router.ts @@ -142,7 +142,7 @@ export function useRouter(): NextRouter { // (do not use following exports inside the app) // Create a router and assign it as the singleton instance. -// This is used in client side when we are initilizing the app. +// This is used in client side when we are initializing the app. // This should **not** be used inside the server. export function createRouter(...args: RouterArgs): Router { singletonRouter.router = new Router(...args) diff --git a/packages/next/compiled/@next/react-dev-overlay/client.js b/packages/next/compiled/@next/react-dev-overlay/client.js index f003efff0d3f4..d9c4fe6ee53be 100644 --- a/packages/next/compiled/@next/react-dev-overlay/client.js +++ b/packages/next/compiled/@next/react-dev-overlay/client.js @@ -4,4 +4,4 @@ * Copyright 2014-2020 Benjamin Tan * Copyright 2011-2013 John-David Dalton * Available under MIT license - */(function(){"use strict";var t={function:true,object:true};var r=t[typeof window]&&window||this;var a=r;var i=t[typeof n]&&n;var o=t["object"]&&e&&!e.nodeType&&e;var l=i&&o&&typeof global=="object"&&global;if(l&&(l.global===l||l.window===l||l.self===l)){r=l}var s=Math.pow(2,53)-1;var u=/\bOpera/;var c=this;var f=Object.prototype;var d=f.hasOwnProperty;var p=f.toString;function capitalize(e){e=String(e);return e.charAt(0).toUpperCase()+e.slice(1)}function cleanupOS(e,n,t){var r={"10.0":"10",6.4:"10 Technical Preview",6.3:"8.1",6.2:"8",6.1:"Server 2008 R2 / 7","6.0":"Server 2008 / Vista",5.2:"Server 2003 / XP 64-bit",5.1:"XP",5.01:"2000 SP1","5.0":"2000","4.0":"NT","4.90":"ME"};if(n&&t&&/^Win/i.test(e)&&!/^Windows Phone /i.test(e)&&(r=r[/[\d.]+$/.exec(e)])){e="Windows "+r}e=String(e);if(n&&t){e=e.replace(RegExp(n,"i"),t)}e=format(e.replace(/ ce$/i," CE").replace(/\bhpw/i,"web").replace(/\bMacintosh\b/,"Mac OS").replace(/_PowerPC\b/i," OS").replace(/\b(OS X) [^ \d]+/i,"$1").replace(/\bMac (OS X)\b/,"$1").replace(/\/(\d)/," $1").replace(/_/g,".").replace(/(?: BePC|[ .]*fc[ \d.]+)$/i,"").replace(/\bx86\.64\b/gi,"x86_64").replace(/\b(Windows Phone) OS\b/,"$1").replace(/\b(Chrome OS \w+) [\d.]+\b/,"$1").split(" on ")[0]);return e}function each(e,n){var t=-1,r=e?e.length:0;if(typeof r=="number"&&r>-1&&r<=s){while(++t3&&"WebKit"||/\bOpera\b/.test(A)&&(/\bOPR\b/.test(e)?"Blink":"Presto")||/\b(?:Midori|Nook|Safari)\b/i.test(e)&&!/^(?:Trident|EdgeHTML)$/.test(M)&&"WebKit"||!M&&/\bMSIE\b/i.test(e)&&(D=="Mac OS"?"Tasman":"Trident")||M=="WebKit"&&/\bPlayStation\b(?! Vita\b)/i.test(A)&&"NetFront"){M=[O]}if(A=="IE"&&(O=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(e)||0)[1])){A+=" Mobile";D="Windows Phone "+(/\+$/.test(O)?O:O+".x");S.unshift("desktop mode")}else if(/\bWPDesktop\b/i.test(e)){A="IE Mobile";D="Windows Phone 8.x";S.unshift("desktop mode");C||(C=(/\brv:([\d.]+)/.exec(e)||0)[1])}else if(A!="IE"&&M=="Trident"&&(O=/\brv:([\d.]+)/.exec(e))){if(A){S.push("identifying as "+A+(C?" "+C:""))}A="IE";C=O[1]}if(T){if(isHostType(n,"global")){if(h){O=h.lang.System;j=O.getProperty("os.arch");D=D||O.getProperty("os.name")+" "+O.getProperty("os.version")}if(g){try{C=n.require("ringo/engine").version.join(".");A="RingoJS"}catch(e){if((O=n.system)&&O.global.system==n.system){A="Narwhal";D||(D=O[0].os||null)}}if(!A){A="Rhino"}}else if(typeof n.process=="object"&&!n.process.browser&&(O=n.process)){if(typeof O.versions=="object"){if(typeof O.versions.electron=="string"){S.push("Node "+O.versions.node);A="Electron";C=O.versions.electron}else if(typeof O.versions.nw=="string"){S.push("Chromium "+C,"Node "+O.versions.node);A="NW.js";C=O.versions.nw}}if(!A){A="Node.js";j=O.arch;D=O.platform;C=/[\d.]+/.exec(O.version);C=C?C[0]:null}}}else if(getClassOf(O=n.runtime)==d){A="Adobe AIR";D=O.flash.system.Capabilities.os}else if(getClassOf(O=n.phantom)==m){A="PhantomJS";C=(O=O.version||null)&&O.major+"."+O.minor+"."+O.patch}else if(typeof w.documentMode=="number"&&(O=/\bTrident\/(\d+)/i.exec(e))){C=[C,w.documentMode];if((O=+O[1]+4)!=C[1]){S.push("IE "+C[1]+" mode");M&&(M[1]="");C[1]=O}C=A=="IE"?String(C[1].toFixed(1)):C[0]}else if(typeof w.documentMode=="number"&&/^(?:Chrome|Firefox)\b/.test(A)){S.push("masking as "+A+" "+C);A="IE";C="11.0";M=["Trident"];D="Windows"}D=D&&format(D)}if(C&&(O=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(C)||/(?:alpha|beta)(?: ?\d)?/i.exec(e+";"+(T&&i.appMinorVersion))||/\bMinefield\b/i.test(e)&&"a")){k=/b/i.test(O)?"beta":"alpha";C=C.replace(RegExp(O+"\\+?$"),"")+(k=="beta"?x:y)+(/\d+\+?/.exec(O)||"")}if(A=="Fennec"||A=="Firefox"&&/\b(?:Android|Firefox OS|KaiOS)\b/.test(D)){A="Firefox Mobile"}else if(A=="Maxthon"&&C){C=C.replace(/\.[\d.]+/,".x")}else if(/\bXbox\b/i.test(R)){if(R=="Xbox 360"){D=null}if(R=="Xbox 360"&&/\bIEMobile\b/.test(e)){S.unshift("mobile mode")}}else if((/^(?:Chrome|IE|Opera)$/.test(A)||A&&!R&&!/Browser|Mobi/.test(A))&&(D=="Windows CE"||/Mobi/i.test(e))){A+=" Mobile"}else if(A=="IE"&&T){try{if(n.external===null){S.unshift("platform preview")}}catch(e){S.unshift("embedded")}}else if((/\bBlackBerry\b/.test(R)||/\bBB10\b/.test(e))&&(O=(RegExp(R.replace(/ +/g," *")+"/([.\\d]+)","i").exec(e)||0)[1]||C)){O=[O,/BB10/.test(e)];D=(O[1]?(R=null,N="BlackBerry"):"Device Software")+" "+O[0];C=null}else if(this!=forOwn&&R!="Wii"&&(T&&_||/Opera/.test(A)&&/\b(?:MSIE|Firefox)\b/i.test(e)||A=="Firefox"&&/\bOS X (?:\d+\.){2,}/.test(D)||A=="IE"&&(D&&!/^Win/.test(D)&&C>5.5||/\bWindows XP\b/.test(D)&&C>8||C==8&&!/\bTrident\b/.test(e)))&&!u.test(O=parse.call(forOwn,e.replace(u,"")+";"))&&O.name){O="ing as "+O.name+((O=O.version)?" "+O:"");if(u.test(A)){if(/\bIE\b/.test(O)&&D=="Mac OS"){D=null}O="identify"+O}else{O="mask"+O;if(E){A=format(E.replace(/([a-z])([A-Z])/g,"$1 $2"))}else{A="Opera"}if(/\bIE\b/.test(O)){D=null}if(!T){C=null}}M=["Presto"];S.push(O)}if(O=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(e)||0)[1]){O=[parseFloat(O.replace(/\.(\d)$/,".0$1")),O];if(A=="Safari"&&O[1].slice(-1)=="+"){A="WebKit Nightly";k="alpha";C=O[1].slice(0,-1)}else if(C==O[1]||C==(O[2]=(/\bSafari\/([\d.]+\+?)/i.exec(e)||0)[1])){C=null}O[1]=(/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(e)||0)[1];if(O[0]==537.36&&O[2]==537.36&&parseFloat(O[1])>=28&&M=="WebKit"){M=["Blink"]}if(!T||!s&&!O[1]){M&&(M[1]="like Safari");O=(O=O[0],O<400?1:O<500?2:O<526?3:O<533?4:O<534?"4+":O<535?5:O<537?6:O<538?7:O<601?8:O<602?9:O<604?10:O<606?11:O<608?12:"12")}else{M&&(M[1]="like Chrome");O=O[1]||(O=O[0],O<530?1:O<532?2:O<532.05?3:O<533?4:O<534.03?5:O<534.07?6:O<534.1?7:O<534.13?8:O<534.16?9:O<534.24?10:O<534.3?11:O<535.01?12:O<535.02?"13+":O<535.07?15:O<535.11?16:O<535.19?17:O<536.05?18:O<536.1?19:O<537.01?20:O<537.11?"21+":O<537.13?23:O<537.18?24:O<537.24?25:O<537.36?26:M!="Blink"?"27":"28")}M&&(M[1]+=" "+(O+=typeof O=="number"?".x":/[.+]/.test(O)?"":"+"));if(A=="Safari"&&(!C||parseInt(C)>45)){C=O}else if(A=="Chrome"&&/\bHeadlessChrome/i.test(e)){S.unshift("headless")}}if(A=="Opera"&&(O=/\bzbov|zvav$/.exec(D))){A+=" ";S.unshift("desktop mode");if(O=="zvav"){A+="Mini";C=null}else{A+="Mobile"}D=D.replace(RegExp(" *"+O+"$"),"")}else if(A=="Safari"&&/\bChrome\b/.exec(M&&M[1])){S.unshift("desktop mode");A="Chrome Mobile";C=null;if(/\bOS X\b/.test(D)){N="Apple";D="iOS 4.3+"}else{D=null}}else if(/\bSRWare Iron\b/.test(A)&&!C){C=getVersion("Chrome")}if(C&&C.indexOf(O=/[\d.]+$/.exec(D))==0&&e.indexOf("/"+O+"-")>-1){D=trim(D.replace(O,""))}if(D&&D.indexOf(A)!=-1&&!RegExp(A+" OS").test(D)){D=D.replace(RegExp(" *"+qualify(A)+" *"),"")}if(M&&!/\b(?:Avant|Nook)\b/.test(A)&&(/Browser|Lunascape|Maxthon/.test(A)||A!="Safari"&&/^iOS/.test(D)&&/\bSafari\b/.test(M[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(A)&&M[1])){(O=M[M.length-1])&&S.push(O)}if(S.length){S=["("+S.join("; ")+")"]}if(N&&R&&R.indexOf(N)<0){S.push("on "+N)}if(R){S.push((/^on /.test(S[S.length-1])?"":"on ")+R)}if(D){O=/ ([\d.+]+)$/.exec(D);P=O&&D.charAt(D.length-O[0].length-1)=="/";D={architecture:32,family:O&&!P?D.replace(O[0],""):D,version:O?O[1]:null,toString:function(){var e=this.version;return this.family+(e&&!P?" "+e:"")+(this.architecture==64?" 64-bit":"")}}}if((O=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(j))&&!/\bi686\b/i.test(j)){if(D){D.architecture=64;D.family=D.family.replace(RegExp(" *"+O),"")}if(A&&(/\bWOW64\b/i.test(e)||T&&/\w(?:86|32)$/.test(i.cpuClass||i.platform)&&!/\bWin64; x64\b/i.test(e))){S.unshift("32-bit")}}else if(D&&/^OS X/.test(D.family)&&A=="Chrome"&&parseFloat(C)>=39){D.architecture=64}e||(e=null);var z={};z.description=e;z.layout=M&&M[0];z.manufacturer=N;z.name=A;z.prerelease=k;z.product=R;z.ua=e;z.version=A&&C;z.os=D||{architecture:null,family:null,version:null,toString:function(){return"null"}};z.parse=parse;z.toString=toStringPlatform;if(z.version){S.unshift(C)}if(z.name){S.unshift(A)}if(D&&A&&!(D==String(D).split(" ")[0]&&(D==A.split(" ")[0]||R))){S.push(R?"("+D+")":"on "+D)}if(S.length){z.description=S.join(" ")}return z}var v=parse();if(i&&o){forOwn(v,(function(e,n){i[n]=e}))}else{r.platform=v}}).call(this)},922:function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:true});var t="";function parse(e){var n=e.split("\n");return n.reduce((function(e,n){var t=parseChrome(n)||parseWinjs(n)||parseGecko(n)||parseNode(n)||parseJSC(n);if(t){e.push(t)}return e}),[])}var r=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;var a=/\((\S*)(?::(\d+))(?::(\d+))\)/;function parseChrome(e){var n=r.exec(e);if(!n){return null}var i=n[2]&&n[2].indexOf("native")===0;var o=n[2]&&n[2].indexOf("eval")===0;var l=a.exec(n[2]);if(o&&l!=null){n[2]=l[1];n[3]=l[2];n[4]=l[3]}return{file:!i?n[2]:null,methodName:n[1]||t,arguments:i?[n[2]]:[],lineNumber:n[3]?+n[3]:null,column:n[4]?+n[4]:null}}var i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;function parseWinjs(e){var n=i.exec(e);if(!n){return null}return{file:n[2],methodName:n[1]||t,arguments:[],lineNumber:+n[3],column:n[4]?+n[4]:null}}var o=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;var l=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i;function parseGecko(e){var n=o.exec(e);if(!n){return null}var r=n[3]&&n[3].indexOf(" > eval")>-1;var a=l.exec(n[3]);if(r&&a!=null){n[3]=a[1];n[4]=a[2];n[5]=null}return{file:n[3],methodName:n[1]||t,arguments:n[2]?n[2].split(","):[],lineNumber:n[4]?+n[4]:null,column:n[5]?+n[5]:null}}var s=/^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;function parseJSC(e){var n=s.exec(e);if(!n){return null}return{file:n[3],methodName:n[1]||t,arguments:[],lineNumber:+n[4],column:n[5]?+n[5]:null}}var u=/^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;function parseNode(e){var n=u.exec(e);if(!n){return null}return{file:n[2],methodName:n[1]||t,arguments:[],lineNumber:+n[3],column:n[4]?+n[4]:null}}n.parse=parse},977:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.onRefresh=n.unregister=n.register=n.onFullRefreshNeeded=n.onBuildError=n.onBuildOk=n.ReactDevOverlay=n.getNodeError=void 0;var o=i(t(591));var l=t(525);var s=false;var u=undefined;function onUnhandledError(e){var n=e===null||e===void 0?void 0:e.error;if(!n||!(n instanceof Error)||typeof n.stack!=="string"){return}var t=n;o.emit({type:o.TYPE_UNHANDLED_ERROR,reason:n,frames:(0,l.parseStack)(t.stack)})}function onUnhandledRejection(e){var n=e===null||e===void 0?void 0:e.reason;if(!n||!(n instanceof Error)||typeof n.stack!=="string"){return}var t=n;o.emit({type:o.TYPE_UNHANDLED_REJECTION,reason:n,frames:(0,l.parseStack)(t.stack)})}function register(){if(s){return}s=true;try{var e=Error.stackTraceLimit;Error.stackTraceLimit=50;u=e}catch(e){}window.addEventListener("error",onUnhandledError);window.addEventListener("unhandledrejection",onUnhandledRejection)}n.register=register;function unregister(){if(!s){return}s=false;if(u!==undefined){try{Error.stackTraceLimit=u}catch(e){}u=undefined}window.removeEventListener("error",onUnhandledError);window.removeEventListener("unhandledrejection",onUnhandledRejection)}n.unregister=unregister;function onBuildOk(){o.emit({type:o.TYPE_BUILD_OK})}n.onBuildOk=onBuildOk;function onBuildError(e){o.emit({type:o.TYPE_BUILD_ERROR,message:e})}n.onBuildError=onBuildError;function onFullRefreshNeeded(e){o.emit({type:o.TYPE_FULL_REFRESH_NEEDED,reason:e!==null&&e!==void 0?e:null})}n.onFullRefreshNeeded=onFullRefreshNeeded;function onRefresh(){o.emit({type:o.TYPE_REFRESH})}n.onRefresh=onRefresh;var c=t(915);r(n,c,"getNodeError");var f=t(943);r(n,f,"default","ReactDevOverlay")},198:function(e,n,t){"use strict";var r=this&&this.__extends||function(){var extendStatics=function(e,n){extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var t in n)if(Object.prototype.hasOwnProperty.call(n,t))e[t]=n[t]};return extendStatics(e,n)};return function(e,n){if(typeof n!=="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");extendStatics(e,n);function __(){this.constructor=e}e.prototype=n===null?Object.create(n):(__.prototype=n.prototype,new __)}}();var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;n.ErrorBoundary=void 0;var i=a(t(522));var o=function(e){r(ErrorBoundary,e);function ErrorBoundary(){var n=e!==null&&e.apply(this,arguments)||this;n.state={error:null};return n}ErrorBoundary.prototype.componentDidCatch=function(e,n){this.props.onError(e,(n===null||n===void 0?void 0:n.componentStack)||null);this.setState({error:e})};ErrorBoundary.prototype.render=function(){return this.state.error?null:this.props.children};return ErrorBoundary}(i["default"].PureComponent);n.ErrorBoundary=o},943:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};var s=this&&this.__spreadArray||function(e,n,t){if(t||arguments.length===2)for(var r=0,a=n.length,i;r? +\d+ +\| ( *)/.exec((0,c["default"])(e))})).filter(Boolean).map((function(e){return e.pop()})).reduce((function(e,n){return isNaN(e)?n.length:Math.min(e,n.length)}),NaN);if(n>1){var r=" ".repeat(n);return e.map((function(e,n){return~(n=e.indexOf("|"))?e.substring(0,n)+e.substring(n).replace(r,""):e})).join("\n")}return e.join("\n")}),[t]);var i=u.useMemo((function(){return s["default"].ansiToJson(a,{json:true,use_classes:true,remove_empty:true})}),[a]);var o=u.useCallback((function(){var e;var t=new URLSearchParams;for(var r in n){t.append(r,((e=n[r])!==null&&e!==void 0?e:"").toString())}self.fetch((process.env.__NEXT_ROUTER_BASEPATH||"")+"/__nextjs_launch-editor?"+t.toString()).then((function(){}),(function(){console.error("There was an issue opening this code in your editor.")}))}),[n]);return u.createElement("div",{"data-nextjs-codeframe":true},u.createElement("div",null,u.createElement("p",{role:"link",onClick:o,tabIndex:1,title:"Click to open in your editor"},u.createElement("span",null,(0,f.getFrameSource)(n)," @ ",n.methodName),u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},u.createElement("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),u.createElement("polyline",{points:"15 3 21 3 21 9"}),u.createElement("line",{x1:"10",y1:"14",x2:"21",y2:"3"})))),u.createElement("pre",null,i.map((function(e,n){return u.createElement("span",{key:"frame-"+n,style:r({color:e.fg?"var(--color-"+e.fg+")":undefined},e.decoration==="bold"?{fontWeight:800}:e.decoration==="italic"?{fontStyle:"italic"}:undefined)},e.content)}))))};n.CodeFrame=d},983:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.CodeFrame=void 0;var a=t(7);r(n,a,"CodeFrame")},761:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-codeframe] {\n overflow: auto;\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > div {\n display: inline-block;\n width: auto;\n min-width: 100%;\n border-bottom: 1px solid var(--color-ansi-bright-black);\n }\n [data-nextjs-codeframe] > div > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n margin: 0;\n }\n [data-nextjs-codeframe] > div > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] div > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n [data-nextjs-codeframe] div > pre {\n overflow: hidden;\n display: inline-block;\n }\n"],["\n [data-nextjs-codeframe] {\n overflow: auto;\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > div {\n display: inline-block;\n width: auto;\n min-width: 100%;\n border-bottom: 1px solid var(--color-ansi-bright-black);\n }\n [data-nextjs-codeframe] > div > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n margin: 0;\n }\n [data-nextjs-codeframe] > div > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] div > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n [data-nextjs-codeframe] div > pre {\n overflow: hidden;\n display: inline-block;\n }\n"])));n.styles=i;var o},870:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__rest||function(e,n){var t={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n.indexOf(r)<0)t[r]=e[r];if(e!=null&&typeof Object.getOwnPropertySymbols==="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.Dialog=void 0;var s=i(t(522));var u=t(814);var c=function Dialog(e){var n=e.children,t=e.type,r=e.onClose,a=o(e,["children","type","onClose"]);var i=l(s.useState(null),2),c=i[0],f=i[1];var d=s.useCallback((function(e){f(e)}),[]);(0,u.useOnClickOutside)(c,r);s.useEffect((function(){if(c==null){return}var e=c.getRootNode();if(!(e instanceof ShadowRoot)){return}var n=e;function handler(e){var t=n.activeElement;if(e.key==="Enter"&&t instanceof HTMLElement&&t.getAttribute("role")==="link"){e.preventDefault();e.stopPropagation();t.click()}}n.addEventListener("keydown",handler);return function(){return n.removeEventListener("keydown",handler)}}),[c]);return s.createElement("div",{ref:d,"data-nextjs-dialog":true,tabIndex:-1,role:"dialog","aria-labelledby":a["aria-labelledby"],"aria-describedby":a["aria-describedby"],"aria-modal":"true"},s.createElement("div",{"data-nextjs-dialog-banner":true,className:"banner-"+t}),n)};n.Dialog=c},244:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogBody=void 0;var o=i(t(522));var l=function DialogBody(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-body":true,className:t},n)};n.DialogBody=l},519:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogContent=void 0;var o=i(t(522));var l=function DialogContent(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-content":true,className:t},n)};n.DialogContent=l},734:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogHeader=void 0;var o=i(t(522));var l=function DialogHeader(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-header":true,className:t},n)};n.DialogHeader=l},824:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.styles=n.DialogHeader=n.DialogContent=n.DialogBody=n.Dialog=void 0;var a=t(870);r(n,a,"Dialog");var i=t(244);r(n,i,"DialogBody");var o=t(519);r(n,o,"DialogContent");var l=t(734);r(n,l,"DialogHeader");var s=t(629);r(n,s,"styles")},629:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"],["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"])));n.styles=i;var o},727:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.LeftRightDialogHeader=void 0;var l=i(t(522));var s=function LeftRightDialogHeader(e){var n=e.children,t=e.className,r=e.previous,a=e.next,i=e.close;var s=l.useRef(null);var u=l.useRef(null);var c=l.useRef(null);var f=o(l.useState(null),2),d=f[0],p=f[1];var v=l.useCallback((function(e){p(e)}),[]);l.useEffect((function(){if(d==null){return}var e=d.getRootNode();var n=self.document;function handler(n){if(n.key==="ArrowLeft"){n.stopPropagation();if(s.current){s.current.focus()}r&&r()}else if(n.key==="ArrowRight"){n.stopPropagation();if(u.current){u.current.focus()}a&&a()}else if(n.key==="Escape"){n.stopPropagation();if(e instanceof ShadowRoot){var t=e.activeElement;if(t&&t!==c.current&&t instanceof HTMLElement){t.blur();return}}if(i){i()}}}e.addEventListener("keydown",handler);if(e!==n){n.addEventListener("keydown",handler)}return function(){e.removeEventListener("keydown",handler);if(e!==n){n.removeEventListener("keydown",handler)}}}),[i,d,a,r]);l.useEffect((function(){if(d==null){return}var e=d.getRootNode();if(e instanceof ShadowRoot){var n=e.activeElement;if(r==null){if(s.current&&n===s.current){s.current.blur()}}else if(a==null){if(u.current&&n===u.current){u.current.blur()}}}}),[d,a,r]);return l.createElement("div",{"data-nextjs-dialog-left-right":true,className:t},l.createElement("nav",{ref:v},l.createElement("button",{ref:s,type:"button",disabled:r==null?true:undefined,"aria-disabled":r==null?true:undefined,onClick:r!==null&&r!==void 0?r:undefined},l.createElement("svg",{viewBox:"0 0 14 14",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M6.99996 1.16666L1.16663 6.99999L6.99996 12.8333M12.8333 6.99999H1.99996H12.8333Z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}))),l.createElement("button",{ref:u,type:"button",disabled:a==null?true:undefined,"aria-disabled":a==null?true:undefined,onClick:a!==null&&a!==void 0?a:undefined},l.createElement("svg",{viewBox:"0 0 14 14",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M6.99996 1.16666L12.8333 6.99999L6.99996 12.8333M1.16663 6.99999H12H1.16663Z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})))," ",n),i?l.createElement("button",{ref:c,type:"button",onClick:i,"aria-label":"Close"},l.createElement("span",{"aria-hidden":"true"},l.createElement("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M18 6L6 18",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),l.createElement("path",{d:"M6 6L18 18",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})))):null)};n.LeftRightDialogHeader=s},830:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.styles=n.LeftRightDialogHeader=void 0;var a=t(727);r(n,a,"LeftRightDialogHeader");var i=t(448);r(n,i,"styles")},448:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"],["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"])));n.styles=i;var o},434:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;n.Overlay=void 0;var s=l(t(426));var u=i(t(522));var c=t(253);var f=function Overlay(e){var n=e.className,t=e.children,r=e.fixed;u.useEffect((function(){(0,c.lock)();return function(){(0,c.unlock)()}}),[]);var a=o(u.useState(null),2),i=a[0],l=a[1];var f=u.useCallback((function(e){l(e)}),[]);u.useEffect((function(){if(i==null){return}var e=(0,s["default"])({context:i});return function(){e.disengage()}}),[i]);return u.createElement("div",{"data-nextjs-dialog-overlay":true,className:n,ref:f},u.createElement("div",{"data-nextjs-dialog-backdrop":true,"data-nextjs-dialog-backdrop-fixed":r?true:undefined}),t)};n.Overlay=f},253:function(e,n){"use strict";n.__esModule=true;n.unlock=n.lock=void 0;var t;var r;var a=0;function lock(){setTimeout((function(){if(a++>0){return}var e=window.innerWidth-document.documentElement.clientWidth;if(e>0){t=document.body.style.paddingRight;document.body.style.paddingRight=e+"px"}r=document.body.style.overflow;document.body.style.overflow="hidden"}))}n.lock=lock;function unlock(){setTimeout((function(){if(a===0||--a!==0){return}if(t!==undefined){document.body.style.paddingRight=t;t=undefined}if(r!==undefined){document.body.style.overflow=r;r=undefined}}))}n.unlock=unlock},382:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.Overlay=void 0;var a=t(434);r(n,a,"Overlay")},426:function(e,n,t){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;var a=r(t(36));var i=r(t(730));function nodeArray(e){if(!e){return[]}if(Array.isArray(e)){return e}if(e.nodeType!==undefined){return[e]}if(typeof e==="string"){e=document.querySelectorAll(e)}if(e.length!==undefined){return[].slice.call(e,0)}throw new TypeError("unexpected input "+String(e))}function contextToElement(e){var n=e.context,t=e.label,r=t===undefined?"context-to-element":t,a=e.resolveDocument,i=e.defaultToDocument;var o=nodeArray(n)[0];if(a&&o&&o.nodeType===Node.DOCUMENT_NODE){o=o.documentElement}if(!o&&i){return document.documentElement}if(!o){throw new TypeError(r+" requires valid options.context")}if(o.nodeType!==Node.ELEMENT_NODE&&o.nodeType!==Node.DOCUMENT_FRAGMENT_NODE){throw new TypeError(r+" requires options.context to be an Element")}return o}function getShadowHost(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context;var t=contextToElement({label:"get/shadow-host",context:n});var r=null;while(t){r=t;t=t.parentNode}if(r.nodeType===r.DOCUMENT_FRAGMENT_NODE&&r.host){return r.host}return null}function getDocument(e){if(!e){return document}if(e.nodeType===Node.DOCUMENT_NODE){return e}return e.ownerDocument||document}function isActiveElement(e){var n=contextToElement({label:"is/active-element",resolveDocument:true,context:e});var t=getDocument(n);if(t.activeElement===n){return true}var r=getShadowHost({context:n});if(r&&r.shadowRoot.activeElement===n){return true}return false}function getParents(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context;var t=[];var r=contextToElement({label:"get/parents",context:n});while(r){t.push(r);r=r.parentNode;if(r&&r.nodeType!==Node.ELEMENT_NODE){r=null}}return t}var o=["matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector"];var l=null;function findMethodName(e){o.some((function(n){if(!e[n]){return false}l=n;return true}))}function elementMatches(e,n){if(!l){findMethodName(e)}return e[l](n)}var s=JSON.parse(JSON.stringify(a["default"]));var u=s.os.family||"";var c=u==="Android";var f=u.slice(0,7)==="Windows";var d=u==="OS X";var p=u==="iOS";var v=s.layout==="Blink";var b=s.layout==="Gecko";var m=s.layout==="Trident";var h=s.layout==="EdgeHTML";var g=s.layout==="WebKit";var y=parseFloat(s.version);var x=Math.floor(y);s.majorVersion=x;s.is={ANDROID:c,WINDOWS:f,OSX:d,IOS:p,BLINK:v,GECKO:b,TRIDENT:m,EDGE:h,WEBKIT:g,IE9:m&&x===9,IE10:m&&x===10,IE11:m&&x===11};function before(){var e={activeElement:document.activeElement,windowScrollTop:window.scrollTop,windowScrollLeft:window.scrollLeft,bodyScrollTop:document.body.scrollTop,bodyScrollLeft:document.body.scrollLeft};var n=document.createElement("iframe");n.setAttribute("style","position:absolute; position:fixed; top:0; left:-2px; width:1px; height:1px; overflow:hidden;");n.setAttribute("aria-live","off");n.setAttribute("aria-busy","true");n.setAttribute("aria-hidden","true");document.body.appendChild(n);var t=n.contentWindow;var r=t.document;r.open();r.close();var a=r.createElement("div");r.body.appendChild(a);e.iframe=n;e.wrapper=a;e.window=t;e.document=r;return e}function test(e,n){e.wrapper.innerHTML="";var t=typeof n.element==="string"?e.document.createElement(n.element):n.element(e.wrapper,e.document);var r=n.mutate&&n.mutate(t,e.wrapper,e.document);if(!r&&r!==false){r=t}!t.parentNode&&e.wrapper.appendChild(t);r&&r.focus&&r.focus();return n.validate?n.validate(t,r,e.document):e.document.activeElement===r}function after(e){if(e.activeElement===document.body){document.activeElement&&document.activeElement.blur&&document.activeElement.blur();if(s.is.IE10){document.body.focus()}}else{e.activeElement&&e.activeElement.focus&&e.activeElement.focus()}document.body.removeChild(e.iframe);window.scrollTop=e.windowScrollTop;window.scrollLeft=e.windowScrollLeft;document.body.scrollTop=e.bodyScrollTop;document.body.scrollLeft=e.bodyScrollLeft}function detectFocus(e){var n=before();var t={};Object.keys(e).map((function(r){t[r]=test(n,e[r])}));after(n);return t}var w="1.4.1";function readLocalStorage(e){var n=void 0;try{n=window.localStorage&&window.localStorage.getItem(e);n=n?JSON.parse(n):{}}catch(e){n={}}return n}function writeLocalStorage(e,n){if(!document.hasFocus()){try{window.localStorage&&window.localStorage.removeItem(e)}catch(e){}return}try{window.localStorage&&window.localStorage.setItem(e,JSON.stringify(n))}catch(e){}}var _=typeof window!=="undefined"&&window.navigator.userAgent||"";var E="ally-supports-cache";var O=readLocalStorage(E);if(O.userAgent!==_||O.version!==w){O={}}O.userAgent=_;O.version=w;var j={get:function get(){return O},set:function set(e){Object.keys(e).forEach((function(n){O[n]=e[n]}));O.time=(new Date).toISOString();writeLocalStorage(E,O)}};function cssShadowPiercingDeepCombinator(){var e=void 0;try{document.querySelector("html >>> :first-child");e=">>>"}catch(n){try{document.querySelector("html /deep/ :first-child");e="/deep/"}catch(n){e=""}}return e}var S="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";var k={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return e.querySelector("area")}};var T={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return false},validate:function validate(e,n,t){if(s.is.GECKO){return true}var r=e.querySelector("area");r.focus();return t.activeElement===r}};var C={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return e.querySelector("area")},validate:function validate(e,n,t){if(s.is.GECKO){return true}return t.activeElement===n}};var P={name:"can-focus-audio-without-controls",element:"audio",mutate:function mutate(e){try{e.setAttribute("src",S)}catch(e){}}};var M="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";var A={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("area")}};var R={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","-1");e.setAttribute("style","display: -webkit-flex; display: -ms-flexbox; display: flex;");e.innerHTML='hello';return e.querySelector("span")}};var N={element:"fieldset",mutate:function mutate(e){e.setAttribute("tabindex",0);e.setAttribute("disabled","disabled")}};var D={element:"fieldset",mutate:function mutate(e){e.innerHTML="legend

    content

    "}};var z={element:"span",mutate:function mutate(e){e.setAttribute("style","display: -webkit-flex; display: -ms-flexbox; display: flex;");e.innerHTML='hello'}};var F={element:"form",mutate:function mutate(e){e.setAttribute("tabindex",0);e.setAttribute("disabled","disabled")}};var I={element:"a",mutate:function mutate(e){e.href="#void";e.innerHTML='';return e.querySelector("img")}};var L={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("img")}};var B={element:function element(e,n){var t=n.createElement("iframe");e.appendChild(t);var r=t.contentWindow.document;r.open();r.close();return t},mutate:function mutate(e){e.style.visibility="hidden";var n=e.contentWindow.document;var t=n.createElement("input");n.body.appendChild(t);return t},validate:function validate(e){var n=e.contentWindow.document;var t=n.querySelector("input");return n.activeElement===t}};var H=!s.is.WEBKIT;function focusInZeroDimensionObject(){return H}var W={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","invalid-value")}};var q={element:"label",mutate:function mutate(e){e.setAttribute("tabindex","-1")},validate:function validate(e,n,t){var r=e.offsetHeight;e.focus();return t.activeElement===e}};var U="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtb"+"G5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0ic3ZnIj48dGV4dCB4PSIxMCIgeT0iMjAiIGlkPSJ"+"zdmctbGluay10ZXh0Ij50ZXh0PC90ZXh0Pjwvc3ZnPg==";var G={element:"object",mutate:function mutate(e){e.setAttribute("type","image/svg+xml");e.setAttribute("data",U);e.setAttribute("width","200");e.setAttribute("height","50");e.style.visibility="hidden"}};var V={name:"can-focus-object-svg",element:"object",mutate:function mutate(e){e.setAttribute("type","image/svg+xml");e.setAttribute("data",U);e.setAttribute("width","200");e.setAttribute("height","50")},validate:function validate(e,n,t){if(s.is.GECKO){return true}return t.activeElement===e}};var K=!s.is.IE9;function focusObjectSwf(){return K}var Z={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("img")},validate:function validate(e,n,t){var r=e.querySelector("area");return t.activeElement===r}};var $={element:"fieldset",mutate:function mutate(e){e.innerHTML='legend';return false},validate:function validate(e,n,t){var r=e.querySelector('input[tabindex="-1"]');var a=e.querySelector('input[tabindex="0"]');e.focus();e.querySelector("legend").focus();return t.activeElement===r&&"focusable"||t.activeElement===a&&"tabbable"||""}};var Y={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px; overflow: auto;");e.innerHTML='
    scrollable content
    ';return e.querySelector("div")}};var X={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px;");e.innerHTML='
    scrollable content
    '}};var J={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px; overflow: auto;");e.innerHTML='
    scrollable content
    '}};var Q={element:"details",mutate:function mutate(e){e.innerHTML="foo

    content

    ";return e.firstElementChild}};function makeFocusableForeignObject(){var e=document.createElement("div");e.innerHTML='\n \n ';return e.firstChild.firstChild}function focusSvgForeignObjectHack(e){var n=e.ownerSVGElement||e.nodeName.toLowerCase()==="svg";if(!n){return false}var t=makeFocusableForeignObject();e.appendChild(t);var r=t.querySelector("input");r.focus();r.disabled=true;e.removeChild(t);return true}function generate(e){return''+e+""}function focus(e){if(e.focus){return}try{HTMLElement.prototype.focus.call(e)}catch(n){focusSvgForeignObjectHack(e)}}function validate(e,n,t){focus(n);return t.activeElement===n}var ee={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var ne={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var te={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var re={element:"div",mutate:function mutate(e){e.innerHTML=generate(['link',''].join(""));return e.querySelector("use")},validate:validate};var ae={element:"div",mutate:function mutate(e){e.innerHTML=generate('');return e.querySelector("foreignObject")||e.getElementsByTagName("foreignObject")[0]},validate:validate};var ie=Boolean(s.is.GECKO&&typeof SVGElement!=="undefined"&&SVGElement.prototype.focus);function focusSvgInIframe(){return ie}var oe={element:"div",mutate:function mutate(e){e.innerHTML=generate("");return e.firstChild},validate:validate};var le={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","3x")}};var se={element:"table",mutate:function mutate(e,n,t){var r=t.createDocumentFragment();r.innerHTML="cell";e.appendChild(r)}};var ue={element:"video",mutate:function mutate(e){try{e.setAttribute("src",S)}catch(e){}}};var ce=s.is.GECKO||s.is.TRIDENT||s.is.EDGE;function tabsequenceAreaAtImgPosition(){return ce}var fe={cssShadowPiercingDeepCombinator:cssShadowPiercingDeepCombinator,focusInZeroDimensionObject:focusInZeroDimensionObject,focusObjectSwf:focusObjectSwf,focusSvgInIframe:focusSvgInIframe,tabsequenceAreaAtImgPosition:tabsequenceAreaAtImgPosition};var de={focusAreaImgTabindex:k,focusAreaTabindex:T,focusAreaWithoutHref:C,focusAudioWithoutControls:P,focusBrokenImageMap:A,focusChildrenOfFocusableFlexbox:R,focusFieldsetDisabled:N,focusFieldset:D,focusFlexboxContainer:z,focusFormDisabled:F,focusImgIsmap:I,focusImgUsemapTabindex:L,focusInHiddenIframe:B,focusInvalidTabindex:W,focusLabelTabindex:q,focusObjectSvg:V,focusObjectSvgHidden:G,focusRedirectImgUsemap:Z,focusRedirectLegend:$,focusScrollBody:Y,focusScrollContainerWithoutOverflow:X,focusScrollContainer:J,focusSummary:Q,focusSvgFocusableAttribute:ee,focusSvgTabindexAttribute:ne,focusSvgNegativeTabindexAttribute:te,focusSvgUseTabindex:re,focusSvgForeignobjectTabindex:ae,focusSvg:oe,focusTabindexTrailingCharacters:le,focusTable:se,focusVideoWithoutControls:ue};function executeTests(){var e=detectFocus(de);Object.keys(fe).forEach((function(n){e[n]=fe[n]()}));return e}var pe=null;function _supports(){if(pe){return pe}pe=j.get();if(!pe.time){j.set(executeTests());pe=j.get()}return pe}var ve=void 0;var be=/^\s*(-|\+)?[0-9]+\s*$/;var me=/^\s*(-|\+)?[0-9]+.*$/;function isValidTabindex(e){if(!ve){ve=_supports()}var n=ve.focusTabindexTrailingCharacters?me:be;var t=contextToElement({label:"is/valid-tabindex",resolveDocument:true,context:e});var r=t.hasAttribute("tabindex");var a=t.hasAttribute("tabIndex");if(!r&&!a){return false}var i=t.ownerSVGElement||t.nodeName.toLowerCase()==="svg";if(i&&!ve.focusSvgTabindexAttribute){return false}if(ve.focusInvalidTabindex){return true}var o=t.getAttribute(r?"tabindex":"tabIndex");if(o==="-32768"){return false}return Boolean(o&&n.test(o))}function tabindexValue(e){if(!isValidTabindex(e)){return null}var n=e.hasAttribute("tabindex");var t=n?"tabindex":"tabIndex";var r=parseInt(e.getAttribute(t),10);return isNaN(r)?-1:r}function isUserModifyWritable(e){var n=e.webkitUserModify||"";return Boolean(n&&n.indexOf("write")!==-1)}function hasCssOverflowScroll(e){return[e.getPropertyValue("overflow"),e.getPropertyValue("overflow-x"),e.getPropertyValue("overflow-y")].some((function(e){return e==="auto"||e==="scroll"}))}function hasCssDisplayFlex(e){return e.display.indexOf("flex")>-1}function isScrollableContainer(e,n,t,r){if(n!=="div"&&n!=="span"){return false}if(t&&t!=="div"&&t!=="span"&&!hasCssOverflowScroll(r)){return false}return e.offsetHeight0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{flexbox:false,scrollable:false,shadow:false}:t;if(!he){he=_supports()}var a=contextToElement({label:"is/focus-relevant",resolveDocument:true,context:n});if(!r.shadow&&a.shadowRoot){return true}var i=a.nodeName.toLowerCase();if(i==="input"&&a.type==="hidden"){return false}if(i==="input"||i==="select"||i==="button"||i==="textarea"){return true}if(i==="legend"&&he.focusRedirectLegend){return true}if(i==="label"){return true}if(i==="area"){return true}if(i==="a"&&a.hasAttribute("href")){return true}if(i==="object"&&a.hasAttribute("usemap")){return false}if(i==="object"){var o=a.getAttribute("type");if(!he.focusObjectSvg&&o==="image/svg+xml"){return false}else if(!he.focusObjectSwf&&o==="application/x-shockwave-flash"){return false}}if(i==="iframe"||i==="object"){return true}if(i==="embed"||i==="keygen"){return true}if(a.hasAttribute("contenteditable")){return true}if(i==="audio"&&(he.focusAudioWithoutControls||a.hasAttribute("controls"))){return true}if(i==="video"&&(he.focusVideoWithoutControls||a.hasAttribute("controls"))){return true}if(he.focusSummary&&i==="summary"){return true}var l=isValidTabindex(a);if(i==="img"&&a.hasAttribute("usemap")){return l&&he.focusImgUsemapTabindex||he.focusRedirectImgUsemap}if(he.focusTable&&(i==="table"||i==="td")){return true}if(he.focusFieldset&&i==="fieldset"){return true}var s=i==="svg";var u=a.ownerSVGElement;var c=a.getAttribute("focusable");var f=tabindexValue(a);if(i==="use"&&f!==null&&!he.focusSvgUseTabindex){return false}if(i==="foreignobject"){return f!==null&&he.focusSvgForeignobjectTabindex}if(elementMatches(a,"svg a")&&a.hasAttribute("xlink:href")){return true}if((s||u)&&a.focus&&!he.focusSvgNegativeTabindexAttribute&&f<0){return false}if(s){return l||he.focusSvg||he.focusSvgInIframe||Boolean(he.focusSvgFocusableAttribute&&c&&c==="true")}if(u){if(he.focusSvgTabindexAttribute&&l){return true}if(he.focusSvgFocusableAttribute){return c==="true"}}if(l){return true}var d=window.getComputedStyle(a,null);if(isUserModifyWritable(d)){return true}if(he.focusImgIsmap&&i==="img"&&a.hasAttribute("ismap")){var p=getParents({context:a}).some((function(e){return e.nodeName.toLowerCase()==="a"&&e.hasAttribute("href")}));if(p){return true}}if(!r.scrollable&&he.focusScrollContainer){if(he.focusScrollContainerWithoutOverflow){if(isScrollableContainer(a,i)){return true}}else if(hasCssOverflowScroll(d)){return true}}if(!r.flexbox&&he.focusFlexboxContainer&&hasCssDisplayFlex(d)){return true}var v=a.parentElement;if(!r.scrollable&&v){var b=v.nodeName.toLowerCase();var m=window.getComputedStyle(v,null);if(he.focusScrollBody&&isScrollableContainer(v,i,b,m)){return true}if(he.focusChildrenOfFocusableFlexbox){if(hasCssDisplayFlex(m)){return true}}}return false}isFocusRelevantRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isFocusRelevant(n){return isFocusRelevantRules({context:n,except:e})};n.rules=isFocusRelevantRules;return n};var ge=isFocusRelevantRules.except({});function findIndex(e,n){if(e.findIndex){return e.findIndex(n)}var t=e.length;if(t===0){return-1}for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{notRendered:false,cssDisplay:false,cssVisibility:false,detailsElement:false,browsingContext:false}:t;var a=contextToElement({label:"is/visible",resolveDocument:true,context:n});var i=a.nodeName.toLowerCase();if(!r.notRendered&&we.test(i)){return true}var o=getParents({context:a});var l=i==="audio"&&!a.hasAttribute("controls");if(!r.cssDisplay&¬Displayed(l?o.slice(1):o)){return false}if(!r.cssVisibility&¬Visible(o)){return false}if(!r.detailsElement&&collapsedParent(o)){return false}if(!r.browsingContext){var s=getFrameElement(a);var u=isVisibleRules.except(r);if(s&&!u(s)){return false}}return true}isVisibleRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isVisible(n){return isVisibleRules({context:n,except:e})};n.rules=isVisibleRules;return n};var _e=isVisibleRules.except({});function getMapByName(e,n){var t=n.querySelector('map[name="'+(0,i["default"])(e)+'"]');return t||null}function getImageOfArea(e){var n=e.parentElement;if(!n.name||n.nodeName.toLowerCase()!=="map"){return null}var t=getDocument(e);return t.querySelector('img[usemap="#'+(0,i["default"])(n.name)+'"]')||null}var Ee=void 0;function isValidArea(e){if(!Ee){Ee=_supports()}var n=contextToElement({label:"is/valid-area",context:e});var t=n.nodeName.toLowerCase();if(t!=="area"){return false}var r=n.hasAttribute("tabindex");if(!Ee.focusAreaTabindex&&r){return false}var a=getImageOfArea(n);if(!a||!_e(a)){return false}if(!Ee.focusBrokenImageMap&&(!a.complete||!a.naturalHeight||a.offsetWidth<=0||a.offsetHeight<=0)){return false}if(!Ee.focusAreaWithoutHref&&!n.href){return Ee.focusAreaTabindex&&r||Ee.focusAreaImgTabindex&&a.hasAttribute("tabindex")}var i=getParents({context:a}).slice(1).some((function(e){var n=e.nodeName.toLowerCase();return n==="button"||n==="a"}));if(i){return false}return true}var Oe=void 0;var je=void 0;var Se={input:true,select:true,textarea:true,button:true,fieldset:true,form:true};function isNativeDisabledSupported(e){if(!Oe){Oe=_supports();if(Oe.focusFieldsetDisabled){delete Se.fieldset}if(Oe.focusFormDisabled){delete Se.form}je=new RegExp("^("+Object.keys(Se).join("|")+")$")}var n=contextToElement({label:"is/native-disabled-supported",context:e});var t=n.nodeName.toLowerCase();return Boolean(je.test(t))}var ke=void 0;function isDisabledFieldset(e){var n=e.nodeName.toLowerCase();return n==="fieldset"&&e.disabled}function isDisabledForm(e){var n=e.nodeName.toLowerCase();return n==="form"&&e.disabled}function isDisabled(e){if(!ke){ke=_supports()}var n=contextToElement({label:"is/disabled",context:e});if(n.hasAttribute("data-ally-disabled")){return true}if(!isNativeDisabledSupported(n)){return false}if(n.disabled){return true}var t=getParents({context:n});if(t.some(isDisabledFieldset)){return true}if(!ke.focusFormDisabled&&t.some(isDisabledForm)){return true}return false}function isOnlyTabbableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{onlyFocusableBrowsingContext:false,visible:false}:t;var a=contextToElement({label:"is/only-tabbable",resolveDocument:true,context:n});if(!r.visible&&!_e(a)){return false}if(!r.onlyFocusableBrowsingContext&&(s.is.GECKO||s.is.TRIDENT||s.is.EDGE)){var i=getFrameElement(a);if(i){if(tabindexValue(i)<0){return false}}}var o=a.nodeName.toLowerCase();var l=tabindexValue(a);if(o==="label"&&s.is.GECKO){return l!==null&&l>=0}if(s.is.GECKO&&a.ownerSVGElement&&!a.focus){if(o==="a"&&a.hasAttribute("xlink:href")){if(s.is.GECKO){return true}}}return false}isOnlyTabbableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isOnlyTabbable(n){return isOnlyTabbableRules({context:n,except:e})};n.rules=isOnlyTabbableRules;return n};var Te=isOnlyTabbableRules.except({});var Ce=void 0;function isOnlyFocusRelevant(e){var n=e.nodeName.toLowerCase();if(n==="embed"||n==="keygen"){return true}var t=tabindexValue(e);if(e.shadowRoot&&t===null){return true}if(n==="label"){return!Ce.focusLabelTabindex||t===null}if(n==="legend"){return t===null}if(Ce.focusSvgFocusableAttribute&&(e.ownerSVGElement||n==="svg")){var r=e.getAttribute("focusable");return r&&r==="false"}if(n==="img"&&e.hasAttribute("usemap")){return t===null||!Ce.focusImgUsemapTabindex}if(n==="area"){return!isValidArea(e)}return false}function isFocusableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{disabled:false,visible:false,onlyTabbable:false}:t;if(!Ce){Ce=_supports()}var a=Te.rules.except({onlyFocusableBrowsingContext:true,visible:r.visible});var i=contextToElement({label:"is/focusable",resolveDocument:true,context:n});var o=ge.rules({context:i,except:r});if(!o||isOnlyFocusRelevant(i)){return false}if(!r.disabled&&isDisabled(i)){return false}if(!r.onlyTabbable&&a(i)){return false}if(!r.visible){var l={context:i,except:{}};if(Ce.focusInHiddenIframe){l.except.browsingContext=true}if(Ce.focusObjectSvgHidden){var s=i.nodeName.toLowerCase();if(s==="object"){l.except.cssVisibility=true}}if(!_e.rules(l)){return false}}var u=getFrameElement(i);if(u){var c=u.nodeName.toLowerCase();if(c==="object"&&!Ce.focusInZeroDimensionObject){if(!u.offsetWidth||!u.offsetHeight){return false}}}var f=i.nodeName.toLowerCase();if(f==="svg"&&Ce.focusSvgInIframe&&!u&&i.getAttribute("tabindex")===null){return false}return true}isFocusableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isFocusable(n){return isFocusableRules({context:n,except:e})};n.rules=isFocusableRules;return n};var Pe=isFocusableRules.except({});function createFilter(e){var n=function filter(n){if(n.shadowRoot){return NodeFilter.FILTER_ACCEPT}if(e(n)){return NodeFilter.FILTER_ACCEPT}return NodeFilter.FILTER_SKIP};n.acceptNode=n;return n}var Me=createFilter(ge);function queryFocusableStrict(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;if(!n){n=document.documentElement}var i=Pe.rules.except({onlyTabbable:r});var o=getDocument(n);var l=o.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,a==="all"?Me:createFilter(i),false);var s=[];while(l.nextNode()){if(l.currentNode.shadowRoot){if(i(l.currentNode)){s.push(l.currentNode)}s=s.concat(queryFocusableStrict({context:l.currentNode.shadowRoot,includeOnlyTabbable:r,strategy:a}))}else{s.push(l.currentNode)}}if(t){if(a==="all"){if(ge(n)){s.unshift(n)}}else if(i(n)){s.unshift(n)}}return s}var Ae=void 0;var Re=void 0;function selector$2(){if(!Ae){Ae=_supports()}if(typeof Re==="string"){return Re}Re=""+(Ae.focusTable?"table, td,":"")+(Ae.focusFieldset?"fieldset,":"")+"svg a,"+"a[href],"+"area[href],"+"input, select, textarea, button,"+"iframe, object, embed,"+"keygen,"+(Ae.focusAudioWithoutControls?"audio,":"audio[controls],")+(Ae.focusVideoWithoutControls?"video,":"video[controls],")+(Ae.focusSummary?"summary,":"")+"[tabindex],"+"[contenteditable]";Re=selectInShadows(Re);return Re}function queryFocusableQuick(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable;var a=selector$2();var i=n.querySelectorAll(a);var o=Pe.rules.except({onlyTabbable:r});var l=[].filter.call(i,o);if(t&&o(n)){l.unshift(n)}return l}function queryFocusable(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy,i=a===undefined?"quick":a;var o=contextToElement({label:"query/focusable",resolveDocument:true,defaultToDocument:true,context:n});var l={context:o,includeContext:t,includeOnlyTabbable:r,strategy:i};if(i==="quick"){return queryFocusableQuick(l)}else if(i==="strict"||i==="all"){return queryFocusableStrict(l)}throw new TypeError('query/focusable requires option.strategy to be one of ["quick", "strict", "all"]')}var Ne=void 0;var De=/^(fieldset|table|td|body)$/;function isTabbableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{flexbox:false,scrollable:false,shadow:false,visible:false,onlyTabbable:false}:t;if(!Ne){Ne=_supports()}var a=contextToElement({label:"is/tabbable",resolveDocument:true,context:n});if(s.is.BLINK&&s.is.ANDROID&&s.majorVersion>42){return false}var i=getFrameElement(a);if(i){if(s.is.WEBKIT&&s.is.IOS){return false}if(tabindexValue(i)<0){return false}if(!r.visible&&(s.is.BLINK||s.is.WEBKIT)&&!_e(i)){return false}var o=i.nodeName.toLowerCase();if(o==="object"){var l=s.name==="Chrome"&&s.majorVersion>=54||s.name==="Opera"&&s.majorVersion>=41;if(s.is.WEBKIT||s.is.BLINK&&!l){return false}}}var u=a.nodeName.toLowerCase();var c=tabindexValue(a);var f=c===null?null:c>=0;if(s.is.EDGE&&s.majorVersion>=14&&i&&a.ownerSVGElement&&c<0){return true}var d=f!==false;var p=c!==null&&c>=0;if(a.hasAttribute("contenteditable")){return d}if(De.test(u)&&f!==true){return false}if(s.is.WEBKIT&&s.is.IOS){var v=u==="input"&&a.type==="text"||a.type==="password"||u==="select"||u==="textarea"||a.hasAttribute("contenteditable");if(!v){var b=window.getComputedStyle(a,null);v=isUserModifyWritable(b)}if(!v){return false}}if(u==="use"&&c!==null){if(s.is.BLINK||s.is.WEBKIT&&s.majorVersion===9){return true}}if(elementMatches(a,"svg a")&&a.hasAttribute("xlink:href")){if(d){return true}if(a.focus&&!Ne.focusSvgNegativeTabindexAttribute){return true}}if(u==="svg"&&Ne.focusSvgInIframe&&d){return true}if(s.is.TRIDENT||s.is.EDGE){if(u==="svg"){if(Ne.focusSvg){return true}return a.hasAttribute("focusable")||p}if(a.ownerSVGElement){if(Ne.focusSvgTabindexAttribute&&p){return true}return a.hasAttribute("focusable")}}if(a.tabIndex===undefined){return Boolean(r.onlyTabbable)}if(u==="audio"){if(!a.hasAttribute("controls")){return false}else if(s.is.BLINK){return true}}if(u==="video"){if(!a.hasAttribute("controls")){if(s.is.TRIDENT||s.is.EDGE){return false}}else if(s.is.BLINK||s.is.GECKO){return true}}if(u==="object"){if(s.is.BLINK||s.is.WEBKIT){return false}}if(u==="iframe"){return false}if(!r.scrollable&&s.is.GECKO){var m=window.getComputedStyle(a,null);if(hasCssOverflowScroll(m)){return d}}if(s.is.TRIDENT||s.is.EDGE){if(u==="area"){var h=getImageOfArea(a);if(h&&tabindexValue(h)<0){return false}}var g=window.getComputedStyle(a,null);if(isUserModifyWritable(g)){return a.tabIndex>=0}if(!r.flexbox&&hasCssDisplayFlex(g)){if(c!==null){return p}return ze(a)&&Fe(a)}if(isScrollableContainer(a,u)){return false}var y=a.parentElement;if(y){var x=y.nodeName.toLowerCase();var w=window.getComputedStyle(y,null);if(isScrollableContainer(y,u,x,w)){return false}if(hasCssDisplayFlex(w)){return p}}}return a.tabIndex>=0}isTabbableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isTabbable(n){return isTabbableRules({context:n,except:e})};n.rules=isTabbableRules;return n};var ze=ge.rules.except({flexbox:true});var Fe=isTabbableRules.except({flexbox:true});var Ie=isTabbableRules.except({});function queryTabbable(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;var i=Ie.rules.except({onlyTabbable:r});return queryFocusable({context:n,includeContext:t,includeOnlyTabbable:r,strategy:a}).filter(i)}function compareDomPosition(e,n){return e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}function sortDomOrder(e){return e.sort(compareDomPosition)}function getFirstSuccessorOffset(e,n){return findIndex(e,(function(e){return n.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING}))}function findInsertionOffsets(e,n,t){var r=[];n.forEach((function(n){var a=true;var i=e.indexOf(n);if(i===-1){i=getFirstSuccessorOffset(e,n);a=false}if(i===-1){i=e.length}var o=nodeArray(t?t(n):n);if(!o.length){return}r.push({offset:i,replace:a,elements:o})}));return r}function insertElementsAtOffsets(e,n){var t=0;n.sort((function(e,n){return e.offset-n.offset}));n.forEach((function(n){var r=n.replace?1:0;var a=[n.offset+t,r].concat(n.elements);e.splice.apply(e,a);t+=n.elements.length-r}))}function mergeInDomOrder(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.list,t=e.elements,r=e.resolveElement;var a=n.slice(0);var i=nodeArray(t).slice(0);sortDomOrder(i);var o=findInsertionOffsets(a,i,r);insertElementsAtOffsets(a,o);return a}var Le=function(){function defineProperties(e,n){for(var t=0;t-1){return[e].concat(n)}return n}},{key:"_cleanup",value:function _cleanup(){Object.keys(this.hosts).forEach((function(e){delete this.hosts[e]._sortingId}),this)}}]);return Shadows}();function sortShadowed(e,n,t){var r=new We(n,t);var a=r.extractElements(e);if(a.length===e.length){return t(e)}return r.sort(a)}function sortTabindex(e){var n={};var t=[];var r=e.filter((function(e){var r=e.tabIndex;if(r===undefined){r=tabindexValue(e)}if(r<=0||r===null||r===undefined){return true}if(!n[r]){n[r]=[];t.push(r)}n[r].push(e);return false}));var a=t.sort().map((function(e){return n[e]})).reduceRight((function(e,n){return n.concat(e)}),r);return a}var qe=void 0;function moveContextToBeginning(e,n){var t=e.indexOf(n);if(t>0){var r=e.splice(t,1);return r.concat(e)}return e}function sortElements(e,n){if(qe.tabsequenceAreaAtImgPosition){e=sortArea(e,n)}e=sortTabindex(e);return e}function queryTabsequence(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;if(!qe){qe=_supports()}var i=nodeArray(n)[0]||document.documentElement;var o=queryTabbable({context:i,includeContext:t,includeOnlyTabbable:r,strategy:a});if(document.body.createShadowRoot&&s.is.BLINK){o=sortShadowed(o,i,sortElements)}else{o=sortElements(o,i)}if(t){o=moveContextToBeginning(o,i)}return o}var Ue={tab:9,left:37,up:38,right:39,down:40,pageUp:33,"page-up":33,pageDown:34,"page-down":34,end:35,home:36,enter:13,escape:27,space:32,shift:16,capsLock:20,"caps-lock":20,ctrl:17,alt:18,meta:91,pause:19,insert:45,delete:46,backspace:8,_alias:{91:[92,93,224]}};for(var Ge=1;Ge<26;Ge++){Ue["f"+Ge]=Ge+111}for(var Ve=0;Ve<10;Ve++){var Ke=Ve+48;var Ze=Ve+96;Ue[Ve]=Ke;Ue["num-"+Ve]=Ze;Ue._alias[Ke]=[Ze]}for(var $e=0;$e<26;$e++){var Ye=$e+65;var Xe=String.fromCharCode(Ye).toLowerCase();Ue[Xe]=Ye}var Je={alt:"altKey",ctrl:"ctrlKey",meta:"metaKey",shift:"shiftKey"};var Qe=Object.keys(Je).map((function(e){return Je[e]}));function createExpectedModifiers(e){var n=e?null:false;return{altKey:n,ctrlKey:n,metaKey:n,shiftKey:n}}function resolveModifiers(e){var n=e.indexOf("*")!==-1;var t=createExpectedModifiers(n);e.forEach((function(e){if(e==="*"){return}var n=true;var r=e.slice(0,1);if(r==="?"){n=null}else if(r==="!"){n=false}if(n!==true){e=e.slice(1)}var a=Je[e];if(!a){throw new TypeError('Unknown modifier "'+e+'"')}t[a]=n}));return t}function resolveKey(e){var n=Ue[e]||parseInt(e,10);if(!n||typeof n!=="number"||isNaN(n)){throw new TypeError('Unknown key "'+e+'"')}return[n].concat(Ue._alias[n]||[])}function matchModifiers(e,n){return!Qe.some((function(t){return typeof e[t]==="boolean"&&Boolean(n[t])!==e[t]}))}function keyBinding(e){return e.split(/\s+/).map((function(e){var n=e.split("+");var t=resolveModifiers(n.slice(0,-1));var r=resolveKey(n.slice(-1));return{keyCodes:r,modifiers:t,matchModifiers:matchModifiers.bind(null,t)}}))}function getParentComparator(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.parent,t=e.element,r=e.includeSelf;if(n){return function isChildOf(e){return Boolean(r&&e===n||n.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_CONTAINED_BY)}}else if(t){return function isParentOf(e){return Boolean(r&&t===e||e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)}}throw new TypeError("util/compare-position#getParentComparator required either options.parent or options.element")}function whenKey(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n={};var t=nodeArray(e.context)[0]||document.documentElement;delete e.context;var r=nodeArray(e.filter);delete e.filter;var a=Object.keys(e);if(!a.length){throw new TypeError("when/key requires at least one option key")}var i=function registerBinding(e){e.keyCodes.forEach((function(t){if(!n[t]){n[t]=[]}n[t].push(e)}))};a.forEach((function(n){if(typeof e[n]!=="function"){throw new TypeError('when/key requires option["'+n+'"] to be a function')}var t=function addCallback(t){t.callback=e[n];return t};keyBinding(n).map(t).forEach(i)}));var o=function handleKeyDown(e){if(e.defaultPrevented){return}if(r.length){var a=getParentComparator({element:e.target,includeSelf:true});if(r.some(a)){return}}var i=e.keyCode||e.which;if(!n[i]){return}n[i].forEach((function(n){if(!n.matchModifiers(e)){return}n.callback.call(t,e,l)}))};t.addEventListener("keydown",o,false);var l=function disengage(){t.removeEventListener("keydown",o,false)};return{disengage:l}}function default_1(e){var n=e===void 0?{}:e,t=n.context;if(!t){t=document.documentElement}queryTabsequence();return whenKey({"?alt+?shift+tab":function altShiftTab(e){e.preventDefault();var n=queryTabsequence({context:t});var r=e.shiftKey;var a=n[0];var i=n[n.length-1];var o=r?a:i;var l=r?i:a;if(isActiveElement(o)){l.focus();return}var s=void 0;var u=n.some((function(e,n){if(!isActiveElement(e)){return false}s=n;return true}));if(!u){a.focus();return}var c=r?-1:1;n[s+c].focus()}})}n["default"]=default_1},173:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"],["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"])));n.styles=i;var o},395:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.ShadowPortal=void 0;var l=i(t(522));var s=t(255);var u=function Portal(e){var n=e.children;var t=l.useRef(null);var r=l.useRef(null);var a=l.useRef(null);var i=o(l.useState(),2),u=i[1];l.useLayoutEffect((function(){var e=t.current.ownerDocument;r.current=e.createElement("nextjs-portal");a.current=r.current.attachShadow({mode:"open"});e.body.appendChild(r.current);u({});return function(){if(r.current&&r.current.ownerDocument){r.current.ownerDocument.body.removeChild(r.current)}}}),[]);return a.current?(0,s.createPortal)(n,a.current):l.createElement("span",{ref:t})};n.ShadowPortal=u},261:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"],["\n [data-nextjs-terminal] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-terminal]::selection,\n [data-nextjs-terminal] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-terminal] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n [data-nextjs-terminal] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"])));n.styles=i;var o},314:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.Toast=void 0;var o=i(t(522));var l=function Toast(e){var n=e.onClick,t=e.children,r=e.className;return o.createElement("div",{"data-nextjs-toast":true,onClick:n,className:r},o.createElement("div",{"data-nextjs-toast-wrapper":true},t))};n.Toast=l},626:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.Toast=n.styles=void 0;var a=t(565);r(n,a,"styles");var i=t(314);r(n,i,"Toast")},565:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"],["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"])));n.styles=i;var o},71:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};n.__esModule=true;n.styles=n.BuildError=void 0;var l=o(t(522));var s=t(824);var u=t(382);var c=t(504);var f=t(373);var d=function BuildError(e){var n=e.message;var t=l.useCallback((function(){}),[]);return l.createElement(u.Overlay,{fixed:true},l.createElement(s.Dialog,{type:"error","aria-labelledby":"nextjs__container_build_error_label","aria-describedby":"nextjs__container_build_error_desc",onClose:t},l.createElement(s.DialogContent,null,l.createElement(s.DialogHeader,{className:"nextjs-container-build-error-header"},l.createElement("h4",{id:"nextjs__container_build_error_label"},"Failed to compile")),l.createElement(s.DialogBody,{className:"nextjs-container-build-error-body"},l.createElement(c.Terminal,{content:n}),l.createElement("footer",null,l.createElement("p",{id:"nextjs__container_build_error_desc"},l.createElement("small",null,"This error occurred during the build process and can only be dismissed by fixing the error.")))))))};n.BuildError=d;n.styles=(0,f.noop)(p||(p=r(["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"],["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"])));var p},610:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__assign||function(){a=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0&&i[i.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1]0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.styles=n.Errors=void 0;var f=l(t(522));var d=t(591);var p=t(824);var v=t(830);var b=t(382);var m=t(626);var h=t(915);var g=t(373);var y=t(392);var x=t(157);function getErrorSignature(e){var n=e.event;switch(n.type){case d.TYPE_UNHANDLED_ERROR:case d.TYPE_UNHANDLED_REJECTION:{return n.reason.name+"::"+n.reason.message+"::"+n.reason.stack}default:{}}var t=n;return""}var w=function HotlinkedText(e){var n=e.text;var t=/https?:\/\/[^\s/$.?#].[^\s"]*/i;return f.createElement(f.Fragment,null,t.test(n)?n.split(" ").map((function(e,n,r){if(t.test(e)){return f.createElement(f.Fragment,{key:"link-"+n},f.createElement("a",{href:e},e),n===r.length-1?"":" ")}return n===r.length-1?f.createElement(f.Fragment,{key:"text-"+n},e):f.createElement(f.Fragment,{key:"text-"+n},e," ")})):n)};function getErrorByType(e){return s(this,void 0,void 0,(function(){var n,t,r,a;var i;return u(this,(function(o){switch(o.label){case 0:n=e.id,t=e.event;r=t.type;switch(r){case d.TYPE_UNHANDLED_ERROR:return[3,1];case d.TYPE_UNHANDLED_REJECTION:return[3,1]}return[3,3];case 1:i={id:n,runtime:true,error:t.reason};return[4,(0,y.getOriginalStackFrames)((0,h.isNodeError)(t.reason),t.frames)];case 2:return[2,(i.frames=o.sent(),i)];case 3:{return[3,4]}o.label=4;case 4:a=t;throw new Error("type system invariant violation")}}))}))}var _=function Errors(e){var n=e.errors;var t=c(f.useState({}),2),r=t[0],i=t[1];var o=c(f.useMemo((function(){var e=[];var t=null;for(var a=0;a0){var l=n[a-1];if(getErrorSignature(l)===getErrorSignature(i)){continue}}t=i;break}return[e,t]}),[n,r]),2),l=o[0],s=o[1];var u=f.useMemo((function(){return l.length<1&&Boolean(n.length)}),[n.length,l.length]);f.useEffect((function(){if(s==null){return}var e=true;getErrorByType(s).then((function(n){if(e){i((function(e){var t;return a(a({},e),(t={},t[n.id]=n,t))}))}}),(function(){}));return function(){e=false}}),[s]);var d=c(f.useState(false),2),g=d[0],y=d[1];var _=c(f.useState(0),2),E=_[0],O=_[1];var j=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();O((function(e){return Math.max(0,e-1)}))}),[]);var S=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();O((function(e){return Math.max(0,Math.min(l.length-1,e+1))}))}),[l.length]);var k=f.useMemo((function(){var e;return(e=l[E])!==null&&e!==void 0?e:null}),[E,l]);f.useEffect((function(){if(n.length<1){i({});y(false);O(0)}}),[n.length]);var T=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();y(true)}),[]);var C=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();y(false)}),[]);if(n.length<1||k==null){return null}if(u){return f.createElement(b.Overlay,null)}if(g){return f.createElement(m.Toast,{className:"nextjs-toast-errors-parent",onClick:C},f.createElement("div",{className:"nextjs-toast-errors"},f.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},f.createElement("circle",{cx:"12",cy:"12",r:"10"}),f.createElement("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),f.createElement("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})),f.createElement("span",null,l.length," error",l.length>1?"s":"")))}var P=(0,h.isNodeError)(k.error);return f.createElement(b.Overlay,null,f.createElement(p.Dialog,{type:"error","aria-labelledby":"nextjs__container_errors_label","aria-describedby":"nextjs__container_errors_desc",onClose:P?undefined:T},f.createElement(p.DialogContent,null,f.createElement(p.DialogHeader,{className:"nextjs-container-errors-header"},f.createElement(v.LeftRightDialogHeader,{previous:E>0?j:null,next:E h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"],["\n .nextjs-container-errors-header > h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"])));var E},710:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};n.__esModule=true;n.styles=n.FullRefreshWarning=void 0;var l=o(t(522));var s=t(824);var u=t(382);var c=t(504);var f=t(373);var d=function FullRefreshWarning(e){var n=e.reason;var t=l.useCallback((function(){window.location.reload()}),[]);return l.createElement(u.Overlay,{fixed:true},l.createElement(s.Dialog,{type:"warning","aria-labelledby":"nextjs__container_refresh_warning_label","aria-describedby":"nextjs__container_refresh_warning_desc",onClose:t},l.createElement(s.DialogContent,null,l.createElement(s.DialogHeader,{className:"nextjs-container-refresh-warning-header"},l.createElement("h4",{id:"nextjs__container_refresh_warning_label"},"About to perform a full refresh")),l.createElement(s.DialogBody,{className:"nextjs-container-refresh-warning-body"},l.createElement(FullRefreshWarningReason,{reason:n}),l.createElement("footer",null,l.createElement("p",null,"You can read more about Fast Refresh in"," ",l.createElement("a",{href:"https://nextjs.org/docs/basic-features/fast-refresh#how-it-works"},"our documentation"),"."),l.createElement("button",{onClick:t},"Reload"))))))};n.FullRefreshWarning=d;n.styles=(0,f.noop)(p||(p=r(["\n .nextjs-container-refresh-warning-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-refresh-warning-body footer {\n margin-top: var(--size-gap-double);\n }\n\n .nextjs-container-build-error-body p {\n color: #757575;\n }\n\n .nextjs-container-refresh-warning-body button {\n background-color: var(--color-ansi-yellow);\n border: 0;\n border-radius: var(--size-gap-half);\n color: var(--color-ansi-black);\n cursor: pointer;\n display: block;\n margin-left: auto;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n transition: background-color 0.25s ease;\n }\n\n .nextjs-container-refresh-warning-body button:hover {\n background-color: var(--color-ansi-bright-yellow);\n }\n"],["\n .nextjs-container-refresh-warning-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-refresh-warning-body footer {\n margin-top: var(--size-gap-double);\n }\n\n .nextjs-container-build-error-body p {\n color: #757575;\n }\n\n .nextjs-container-refresh-warning-body button {\n background-color: var(--color-ansi-yellow);\n border: 0;\n border-radius: var(--size-gap-half);\n color: var(--color-ansi-black);\n cursor: pointer;\n display: block;\n margin-left: auto;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n transition: background-color 0.25s ease;\n }\n\n .nextjs-container-refresh-warning-body button:hover {\n background-color: var(--color-ansi-bright-yellow);\n }\n"])));var FullRefreshWarningReason=function(e){var n=e.reason;if(n===null){return l.createElement("p",null,"Fast Refresh will perform a full reload because your application had an unrecoverable error.")}return l.createElement(l.Fragment,null,l.createElement("p",null,"Fast Refresh will perform a full reload when you edit a file that is imported by modules outside of the React rendering tree. It is also possible the parent component of the component you edited is a class component, which disables Fast Refresh. Fast Refresh requires at least one parent function component in your React tree."),l.createElement("p",null,"You can find more information in the related Webpack error below:"),l.createElement(c.Terminal,{content:n}))};var p},157:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};var l=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.RuntimeError=n.styles=void 0;var s=o(t(522));var u=t(983);var c=t(373);var f=t(392);var d=function CallStackFrame(e){var n;var t=e.frame;var r=(n=t.originalStackFrame)!==null&&n!==void 0?n:t.sourceStackFrame;var a=Boolean(t.originalCodeFrame);var i=s.useCallback((function(){var e;if(!a)return;var n=new URLSearchParams;for(var t in r){n.append(t,((e=r[t])!==null&&e!==void 0?e:"").toString())}self.fetch((process.env.__NEXT_ROUTER_BASEPATH||"")+"/__nextjs_launch-editor?"+n.toString()).then((function(){}),(function(){console.error("There was an issue opening this code in your editor.")}))}),[a,r]);return s.createElement("div",{"data-nextjs-call-stack-frame":true},s.createElement("h6",{"data-nextjs-frame-expanded":Boolean(t.expanded)},r.methodName),s.createElement("div",{"data-has-source":a?"true":undefined,tabIndex:a?10:undefined,role:a?"link":undefined,onClick:i,title:a?"Click to open in your editor":undefined},s.createElement("span",null,(0,f.getFrameSource)(r)),s.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},s.createElement("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),s.createElement("polyline",{points:"15 3 21 3 21 9"}),s.createElement("line",{x1:"10",y1:"14",x2:"21",y2:"3"}))))};var p=function RuntimeError(e){var n=e.error;var t=s.useMemo((function(){return n.frames.findIndex((function(e){return e.expanded&&Boolean(e.originalCodeFrame)&&Boolean(e.originalStackFrame)}))}),[n.frames]);var r=s.useMemo((function(){var e;return(e=n.frames[t])!==null&&e!==void 0?e:null}),[n.frames,t]);var a=s.useMemo((function(){return t<0?[]:n.frames.slice(0,t)}),[n.frames,t]);var i=l(s.useState(r==null),2),o=i[0],c=i[1];var f=s.useCallback((function(){c((function(e){return!e}))}),[]);var p=s.useMemo((function(){return a.filter((function(e){return e.expanded||o}))}),[o,a]);var v=s.useMemo((function(){return n.frames.slice(t+1)}),[n.frames,t]);var b=s.useMemo((function(){return v.filter((function(e){return e.expanded||o}))}),[o,v]);var m=s.useMemo((function(){return v.length!==b.length||o&&r!=null}),[o,v.length,r,b.length]);return s.createElement(s.Fragment,null,r?s.createElement(s.Fragment,null,s.createElement("h5",null,"Source"),p.map((function(e,n){return s.createElement(d,{key:"leading-frame-"+n+"-"+o,frame:e})})),s.createElement(u.CodeFrame,{stackFrame:r.originalStackFrame,codeFrame:r.originalCodeFrame})):undefined,b.length?s.createElement(s.Fragment,null,s.createElement("h5",null,"Call Stack"),b.map((function(e,n){return s.createElement(d,{key:"call-stack-"+n+"-"+o,frame:e})}))):undefined,m?s.createElement(s.Fragment,null,s.createElement("button",{tabIndex:10,"data-nextjs-data-runtime-error-collapsed-action":true,type:"button",onClick:f},o?"Hide":"Show"," collapsed frames")):undefined)};n.RuntimeError=p;n.styles=(0,c.noop)(v||(v=r(["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"],["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"])));var v},915:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0&&i[i.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1]-1&&r<=s){while(++t3&&"WebKit"||/\bOpera\b/.test(A)&&(/\bOPR\b/.test(e)?"Blink":"Presto")||/\b(?:Midori|Nook|Safari)\b/i.test(e)&&!/^(?:Trident|EdgeHTML)$/.test(M)&&"WebKit"||!M&&/\bMSIE\b/i.test(e)&&(D=="Mac OS"?"Tasman":"Trident")||M=="WebKit"&&/\bPlayStation\b(?! Vita\b)/i.test(A)&&"NetFront"){M=[O]}if(A=="IE"&&(O=(/; *(?:XBLWP|ZuneWP)(\d+)/i.exec(e)||0)[1])){A+=" Mobile";D="Windows Phone "+(/\+$/.test(O)?O:O+".x");S.unshift("desktop mode")}else if(/\bWPDesktop\b/i.test(e)){A="IE Mobile";D="Windows Phone 8.x";S.unshift("desktop mode");C||(C=(/\brv:([\d.]+)/.exec(e)||0)[1])}else if(A!="IE"&&M=="Trident"&&(O=/\brv:([\d.]+)/.exec(e))){if(A){S.push("identifying as "+A+(C?" "+C:""))}A="IE";C=O[1]}if(T){if(isHostType(n,"global")){if(h){O=h.lang.System;j=O.getProperty("os.arch");D=D||O.getProperty("os.name")+" "+O.getProperty("os.version")}if(g){try{C=n.require("ringo/engine").version.join(".");A="RingoJS"}catch(e){if((O=n.system)&&O.global.system==n.system){A="Narwhal";D||(D=O[0].os||null)}}if(!A){A="Rhino"}}else if(typeof n.process=="object"&&!n.process.browser&&(O=n.process)){if(typeof O.versions=="object"){if(typeof O.versions.electron=="string"){S.push("Node "+O.versions.node);A="Electron";C=O.versions.electron}else if(typeof O.versions.nw=="string"){S.push("Chromium "+C,"Node "+O.versions.node);A="NW.js";C=O.versions.nw}}if(!A){A="Node.js";j=O.arch;D=O.platform;C=/[\d.]+/.exec(O.version);C=C?C[0]:null}}}else if(getClassOf(O=n.runtime)==d){A="Adobe AIR";D=O.flash.system.Capabilities.os}else if(getClassOf(O=n.phantom)==m){A="PhantomJS";C=(O=O.version||null)&&O.major+"."+O.minor+"."+O.patch}else if(typeof w.documentMode=="number"&&(O=/\bTrident\/(\d+)/i.exec(e))){C=[C,w.documentMode];if((O=+O[1]+4)!=C[1]){S.push("IE "+C[1]+" mode");M&&(M[1]="");C[1]=O}C=A=="IE"?String(C[1].toFixed(1)):C[0]}else if(typeof w.documentMode=="number"&&/^(?:Chrome|Firefox)\b/.test(A)){S.push("masking as "+A+" "+C);A="IE";C="11.0";M=["Trident"];D="Windows"}D=D&&format(D)}if(C&&(O=/(?:[ab]|dp|pre|[ab]\d+pre)(?:\d+\+?)?$/i.exec(C)||/(?:alpha|beta)(?: ?\d)?/i.exec(e+";"+(T&&i.appMinorVersion))||/\bMinefield\b/i.test(e)&&"a")){k=/b/i.test(O)?"beta":"alpha";C=C.replace(RegExp(O+"\\+?$"),"")+(k=="beta"?x:y)+(/\d+\+?/.exec(O)||"")}if(A=="Fennec"||A=="Firefox"&&/\b(?:Android|Firefox OS|KaiOS)\b/.test(D)){A="Firefox Mobile"}else if(A=="Maxthon"&&C){C=C.replace(/\.[\d.]+/,".x")}else if(/\bXbox\b/i.test(R)){if(R=="Xbox 360"){D=null}if(R=="Xbox 360"&&/\bIEMobile\b/.test(e)){S.unshift("mobile mode")}}else if((/^(?:Chrome|IE|Opera)$/.test(A)||A&&!R&&!/Browser|Mobi/.test(A))&&(D=="Windows CE"||/Mobi/i.test(e))){A+=" Mobile"}else if(A=="IE"&&T){try{if(n.external===null){S.unshift("platform preview")}}catch(e){S.unshift("embedded")}}else if((/\bBlackBerry\b/.test(R)||/\bBB10\b/.test(e))&&(O=(RegExp(R.replace(/ +/g," *")+"/([.\\d]+)","i").exec(e)||0)[1]||C)){O=[O,/BB10/.test(e)];D=(O[1]?(R=null,N="BlackBerry"):"Device Software")+" "+O[0];C=null}else if(this!=forOwn&&R!="Wii"&&(T&&_||/Opera/.test(A)&&/\b(?:MSIE|Firefox)\b/i.test(e)||A=="Firefox"&&/\bOS X (?:\d+\.){2,}/.test(D)||A=="IE"&&(D&&!/^Win/.test(D)&&C>5.5||/\bWindows XP\b/.test(D)&&C>8||C==8&&!/\bTrident\b/.test(e)))&&!u.test(O=parse.call(forOwn,e.replace(u,"")+";"))&&O.name){O="ing as "+O.name+((O=O.version)?" "+O:"");if(u.test(A)){if(/\bIE\b/.test(O)&&D=="Mac OS"){D=null}O="identify"+O}else{O="mask"+O;if(E){A=format(E.replace(/([a-z])([A-Z])/g,"$1 $2"))}else{A="Opera"}if(/\bIE\b/.test(O)){D=null}if(!T){C=null}}M=["Presto"];S.push(O)}if(O=(/\bAppleWebKit\/([\d.]+\+?)/i.exec(e)||0)[1]){O=[parseFloat(O.replace(/\.(\d)$/,".0$1")),O];if(A=="Safari"&&O[1].slice(-1)=="+"){A="WebKit Nightly";k="alpha";C=O[1].slice(0,-1)}else if(C==O[1]||C==(O[2]=(/\bSafari\/([\d.]+\+?)/i.exec(e)||0)[1])){C=null}O[1]=(/\b(?:Headless)?Chrome\/([\d.]+)/i.exec(e)||0)[1];if(O[0]==537.36&&O[2]==537.36&&parseFloat(O[1])>=28&&M=="WebKit"){M=["Blink"]}if(!T||!s&&!O[1]){M&&(M[1]="like Safari");O=(O=O[0],O<400?1:O<500?2:O<526?3:O<533?4:O<534?"4+":O<535?5:O<537?6:O<538?7:O<601?8:O<602?9:O<604?10:O<606?11:O<608?12:"12")}else{M&&(M[1]="like Chrome");O=O[1]||(O=O[0],O<530?1:O<532?2:O<532.05?3:O<533?4:O<534.03?5:O<534.07?6:O<534.1?7:O<534.13?8:O<534.16?9:O<534.24?10:O<534.3?11:O<535.01?12:O<535.02?"13+":O<535.07?15:O<535.11?16:O<535.19?17:O<536.05?18:O<536.1?19:O<537.01?20:O<537.11?"21+":O<537.13?23:O<537.18?24:O<537.24?25:O<537.36?26:M!="Blink"?"27":"28")}M&&(M[1]+=" "+(O+=typeof O=="number"?".x":/[.+]/.test(O)?"":"+"));if(A=="Safari"&&(!C||parseInt(C)>45)){C=O}else if(A=="Chrome"&&/\bHeadlessChrome/i.test(e)){S.unshift("headless")}}if(A=="Opera"&&(O=/\bzbov|zvav$/.exec(D))){A+=" ";S.unshift("desktop mode");if(O=="zvav"){A+="Mini";C=null}else{A+="Mobile"}D=D.replace(RegExp(" *"+O+"$"),"")}else if(A=="Safari"&&/\bChrome\b/.exec(M&&M[1])){S.unshift("desktop mode");A="Chrome Mobile";C=null;if(/\bOS X\b/.test(D)){N="Apple";D="iOS 4.3+"}else{D=null}}else if(/\bSRWare Iron\b/.test(A)&&!C){C=getVersion("Chrome")}if(C&&C.indexOf(O=/[\d.]+$/.exec(D))==0&&e.indexOf("/"+O+"-")>-1){D=trim(D.replace(O,""))}if(D&&D.indexOf(A)!=-1&&!RegExp(A+" OS").test(D)){D=D.replace(RegExp(" *"+qualify(A)+" *"),"")}if(M&&!/\b(?:Avant|Nook)\b/.test(A)&&(/Browser|Lunascape|Maxthon/.test(A)||A!="Safari"&&/^iOS/.test(D)&&/\bSafari\b/.test(M[1])||/^(?:Adobe|Arora|Breach|Midori|Opera|Phantom|Rekonq|Rock|Samsung Internet|Sleipnir|SRWare Iron|Vivaldi|Web)/.test(A)&&M[1])){(O=M[M.length-1])&&S.push(O)}if(S.length){S=["("+S.join("; ")+")"]}if(N&&R&&R.indexOf(N)<0){S.push("on "+N)}if(R){S.push((/^on /.test(S[S.length-1])?"":"on ")+R)}if(D){O=/ ([\d.+]+)$/.exec(D);P=O&&D.charAt(D.length-O[0].length-1)=="/";D={architecture:32,family:O&&!P?D.replace(O[0],""):D,version:O?O[1]:null,toString:function(){var e=this.version;return this.family+(e&&!P?" "+e:"")+(this.architecture==64?" 64-bit":"")}}}if((O=/\b(?:AMD|IA|Win|WOW|x86_|x)64\b/i.exec(j))&&!/\bi686\b/i.test(j)){if(D){D.architecture=64;D.family=D.family.replace(RegExp(" *"+O),"")}if(A&&(/\bWOW64\b/i.test(e)||T&&/\w(?:86|32)$/.test(i.cpuClass||i.platform)&&!/\bWin64; x64\b/i.test(e))){S.unshift("32-bit")}}else if(D&&/^OS X/.test(D.family)&&A=="Chrome"&&parseFloat(C)>=39){D.architecture=64}e||(e=null);var z={};z.description=e;z.layout=M&&M[0];z.manufacturer=N;z.name=A;z.prerelease=k;z.product=R;z.ua=e;z.version=A&&C;z.os=D||{architecture:null,family:null,version:null,toString:function(){return"null"}};z.parse=parse;z.toString=toStringPlatform;if(z.version){S.unshift(C)}if(z.name){S.unshift(A)}if(D&&A&&!(D==String(D).split(" ")[0]&&(D==A.split(" ")[0]||R))){S.push(R?"("+D+")":"on "+D)}if(S.length){z.description=S.join(" ")}return z}var v=parse();if(i&&o){forOwn(v,(function(e,n){i[n]=e}))}else{r.platform=v}}).call(this)},922:function(e,n){"use strict";Object.defineProperty(n,"__esModule",{value:true});var t="";function parse(e){var n=e.split("\n");return n.reduce((function(e,n){var t=parseChrome(n)||parseWinjs(n)||parseGecko(n)||parseNode(n)||parseJSC(n);if(t){e.push(t)}return e}),[])}var r=/^\s*at (.*?) ?\(((?:file|https?|blob|chrome-extension|native|eval|webpack||\/|[a-z]:\\|\\\\).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i;var a=/\((\S*)(?::(\d+))(?::(\d+))\)/;function parseChrome(e){var n=r.exec(e);if(!n){return null}var i=n[2]&&n[2].indexOf("native")===0;var o=n[2]&&n[2].indexOf("eval")===0;var l=a.exec(n[2]);if(o&&l!=null){n[2]=l[1];n[3]=l[2];n[4]=l[3]}return{file:!i?n[2]:null,methodName:n[1]||t,arguments:i?[n[2]]:[],lineNumber:n[3]?+n[3]:null,column:n[4]?+n[4]:null}}var i=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i;function parseWinjs(e){var n=i.exec(e);if(!n){return null}return{file:n[2],methodName:n[1]||t,arguments:[],lineNumber:+n[3],column:n[4]?+n[4]:null}}var o=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)((?:file|https?|blob|chrome|webpack|resource|\[native).*?|[^@]*bundle)(?::(\d+))?(?::(\d+))?\s*$/i;var l=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i;function parseGecko(e){var n=o.exec(e);if(!n){return null}var r=n[3]&&n[3].indexOf(" > eval")>-1;var a=l.exec(n[3]);if(r&&a!=null){n[3]=a[1];n[4]=a[2];n[5]=null}return{file:n[3],methodName:n[1]||t,arguments:n[2]?n[2].split(","):[],lineNumber:n[4]?+n[4]:null,column:n[5]?+n[5]:null}}var s=/^\s*(?:([^@]*)(?:\((.*?)\))?@)?(\S.*?):(\d+)(?::(\d+))?\s*$/i;function parseJSC(e){var n=s.exec(e);if(!n){return null}return{file:n[3],methodName:n[1]||t,arguments:[],lineNumber:+n[4],column:n[5]?+n[5]:null}}var u=/^\s*at (?:((?:\[object object\])?[^\\/]+(?: \[as \S+\])?) )?\(?(.*?):(\d+)(?::(\d+))?\)?\s*$/i;function parseNode(e){var n=u.exec(e);if(!n){return null}return{file:n[2],methodName:n[1]||t,arguments:[],lineNumber:+n[3],column:n[4]?+n[4]:null}}n.parse=parse},977:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.onRefresh=n.unregister=n.register=n.onFullRefreshNeeded=n.onBuildError=n.onBuildOk=n.ReactDevOverlay=n.getNodeError=void 0;var o=i(t(591));var l=t(525);var s=false;var u=undefined;function onUnhandledError(e){var n=e===null||e===void 0?void 0:e.error;if(!n||!(n instanceof Error)||typeof n.stack!=="string"){return}var t=n;o.emit({type:o.TYPE_UNHANDLED_ERROR,reason:n,frames:(0,l.parseStack)(t.stack)})}function onUnhandledRejection(e){var n=e===null||e===void 0?void 0:e.reason;if(!n||!(n instanceof Error)||typeof n.stack!=="string"){return}var t=n;o.emit({type:o.TYPE_UNHANDLED_REJECTION,reason:n,frames:(0,l.parseStack)(t.stack)})}function register(){if(s){return}s=true;try{var e=Error.stackTraceLimit;Error.stackTraceLimit=50;u=e}catch(e){}window.addEventListener("error",onUnhandledError);window.addEventListener("unhandledrejection",onUnhandledRejection)}n.register=register;function unregister(){if(!s){return}s=false;if(u!==undefined){try{Error.stackTraceLimit=u}catch(e){}u=undefined}window.removeEventListener("error",onUnhandledError);window.removeEventListener("unhandledrejection",onUnhandledRejection)}n.unregister=unregister;function onBuildOk(){o.emit({type:o.TYPE_BUILD_OK})}n.onBuildOk=onBuildOk;function onBuildError(e){o.emit({type:o.TYPE_BUILD_ERROR,message:e})}n.onBuildError=onBuildError;function onFullRefreshNeeded(e){o.emit({type:o.TYPE_FULL_REFRESH_NEEDED,reason:e!==null&&e!==void 0?e:null})}n.onFullRefreshNeeded=onFullRefreshNeeded;function onRefresh(){o.emit({type:o.TYPE_REFRESH})}n.onRefresh=onRefresh;var c=t(915);r(n,c,"getNodeError");var f=t(943);r(n,f,"default","ReactDevOverlay")},198:function(e,n,t){"use strict";var r=this&&this.__extends||function(){var extendStatics=function(e,n){extendStatics=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,n){e.__proto__=n}||function(e,n){for(var t in n)if(Object.prototype.hasOwnProperty.call(n,t))e[t]=n[t]};return extendStatics(e,n)};return function(e,n){if(typeof n!=="function"&&n!==null)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");extendStatics(e,n);function __(){this.constructor=e}e.prototype=n===null?Object.create(n):(__.prototype=n.prototype,new __)}}();var a=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;n.ErrorBoundary=void 0;var i=a(t(522));var o=function(e){r(ErrorBoundary,e);function ErrorBoundary(){var n=e!==null&&e.apply(this,arguments)||this;n.state={error:null};return n}ErrorBoundary.prototype.componentDidCatch=function(e,n){this.props.onError(e,(n===null||n===void 0?void 0:n.componentStack)||null);this.setState({error:e})};ErrorBoundary.prototype.render=function(){return this.state.error?null:this.props.children};return ErrorBoundary}(i["default"].PureComponent);n.ErrorBoundary=o},943:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};var s=this&&this.__spreadArray||function(e,n,t){if(t||arguments.length===2)for(var r=0,a=n.length,i;r? +\d+ +\| ( *)/.exec((0,c["default"])(e))})).filter(Boolean).map((function(e){return e.pop()})).reduce((function(e,n){return isNaN(e)?n.length:Math.min(e,n.length)}),NaN);if(n>1){var r=" ".repeat(n);return e.map((function(e,n){return~(n=e.indexOf("|"))?e.substring(0,n)+e.substring(n).replace(r,""):e})).join("\n")}return e.join("\n")}),[t]);var i=u.useMemo((function(){return s["default"].ansiToJson(a,{json:true,use_classes:true,remove_empty:true})}),[a]);var o=u.useCallback((function(){var e;var t=new URLSearchParams;for(var r in n){t.append(r,((e=n[r])!==null&&e!==void 0?e:"").toString())}self.fetch((process.env.__NEXT_ROUTER_BASEPATH||"")+"/__nextjs_launch-editor?"+t.toString()).then((function(){}),(function(){console.error("There was an issue opening this code in your editor.")}))}),[n]);return u.createElement("div",{"data-nextjs-codeframe":true},u.createElement("div",null,u.createElement("p",{role:"link",onClick:o,tabIndex:1,title:"Click to open in your editor"},u.createElement("span",null,(0,f.getFrameSource)(n)," @ ",n.methodName),u.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},u.createElement("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),u.createElement("polyline",{points:"15 3 21 3 21 9"}),u.createElement("line",{x1:"10",y1:"14",x2:"21",y2:"3"})))),u.createElement("pre",null,i.map((function(e,n){return u.createElement("span",{key:"frame-"+n,style:r({color:e.fg?"var(--color-"+e.fg+")":undefined},e.decoration==="bold"?{fontWeight:800}:e.decoration==="italic"?{fontStyle:"italic"}:undefined)},e.content)}))))};n.CodeFrame=d},983:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.CodeFrame=void 0;var a=t(7);r(n,a,"CodeFrame")},761:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-codeframe] {\n overflow: auto;\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > div {\n display: inline-block;\n width: auto;\n min-width: 100%;\n border-bottom: 1px solid var(--color-ansi-bright-black);\n }\n [data-nextjs-codeframe] > div > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n margin: 0;\n }\n [data-nextjs-codeframe] > div > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] div > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n [data-nextjs-codeframe] div > pre {\n overflow: hidden;\n display: inline-block;\n }\n"],["\n [data-nextjs-codeframe] {\n overflow: auto;\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-codeframe]::selection,\n [data-nextjs-codeframe] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-codeframe] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n\n [data-nextjs-codeframe] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n [data-nextjs-codeframe] > div {\n display: inline-block;\n width: auto;\n min-width: 100%;\n border-bottom: 1px solid var(--color-ansi-bright-black);\n }\n [data-nextjs-codeframe] > div > p {\n display: flex;\n align-items: center;\n justify-content: space-between;\n cursor: pointer;\n margin: 0;\n }\n [data-nextjs-codeframe] > div > p:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-codeframe] div > p > svg {\n width: auto;\n height: 1em;\n margin-left: 8px;\n }\n [data-nextjs-codeframe] div > pre {\n overflow: hidden;\n display: inline-block;\n }\n"])));n.styles=i;var o},870:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__rest||function(e,n){var t={};for(var r in e)if(Object.prototype.hasOwnProperty.call(e,r)&&n.indexOf(r)<0)t[r]=e[r];if(e!=null&&typeof Object.getOwnPropertySymbols==="function")for(var a=0,r=Object.getOwnPropertySymbols(e);a0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.Dialog=void 0;var s=i(t(522));var u=t(814);var c=function Dialog(e){var n=e.children,t=e.type,r=e.onClose,a=o(e,["children","type","onClose"]);var i=l(s.useState(null),2),c=i[0],f=i[1];var d=s.useCallback((function(e){f(e)}),[]);(0,u.useOnClickOutside)(c,r);s.useEffect((function(){if(c==null){return}var e=c.getRootNode();if(!(e instanceof ShadowRoot)){return}var n=e;function handler(e){var t=n.activeElement;if(e.key==="Enter"&&t instanceof HTMLElement&&t.getAttribute("role")==="link"){e.preventDefault();e.stopPropagation();t.click()}}n.addEventListener("keydown",handler);return function(){return n.removeEventListener("keydown",handler)}}),[c]);return s.createElement("div",{ref:d,"data-nextjs-dialog":true,tabIndex:-1,role:"dialog","aria-labelledby":a["aria-labelledby"],"aria-describedby":a["aria-describedby"],"aria-modal":"true"},s.createElement("div",{"data-nextjs-dialog-banner":true,className:"banner-"+t}),n)};n.Dialog=c},244:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogBody=void 0;var o=i(t(522));var l=function DialogBody(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-body":true,className:t},n)};n.DialogBody=l},519:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogContent=void 0;var o=i(t(522));var l=function DialogContent(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-content":true,className:t},n)};n.DialogContent=l},734:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.DialogHeader=void 0;var o=i(t(522));var l=function DialogHeader(e){var n=e.children,t=e.className;return o.createElement("div",{"data-nextjs-dialog-header":true,className:t},n)};n.DialogHeader=l},824:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.styles=n.DialogHeader=n.DialogContent=n.DialogBody=n.Dialog=void 0;var a=t(870);r(n,a,"Dialog");var i=t(244);r(n,i,"DialogBody");var o=t(519);r(n,o,"DialogContent");var l=t(734);r(n,l,"DialogHeader");var s=t(629);r(n,s,"styles")},629:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"],["\n [data-nextjs-dialog] {\n display: flex;\n flex-direction: column;\n width: 100%;\n margin-right: auto;\n margin-left: auto;\n outline: none;\n background: white;\n border-radius: var(--size-gap);\n box-shadow: 0 var(--size-gap-half) var(--size-gap-double)\n rgba(0, 0, 0, 0.25);\n max-height: calc(100% - 56px);\n overflow-y: hidden;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n max-height: calc(100% - 15px);\n }\n }\n\n @media (min-width: 576px) {\n [data-nextjs-dialog] {\n max-width: 540px;\n box-shadow: 0 var(--size-gap) var(--size-gap-quad) rgba(0, 0, 0, 0.25);\n }\n }\n\n @media (min-width: 768px) {\n [data-nextjs-dialog] {\n max-width: 720px;\n }\n }\n\n @media (min-width: 992px) {\n [data-nextjs-dialog] {\n max-width: 960px;\n }\n }\n\n [data-nextjs-dialog-banner] {\n position: relative;\n }\n [data-nextjs-dialog-banner].banner-warning {\n border-color: var(--color-ansi-yellow);\n }\n [data-nextjs-dialog-banner].banner-error {\n border-color: var(--color-ansi-red);\n }\n\n [data-nextjs-dialog-banner]::after {\n z-index: 2;\n content: '';\n position: absolute;\n top: 0;\n right: 0;\n width: 100%;\n /* banner width: */\n border-top-width: var(--size-gap-half);\n border-bottom-width: 0;\n border-top-style: solid;\n border-bottom-style: solid;\n border-top-color: inherit;\n border-bottom-color: transparent;\n }\n\n [data-nextjs-dialog-content] {\n overflow-y: auto;\n border: none;\n margin: 0;\n /* calc(padding + banner width offset) */\n padding: calc(var(--size-gap-double) + var(--size-gap-half))\n var(--size-gap-double);\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-header] {\n flex-shrink: 0;\n margin-bottom: var(--size-gap-double);\n }\n [data-nextjs-dialog-content] > [data-nextjs-dialog-body] {\n position: relative;\n flex: 1 1 auto;\n }\n"])));n.styles=i;var o},727:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.LeftRightDialogHeader=void 0;var l=i(t(522));var s=function LeftRightDialogHeader(e){var n=e.children,t=e.className,r=e.previous,a=e.next,i=e.close;var s=l.useRef(null);var u=l.useRef(null);var c=l.useRef(null);var f=o(l.useState(null),2),d=f[0],p=f[1];var v=l.useCallback((function(e){p(e)}),[]);l.useEffect((function(){if(d==null){return}var e=d.getRootNode();var n=self.document;function handler(n){if(n.key==="ArrowLeft"){n.stopPropagation();if(s.current){s.current.focus()}r&&r()}else if(n.key==="ArrowRight"){n.stopPropagation();if(u.current){u.current.focus()}a&&a()}else if(n.key==="Escape"){n.stopPropagation();if(e instanceof ShadowRoot){var t=e.activeElement;if(t&&t!==c.current&&t instanceof HTMLElement){t.blur();return}}if(i){i()}}}e.addEventListener("keydown",handler);if(e!==n){n.addEventListener("keydown",handler)}return function(){e.removeEventListener("keydown",handler);if(e!==n){n.removeEventListener("keydown",handler)}}}),[i,d,a,r]);l.useEffect((function(){if(d==null){return}var e=d.getRootNode();if(e instanceof ShadowRoot){var n=e.activeElement;if(r==null){if(s.current&&n===s.current){s.current.blur()}}else if(a==null){if(u.current&&n===u.current){u.current.blur()}}}}),[d,a,r]);return l.createElement("div",{"data-nextjs-dialog-left-right":true,className:t},l.createElement("nav",{ref:v},l.createElement("button",{ref:s,type:"button",disabled:r==null?true:undefined,"aria-disabled":r==null?true:undefined,onClick:r!==null&&r!==void 0?r:undefined},l.createElement("svg",{viewBox:"0 0 14 14",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M6.99996 1.16666L1.16663 6.99999L6.99996 12.8333M12.8333 6.99999H1.99996H12.8333Z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}))),l.createElement("button",{ref:u,type:"button",disabled:a==null?true:undefined,"aria-disabled":a==null?true:undefined,onClick:a!==null&&a!==void 0?a:undefined},l.createElement("svg",{viewBox:"0 0 14 14",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M6.99996 1.16666L12.8333 6.99999L6.99996 12.8333M1.16663 6.99999H12H1.16663Z",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})))," ",n),i?l.createElement("button",{ref:c,type:"button",onClick:i,"aria-label":"Close"},l.createElement("span",{"aria-hidden":"true"},l.createElement("svg",{width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",xmlns:"http://www.w3.org/2000/svg"},l.createElement("path",{d:"M18 6L6 18",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"}),l.createElement("path",{d:"M6 6L18 18",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"})))):null)};n.LeftRightDialogHeader=s},830:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.styles=n.LeftRightDialogHeader=void 0;var a=t(727);r(n,a,"LeftRightDialogHeader");var i=t(448);r(n,i,"styles")},448:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"],["\n [data-nextjs-dialog-left-right] {\n display: flex;\n flex-direction: row;\n align-content: center;\n align-items: center;\n justify-content: space-between;\n }\n [data-nextjs-dialog-left-right] > nav > button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n\n width: calc(var(--size-gap-double) + var(--size-gap));\n height: calc(var(--size-gap-double) + var(--size-gap));\n font-size: 0;\n border: none;\n background-color: rgba(255, 85, 85, 0.1);\n color: var(--color-ansi-red);\n cursor: pointer;\n transition: background-color 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > nav > button > svg {\n width: auto;\n height: calc(var(--size-gap) + var(--size-gap-half));\n }\n [data-nextjs-dialog-left-right] > nav > button:hover {\n background-color: rgba(255, 85, 85, 0.2);\n }\n [data-nextjs-dialog-left-right] > nav > button:disabled {\n background-color: rgba(255, 85, 85, 0.1);\n color: rgba(255, 85, 85, 0.4);\n cursor: not-allowed;\n }\n\n [data-nextjs-dialog-left-right] > nav > button:first-of-type {\n border-radius: var(--size-gap-half) 0 0 var(--size-gap-half);\n margin-right: 1px;\n }\n [data-nextjs-dialog-left-right] > nav > button:last-of-type {\n border-radius: 0 var(--size-gap-half) var(--size-gap-half) 0;\n }\n\n [data-nextjs-dialog-left-right] > button:last-of-type {\n border: 0;\n padding: 0;\n\n background-color: transparent;\n appearance: none;\n\n opacity: 0.4;\n transition: opacity 0.25s ease;\n }\n [data-nextjs-dialog-left-right] > button:last-of-type:hover {\n opacity: 0.7;\n }\n"])));n.styles=i;var o},434:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};var l=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;n.Overlay=void 0;var s=l(t(426));var u=i(t(522));var c=t(253);var f=function Overlay(e){var n=e.className,t=e.children,r=e.fixed;u.useEffect((function(){(0,c.lock)();return function(){(0,c.unlock)()}}),[]);var a=o(u.useState(null),2),i=a[0],l=a[1];var f=u.useCallback((function(e){l(e)}),[]);u.useEffect((function(){if(i==null){return}var e=(0,s["default"])({context:i});return function(){e.disengage()}}),[i]);return u.createElement("div",{"data-nextjs-dialog-overlay":true,className:n,ref:f},u.createElement("div",{"data-nextjs-dialog-backdrop":true,"data-nextjs-dialog-backdrop-fixed":r?true:undefined}),t)};n.Overlay=f},253:function(e,n){"use strict";n.__esModule=true;n.unlock=n.lock=void 0;var t;var r;var a=0;function lock(){setTimeout((function(){if(a++>0){return}var e=window.innerWidth-document.documentElement.clientWidth;if(e>0){t=document.body.style.paddingRight;document.body.style.paddingRight=e+"px"}r=document.body.style.overflow;document.body.style.overflow="hidden"}))}n.lock=lock;function unlock(){setTimeout((function(){if(a===0||--a!==0){return}if(t!==undefined){document.body.style.paddingRight=t;t=undefined}if(r!==undefined){document.body.style.overflow=r;r=undefined}}))}n.unlock=unlock},382:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.Overlay=void 0;var a=t(434);r(n,a,"Overlay")},426:function(e,n,t){"use strict";var r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};n.__esModule=true;var a=r(t(36));var i=r(t(730));function nodeArray(e){if(!e){return[]}if(Array.isArray(e)){return e}if(e.nodeType!==undefined){return[e]}if(typeof e==="string"){e=document.querySelectorAll(e)}if(e.length!==undefined){return[].slice.call(e,0)}throw new TypeError("unexpected input "+String(e))}function contextToElement(e){var n=e.context,t=e.label,r=t===undefined?"context-to-element":t,a=e.resolveDocument,i=e.defaultToDocument;var o=nodeArray(n)[0];if(a&&o&&o.nodeType===Node.DOCUMENT_NODE){o=o.documentElement}if(!o&&i){return document.documentElement}if(!o){throw new TypeError(r+" requires valid options.context")}if(o.nodeType!==Node.ELEMENT_NODE&&o.nodeType!==Node.DOCUMENT_FRAGMENT_NODE){throw new TypeError(r+" requires options.context to be an Element")}return o}function getShadowHost(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context;var t=contextToElement({label:"get/shadow-host",context:n});var r=null;while(t){r=t;t=t.parentNode}if(r.nodeType===r.DOCUMENT_FRAGMENT_NODE&&r.host){return r.host}return null}function getDocument(e){if(!e){return document}if(e.nodeType===Node.DOCUMENT_NODE){return e}return e.ownerDocument||document}function isActiveElement(e){var n=contextToElement({label:"is/active-element",resolveDocument:true,context:e});var t=getDocument(n);if(t.activeElement===n){return true}var r=getShadowHost({context:n});if(r&&r.shadowRoot.activeElement===n){return true}return false}function getParents(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context;var t=[];var r=contextToElement({label:"get/parents",context:n});while(r){t.push(r);r=r.parentNode;if(r&&r.nodeType!==Node.ELEMENT_NODE){r=null}}return t}var o=["matches","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector"];var l=null;function findMethodName(e){o.some((function(n){if(!e[n]){return false}l=n;return true}))}function elementMatches(e,n){if(!l){findMethodName(e)}return e[l](n)}var s=JSON.parse(JSON.stringify(a["default"]));var u=s.os.family||"";var c=u==="Android";var f=u.slice(0,7)==="Windows";var d=u==="OS X";var p=u==="iOS";var v=s.layout==="Blink";var b=s.layout==="Gecko";var m=s.layout==="Trident";var h=s.layout==="EdgeHTML";var g=s.layout==="WebKit";var y=parseFloat(s.version);var x=Math.floor(y);s.majorVersion=x;s.is={ANDROID:c,WINDOWS:f,OSX:d,IOS:p,BLINK:v,GECKO:b,TRIDENT:m,EDGE:h,WEBKIT:g,IE9:m&&x===9,IE10:m&&x===10,IE11:m&&x===11};function before(){var e={activeElement:document.activeElement,windowScrollTop:window.scrollTop,windowScrollLeft:window.scrollLeft,bodyScrollTop:document.body.scrollTop,bodyScrollLeft:document.body.scrollLeft};var n=document.createElement("iframe");n.setAttribute("style","position:absolute; position:fixed; top:0; left:-2px; width:1px; height:1px; overflow:hidden;");n.setAttribute("aria-live","off");n.setAttribute("aria-busy","true");n.setAttribute("aria-hidden","true");document.body.appendChild(n);var t=n.contentWindow;var r=t.document;r.open();r.close();var a=r.createElement("div");r.body.appendChild(a);e.iframe=n;e.wrapper=a;e.window=t;e.document=r;return e}function test(e,n){e.wrapper.innerHTML="";var t=typeof n.element==="string"?e.document.createElement(n.element):n.element(e.wrapper,e.document);var r=n.mutate&&n.mutate(t,e.wrapper,e.document);if(!r&&r!==false){r=t}!t.parentNode&&e.wrapper.appendChild(t);r&&r.focus&&r.focus();return n.validate?n.validate(t,r,e.document):e.document.activeElement===r}function after(e){if(e.activeElement===document.body){document.activeElement&&document.activeElement.blur&&document.activeElement.blur();if(s.is.IE10){document.body.focus()}}else{e.activeElement&&e.activeElement.focus&&e.activeElement.focus()}document.body.removeChild(e.iframe);window.scrollTop=e.windowScrollTop;window.scrollLeft=e.windowScrollLeft;document.body.scrollTop=e.bodyScrollTop;document.body.scrollLeft=e.bodyScrollLeft}function detectFocus(e){var n=before();var t={};Object.keys(e).map((function(r){t[r]=test(n,e[r])}));after(n);return t}var w="1.4.1";function readLocalStorage(e){var n=void 0;try{n=window.localStorage&&window.localStorage.getItem(e);n=n?JSON.parse(n):{}}catch(e){n={}}return n}function writeLocalStorage(e,n){if(!document.hasFocus()){try{window.localStorage&&window.localStorage.removeItem(e)}catch(e){}return}try{window.localStorage&&window.localStorage.setItem(e,JSON.stringify(n))}catch(e){}}var _=typeof window!=="undefined"&&window.navigator.userAgent||"";var E="ally-supports-cache";var O=readLocalStorage(E);if(O.userAgent!==_||O.version!==w){O={}}O.userAgent=_;O.version=w;var j={get:function get(){return O},set:function set(e){Object.keys(e).forEach((function(n){O[n]=e[n]}));O.time=(new Date).toISOString();writeLocalStorage(E,O)}};function cssShadowPiercingDeepCombinator(){var e=void 0;try{document.querySelector("html >>> :first-child");e=">>>"}catch(n){try{document.querySelector("html /deep/ :first-child");e="/deep/"}catch(n){e=""}}return e}var S="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7";var k={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return e.querySelector("area")}};var T={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return false},validate:function validate(e,n,t){if(s.is.GECKO){return true}var r=e.querySelector("area");r.focus();return t.activeElement===r}};var C={element:"div",mutate:function mutate(e){e.innerHTML=''+''+'';return e.querySelector("area")},validate:function validate(e,n,t){if(s.is.GECKO){return true}return t.activeElement===n}};var P={name:"can-focus-audio-without-controls",element:"audio",mutate:function mutate(e){try{e.setAttribute("src",S)}catch(e){}}};var M="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";var A={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("area")}};var R={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","-1");e.setAttribute("style","display: -webkit-flex; display: -ms-flexbox; display: flex;");e.innerHTML='hello';return e.querySelector("span")}};var N={element:"fieldset",mutate:function mutate(e){e.setAttribute("tabindex",0);e.setAttribute("disabled","disabled")}};var D={element:"fieldset",mutate:function mutate(e){e.innerHTML="legend

    content

    "}};var z={element:"span",mutate:function mutate(e){e.setAttribute("style","display: -webkit-flex; display: -ms-flexbox; display: flex;");e.innerHTML='hello'}};var F={element:"form",mutate:function mutate(e){e.setAttribute("tabindex",0);e.setAttribute("disabled","disabled")}};var I={element:"a",mutate:function mutate(e){e.href="#void";e.innerHTML='';return e.querySelector("img")}};var L={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("img")}};var B={element:function element(e,n){var t=n.createElement("iframe");e.appendChild(t);var r=t.contentWindow.document;r.open();r.close();return t},mutate:function mutate(e){e.style.visibility="hidden";var n=e.contentWindow.document;var t=n.createElement("input");n.body.appendChild(t);return t},validate:function validate(e){var n=e.contentWindow.document;var t=n.querySelector("input");return n.activeElement===t}};var H=!s.is.WEBKIT;function focusInZeroDimensionObject(){return H}var W={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","invalid-value")}};var q={element:"label",mutate:function mutate(e){e.setAttribute("tabindex","-1")},validate:function validate(e,n,t){var r=e.offsetHeight;e.focus();return t.activeElement===e}};var U="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtb"+"G5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBpZD0ic3ZnIj48dGV4dCB4PSIxMCIgeT0iMjAiIGlkPSJ"+"zdmctbGluay10ZXh0Ij50ZXh0PC90ZXh0Pjwvc3ZnPg==";var G={element:"object",mutate:function mutate(e){e.setAttribute("type","image/svg+xml");e.setAttribute("data",U);e.setAttribute("width","200");e.setAttribute("height","50");e.style.visibility="hidden"}};var V={name:"can-focus-object-svg",element:"object",mutate:function mutate(e){e.setAttribute("type","image/svg+xml");e.setAttribute("data",U);e.setAttribute("width","200");e.setAttribute("height","50")},validate:function validate(e,n,t){if(s.is.GECKO){return true}return t.activeElement===e}};var K=!s.is.IE9;function focusObjectSwf(){return K}var Z={element:"div",mutate:function mutate(e){e.innerHTML=''+'';return e.querySelector("img")},validate:function validate(e,n,t){var r=e.querySelector("area");return t.activeElement===r}};var $={element:"fieldset",mutate:function mutate(e){e.innerHTML='legend';return false},validate:function validate(e,n,t){var r=e.querySelector('input[tabindex="-1"]');var a=e.querySelector('input[tabindex="0"]');e.focus();e.querySelector("legend").focus();return t.activeElement===r&&"focusable"||t.activeElement===a&&"tabbable"||""}};var Y={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px; overflow: auto;");e.innerHTML='
    scrollable content
    ';return e.querySelector("div")}};var X={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px;");e.innerHTML='
    scrollable content
    '}};var J={element:"div",mutate:function mutate(e){e.setAttribute("style","width: 100px; height: 50px; overflow: auto;");e.innerHTML='
    scrollable content
    '}};var Q={element:"details",mutate:function mutate(e){e.innerHTML="foo

    content

    ";return e.firstElementChild}};function makeFocusableForeignObject(){var e=document.createElement("div");e.innerHTML='\n \n ';return e.firstChild.firstChild}function focusSvgForeignObjectHack(e){var n=e.ownerSVGElement||e.nodeName.toLowerCase()==="svg";if(!n){return false}var t=makeFocusableForeignObject();e.appendChild(t);var r=t.querySelector("input");r.focus();r.disabled=true;e.removeChild(t);return true}function generate(e){return''+e+""}function focus(e){if(e.focus){return}try{HTMLElement.prototype.focus.call(e)}catch(n){focusSvgForeignObjectHack(e)}}function validate(e,n,t){focus(n);return t.activeElement===n}var ee={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var ne={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var te={element:"div",mutate:function mutate(e){e.innerHTML=generate('a');return e.querySelector("text")},validate:validate};var re={element:"div",mutate:function mutate(e){e.innerHTML=generate(['link',''].join(""));return e.querySelector("use")},validate:validate};var ae={element:"div",mutate:function mutate(e){e.innerHTML=generate('');return e.querySelector("foreignObject")||e.getElementsByTagName("foreignObject")[0]},validate:validate};var ie=Boolean(s.is.GECKO&&typeof SVGElement!=="undefined"&&SVGElement.prototype.focus);function focusSvgInIframe(){return ie}var oe={element:"div",mutate:function mutate(e){e.innerHTML=generate("");return e.firstChild},validate:validate};var le={element:"div",mutate:function mutate(e){e.setAttribute("tabindex","3x")}};var se={element:"table",mutate:function mutate(e,n,t){var r=t.createDocumentFragment();r.innerHTML="cell";e.appendChild(r)}};var ue={element:"video",mutate:function mutate(e){try{e.setAttribute("src",S)}catch(e){}}};var ce=s.is.GECKO||s.is.TRIDENT||s.is.EDGE;function tabsequenceAreaAtImgPosition(){return ce}var fe={cssShadowPiercingDeepCombinator:cssShadowPiercingDeepCombinator,focusInZeroDimensionObject:focusInZeroDimensionObject,focusObjectSwf:focusObjectSwf,focusSvgInIframe:focusSvgInIframe,tabsequenceAreaAtImgPosition:tabsequenceAreaAtImgPosition};var de={focusAreaImgTabindex:k,focusAreaTabindex:T,focusAreaWithoutHref:C,focusAudioWithoutControls:P,focusBrokenImageMap:A,focusChildrenOfFocusableFlexbox:R,focusFieldsetDisabled:N,focusFieldset:D,focusFlexboxContainer:z,focusFormDisabled:F,focusImgIsmap:I,focusImgUsemapTabindex:L,focusInHiddenIframe:B,focusInvalidTabindex:W,focusLabelTabindex:q,focusObjectSvg:V,focusObjectSvgHidden:G,focusRedirectImgUsemap:Z,focusRedirectLegend:$,focusScrollBody:Y,focusScrollContainerWithoutOverflow:X,focusScrollContainer:J,focusSummary:Q,focusSvgFocusableAttribute:ee,focusSvgTabindexAttribute:ne,focusSvgNegativeTabindexAttribute:te,focusSvgUseTabindex:re,focusSvgForeignobjectTabindex:ae,focusSvg:oe,focusTabindexTrailingCharacters:le,focusTable:se,focusVideoWithoutControls:ue};function executeTests(){var e=detectFocus(de);Object.keys(fe).forEach((function(n){e[n]=fe[n]()}));return e}var pe=null;function _supports(){if(pe){return pe}pe=j.get();if(!pe.time){j.set(executeTests());pe=j.get()}return pe}var ve=void 0;var be=/^\s*(-|\+)?[0-9]+\s*$/;var me=/^\s*(-|\+)?[0-9]+.*$/;function isValidTabindex(e){if(!ve){ve=_supports()}var n=ve.focusTabindexTrailingCharacters?me:be;var t=contextToElement({label:"is/valid-tabindex",resolveDocument:true,context:e});var r=t.hasAttribute("tabindex");var a=t.hasAttribute("tabIndex");if(!r&&!a){return false}var i=t.ownerSVGElement||t.nodeName.toLowerCase()==="svg";if(i&&!ve.focusSvgTabindexAttribute){return false}if(ve.focusInvalidTabindex){return true}var o=t.getAttribute(r?"tabindex":"tabIndex");if(o==="-32768"){return false}return Boolean(o&&n.test(o))}function tabindexValue(e){if(!isValidTabindex(e)){return null}var n=e.hasAttribute("tabindex");var t=n?"tabindex":"tabIndex";var r=parseInt(e.getAttribute(t),10);return isNaN(r)?-1:r}function isUserModifyWritable(e){var n=e.webkitUserModify||"";return Boolean(n&&n.indexOf("write")!==-1)}function hasCssOverflowScroll(e){return[e.getPropertyValue("overflow"),e.getPropertyValue("overflow-x"),e.getPropertyValue("overflow-y")].some((function(e){return e==="auto"||e==="scroll"}))}function hasCssDisplayFlex(e){return e.display.indexOf("flex")>-1}function isScrollableContainer(e,n,t,r){if(n!=="div"&&n!=="span"){return false}if(t&&t!=="div"&&t!=="span"&&!hasCssOverflowScroll(r)){return false}return e.offsetHeight0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{flexbox:false,scrollable:false,shadow:false}:t;if(!he){he=_supports()}var a=contextToElement({label:"is/focus-relevant",resolveDocument:true,context:n});if(!r.shadow&&a.shadowRoot){return true}var i=a.nodeName.toLowerCase();if(i==="input"&&a.type==="hidden"){return false}if(i==="input"||i==="select"||i==="button"||i==="textarea"){return true}if(i==="legend"&&he.focusRedirectLegend){return true}if(i==="label"){return true}if(i==="area"){return true}if(i==="a"&&a.hasAttribute("href")){return true}if(i==="object"&&a.hasAttribute("usemap")){return false}if(i==="object"){var o=a.getAttribute("type");if(!he.focusObjectSvg&&o==="image/svg+xml"){return false}else if(!he.focusObjectSwf&&o==="application/x-shockwave-flash"){return false}}if(i==="iframe"||i==="object"){return true}if(i==="embed"||i==="keygen"){return true}if(a.hasAttribute("contenteditable")){return true}if(i==="audio"&&(he.focusAudioWithoutControls||a.hasAttribute("controls"))){return true}if(i==="video"&&(he.focusVideoWithoutControls||a.hasAttribute("controls"))){return true}if(he.focusSummary&&i==="summary"){return true}var l=isValidTabindex(a);if(i==="img"&&a.hasAttribute("usemap")){return l&&he.focusImgUsemapTabindex||he.focusRedirectImgUsemap}if(he.focusTable&&(i==="table"||i==="td")){return true}if(he.focusFieldset&&i==="fieldset"){return true}var s=i==="svg";var u=a.ownerSVGElement;var c=a.getAttribute("focusable");var f=tabindexValue(a);if(i==="use"&&f!==null&&!he.focusSvgUseTabindex){return false}if(i==="foreignobject"){return f!==null&&he.focusSvgForeignobjectTabindex}if(elementMatches(a,"svg a")&&a.hasAttribute("xlink:href")){return true}if((s||u)&&a.focus&&!he.focusSvgNegativeTabindexAttribute&&f<0){return false}if(s){return l||he.focusSvg||he.focusSvgInIframe||Boolean(he.focusSvgFocusableAttribute&&c&&c==="true")}if(u){if(he.focusSvgTabindexAttribute&&l){return true}if(he.focusSvgFocusableAttribute){return c==="true"}}if(l){return true}var d=window.getComputedStyle(a,null);if(isUserModifyWritable(d)){return true}if(he.focusImgIsmap&&i==="img"&&a.hasAttribute("ismap")){var p=getParents({context:a}).some((function(e){return e.nodeName.toLowerCase()==="a"&&e.hasAttribute("href")}));if(p){return true}}if(!r.scrollable&&he.focusScrollContainer){if(he.focusScrollContainerWithoutOverflow){if(isScrollableContainer(a,i)){return true}}else if(hasCssOverflowScroll(d)){return true}}if(!r.flexbox&&he.focusFlexboxContainer&&hasCssDisplayFlex(d)){return true}var v=a.parentElement;if(!r.scrollable&&v){var b=v.nodeName.toLowerCase();var m=window.getComputedStyle(v,null);if(he.focusScrollBody&&isScrollableContainer(v,i,b,m)){return true}if(he.focusChildrenOfFocusableFlexbox){if(hasCssDisplayFlex(m)){return true}}}return false}isFocusRelevantRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isFocusRelevant(n){return isFocusRelevantRules({context:n,except:e})};n.rules=isFocusRelevantRules;return n};var ge=isFocusRelevantRules.except({});function findIndex(e,n){if(e.findIndex){return e.findIndex(n)}var t=e.length;if(t===0){return-1}for(var r=0;r0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{notRendered:false,cssDisplay:false,cssVisibility:false,detailsElement:false,browsingContext:false}:t;var a=contextToElement({label:"is/visible",resolveDocument:true,context:n});var i=a.nodeName.toLowerCase();if(!r.notRendered&&we.test(i)){return true}var o=getParents({context:a});var l=i==="audio"&&!a.hasAttribute("controls");if(!r.cssDisplay&¬Displayed(l?o.slice(1):o)){return false}if(!r.cssVisibility&¬Visible(o)){return false}if(!r.detailsElement&&collapsedParent(o)){return false}if(!r.browsingContext){var s=getFrameElement(a);var u=isVisibleRules.except(r);if(s&&!u(s)){return false}}return true}isVisibleRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isVisible(n){return isVisibleRules({context:n,except:e})};n.rules=isVisibleRules;return n};var _e=isVisibleRules.except({});function getMapByName(e,n){var t=n.querySelector('map[name="'+(0,i["default"])(e)+'"]');return t||null}function getImageOfArea(e){var n=e.parentElement;if(!n.name||n.nodeName.toLowerCase()!=="map"){return null}var t=getDocument(e);return t.querySelector('img[usemap="#'+(0,i["default"])(n.name)+'"]')||null}var Ee=void 0;function isValidArea(e){if(!Ee){Ee=_supports()}var n=contextToElement({label:"is/valid-area",context:e});var t=n.nodeName.toLowerCase();if(t!=="area"){return false}var r=n.hasAttribute("tabindex");if(!Ee.focusAreaTabindex&&r){return false}var a=getImageOfArea(n);if(!a||!_e(a)){return false}if(!Ee.focusBrokenImageMap&&(!a.complete||!a.naturalHeight||a.offsetWidth<=0||a.offsetHeight<=0)){return false}if(!Ee.focusAreaWithoutHref&&!n.href){return Ee.focusAreaTabindex&&r||Ee.focusAreaImgTabindex&&a.hasAttribute("tabindex")}var i=getParents({context:a}).slice(1).some((function(e){var n=e.nodeName.toLowerCase();return n==="button"||n==="a"}));if(i){return false}return true}var Oe=void 0;var je=void 0;var Se={input:true,select:true,textarea:true,button:true,fieldset:true,form:true};function isNativeDisabledSupported(e){if(!Oe){Oe=_supports();if(Oe.focusFieldsetDisabled){delete Se.fieldset}if(Oe.focusFormDisabled){delete Se.form}je=new RegExp("^("+Object.keys(Se).join("|")+")$")}var n=contextToElement({label:"is/native-disabled-supported",context:e});var t=n.nodeName.toLowerCase();return Boolean(je.test(t))}var ke=void 0;function isDisabledFieldset(e){var n=e.nodeName.toLowerCase();return n==="fieldset"&&e.disabled}function isDisabledForm(e){var n=e.nodeName.toLowerCase();return n==="form"&&e.disabled}function isDisabled(e){if(!ke){ke=_supports()}var n=contextToElement({label:"is/disabled",context:e});if(n.hasAttribute("data-ally-disabled")){return true}if(!isNativeDisabledSupported(n)){return false}if(n.disabled){return true}var t=getParents({context:n});if(t.some(isDisabledFieldset)){return true}if(!ke.focusFormDisabled&&t.some(isDisabledForm)){return true}return false}function isOnlyTabbableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{onlyFocusableBrowsingContext:false,visible:false}:t;var a=contextToElement({label:"is/only-tabbable",resolveDocument:true,context:n});if(!r.visible&&!_e(a)){return false}if(!r.onlyFocusableBrowsingContext&&(s.is.GECKO||s.is.TRIDENT||s.is.EDGE)){var i=getFrameElement(a);if(i){if(tabindexValue(i)<0){return false}}}var o=a.nodeName.toLowerCase();var l=tabindexValue(a);if(o==="label"&&s.is.GECKO){return l!==null&&l>=0}if(s.is.GECKO&&a.ownerSVGElement&&!a.focus){if(o==="a"&&a.hasAttribute("xlink:href")){if(s.is.GECKO){return true}}}return false}isOnlyTabbableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isOnlyTabbable(n){return isOnlyTabbableRules({context:n,except:e})};n.rules=isOnlyTabbableRules;return n};var Te=isOnlyTabbableRules.except({});var Ce=void 0;function isOnlyFocusRelevant(e){var n=e.nodeName.toLowerCase();if(n==="embed"||n==="keygen"){return true}var t=tabindexValue(e);if(e.shadowRoot&&t===null){return true}if(n==="label"){return!Ce.focusLabelTabindex||t===null}if(n==="legend"){return t===null}if(Ce.focusSvgFocusableAttribute&&(e.ownerSVGElement||n==="svg")){var r=e.getAttribute("focusable");return r&&r==="false"}if(n==="img"&&e.hasAttribute("usemap")){return t===null||!Ce.focusImgUsemapTabindex}if(n==="area"){return!isValidArea(e)}return false}function isFocusableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{disabled:false,visible:false,onlyTabbable:false}:t;if(!Ce){Ce=_supports()}var a=Te.rules.except({onlyFocusableBrowsingContext:true,visible:r.visible});var i=contextToElement({label:"is/focusable",resolveDocument:true,context:n});var o=ge.rules({context:i,except:r});if(!o||isOnlyFocusRelevant(i)){return false}if(!r.disabled&&isDisabled(i)){return false}if(!r.onlyTabbable&&a(i)){return false}if(!r.visible){var l={context:i,except:{}};if(Ce.focusInHiddenIframe){l.except.browsingContext=true}if(Ce.focusObjectSvgHidden){var s=i.nodeName.toLowerCase();if(s==="object"){l.except.cssVisibility=true}}if(!_e.rules(l)){return false}}var u=getFrameElement(i);if(u){var c=u.nodeName.toLowerCase();if(c==="object"&&!Ce.focusInZeroDimensionObject){if(!u.offsetWidth||!u.offsetHeight){return false}}}var f=i.nodeName.toLowerCase();if(f==="svg"&&Ce.focusSvgInIframe&&!u&&i.getAttribute("tabindex")===null){return false}return true}isFocusableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isFocusable(n){return isFocusableRules({context:n,except:e})};n.rules=isFocusableRules;return n};var Pe=isFocusableRules.except({});function createFilter(e){var n=function filter(n){if(n.shadowRoot){return NodeFilter.FILTER_ACCEPT}if(e(n)){return NodeFilter.FILTER_ACCEPT}return NodeFilter.FILTER_SKIP};n.acceptNode=n;return n}var Me=createFilter(ge);function queryFocusableStrict(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;if(!n){n=document.documentElement}var i=Pe.rules.except({onlyTabbable:r});var o=getDocument(n);var l=o.createTreeWalker(n,NodeFilter.SHOW_ELEMENT,a==="all"?Me:createFilter(i),false);var s=[];while(l.nextNode()){if(l.currentNode.shadowRoot){if(i(l.currentNode)){s.push(l.currentNode)}s=s.concat(queryFocusableStrict({context:l.currentNode.shadowRoot,includeOnlyTabbable:r,strategy:a}))}else{s.push(l.currentNode)}}if(t){if(a==="all"){if(ge(n)){s.unshift(n)}}else if(i(n)){s.unshift(n)}}return s}var Ae=void 0;var Re=void 0;function selector$2(){if(!Ae){Ae=_supports()}if(typeof Re==="string"){return Re}Re=""+(Ae.focusTable?"table, td,":"")+(Ae.focusFieldset?"fieldset,":"")+"svg a,"+"a[href],"+"area[href],"+"input, select, textarea, button,"+"iframe, object, embed,"+"keygen,"+(Ae.focusAudioWithoutControls?"audio,":"audio[controls],")+(Ae.focusVideoWithoutControls?"video,":"video[controls],")+(Ae.focusSummary?"summary,":"")+"[tabindex],"+"[contenteditable]";Re=selectInShadows(Re);return Re}function queryFocusableQuick(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable;var a=selector$2();var i=n.querySelectorAll(a);var o=Pe.rules.except({onlyTabbable:r});var l=[].filter.call(i,o);if(t&&o(n)){l.unshift(n)}return l}function queryFocusable(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy,i=a===undefined?"quick":a;var o=contextToElement({label:"query/focusable",resolveDocument:true,defaultToDocument:true,context:n});var l={context:o,includeContext:t,includeOnlyTabbable:r,strategy:i};if(i==="quick"){return queryFocusableQuick(l)}else if(i==="strict"||i==="all"){return queryFocusableStrict(l)}throw new TypeError('query/focusable requires option.strategy to be one of ["quick", "strict", "all"]')}var Ne=void 0;var De=/^(fieldset|table|td|body)$/;function isTabbableRules(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.except,r=t===undefined?{flexbox:false,scrollable:false,shadow:false,visible:false,onlyTabbable:false}:t;if(!Ne){Ne=_supports()}var a=contextToElement({label:"is/tabbable",resolveDocument:true,context:n});if(s.is.BLINK&&s.is.ANDROID&&s.majorVersion>42){return false}var i=getFrameElement(a);if(i){if(s.is.WEBKIT&&s.is.IOS){return false}if(tabindexValue(i)<0){return false}if(!r.visible&&(s.is.BLINK||s.is.WEBKIT)&&!_e(i)){return false}var o=i.nodeName.toLowerCase();if(o==="object"){var l=s.name==="Chrome"&&s.majorVersion>=54||s.name==="Opera"&&s.majorVersion>=41;if(s.is.WEBKIT||s.is.BLINK&&!l){return false}}}var u=a.nodeName.toLowerCase();var c=tabindexValue(a);var f=c===null?null:c>=0;if(s.is.EDGE&&s.majorVersion>=14&&i&&a.ownerSVGElement&&c<0){return true}var d=f!==false;var p=c!==null&&c>=0;if(a.hasAttribute("contenteditable")){return d}if(De.test(u)&&f!==true){return false}if(s.is.WEBKIT&&s.is.IOS){var v=u==="input"&&a.type==="text"||a.type==="password"||u==="select"||u==="textarea"||a.hasAttribute("contenteditable");if(!v){var b=window.getComputedStyle(a,null);v=isUserModifyWritable(b)}if(!v){return false}}if(u==="use"&&c!==null){if(s.is.BLINK||s.is.WEBKIT&&s.majorVersion===9){return true}}if(elementMatches(a,"svg a")&&a.hasAttribute("xlink:href")){if(d){return true}if(a.focus&&!Ne.focusSvgNegativeTabindexAttribute){return true}}if(u==="svg"&&Ne.focusSvgInIframe&&d){return true}if(s.is.TRIDENT||s.is.EDGE){if(u==="svg"){if(Ne.focusSvg){return true}return a.hasAttribute("focusable")||p}if(a.ownerSVGElement){if(Ne.focusSvgTabindexAttribute&&p){return true}return a.hasAttribute("focusable")}}if(a.tabIndex===undefined){return Boolean(r.onlyTabbable)}if(u==="audio"){if(!a.hasAttribute("controls")){return false}else if(s.is.BLINK){return true}}if(u==="video"){if(!a.hasAttribute("controls")){if(s.is.TRIDENT||s.is.EDGE){return false}}else if(s.is.BLINK||s.is.GECKO){return true}}if(u==="object"){if(s.is.BLINK||s.is.WEBKIT){return false}}if(u==="iframe"){return false}if(!r.scrollable&&s.is.GECKO){var m=window.getComputedStyle(a,null);if(hasCssOverflowScroll(m)){return d}}if(s.is.TRIDENT||s.is.EDGE){if(u==="area"){var h=getImageOfArea(a);if(h&&tabindexValue(h)<0){return false}}var g=window.getComputedStyle(a,null);if(isUserModifyWritable(g)){return a.tabIndex>=0}if(!r.flexbox&&hasCssDisplayFlex(g)){if(c!==null){return p}return ze(a)&&Fe(a)}if(isScrollableContainer(a,u)){return false}var y=a.parentElement;if(y){var x=y.nodeName.toLowerCase();var w=window.getComputedStyle(y,null);if(isScrollableContainer(y,u,x,w)){return false}if(hasCssDisplayFlex(w)){return p}}}return a.tabIndex>=0}isTabbableRules.except=function(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n=function isTabbable(n){return isTabbableRules({context:n,except:e})};n.rules=isTabbableRules;return n};var ze=ge.rules.except({flexbox:true});var Fe=isTabbableRules.except({flexbox:true});var Ie=isTabbableRules.except({});function queryTabbable(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;var i=Ie.rules.except({onlyTabbable:r});return queryFocusable({context:n,includeContext:t,includeOnlyTabbable:r,strategy:a}).filter(i)}function compareDomPosition(e,n){return e.compareDocumentPosition(n)&Node.DOCUMENT_POSITION_FOLLOWING?-1:1}function sortDomOrder(e){return e.sort(compareDomPosition)}function getFirstSuccessorOffset(e,n){return findIndex(e,(function(e){return n.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_FOLLOWING}))}function findInsertionOffsets(e,n,t){var r=[];n.forEach((function(n){var a=true;var i=e.indexOf(n);if(i===-1){i=getFirstSuccessorOffset(e,n);a=false}if(i===-1){i=e.length}var o=nodeArray(t?t(n):n);if(!o.length){return}r.push({offset:i,replace:a,elements:o})}));return r}function insertElementsAtOffsets(e,n){var t=0;n.sort((function(e,n){return e.offset-n.offset}));n.forEach((function(n){var r=n.replace?1:0;var a=[n.offset+t,r].concat(n.elements);e.splice.apply(e,a);t+=n.elements.length-r}))}function mergeInDomOrder(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.list,t=e.elements,r=e.resolveElement;var a=n.slice(0);var i=nodeArray(t).slice(0);sortDomOrder(i);var o=findInsertionOffsets(a,i,r);insertElementsAtOffsets(a,o);return a}var Le=function(){function defineProperties(e,n){for(var t=0;t-1){return[e].concat(n)}return n}},{key:"_cleanup",value:function _cleanup(){Object.keys(this.hosts).forEach((function(e){delete this.hosts[e]._sortingId}),this)}}]);return Shadows}();function sortShadowed(e,n,t){var r=new We(n,t);var a=r.extractElements(e);if(a.length===e.length){return t(e)}return r.sort(a)}function sortTabindex(e){var n={};var t=[];var r=e.filter((function(e){var r=e.tabIndex;if(r===undefined){r=tabindexValue(e)}if(r<=0||r===null||r===undefined){return true}if(!n[r]){n[r]=[];t.push(r)}n[r].push(e);return false}));var a=t.sort().map((function(e){return n[e]})).reduceRight((function(e,n){return n.concat(e)}),r);return a}var qe=void 0;function moveContextToBeginning(e,n){var t=e.indexOf(n);if(t>0){var r=e.splice(t,1);return r.concat(e)}return e}function sortElements(e,n){if(qe.tabsequenceAreaAtImgPosition){e=sortArea(e,n)}e=sortTabindex(e);return e}function queryTabsequence(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.context,t=e.includeContext,r=e.includeOnlyTabbable,a=e.strategy;if(!qe){qe=_supports()}var i=nodeArray(n)[0]||document.documentElement;var o=queryTabbable({context:i,includeContext:t,includeOnlyTabbable:r,strategy:a});if(document.body.createShadowRoot&&s.is.BLINK){o=sortShadowed(o,i,sortElements)}else{o=sortElements(o,i)}if(t){o=moveContextToBeginning(o,i)}return o}var Ue={tab:9,left:37,up:38,right:39,down:40,pageUp:33,"page-up":33,pageDown:34,"page-down":34,end:35,home:36,enter:13,escape:27,space:32,shift:16,capsLock:20,"caps-lock":20,ctrl:17,alt:18,meta:91,pause:19,insert:45,delete:46,backspace:8,_alias:{91:[92,93,224]}};for(var Ge=1;Ge<26;Ge++){Ue["f"+Ge]=Ge+111}for(var Ve=0;Ve<10;Ve++){var Ke=Ve+48;var Ze=Ve+96;Ue[Ve]=Ke;Ue["num-"+Ve]=Ze;Ue._alias[Ke]=[Ze]}for(var $e=0;$e<26;$e++){var Ye=$e+65;var Xe=String.fromCharCode(Ye).toLowerCase();Ue[Xe]=Ye}var Je={alt:"altKey",ctrl:"ctrlKey",meta:"metaKey",shift:"shiftKey"};var Qe=Object.keys(Je).map((function(e){return Je[e]}));function createExpectedModifiers(e){var n=e?null:false;return{altKey:n,ctrlKey:n,metaKey:n,shiftKey:n}}function resolveModifiers(e){var n=e.indexOf("*")!==-1;var t=createExpectedModifiers(n);e.forEach((function(e){if(e==="*"){return}var n=true;var r=e.slice(0,1);if(r==="?"){n=null}else if(r==="!"){n=false}if(n!==true){e=e.slice(1)}var a=Je[e];if(!a){throw new TypeError('Unknown modifier "'+e+'"')}t[a]=n}));return t}function resolveKey(e){var n=Ue[e]||parseInt(e,10);if(!n||typeof n!=="number"||isNaN(n)){throw new TypeError('Unknown key "'+e+'"')}return[n].concat(Ue._alias[n]||[])}function matchModifiers(e,n){return!Qe.some((function(t){return typeof e[t]==="boolean"&&Boolean(n[t])!==e[t]}))}function keyBinding(e){return e.split(/\s+/).map((function(e){var n=e.split("+");var t=resolveModifiers(n.slice(0,-1));var r=resolveKey(n.slice(-1));return{keyCodes:r,modifiers:t,matchModifiers:matchModifiers.bind(null,t)}}))}function getParentComparator(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{},n=e.parent,t=e.element,r=e.includeSelf;if(n){return function isChildOf(e){return Boolean(r&&e===n||n.compareDocumentPosition(e)&Node.DOCUMENT_POSITION_CONTAINED_BY)}}else if(t){return function isParentOf(e){return Boolean(r&&t===e||e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_CONTAINED_BY)}}throw new TypeError("util/compare-position#getParentComparator required either options.parent or options.element")}function whenKey(){var e=arguments.length>0&&arguments[0]!==undefined?arguments[0]:{};var n={};var t=nodeArray(e.context)[0]||document.documentElement;delete e.context;var r=nodeArray(e.filter);delete e.filter;var a=Object.keys(e);if(!a.length){throw new TypeError("when/key requires at least one option key")}var i=function registerBinding(e){e.keyCodes.forEach((function(t){if(!n[t]){n[t]=[]}n[t].push(e)}))};a.forEach((function(n){if(typeof e[n]!=="function"){throw new TypeError('when/key requires option["'+n+'"] to be a function')}var t=function addCallback(t){t.callback=e[n];return t};keyBinding(n).map(t).forEach(i)}));var o=function handleKeyDown(e){if(e.defaultPrevented){return}if(r.length){var a=getParentComparator({element:e.target,includeSelf:true});if(r.some(a)){return}}var i=e.keyCode||e.which;if(!n[i]){return}n[i].forEach((function(n){if(!n.matchModifiers(e)){return}n.callback.call(t,e,l)}))};t.addEventListener("keydown",o,false);var l=function disengage(){t.removeEventListener("keydown",o,false)};return{disengage:l}}function default_1(e){var n=e===void 0?{}:e,t=n.context;if(!t){t=document.documentElement}queryTabsequence();return whenKey({"?alt+?shift+tab":function altShiftTab(e){e.preventDefault();var n=queryTabsequence({context:t});var r=e.shiftKey;var a=n[0];var i=n[n.length-1];var o=r?a:i;var l=r?i:a;if(isActiveElement(o)){l.focus();return}var s=void 0;var u=n.some((function(e,n){if(!isActiveElement(e)){return false}s=n;return true}));if(!u){a.focus();return}var c=r?-1:1;n[s+c].focus()}})}n["default"]=default_1},173:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"],["\n [data-nextjs-dialog-overlay] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n overflow: auto;\n z-index: 9000;\n\n display: flex;\n align-content: center;\n align-items: center;\n flex-direction: column;\n padding: 10vh 15px 0;\n }\n\n @media (max-height: 812px) {\n [data-nextjs-dialog-overlay] {\n padding: 15px 15px 0;\n }\n }\n\n [data-nextjs-dialog-backdrop] {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(17, 17, 17, 0.2);\n pointer-events: all;\n z-index: -1;\n }\n\n [data-nextjs-dialog-backdrop-fixed] {\n cursor: not-allowed;\n -webkit-backdrop-filter: blur(8px);\n backdrop-filter: blur(8px);\n }\n"])));n.styles=i;var o},395:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};var o=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.ShadowPortal=void 0;var l=i(t(522));var s=t(255);var u=function Portal(e){var n=e.children;var t=l.useRef(null);var r=l.useRef(null);var a=l.useRef(null);var i=o(l.useState(),2),u=i[1];l.useLayoutEffect((function(){var e=t.current.ownerDocument;r.current=e.createElement("nextjs-portal");a.current=r.current.attachShadow({mode:"open"});e.body.appendChild(r.current);u({});return function(){if(r.current&&r.current.ownerDocument){r.current.ownerDocument.body.removeChild(r.current)}}}),[]);return a.current?(0,s.createPortal)(n,a.current):l.createElement("span",{ref:t})};n.ShadowPortal=u},261:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"],["\n [data-nextjs-terminal] {\n border-radius: var(--size-gap-half);\n background-color: var(--color-ansi-bg);\n color: var(--color-ansi-fg);\n }\n [data-nextjs-terminal]::selection,\n [data-nextjs-terminal] *::selection {\n background-color: var(--color-ansi-selection);\n }\n [data-nextjs-terminal] * {\n color: inherit;\n background-color: transparent;\n font-family: var(--font-stack-monospace);\n }\n [data-nextjs-terminal] > * {\n margin: 0;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n }\n\n [data-nextjs-terminal] pre {\n white-space: pre-wrap;\n word-break: break-word;\n }\n"])));n.styles=i;var o},314:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var a=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var i=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))r(n,e,t);a(n,e);return n};n.__esModule=true;n.Toast=void 0;var o=i(t(522));var l=function Toast(e){var n=e.onClick,t=e.children,r=e.className;return o.createElement("div",{"data-nextjs-toast":true,onClick:n,className:r},o.createElement("div",{"data-nextjs-toast-wrapper":true},t))};n.Toast=l},626:function(e,n,t){"use strict";var r=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});n.__esModule=true;n.Toast=n.styles=void 0;var a=t(565);r(n,a,"styles");var i=t(314);r(n,i,"Toast")},565:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};n.__esModule=true;n.styles=void 0;var a=t(373);var i=(0,a.noop)(o||(o=r(["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"],["\n [data-nextjs-toast] {\n position: fixed;\n bottom: var(--size-gap-double);\n left: var(--size-gap-double);\n max-width: 420px;\n z-index: 9000;\n }\n\n @media (max-width: 440px) {\n [data-nextjs-toast] {\n max-width: 90vw;\n left: 5vw;\n }\n }\n\n [data-nextjs-toast-wrapper] {\n padding: 16px;\n border-radius: var(--size-gap-half);\n font-weight: 500;\n color: var(--color-ansi-bright-white);\n background-color: var(--color-ansi-red);\n box-shadow: 0px var(--size-gap-double) var(--size-gap-quad)\n rgba(0, 0, 0, 0.25);\n }\n"])));n.styles=i;var o},71:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};n.__esModule=true;n.styles=n.BuildError=void 0;var l=o(t(522));var s=t(824);var u=t(382);var c=t(504);var f=t(373);var d=function BuildError(e){var n=e.message;var t=l.useCallback((function(){}),[]);return l.createElement(u.Overlay,{fixed:true},l.createElement(s.Dialog,{type:"error","aria-labelledby":"nextjs__container_build_error_label","aria-describedby":"nextjs__container_build_error_desc",onClose:t},l.createElement(s.DialogContent,null,l.createElement(s.DialogHeader,{className:"nextjs-container-build-error-header"},l.createElement("h4",{id:"nextjs__container_build_error_label"},"Failed to compile")),l.createElement(s.DialogBody,{className:"nextjs-container-build-error-body"},l.createElement(c.Terminal,{content:n}),l.createElement("footer",null,l.createElement("p",{id:"nextjs__container_build_error_desc"},l.createElement("small",null,"This error occurred during the build process and can only be dismissed by fixing the error.")))))))};n.BuildError=d;n.styles=(0,f.noop)(p||(p=r(["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"],["\n .nextjs-container-build-error-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-build-error-body footer {\n margin-top: var(--size-gap);\n }\n .nextjs-container-build-error-body footer p {\n margin: 0;\n }\n\n .nextjs-container-build-error-body small {\n color: #757575;\n }\n"])));var p},610:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__assign||function(){a=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0&&i[i.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1]0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.styles=n.Errors=void 0;var f=l(t(522));var d=t(591);var p=t(824);var v=t(830);var b=t(382);var m=t(626);var h=t(915);var g=t(373);var y=t(392);var x=t(157);function getErrorSignature(e){var n=e.event;switch(n.type){case d.TYPE_UNHANDLED_ERROR:case d.TYPE_UNHANDLED_REJECTION:{return n.reason.name+"::"+n.reason.message+"::"+n.reason.stack}default:{}}var t=n;return""}var w=function HotlinkedText(e){var n=e.text;var t=/https?:\/\/[^\s/$.?#].[^\s"]*/i;return f.createElement(f.Fragment,null,t.test(n)?n.split(" ").map((function(e,n,r){if(t.test(e)){return f.createElement(f.Fragment,{key:"link-"+n},f.createElement("a",{href:e},e),n===r.length-1?"":" ")}return n===r.length-1?f.createElement(f.Fragment,{key:"text-"+n},e):f.createElement(f.Fragment,{key:"text-"+n},e," ")})):n)};function getErrorByType(e){return s(this,void 0,void 0,(function(){var n,t,r,a;var i;return u(this,(function(o){switch(o.label){case 0:n=e.id,t=e.event;r=t.type;switch(r){case d.TYPE_UNHANDLED_ERROR:return[3,1];case d.TYPE_UNHANDLED_REJECTION:return[3,1]}return[3,3];case 1:i={id:n,runtime:true,error:t.reason};return[4,(0,y.getOriginalStackFrames)((0,h.isNodeError)(t.reason),t.frames)];case 2:return[2,(i.frames=o.sent(),i)];case 3:{return[3,4]}o.label=4;case 4:a=t;throw new Error("type system invariant violation")}}))}))}var _=function Errors(e){var n=e.errors;var t=c(f.useState({}),2),r=t[0],i=t[1];var o=c(f.useMemo((function(){var e=[];var t=null;for(var a=0;a0){var l=n[a-1];if(getErrorSignature(l)===getErrorSignature(i)){continue}}t=i;break}return[e,t]}),[n,r]),2),l=o[0],s=o[1];var u=f.useMemo((function(){return l.length<1&&Boolean(n.length)}),[n.length,l.length]);f.useEffect((function(){if(s==null){return}var e=true;getErrorByType(s).then((function(n){if(e){i((function(e){var t;return a(a({},e),(t={},t[n.id]=n,t))}))}}),(function(){}));return function(){e=false}}),[s]);var d=c(f.useState(false),2),g=d[0],y=d[1];var _=c(f.useState(0),2),E=_[0],O=_[1];var j=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();O((function(e){return Math.max(0,e-1)}))}),[]);var S=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();O((function(e){return Math.max(0,Math.min(l.length-1,e+1))}))}),[l.length]);var k=f.useMemo((function(){var e;return(e=l[E])!==null&&e!==void 0?e:null}),[E,l]);f.useEffect((function(){if(n.length<1){i({});y(false);O(0)}}),[n.length]);var T=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();y(true)}),[]);var C=f.useCallback((function(e){e===null||e===void 0?void 0:e.preventDefault();y(false)}),[]);if(n.length<1||k==null){return null}if(u){return f.createElement(b.Overlay,null)}if(g){return f.createElement(m.Toast,{className:"nextjs-toast-errors-parent",onClick:C},f.createElement("div",{className:"nextjs-toast-errors"},f.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",width:"24",height:"24",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},f.createElement("circle",{cx:"12",cy:"12",r:"10"}),f.createElement("line",{x1:"12",y1:"8",x2:"12",y2:"12"}),f.createElement("line",{x1:"12",y1:"16",x2:"12.01",y2:"16"})),f.createElement("span",null,l.length," error",l.length>1?"s":"")))}var P=(0,h.isNodeError)(k.error);return f.createElement(b.Overlay,null,f.createElement(p.Dialog,{type:"error","aria-labelledby":"nextjs__container_errors_label","aria-describedby":"nextjs__container_errors_desc",onClose:P?undefined:T},f.createElement(p.DialogContent,null,f.createElement(p.DialogHeader,{className:"nextjs-container-errors-header"},f.createElement(v.LeftRightDialogHeader,{previous:E>0?j:null,next:E h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"],["\n .nextjs-container-errors-header > h1 {\n font-size: var(--size-font-big);\n line-height: var(--size-font-bigger);\n font-weight: bold;\n margin: 0;\n margin-top: calc(var(--size-gap-double) + var(--size-gap-half));\n }\n .nextjs-container-errors-header small {\n font-size: var(--size-font-small);\n color: var(--color-accents-1);\n margin-left: var(--size-gap-double);\n }\n .nextjs-container-errors-header small > span {\n font-family: var(--font-stack-monospace);\n }\n .nextjs-container-errors-header > p {\n font-family: var(--font-stack-monospace);\n font-size: var(--size-font-small);\n line-height: var(--size-font-big);\n font-weight: bold;\n margin: 0;\n margin-top: var(--size-gap-half);\n color: var(--color-ansi-red);\n white-space: pre-wrap;\n }\n .nextjs-container-errors-header > div > small {\n margin: 0;\n margin-top: var(--size-gap-half);\n }\n .nextjs-container-errors-header > p > a {\n color: var(--color-ansi-red);\n }\n\n .nextjs-container-errors-body > h5:not(:first-child) {\n margin-top: calc(var(--size-gap-double) + var(--size-gap));\n }\n .nextjs-container-errors-body > h5 {\n margin-bottom: var(--size-gap);\n }\n\n .nextjs-toast-errors-parent {\n cursor: pointer;\n transition: transform 0.2s ease;\n }\n .nextjs-toast-errors-parent:hover {\n transform: scale(1.1);\n }\n .nextjs-toast-errors {\n display: flex;\n align-items: center;\n justify-content: flex-start;\n }\n .nextjs-toast-errors > svg {\n margin-right: var(--size-gap);\n }\n"])));var E},710:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};n.__esModule=true;n.styles=n.FullRefreshWarning=void 0;var l=o(t(522));var s=t(824);var u=t(382);var c=t(504);var f=t(373);var d=function FullRefreshWarning(e){var n=e.reason;var t=l.useCallback((function(){window.location.reload()}),[]);return l.createElement(u.Overlay,{fixed:true},l.createElement(s.Dialog,{type:"warning","aria-labelledby":"nextjs__container_refresh_warning_label","aria-describedby":"nextjs__container_refresh_warning_desc",onClose:t},l.createElement(s.DialogContent,null,l.createElement(s.DialogHeader,{className:"nextjs-container-refresh-warning-header"},l.createElement("h4",{id:"nextjs__container_refresh_warning_label"},"About to perform a full refresh")),l.createElement(s.DialogBody,{className:"nextjs-container-refresh-warning-body"},l.createElement(FullRefreshWarningReason,{reason:n}),l.createElement("footer",null,l.createElement("p",null,"You can read more about Fast Refresh in"," ",l.createElement("a",{href:"https://nextjs.org/docs/basic-features/fast-refresh#how-it-works"},"our documentation"),"."),l.createElement("button",{onClick:t},"Reload"))))))};n.FullRefreshWarning=d;n.styles=(0,f.noop)(p||(p=r(["\n .nextjs-container-refresh-warning-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-refresh-warning-body footer {\n margin-top: var(--size-gap-double);\n }\n\n .nextjs-container-build-error-body p {\n color: #757575;\n }\n\n .nextjs-container-refresh-warning-body button {\n background-color: var(--color-ansi-yellow);\n border: 0;\n border-radius: var(--size-gap-half);\n color: var(--color-ansi-black);\n cursor: pointer;\n display: block;\n margin-left: auto;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n transition: background-color 0.25s ease;\n }\n\n .nextjs-container-refresh-warning-body button:hover {\n background-color: var(--color-ansi-bright-yellow);\n }\n"],["\n .nextjs-container-refresh-warning-header > h4 {\n line-height: 1.5;\n margin: 0;\n padding: 0;\n }\n\n .nextjs-container-refresh-warning-body footer {\n margin-top: var(--size-gap-double);\n }\n\n .nextjs-container-build-error-body p {\n color: #757575;\n }\n\n .nextjs-container-refresh-warning-body button {\n background-color: var(--color-ansi-yellow);\n border: 0;\n border-radius: var(--size-gap-half);\n color: var(--color-ansi-black);\n cursor: pointer;\n display: block;\n margin-left: auto;\n padding: calc(var(--size-gap) + var(--size-gap-half))\n calc(var(--size-gap-double) + var(--size-gap-half));\n transition: background-color 0.25s ease;\n }\n\n .nextjs-container-refresh-warning-body button:hover {\n background-color: var(--color-ansi-bright-yellow);\n }\n"])));var FullRefreshWarningReason=function(e){var n=e.reason;if(n===null){return l.createElement("p",null,"Fast Refresh will perform a full reload because your application had an unrecoverable error.")}return l.createElement(l.Fragment,null,l.createElement("p",null,"Fast Refresh will perform a full reload when you edit a file that is imported by modules outside of the React rendering tree. It is also possible the parent component of the component you edited is a class component, which disables Fast Refresh. Fast Refresh requires at least one parent function component in your React tree."),l.createElement("p",null,"You can find more information in the related error below:"),l.createElement(c.Terminal,{content:n}))};var p},157:function(e,n,t){"use strict";var r=this&&this.__makeTemplateObject||function(e,n){if(Object.defineProperty){Object.defineProperty(e,"raw",{value:n})}else{e.raw=n}return e};var a=this&&this.__createBinding||(Object.create?function(e,n,t,r){if(r===undefined)r=t;Object.defineProperty(e,r,{enumerable:true,get:function(){return n[t]}})}:function(e,n,t,r){if(r===undefined)r=t;e[r]=n[t]});var i=this&&this.__setModuleDefault||(Object.create?function(e,n){Object.defineProperty(e,"default",{enumerable:true,value:n})}:function(e,n){e["default"]=n});var o=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var n={};if(e!=null)for(var t in e)if(t!=="default"&&Object.prototype.hasOwnProperty.call(e,t))a(n,e,t);i(n,e);return n};var l=this&&this.__read||function(e,n){var t=typeof Symbol==="function"&&e[Symbol.iterator];if(!t)return e;var r=t.call(e),a,i=[],o;try{while((n===void 0||n-- >0)&&!(a=r.next()).done)i.push(a.value)}catch(e){o={error:e}}finally{try{if(a&&!a.done&&(t=r["return"]))t.call(r)}finally{if(o)throw o.error}}return i};n.__esModule=true;n.RuntimeError=n.styles=void 0;var s=o(t(522));var u=t(983);var c=t(373);var f=t(392);var d=function CallStackFrame(e){var n;var t=e.frame;var r=(n=t.originalStackFrame)!==null&&n!==void 0?n:t.sourceStackFrame;var a=Boolean(t.originalCodeFrame);var i=s.useCallback((function(){var e;if(!a)return;var n=new URLSearchParams;for(var t in r){n.append(t,((e=r[t])!==null&&e!==void 0?e:"").toString())}self.fetch((process.env.__NEXT_ROUTER_BASEPATH||"")+"/__nextjs_launch-editor?"+n.toString()).then((function(){}),(function(){console.error("There was an issue opening this code in your editor.")}))}),[a,r]);return s.createElement("div",{"data-nextjs-call-stack-frame":true},s.createElement("h6",{"data-nextjs-frame-expanded":Boolean(t.expanded)},r.methodName),s.createElement("div",{"data-has-source":a?"true":undefined,tabIndex:a?10:undefined,role:a?"link":undefined,onClick:i,title:a?"Click to open in your editor":undefined},s.createElement("span",null,(0,f.getFrameSource)(r)),s.createElement("svg",{xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round",strokeLinejoin:"round"},s.createElement("path",{d:"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"}),s.createElement("polyline",{points:"15 3 21 3 21 9"}),s.createElement("line",{x1:"10",y1:"14",x2:"21",y2:"3"}))))};var p=function RuntimeError(e){var n=e.error;var t=s.useMemo((function(){return n.frames.findIndex((function(e){return e.expanded&&Boolean(e.originalCodeFrame)&&Boolean(e.originalStackFrame)}))}),[n.frames]);var r=s.useMemo((function(){var e;return(e=n.frames[t])!==null&&e!==void 0?e:null}),[n.frames,t]);var a=s.useMemo((function(){return t<0?[]:n.frames.slice(0,t)}),[n.frames,t]);var i=l(s.useState(r==null),2),o=i[0],c=i[1];var f=s.useCallback((function(){c((function(e){return!e}))}),[]);var p=s.useMemo((function(){return a.filter((function(e){return e.expanded||o}))}),[o,a]);var v=s.useMemo((function(){return n.frames.slice(t+1)}),[n.frames,t]);var b=s.useMemo((function(){return v.filter((function(e){return e.expanded||o}))}),[o,v]);var m=s.useMemo((function(){return v.length!==b.length||o&&r!=null}),[o,v.length,r,b.length]);return s.createElement(s.Fragment,null,r?s.createElement(s.Fragment,null,s.createElement("h5",null,"Source"),p.map((function(e,n){return s.createElement(d,{key:"leading-frame-"+n+"-"+o,frame:e})})),s.createElement(u.CodeFrame,{stackFrame:r.originalStackFrame,codeFrame:r.originalCodeFrame})):undefined,b.length?s.createElement(s.Fragment,null,s.createElement("h5",null,"Call Stack"),b.map((function(e,n){return s.createElement(d,{key:"call-stack-"+n+"-"+o,frame:e})}))):undefined,m?s.createElement(s.Fragment,null,s.createElement("button",{tabIndex:10,"data-nextjs-data-runtime-error-collapsed-action":true,type:"button",onClick:f},o?"Hide":"Show"," collapsed frames")):undefined)};n.RuntimeError=p;n.styles=(0,c.noop)(v||(v=r(["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"],["\n button[data-nextjs-data-runtime-error-collapsed-action] {\n background: none;\n border: none;\n padding: 0;\n font-size: var(--size-font-small);\n line-height: var(--size-font-bigger);\n color: var(--color-accents-3);\n }\n\n [data-nextjs-call-stack-frame]:not(:last-child) {\n margin-bottom: var(--size-gap-double);\n }\n\n [data-nextjs-call-stack-frame] > h6 {\n margin-top: 0;\n margin-bottom: var(--size-gap);\n font-family: var(--font-stack-monospace);\n color: #222;\n }\n [data-nextjs-call-stack-frame] > h6[data-nextjs-frame-expanded='false'] {\n color: #666;\n }\n [data-nextjs-call-stack-frame] > div {\n display: flex;\n align-items: center;\n padding-left: calc(var(--size-gap) + var(--size-gap-half));\n font-size: var(--size-font-small);\n color: #999;\n }\n [data-nextjs-call-stack-frame] > div > svg {\n width: auto;\n height: var(--size-font-small);\n margin-left: var(--size-gap);\n\n display: none;\n }\n\n [data-nextjs-call-stack-frame] > div[data-has-source] {\n cursor: pointer;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source]:hover {\n text-decoration: underline dotted;\n }\n [data-nextjs-call-stack-frame] > div[data-has-source] > svg {\n display: unset;\n }\n"])));var v},915:function(e,n,t){"use strict";var r=this&&this.__assign||function(){r=Object.assign||function(e){for(var n,t=1,r=arguments.length;t0&&i[i.length-1])&&(o[0]===6||o[0]===2)){t=0;continue}if(o[0]===3&&(!i||o[1]>i[0]&&o[1] { let contentType @@ -335,11 +336,11 @@ const COOKIE_NAME_PRERENDER_BYPASS = `__prerender_bypass` const COOKIE_NAME_PRERENDER_DATA = `__next_preview_data` export const SYMBOL_PREVIEW_DATA = Symbol(COOKIE_NAME_PRERENDER_DATA) -const SYMBOL_CLEARED_COOKIES = Symbol(COOKIE_NAME_PRERENDER_BYPASS) +export const SYMBOL_CLEARED_COOKIES = Symbol(COOKIE_NAME_PRERENDER_BYPASS) export function tryGetPreviewData( - req: IncomingMessage, - res: ServerResponse, + req: IncomingMessage | BaseNextRequest, + res: ServerResponse | BaseNextResponse, options: __ApiPreviewProps ): PreviewData { // Read cached preview data if present diff --git a/packages/next/server/base-http.ts b/packages/next/server/base-http.ts new file mode 100644 index 0000000000000..b353df2d09683 --- /dev/null +++ b/packages/next/server/base-http.ts @@ -0,0 +1,288 @@ +import type { ServerResponse, IncomingMessage, IncomingHttpHeaders } from 'http' +import type { Writable, Readable } from 'stream' +import { PERMANENT_REDIRECT_STATUS } from '../shared/lib/constants' +import { + getCookieParser, + NextApiRequestCookies, + parseBody, + SYMBOL_CLEARED_COOKIES, +} from './api-utils' +import { I18NConfig } from './config-shared' +import { NEXT_REQUEST_META, RequestMeta } from './request-meta' + +export interface BaseNextRequestConfig { + basePath: string | undefined + i18n?: I18NConfig + trailingSlash?: boolean | undefined +} + +export abstract class BaseNextRequest { + protected _cookies: NextApiRequestCookies | undefined + public abstract headers: IncomingHttpHeaders + + constructor(public method: string, public url: string, public body: Body) {} + + abstract parseBody(limit: string | number): Promise + + // Utils implemented using the abstract methods above + + public get cookies() { + if (this._cookies) return this._cookies + return (this._cookies = getCookieParser(this.headers)()) + } +} + +export class NodeNextRequest extends BaseNextRequest { + public headers = this._req.headers; + + [NEXT_REQUEST_META]: RequestMeta + + get originalRequest() { + // Need to mimic these changes to the original req object for places where we use it: + // render.tsx, api/ssg requests + this._req[NEXT_REQUEST_META] = this[NEXT_REQUEST_META] + this._req.url = this.url + this._req.cookies = this.cookies + return this._req + } + + constructor( + private _req: IncomingMessage & { + [NEXT_REQUEST_META]?: RequestMeta + cookies?: NextApiRequestCookies + } + ) { + super(_req.method!.toUpperCase(), _req.url!, _req) + } + + async parseBody(limit: string | number): Promise { + return parseBody(this._req, limit) + } +} + +export class WebNextRequest extends BaseNextRequest { + public request: Request + public headers: IncomingHttpHeaders + + constructor(request: Request) { + const url = new URL(request.url) + + super( + request.method, + url.href.slice(url.origin.length), + request.clone().body + ) + this.request = request + + this.headers = {} + for (const [name, value] of request.headers.entries()) { + this.headers[name] = value + } + } + + async parseBody(_limit: string | number): Promise { + throw new Error('parseBody is not implemented in the web runtime') + } +} + +export abstract class BaseNextResponse { + abstract statusCode: number | undefined + abstract statusMessage: string | undefined + abstract get sent(): boolean + + constructor(public destination: Destination) {} + + /** + * Sets a value for the header overwriting existing values + */ + abstract setHeader(name: string, value: string | string[]): this + + /** + * Appends value for the given header name + */ + abstract appendHeader(name: string, value: string): this + + /** + * Get all vaues for a header as an array or undefined if no value is present + */ + abstract getHeaderValues(name: string): string[] | undefined + + abstract hasHeader(name: string): boolean + + /** + * Get vaues for a header concatenated using `,` or undefined if no value is present + */ + abstract getHeader(name: string): string | undefined + + abstract body(value: string): this + + abstract send(): void + + // Utils implemented using the abstract methods above + + redirect(destination: string, statusCode: number) { + this.setHeader('Location', destination) + this.statusCode = statusCode + + // Since IE11 doesn't support the 308 header add backwards + // compatibility using refresh header + if (statusCode === PERMANENT_REDIRECT_STATUS) { + this.setHeader('Refresh', `0;url=${destination}`) + } + return this + } +} + +export class NodeNextResponse extends BaseNextResponse { + private textBody: string | undefined = undefined + + public [SYMBOL_CLEARED_COOKIES]?: boolean + + get originalResponse() { + if (SYMBOL_CLEARED_COOKIES in this) { + this._res[SYMBOL_CLEARED_COOKIES] = this[SYMBOL_CLEARED_COOKIES] + } + + return this._res + } + + constructor( + private _res: ServerResponse & { [SYMBOL_CLEARED_COOKIES]?: boolean } + ) { + super(_res) + } + + get sent() { + return this._res.finished || this._res.headersSent + } + + get statusCode() { + return this._res.statusCode + } + + set statusCode(value: number) { + this._res.statusCode = value + } + + get statusMessage() { + return this._res.statusMessage + } + + set statusMessage(value: string) { + this._res.statusMessage = value + } + + setHeader(name: string, value: string | string[]): this { + this._res.setHeader(name, value) + return this + } + + getHeaderValues(name: string): string[] | undefined { + const values = this._res.getHeader(name) + + if (values === undefined) return undefined + + return (Array.isArray(values) ? values : [values]).map((value) => + value.toString() + ) + } + + hasHeader(name: string): boolean { + return this._res.hasHeader(name) + } + + getHeader(name: string): string | undefined { + const values = this.getHeaderValues(name) + return Array.isArray(values) ? values.join(',') : undefined + } + + appendHeader(name: string, value: string): this { + const currentValues = this.getHeaderValues(name) ?? [] + + if (!currentValues.includes(value)) { + this._res.setHeader(name, [...currentValues, value]) + } + + return this + } + + body(value: string) { + this.textBody = value + return this + } + + send() { + this._res.end(this.textBody) + } +} + +export class WebNextResponse extends BaseNextResponse { + private headers = new Headers() + private textBody: string | undefined = undefined + private _sent = false + + private sendPromise = new Promise((resolve) => { + this.sendResolve = resolve + }) + private sendResolve?: () => void + private response = this.sendPromise.then(() => { + return new Response(this.textBody ?? this.transformStream.readable, { + headers: this.headers, + status: this.statusCode, + statusText: this.statusMessage, + }) + }) + + public statusCode: number | undefined + public statusMessage: string | undefined + + get sent() { + return this._sent + } + + constructor(public transformStream = new TransformStream()) { + super(transformStream.writable) + } + + setHeader(name: string, value: string | string[]): this { + this.headers.delete(name) + for (const val of Array.isArray(value) ? value : [value]) { + this.headers.append(name, val) + } + return this + } + + getHeaderValues(name: string): string[] | undefined { + // https://developer.mozilla.org/en-US/docs/Web/API/Headers/get#example + return this.getHeader(name) + ?.split(',') + .map((v) => v.trimStart()) + } + + getHeader(name: string): string | undefined { + return this.headers.get(name) ?? undefined + } + + hasHeader(name: string): boolean { + return this.headers.has(name) + } + + appendHeader(name: string, value: string): this { + this.headers.append(name, value) + return this + } + + body(value: string) { + this.textBody = value + return this + } + + send() { + this.sendResolve?.() + this._sent = true + } + + toResponse() { + return this.response + } +} diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index de408ad8ecbcf..9ff580b0ad105 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -4,10 +4,8 @@ import type { DomainLocale } from './config' import type { DynamicRoutes, PageChecker, Params, Route } from './router' import type { FetchEventResult } from './web/types' import type { FontManifest } from './font-utils' -import type { IncomingMessage, ServerResponse } from 'http' import type { LoadComponentsReturnType } from './load-components' import type { MiddlewareManifest } from '../build/webpack/plugins/middleware-plugin' -import type { NextApiRequest, NextApiResponse } from '../shared/lib/utils' import type { NextConfig, NextConfigComplete } from './config-shared' import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta' import type { ParsedNextUrl } from '../shared/lib/router/utils/parse-next-url' @@ -20,8 +18,6 @@ import type { ResponseCacheEntry, ResponseCacheValue } from './response-cache' import type { UrlWithParsedQuery } from 'url' import type { CacheFs } from '../shared/lib/utils' -import compression from 'next/dist/compiled/compression' -import Proxy from 'next/dist/compiled/http-proxy' import { join, relative, resolve, sep } from 'path' import { parse as parseQs, stringify as stringifyQs } from 'querystring' import { format as formatUrl, parse as parseUrl } from 'url' @@ -30,7 +26,6 @@ import { CLIENT_PUBLIC_FILES_PATH, CLIENT_STATIC_FILES_PATH, CLIENT_STATIC_FILES_RUNTIME, - PERMANENT_REDIRECT_STATUS, PRERENDER_MANIFEST, ROUTES_MANIFEST, SERVERLESS_DIRECTORY, @@ -47,27 +42,16 @@ import { getMiddlewareRegex, } from '../shared/lib/router/utils' import * as envConfig from '../shared/lib/runtime-config' -import { - DecodeError, - isResSent, - normalizeRepeatedSlashes, -} from '../shared/lib/utils' -import { - apiResolver, - setLazyProp, - getCookieParser, - tryGetPreviewData, -} from './api-utils' +import { DecodeError, normalizeRepeatedSlashes } from '../shared/lib/utils' +import { setLazyProp, getCookieParser, tryGetPreviewData } from './api-utils' import { isTargetLikeServerless } from './config' import pathMatch from '../shared/lib/router/utils/path-match' -import { renderToHTML } from './render' import Router, { replaceBasePath, route } from './router' import { compileNonPath, prepareDestination, } from '../shared/lib/router/utils/prepare-destination' -import { sendRenderResult, setRevalidateHeaders } from './send-payload' -import { serveStatic } from './serve-static' +import { PayloadOptions, setRevalidateHeaders } from './send-payload' import { IncrementalCache } from './incremental-cache' import { execOnce } from '../shared/lib/utils' import { isBlockedPage, isBot } from './utils' @@ -91,16 +75,11 @@ import { MIDDLEWARE_ROUTE } from '../lib/constants' import { run } from './web/sandbox' import { addRequestMeta, getRequestMeta } from './request-meta' import { toNodeHeaders } from './web/utils' +import { BaseNextRequest, BaseNextResponse } from './base-http' import { relativizeURL } from '../shared/lib/router/utils/relativize-url' const getCustomRouteMatcher = pathMatch(true) -type ExpressMiddleware = ( - req: IncomingMessage, - res: ServerResponse, - next: (err?: Error) => void -) => void - export type FindComponentsResult = { components: LoadComponentsReturnType query: NextParsedUrlQuery @@ -147,17 +126,17 @@ export interface Options { port?: number } -export interface RequestHandler { +export interface BaseRequestHandler { ( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, parsedUrl?: NextUrlWithParsedQuery | undefined ): Promise } type RequestContext = { - req: IncomingMessage - res: ServerResponse + req: BaseNextRequest + res: BaseNextResponse pathname: string query: NextParsedUrlQuery renderOpts: RenderOptsPartial @@ -199,9 +178,9 @@ export default abstract class Server { domainLocales?: DomainLocale[] distDir: string concurrentFeatures?: boolean + serverComponents?: boolean crossOrigin?: string } - private compression?: ExpressMiddleware private incrementalCache: IncrementalCache private responseCache: ResponseCache protected router: Router @@ -232,6 +211,63 @@ export default abstract class Server { protected abstract getPagePath(pathname: string, locales?: string[]): string protected abstract getFontManifest(): FontManifest | undefined + protected abstract sendRenderResult( + req: BaseNextRequest, + res: BaseNextResponse, + options: { + result: RenderResult + type: 'html' | 'json' + generateEtags: boolean + poweredByHeader: boolean + options?: PayloadOptions + } + ): Promise + + protected abstract sendStatic( + req: BaseNextRequest, + res: BaseNextResponse, + path: string + ): Promise + + protected abstract runApi( + req: BaseNextRequest, + res: BaseNextResponse, + query: ParsedUrlQuery, + params: Params | boolean, + page: string, + builtPagePath: string + ): Promise + + protected abstract renderHTML( + req: BaseNextRequest, + res: BaseNextResponse, + pathname: string, + query: NextParsedUrlQuery, + renderOpts: RenderOpts + ): Promise + + protected abstract streamResponseChunk( + res: BaseNextResponse, + chunk: any + ): void + + protected abstract handleCompression( + req: BaseNextRequest, + res: BaseNextResponse + ): void + + protected abstract proxyRequest( + req: BaseNextRequest, + res: BaseNextResponse, + parsedUrl: ParsedUrl + ): Promise<{ finished: boolean }> + + protected abstract imageOptimizer( + req: BaseNextRequest, + res: BaseNextResponse, + parsedUrl: UrlWithParsedQuery + ): Promise<{ finished: boolean }> + public constructor({ dir = '.', quiet = false, @@ -263,7 +299,6 @@ export default abstract class Server { publicRuntimeConfig, assetPrefix, generateEtags, - compress, } = this.nextConfig this.buildId = this.getBuildId() @@ -291,6 +326,7 @@ export default abstract class Server { domainLocales: this.nextConfig.i18n?.domains, distDir: this.distDir, concurrentFeatures: this.nextConfig.experimental.concurrentFeatures, + serverComponents: this.nextConfig.experimental.serverComponents, crossOrigin: this.nextConfig.crossOrigin ? this.nextConfig.crossOrigin : undefined, @@ -302,10 +338,6 @@ export default abstract class Server { this.renderOpts.runtimeConfig = publicRuntimeConfig } - if (compress && this.nextConfig.target === 'server') { - this.compression = compression() as ExpressMiddleware - } - // Initialize next/config with the environment configuration envConfig.setConfig({ serverRuntimeConfig, @@ -362,8 +394,8 @@ export default abstract class Server { } private async handleRequest( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, parsedUrl?: NextUrlWithParsedQuery ): Promise { try { @@ -372,10 +404,7 @@ export default abstract class Server { if (urlNoQuery?.match(/(\\|\/\/)/)) { const cleanUrl = normalizeRepeatedSlashes(req.url!) - res.setHeader('Location', cleanUrl) - res.setHeader('Refresh', `0;url=${cleanUrl}`) - res.statusCode = 308 - res.end(cleanUrl) + res.redirect(cleanUrl, 308).body(cleanUrl).send() return } @@ -557,9 +586,10 @@ export default abstract class Server { } if (url.locale?.redirect) { - res.setHeader('Location', url.locale.redirect) - res.statusCode = TEMPORARY_REDIRECT_STATUS - res.end(url.locale.redirect) + res + .redirect(url.locale.redirect, TEMPORARY_REDIRECT_STATUS) + .body(url.locale.redirect) + .send() return } @@ -579,11 +609,11 @@ export default abstract class Server { } this.logError(getProperError(err)) res.statusCode = 500 - res.end('Internal Server Error') + res.body('Internal Server Error').send() } } - public getRequestHandler(): RequestHandler { + public getRequestHandler(): BaseRequestHandler { return this.handleRequest.bind(this) } @@ -597,7 +627,7 @@ export default abstract class Server { // Backwards compatibility protected async close(): Promise {} - protected setImmutableAssetCacheControl(res: ServerResponse): void { + protected setImmutableAssetCacheControl(res: BaseNextResponse): void { res.setHeader('Cache-Control', 'public, max-age=31536000, immutable') } @@ -683,8 +713,8 @@ export default abstract class Server { }) protected async runMiddleware(params: { - request: IncomingMessage - response: ServerResponse + request: BaseNextRequest + response: BaseNextResponse parsedUrl: ParsedNextUrl parsed: UrlWithParsedQuery onWarning?: (warning: Error) => void @@ -1007,67 +1037,6 @@ export default abstract class Server { } as Route }) - // since initial query values are decoded by querystring.parse - // we need to re-encode them here but still allow passing through - // values from rewrites/redirects - const stringifyQuery = (req: IncomingMessage, query: ParsedUrlQuery) => { - const initialQueryValues = Object.values( - getRequestMeta(req, '__NEXT_INIT_QUERY') || {} - ) - - return stringifyQs(query, undefined, undefined, { - encodeURIComponent(value) { - if (initialQueryValues.some((val) => val === value)) { - return encodeURIComponent(value) - } - return value - }, - }) - } - - const proxyRequest = async ( - req: IncomingMessage, - res: ServerResponse, - parsedUrl: ParsedUrl - ) => { - const { query } = parsedUrl - delete (parsedUrl as any).query - parsedUrl.search = stringifyQuery(req, query) - - const target = formatUrl(parsedUrl) - const proxy = new Proxy({ - target, - changeOrigin: true, - ignorePath: true, - xfwd: true, - proxyTimeout: 30_000, // limit proxying to 30 seconds - }) - - await new Promise((proxyResolve, proxyReject) => { - let finished = false - - proxy.on('proxyReq', (proxyReq) => { - proxyReq.on('close', () => { - if (!finished) { - finished = true - proxyResolve(true) - } - }) - }) - proxy.on('error', (err) => { - if (!finished) { - finished = true - proxyReject(err) - } - }) - proxy.web(req, res) - }) - - return { - finished: true, - } - } - const redirects = this.minimalMode ? [] : this.customRoutes.redirects.map((redirect) => { @@ -1099,16 +1068,14 @@ export default abstract class Server { normalizeRepeatedSlashes(updatedDestination) } - res.setHeader('Location', updatedDestination) - res.statusCode = getRedirectStatus(redirectRoute as Redirect) - - // Since IE11 doesn't support the 308 header add backwards - // compatibility using refresh header - if (res.statusCode === 308) { - res.setHeader('Refresh', `0;url=${updatedDestination}`) - } + res + .redirect( + updatedDestination, + getRedirectStatus(redirectRoute as Redirect) + ) + .body(updatedDestination) + .send() - res.end(updatedDestination) return { finished: true, } @@ -1134,7 +1101,7 @@ export default abstract class Server { // external rewrite, proxy it if (parsedDestination.protocol) { - return proxyRequest(req, res, parsedDestination) + return this.proxyRequest(req, res, parsedDestination) } addRequestMeta(req, '_nextRewroteUrl', newUrl) @@ -1256,8 +1223,8 @@ export default abstract class Server { req.method === 'HEAD' && req.headers['x-middleware-preflight'] if (preflight) { - res.writeHead(200) - res.end() + res.statusCode = 200 + res.send() return { finished: true, } @@ -1273,7 +1240,7 @@ export default abstract class Server { res.setHeader('Refresh', `0;url=${location}`) } - res.end(location) + res.body(location).send() return { finished: true, } @@ -1293,7 +1260,7 @@ export default abstract class Server { ? `${parsedDestination.hostname}:${parsedDestination.port}` : parsedDestination.hostname) !== req.headers.host ) { - return proxyRequest(req, res, parsedDestination) + return this.proxyRequest(req, res, parsedDestination) } if (this.nextConfig.i18n) { @@ -1318,11 +1285,11 @@ export default abstract class Server { } if (result.response.headers.has('x-middleware-refresh')) { - res.writeHead(result.response.status) + res.statusCode = result.response.status for await (const chunk of result.response.body || ([] as any)) { - res.write(chunk) + this.streamResponseChunk(res, chunk) } - res.end() + res.send() return { finished: true, } @@ -1371,12 +1338,7 @@ export default abstract class Server { if (pathname === '/api' || pathname.startsWith('/api/')) { delete query._nextBubbleNoFallback - const handled = await this.handleApiRequest( - req as NextApiRequest, - res as NextApiResponse, - pathname, - query - ) + const handled = await this.handleApiRequest(req, res, pathname, query) if (handled) { return { finished: true } } @@ -1437,8 +1399,8 @@ export default abstract class Server { } protected async _beforeCatchAllRender( - _req: IncomingMessage, - _res: ServerResponse, + _req: BaseNextRequest, + _res: BaseNextResponse, _params: Params, _parsedUrl: UrlWithParsedQuery ): Promise { @@ -1455,13 +1417,13 @@ export default abstract class Server { * @param pathname path of request */ private async handleApiRequest( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathname: string, query: ParsedUrlQuery ): Promise { let page = pathname - let params: Params | boolean = false + let params: Params | false = false let pageFound = await this.hasPage(page) if (!pageFound && this.dynamicRoutes) { @@ -1492,31 +1454,7 @@ export default abstract class Server { throw err } - const pageModule = await require(builtPagePath) - query = { ...query, ...params } - - delete query.__nextLocale - delete query.__nextDefaultLocale - - if (!this.renderOpts.dev && this._isLikeServerless) { - if (typeof pageModule.default === 'function') { - prepareServerlessUrl(req, query) - await pageModule.default(req, res) - return true - } - } - - await apiResolver( - req, - res, - query, - pageModule, - this.renderOpts.previewProps, - this.minimalMode, - this.renderOpts.dev, - page - ) - return true + return this.runApi(req, res, query, params, page, builtPagePath) } protected getDynamicRoutes(): Array { @@ -1539,15 +1477,9 @@ export default abstract class Server { .filter((item): item is RoutingItem => Boolean(item)) } - private handleCompression(req: IncomingMessage, res: ServerResponse): void { - if (this.compression) { - this.compression(req, res, () => {}) - } - } - protected async run( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, parsedUrl: UrlWithParsedQuery ): Promise { this.handleCompression(req, res) @@ -1571,8 +1503,8 @@ export default abstract class Server { private async pipe( fn: (ctx: RequestContext) => Promise, partialContext: { - req: IncomingMessage - res: ServerResponse + req: BaseNextRequest + res: BaseNextResponse pathname: string query: NextParsedUrlQuery } @@ -1591,15 +1523,13 @@ export default abstract class Server { } const { req, res } = ctx const { body, type, revalidateOptions } = payload - if (!isResSent(res)) { + if (!res.sent) { const { generateEtags, poweredByHeader, dev } = this.renderOpts if (dev) { // In dev, we should not cache pages for any reason. res.setHeader('Cache-Control', 'no-store, must-revalidate') } - return sendRenderResult({ - req, - res, + return this.sendRenderResult(req, res, { result: body, type, generateEtags, @@ -1612,8 +1542,8 @@ export default abstract class Server { private async getStaticHTML( fn: (ctx: RequestContext) => Promise, partialContext: { - req: IncomingMessage - res: ServerResponse + req: BaseNextRequest + res: BaseNextResponse pathname: string query: ParsedUrlQuery } @@ -1632,8 +1562,8 @@ export default abstract class Server { } public async render( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathname: string, query: NextParsedUrlQuery = {}, parsedUrl?: NextUrlWithParsedQuery @@ -1826,13 +1756,10 @@ export default abstract class Server { redirect.destination = normalizeRepeatedSlashes(redirect.destination) } - if (statusCode === PERMANENT_REDIRECT_STATUS) { - res.setHeader('Refresh', `0;url=${redirect.destination}`) - } - - res.statusCode = statusCode - res.setHeader('Location', redirect.destination) - res.end(redirect.destination) + res + .redirect(redirect.destination, statusCode) + .body(redirect.destination) + .send() } // remove /_next/data prefix from urlPathname so it matches @@ -1938,7 +1865,7 @@ export default abstract class Server { : resolvedUrl, } - const renderResult = await renderToHTML( + const renderResult = await this.renderHTML( req, res, pathname, @@ -1973,7 +1900,7 @@ export default abstract class Server { async (hasResolved) => { const isProduction = !this.renderOpts.dev const isDynamicPathname = isDynamicRoute(pathname) - const didRespond = hasResolved || isResSent(res) + const didRespond = hasResolved || res.sent let { staticPaths, fallbackMode } = hasStaticPaths ? await this.getStaticPaths(pathname) @@ -2105,7 +2032,7 @@ export default abstract class Server { } if (isDataReq) { res.statusCode = 404 - res.end('{"notFound":true}') + res.body('{"notFound":true}').send() return null } else { await this.render404( @@ -2233,8 +2160,8 @@ export default abstract class Server { } public async renderToHTML( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathname: string, query: ParsedUrlQuery = {} ): Promise { @@ -2248,8 +2175,8 @@ export default abstract class Server { public async renderError( err: Error | null, - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathname: string, query: NextParsedUrlQuery = {}, setHeaders = true @@ -2371,8 +2298,8 @@ export default abstract class Server { public async renderErrorToHTML( err: Error | null, - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathname: string, query: ParsedUrlQuery = {} ): Promise { @@ -2400,8 +2327,8 @@ export default abstract class Server { } public async render404( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, parsedUrl?: NextUrlWithParsedQuery, setHeaders = true ): Promise { @@ -2421,8 +2348,8 @@ export default abstract class Server { } public async serveStatic( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, path: string, parsedUrl?: UrlWithParsedQuery ): Promise { @@ -2437,7 +2364,7 @@ export default abstract class Server { } try { - await serveStatic(req, res, path) + await this.sendStatic(req, res, path) } catch (error) { if (!isError(error)) throw error const err = error as Error & { code?: string; statusCode?: number } @@ -2497,8 +2424,8 @@ export default abstract class Server { } } -function prepareServerlessUrl( - req: IncomingMessage, +export function prepareServerlessUrl( + req: BaseNextRequest, query: ParsedUrlQuery ): void { const curUrl = parseUrl(req.url!, true) @@ -2512,6 +2439,24 @@ function prepareServerlessUrl( }) } +// since initial query values are decoded by querystring.parse +// we need to re-encode them here but still allow passing through +// values from rewrites/redirects +export const stringifyQuery = (req: BaseNextRequest, query: ParsedUrlQuery) => { + const initialQueryValues = Object.values( + getRequestMeta(req, '__NEXT_INIT_QUERY') || {} + ) + + return stringifyQs(query, undefined, undefined, { + encodeURIComponent(value) { + if (initialQueryValues.some((val) => val === value)) { + return encodeURIComponent(value) + } + return value + }, + }) +} + class NoFallbackError extends Error {} // Internal wrapper around build errors at development diff --git a/packages/next/server/dev/hot-reloader.ts b/packages/next/server/dev/hot-reloader.ts index ec0d144b88614..4a20caadeae26 100644 --- a/packages/next/server/dev/hot-reloader.ts +++ b/packages/next/server/dev/hot-reloader.ts @@ -532,6 +532,7 @@ export default class HotReloader { absolute404Path: this.pagesMapping['/404'] || '', absolutePagePath, isServerComponent, + serverComponents: this.hasServerComponents, buildId: this.buildId, basePath: this.config.basePath, assetPrefix: this.config.assetPrefix, diff --git a/packages/next/server/dev/next-dev-server.ts b/packages/next/server/dev/next-dev-server.ts index 2ab5117a021e1..9978fb28c2e4c 100644 --- a/packages/next/server/dev/next-dev-server.ts +++ b/packages/next/server/dev/next-dev-server.ts @@ -2,7 +2,6 @@ import type { __ApiPreviewProps } from '../api-utils' import type { CustomRoutes } from '../../lib/load-custom-routes' import type { FetchEventResult } from '../web/types' import type { FindComponentsResult } from '../next-server' -import type { IncomingMessage, ServerResponse } from 'http' import type { LoadComponentsReturnType } from '../load-components' import type { Options as ServerOptions } from '../next-server' import type { Params } from '../router' @@ -59,6 +58,12 @@ import * as Log from '../../build/output/log' import isError, { getProperError } from '../../lib/is-error' import { getMiddlewareRegex } from '../../shared/lib/router/utils/get-middleware-regex' import { isCustomErrorPage, isReservedPage } from '../../build/utils' +import { + BaseNextRequest, + BaseNextResponse, + NodeNextResponse, + NodeNextRequest, +} from '../base-http' // Load ReactDevOverlay only when needed let ReactDevOverlayImpl: React.FunctionComponent @@ -443,8 +448,8 @@ export default class DevServer extends Server { } protected async _beforeCatchAllRender( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, params: Params, parsedUrl: UrlWithParsedQuery ): Promise { @@ -477,10 +482,10 @@ export default class DevServer extends Server { return false } - private setupWebSocketHandler(server?: HTTPServer, _req?: IncomingMessage) { + private setupWebSocketHandler(server?: HTTPServer, _req?: NodeNextRequest) { if (!this.addedUpgradeListener) { this.addedUpgradeListener = true - server = server || (_req?.socket as any)?.server + server = server || (_req?.originalRequest.socket as any)?.server if (!server) { // this is very unlikely to happen but show an error in case @@ -519,8 +524,8 @@ export default class DevServer extends Server { } async runMiddleware(params: { - request: IncomingMessage - response: ServerResponse + request: BaseNextRequest + response: BaseNextResponse parsedUrl: ParsedNextUrl parsed: UrlWithParsedQuery }): Promise { @@ -547,8 +552,8 @@ export default class DevServer extends Server { } async run( - req: IncomingMessage, - res: ServerResponse, + req: NodeNextRequest, + res: NodeNextResponse, parsedUrl: UrlWithParsedQuery ): Promise { await this.devReady @@ -573,8 +578,8 @@ export default class DevServer extends Server { } const { finished = false } = await this.hotReloader!.run( - req, - res, + req.originalRequest, + res.originalResponse, parsedUrl ) @@ -599,7 +604,7 @@ export default class DevServer extends Server { }) } catch (internalErr) { console.error(internalErr) - res.end('Internal Server Error') + res.body('Internal Server Error').send() } } } @@ -752,11 +757,13 @@ export default class DevServer extends Server { fn: async (_req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'application/json; charset=utf-8') - res.end( - JSON.stringify({ - pages: this.sortedRoutes, - }) - ) + res + .body( + JSON.stringify({ + pages: this.sortedRoutes, + }) + ) + .send() return { finished: true, } @@ -772,14 +779,16 @@ export default class DevServer extends Server { fn: async (_req, res) => { res.statusCode = 200 res.setHeader('Content-Type', 'application/json; charset=utf-8') - res.end( - JSON.stringify( - this.middleware?.map((middleware) => [ - middleware.page, - !!middleware.ssr, - ]) || [] + res + .body( + JSON.stringify( + this.middleware?.map((middleware) => [ + middleware.page, + !!middleware.ssr, + ]) || [] + ) ) - ) + .send() return { finished: true, } @@ -927,13 +936,13 @@ export default class DevServer extends Server { return await loadDefaultErrorComponents(this.distDir) } - protected setImmutableAssetCacheControl(res: ServerResponse): void { + protected setImmutableAssetCacheControl(res: BaseNextResponse): void { res.setHeader('Cache-Control', 'no-store, must-revalidate') } private servePublic( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, pathParts: string[] ): Promise { const p = pathJoin(this.publicDir, ...pathParts) diff --git a/packages/next/server/image-optimizer.ts b/packages/next/server/image-optimizer.ts index a40ce81048577..de5a631573130 100644 --- a/packages/next/server/image-optimizer.ts +++ b/packages/next/server/image-optimizer.ts @@ -14,10 +14,10 @@ import { NextConfig } from './config-shared' import { fileExists } from '../lib/file-exists' import { ImageConfig, imageConfigDefault } from './image-config' import { processBuffer, decodeBuffer, Operation } from './lib/squoosh/main' -import type Server from './base-server' import { sendEtagResponse } from './send-payload' import { getContentType, getExtension } from './serve-static' import chalk from 'next/dist/compiled/chalk' +import { NextUrlWithParsedQuery } from './request-meta' const AVIF = 'image/avif' const WEBP = 'image/webp' @@ -47,12 +47,17 @@ try { let showSharpMissingWarning = process.env.NODE_ENV === 'production' export async function imageOptimizer( - server: Server, req: IncomingMessage, res: ServerResponse, parsedUrl: UrlWithParsedQuery, nextConfig: NextConfig, distDir: string, + render404: () => Promise, + handleRequest: ( + newReq: IncomingMessage, + newRes: ServerResponse, + newParsedUrl?: NextUrlWithParsedQuery + ) => Promise, isDev = false ) { const imageData: ImageConfig = nextConfig.images || imageConfigDefault @@ -66,7 +71,7 @@ export async function imageOptimizer( } = imageData if (loader !== 'default') { - await server.render404(req, res, parsedUrl) + await render404() return { finished: true } } @@ -282,11 +287,7 @@ export async function imageOptimizer( mockReq.url = href mockReq.connection = req.connection - await server.getRequestHandler()( - mockReq, - mockRes, - nodeUrl.parse(href, true) - ) + await handleRequest(mockReq, mockRes, nodeUrl.parse(href, true)) await isStreamFinished res.statusCode = mockRes.statusCode diff --git a/packages/next/server/next-server.ts b/packages/next/server/next-server.ts index 1ee7e77538297..d9f4669e085fb 100644 --- a/packages/next/server/next-server.ts +++ b/packages/next/server/next-server.ts @@ -1,24 +1,66 @@ -import type { Route, Params } from './router' +import type { Params, Route } from './router' import type { CacheFs } from '../shared/lib/utils' -import type { NextParsedUrlQuery } from './request-meta' -import type { FontManifest } from './font-utils' +import type { NextParsedUrlQuery, NextUrlWithParsedQuery } from './request-meta' +import type RenderResult from './render-result' import fs from 'fs' import { join, relative } from 'path' +import { IncomingMessage, ServerResponse } from 'http' + +import { PAGES_MANIFEST, BUILD_ID_FILE } from '../shared/lib/constants' import { PagesManifest } from '../build/webpack/plugins/pages-manifest-plugin' import { recursiveReadDirSync } from './lib/recursive-readdir-sync' +import { format as formatUrl, UrlWithParsedQuery } from 'url' +import compression from 'next/dist/compiled/compression' +import Proxy from 'next/dist/compiled/http-proxy' import { route } from './router' -import BaseServer, { FindComponentsResult } from './base-server' -import { getMiddlewareInfo } from './require' + +import { + BaseNextRequest, + BaseNextResponse, + NodeNextRequest, + NodeNextResponse, +} from './base-http' +import { PayloadOptions, sendRenderResult } from './send-payload' +import { serveStatic } from './serve-static' +import { ParsedUrlQuery } from 'querystring' +import { apiResolver } from './api-utils' +import { RenderOpts, renderToHTML } from './render' +import { ParsedUrl } from '../shared/lib/router/utils/parse-url' + +import BaseServer, { + FindComponentsResult, + prepareServerlessUrl, + stringifyQuery, +} from './base-server' +import { getMiddlewareInfo, getPagePath, requireFontManifest } from './require' +import { normalizePagePath } from './normalize-page-path' import { loadComponents } from './load-components' import isError from '../lib/is-error' -import { normalizePagePath } from './normalize-page-path' -import { getPagePath, requireFontManifest } from './require' -import { BUILD_ID_FILE, PAGES_MANIFEST } from '../shared/lib/constants' +import { FontManifest } from './font-utils' export * from './base-server' +type ExpressMiddleware = ( + req: IncomingMessage, + res: ServerResponse, + next: (err?: Error) => void +) => void + +export interface NodeRequestHandler { + ( + req: IncomingMessage | BaseNextRequest, + res: ServerResponse | BaseNextResponse, + parsedUrl?: NextUrlWithParsedQuery | undefined + ): Promise +} + export default class NextNodeServer extends BaseServer { + private compression = + this.nextConfig.compress && this.nextConfig.target === 'server' + ? (compression() as ExpressMiddleware) + : undefined + protected getHasStaticDir(): boolean { return fs.existsSync(join(this.dir, 'static')) } @@ -44,7 +86,6 @@ export default class NextNodeServer extends BaseServer { } protected generateImageRoutes(): Route[] { - const server = this return [ { match: route('/_next/image'), @@ -53,22 +94,16 @@ export default class NextNodeServer extends BaseServer { fn: (req, res, _params, parsedUrl) => { if (this.minimalMode) { res.statusCode = 400 - res.end('Bad Request') + res.body('Bad Request').send() return { finished: true, } } - const { imageOptimizer } = - require('./image-optimizer') as typeof import('./image-optimizer') - - return imageOptimizer( - server, - req, - res, - parsedUrl, - server.nextConfig, - server.distDir, - this.renderOpts.dev + + return this.imageOptimizer( + req as NodeNextRequest, + res as NodeNextResponse, + parsedUrl ) }, }, @@ -174,6 +209,164 @@ export default class NextNodeServer extends BaseServer { ])) } + protected sendRenderResult( + req: NodeNextRequest, + res: NodeNextResponse, + options: { + result: RenderResult + type: 'html' | 'json' + generateEtags: boolean + poweredByHeader: boolean + options?: PayloadOptions | undefined + } + ): Promise { + return sendRenderResult({ + req: req.originalRequest, + res: res.originalResponse, + ...options, + }) + } + + protected sendStatic( + req: NodeNextRequest, + res: NodeNextResponse, + path: string + ): Promise { + return serveStatic(req.originalRequest, res.originalResponse, path) + } + + protected handleCompression( + req: NodeNextRequest, + res: NodeNextResponse + ): void { + if (this.compression) { + this.compression(req.originalRequest, res.originalResponse, () => {}) + } + } + + protected async proxyRequest( + req: NodeNextRequest, + res: NodeNextResponse, + parsedUrl: ParsedUrl + ) { + const { query } = parsedUrl + delete (parsedUrl as any).query + parsedUrl.search = stringifyQuery(req, query) + + const target = formatUrl(parsedUrl) + const proxy = new Proxy({ + target, + changeOrigin: true, + ignorePath: true, + xfwd: true, + proxyTimeout: 30_000, // limit proxying to 30 seconds + }) + + await new Promise((proxyResolve, proxyReject) => { + let finished = false + + proxy.on('proxyReq', (proxyReq) => { + proxyReq.on('close', () => { + if (!finished) { + finished = true + proxyResolve(true) + } + }) + }) + proxy.on('error', (err) => { + if (!finished) { + finished = true + proxyReject(err) + } + }) + proxy.web(req.originalRequest, res.originalResponse) + }) + + return { + finished: true, + } + } + + protected async runApi( + req: NodeNextRequest, + res: NodeNextResponse, + query: ParsedUrlQuery, + params: Params | false, + page: string, + builtPagePath: string + ): Promise { + const pageModule = await require(builtPagePath) + query = { ...query, ...params } + + delete query.__nextLocale + delete query.__nextDefaultLocale + + if (!this.renderOpts.dev && this._isLikeServerless) { + if (typeof pageModule.default === 'function') { + prepareServerlessUrl(req, query) + await pageModule.default(req, res) + return true + } + } + + await apiResolver( + req.originalRequest, + res.originalResponse, + query, + pageModule, + this.renderOpts.previewProps, + this.minimalMode, + this.renderOpts.dev, + page + ) + return true + } + + protected async renderHTML( + req: NodeNextRequest, + res: NodeNextResponse, + pathname: string, + query: NextParsedUrlQuery, + renderOpts: RenderOpts + ): Promise { + return renderToHTML( + req.originalRequest, + res.originalResponse, + pathname, + query, + renderOpts + ) + } + + protected streamResponseChunk(res: NodeNextResponse, chunk: any) { + res.originalResponse.write(chunk) + } + + protected async imageOptimizer( + req: NodeNextRequest, + res: NodeNextResponse, + parsedUrl: UrlWithParsedQuery + ): Promise<{ finished: boolean }> { + const { imageOptimizer } = + require('./image-optimizer') as typeof import('./image-optimizer') + + return imageOptimizer( + req.originalRequest, + res.originalResponse, + parsedUrl, + this.nextConfig, + this.distDir, + () => this.render404(req, res, parsedUrl), + (newReq, newRes, newParsedUrl) => + this.getRequestHandler()( + new NodeNextRequest(newReq), + new NodeNextResponse(newRes), + newParsedUrl + ), + this.renderOpts.dev + ) + } + protected getPagePath(pathname: string, locales?: string[]): string { return getPagePath( pathname, @@ -257,6 +450,117 @@ export default class NextNodeServer extends BaseServer { } } + private normalizeReq( + req: BaseNextRequest | IncomingMessage + ): BaseNextRequest { + return req instanceof IncomingMessage ? new NodeNextRequest(req) : req + } + + private normalizeRes( + res: BaseNextResponse | ServerResponse + ): BaseNextResponse { + return res instanceof ServerResponse ? new NodeNextResponse(res) : res + } + + public getRequestHandler(): NodeRequestHandler { + const handler = super.getRequestHandler() + return async (req, res, parsedUrl) => { + return handler(this.normalizeReq(req), this.normalizeRes(res), parsedUrl) + } + } + + public async render( + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + pathname: string, + query?: NextParsedUrlQuery, + parsedUrl?: NextUrlWithParsedQuery + ): Promise { + return super.render( + this.normalizeReq(req), + this.normalizeRes(res), + pathname, + query, + parsedUrl + ) + } + + public async renderToHTML( + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + pathname: string, + query?: ParsedUrlQuery + ): Promise { + return super.renderToHTML( + this.normalizeReq(req), + this.normalizeRes(res), + pathname, + query + ) + } + + public async renderError( + err: Error | null, + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + pathname: string, + query?: NextParsedUrlQuery, + setHeaders?: boolean + ): Promise { + return super.renderError( + err, + this.normalizeReq(req), + this.normalizeRes(res), + pathname, + query, + setHeaders + ) + } + + public async renderErrorToHTML( + err: Error | null, + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + pathname: string, + query?: ParsedUrlQuery + ): Promise { + return super.renderErrorToHTML( + err, + this.normalizeReq(req), + this.normalizeRes(res), + pathname, + query + ) + } + + public async render404( + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + parsedUrl?: NextUrlWithParsedQuery, + setHeaders?: boolean + ): Promise { + return super.render404( + this.normalizeReq(req), + this.normalizeRes(res), + parsedUrl, + setHeaders + ) + } + + public async serveStatic( + req: BaseNextRequest | IncomingMessage, + res: BaseNextResponse | ServerResponse, + path: string, + parsedUrl?: UrlWithParsedQuery + ): Promise { + return super.serveStatic( + this.normalizeReq(req), + this.normalizeRes(res), + path, + parsedUrl + ) + } + protected getMiddlewareInfo(params: { dev?: boolean distDir: string diff --git a/packages/next/server/next.ts b/packages/next/server/next.ts index bae67bbcfef25..31f6f75024385 100644 --- a/packages/next/server/next.ts +++ b/packages/next/server/next.ts @@ -1,6 +1,5 @@ -import type { IncomingMessage, ServerResponse } from 'http' import type { Options as DevServerOptions } from './dev/next-dev-server' -import type { RequestHandler } from './next-server' +import type { NodeRequestHandler } from './next-server' import type { UrlWithParsedQuery } from 'url' import './node-polyfill-fetch' @@ -11,6 +10,8 @@ import { resolve } from 'path' import { NON_STANDARD_NODE_ENV } from '../lib/constants' import { PHASE_DEVELOPMENT_SERVER } from '../shared/lib/constants' import { PHASE_PRODUCTION_SERVER } from '../shared/lib/constants' +import { IncomingMessage, ServerResponse } from 'http' +import { NextUrlWithParsedQuery } from './request-meta' let ServerImpl: typeof Server @@ -22,10 +23,18 @@ const getServerImpl = async () => { export type NextServerOptions = Partial +export interface RequestHandler { + ( + req: IncomingMessage, + res: ServerResponse, + parsedUrl?: NextUrlWithParsedQuery | undefined + ): Promise +} + export class NextServer { private serverPromise?: Promise private server?: Server - private reqHandlerPromise?: Promise + private reqHandlerPromise?: Promise private preparedAssetPrefix?: string public options: NextServerOptions @@ -183,4 +192,3 @@ exports = module.exports // Support `import next from 'next'` export default createServer -export type { RequestHandler } diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index 808c24aad59cc..adb068deeef30 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -182,6 +182,21 @@ function enhanceComponents( } } +function renderFlight( + App: AppType, + Component: React.ComponentType, + props: any +) { + const AppServer = (App as any).__next_rsc__ + ? (App as React.ComponentType) + : React.Fragment + return ( + + + + ) +} + export type RenderOptsPartial = { buildId: string canonicalBase: string @@ -219,6 +234,7 @@ export type RenderOptsPartial = { disableOptimizedLoading?: boolean supportsDynamicHTML?: boolean concurrentFeatures?: boolean + serverComponents?: boolean customServer?: boolean crossOrigin?: string } @@ -342,6 +358,7 @@ const useRSCResponse = createRSCHook() function createServerComponentRenderer( cachePrefix: string, transformStream: TransformStream, + App: AppType, OriginalComponent: React.ComponentType, serverComponentManifest: NonNullable ) { @@ -349,7 +366,7 @@ function createServerComponentRenderer( const ServerComponentWrapper = (props: any) => { const id = (React as any).useId() const reqStream = renderToReadableStream( - , + renderFlight(App, OriginalComponent, props), serverComponentManifest ) @@ -363,6 +380,7 @@ function createServerComponentRenderer( rscCache.delete(id) return root } + const Component = (props: any) => { return ( @@ -441,6 +459,7 @@ export async function renderToHTML( ? createServerComponentRenderer( cachePrefix, serverComponentsInlinedTransformStream!, + App, OriginalComponent, serverComponentManifest ) @@ -714,11 +733,9 @@ export async function renderToHTML( // not be useful. // https://github.com/facebook/react/pull/22644 const Noop = () => null - const AppContainerWithIsomorphicFiberStructure = ({ - children, - }: { + const AppContainerWithIsomorphicFiberStructure: React.FC<{ children: JSX.Element - }) => { + }> = ({ children }) => { return ( <> {/* */} @@ -1080,7 +1097,10 @@ export async function renderToHTML( if (renderServerComponentData) { const stream: ReadableStream = renderToReadableStream( - , + renderFlight(App, OriginalComponent, { + ...props.pageProps, + ...serverComponentProps, + }), serverComponentManifest ) const reader = stream.getReader() @@ -1201,22 +1221,30 @@ export async function renderToHTML( } else { let bodyResult + const renderContent = () => { + return ctx.err && ErrorDebug ? ( + + + + ) : ( + + + {renderOpts.serverComponents && (App as any).__next_rsc__ ? ( + + ) : ( + + )} + + + ) + } + if (concurrentFeatures) { bodyResult = async (suffix: string) => { // this must be called inside bodyResult so appWrappers is // up to date when getWrappedApp is called - const content = - ctx.err && ErrorDebug ? ( - - - - ) : ( - - - - - - ) + + const content = renderContent() return process.browser ? await renderToWebStream( content, @@ -1226,18 +1254,7 @@ export async function renderToHTML( : await renderToNodeStream(content, suffix, generateStaticHTML) } } else { - const content = - ctx.err && ErrorDebug ? ( - - - - ) : ( - - - - - - ) + const content = renderContent() // for non-concurrent rendering we need to ensure App is rendered // before _document so that updateHead is called/collected before // rendering _document's head diff --git a/packages/next/server/request-meta.ts b/packages/next/server/request-meta.ts index 79866ad8913b7..0c74571af4929 100644 --- a/packages/next/server/request-meta.ts +++ b/packages/next/server/request-meta.ts @@ -1,15 +1,16 @@ /* eslint-disable no-redeclare */ +import { IncomingMessage } from 'http' import type { ParsedUrlQuery } from 'querystring' -import type { IncomingMessage } from 'http' import type { UrlWithParsedQuery } from 'url' +import { BaseNextRequest } from './base-http' -const NEXT_REQUEST_META = Symbol('NextRequestMeta') +export const NEXT_REQUEST_META = Symbol('NextRequestMeta') -interface NextIncomingMessage extends IncomingMessage { +export type NextIncomingMessage = (BaseNextRequest | IncomingMessage) & { [NEXT_REQUEST_META]?: RequestMeta } -interface RequestMeta { +export interface RequestMeta { __NEXT_INIT_QUERY?: ParsedUrlQuery __NEXT_INIT_URL?: string __nextHadTrailingSlash?: boolean diff --git a/packages/next/server/router.ts b/packages/next/server/router.ts index c4faf4767a4ed..01d2ff94f461b 100644 --- a/packages/next/server/router.ts +++ b/packages/next/server/router.ts @@ -1,4 +1,3 @@ -import type { IncomingMessage, ServerResponse } from 'http' import type { ParsedUrlQuery } from 'querystring' import type { NextUrlWithParsedQuery } from './request-meta' @@ -8,6 +7,7 @@ import { normalizeLocalePath } from '../shared/lib/i18n/normalize-locale-path' import { RouteHas } from '../lib/load-custom-routes' import { matchHas } from '../shared/lib/router/utils/prepare-destination' import { getRequestMeta } from './request-meta' +import { BaseNextRequest, BaseNextResponse } from './base-http' export const route = pathMatch() @@ -31,8 +31,8 @@ export type Route = { requireBasePath?: false internal?: true fn: ( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, params: Params, parsedUrl: NextUrlWithParsedQuery ) => Promise | RouteResult @@ -134,8 +134,8 @@ export default class Router { } async execute( - req: IncomingMessage, - res: ServerResponse, + req: BaseNextRequest, + res: BaseNextResponse, parsedUrl: NextUrlWithParsedQuery ): Promise { // memoize page check calls so we don't duplicate checks for pages diff --git a/packages/next/server/send-payload.ts b/packages/next/server/send-payload.ts index f27d7df288c33..138e154080ad3 100644 --- a/packages/next/server/send-payload.ts +++ b/packages/next/server/send-payload.ts @@ -3,6 +3,7 @@ import { isResSent } from '../shared/lib/utils' import generateETag from 'next/dist/compiled/etag' import fresh from 'next/dist/compiled/fresh' import RenderResult from './render-result' +import { BaseNextResponse } from './base-http' export type PayloadOptions = | { private: true } @@ -10,7 +11,7 @@ export type PayloadOptions = | { private: boolean; stateful: false; revalidate: number | false } export function setRevalidateHeaders( - res: ServerResponse, + res: ServerResponse | BaseNextResponse, options: PayloadOptions ) { if (options.private || options.stateful) { diff --git a/packages/next/shared/lib/router/utils/prepare-destination.ts b/packages/next/shared/lib/router/utils/prepare-destination.ts index 991d125f7307b..0596c2858216d 100644 --- a/packages/next/shared/lib/router/utils/prepare-destination.ts +++ b/packages/next/shared/lib/router/utils/prepare-destination.ts @@ -6,9 +6,10 @@ import type { RouteHas } from '../../../../lib/load-custom-routes' import { compile, pathToRegexp } from 'next/dist/compiled/path-to-regexp' import { escapeStringRegexp } from '../../escape-regexp' import { parseUrl } from './parse-url' +import { BaseNextRequest } from '../../../../server/base-http' export function matchHas( - req: IncomingMessage, + req: BaseNextRequest | IncomingMessage, has: RouteHas[], query: Params ): false | Params { diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index 347ce77fd5be6..b2e9d17c9c130 100644 --- a/packages/react-dev-overlay/package.json +++ b/packages/react-dev-overlay/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-dev-overlay", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-dev-overlay/src/internal/container/FullRefreshWarning.tsx b/packages/react-dev-overlay/src/internal/container/FullRefreshWarning.tsx index 2f507a124a5be..2747eda684844 100644 --- a/packages/react-dev-overlay/src/internal/container/FullRefreshWarning.tsx +++ b/packages/react-dev-overlay/src/internal/container/FullRefreshWarning.tsx @@ -109,7 +109,7 @@ const FullRefreshWarningReason = ({ component, which disables Fast Refresh. Fast Refresh requires at least one parent function component in your React tree.

    -

    You can find more information in the related Webpack error below:

    +

    You can find more information in the related error below:

    ) diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index 6e6ec3a1b10c1..ec188fd8f3487 100644 --- a/packages/react-refresh-utils/package.json +++ b/packages/react-refresh-utils/package.json @@ -1,6 +1,6 @@ { "name": "@next/react-refresh-utils", - "version": "12.0.8", + "version": "12.0.9-canary.0", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", diff --git a/run-tests.js b/run-tests.js index ea6a69be59de2..abffb90803037 100644 --- a/run-tests.js +++ b/run-tests.js @@ -36,6 +36,7 @@ const cleanUpAndExit = async (code) => { if (process.env.NEXT_TEST_STARTER) { await fs.remove(process.env.NEXT_TEST_STARTER) } + console.log(`exiting with code ${code}`) process.exit(code) } diff --git a/scripts/test-pnp.sh b/scripts/test-pnp.sh deleted file mode 100755 index 1189b61916ad6..0000000000000 --- a/scripts/test-pnp.sh +++ /dev/null @@ -1,43 +0,0 @@ -declare -a testCases=( - # Tests the webpack require hook - "progressive-web-app" - "with-eslint" - "with-typescript" - "with-next-sass" - # Tests @next/mdx - "with-mdx" - # Tests babel config - "with-styled-components" -) - -set -e -set -x - -# Speeds up testing locally -export CI=1 - -rm -rf ./e2e-tests - -initialDir=$(pwd) - -for testCase in "${testCases[@]}" -do - cd $initialDir - - echo "--- Testing $testCase ---" - mkdir -p "./e2e-tests/$testCase" - cp -r "./examples/$testCase/." "./e2e-tests/$testCase" - cd "./e2e-tests/$testCase" - - # TODO: remove after able to load bindings with YarnPnP - echo '{"presets": ["next/babel"]}' > .babelrc - - touch yarn.lock - yarn set version berry - - yarn config set pnpFallbackMode none - yarn config set enableGlobalCache true - yarn link --all --private -r ../.. - - yarn build --no-lint -done diff --git a/test/e2e/yarn-pnp/test/pwa-example.test.ts b/test/e2e/yarn-pnp/test/pwa-example.test.ts new file mode 100644 index 0000000000000..03c6e38de0473 --- /dev/null +++ b/test/e2e/yarn-pnp/test/pwa-example.test.ts @@ -0,0 +1,5 @@ +import { runTests } from './utils' + +describe('yarn PnP', () => { + runTests('progressive-web-app') +}) diff --git a/test/e2e/yarn-pnp/test/utils.ts b/test/e2e/yarn-pnp/test/utils.ts new file mode 100644 index 0000000000000..d7b3f89d810b8 --- /dev/null +++ b/test/e2e/yarn-pnp/test/utils.ts @@ -0,0 +1,49 @@ +import fs from 'fs-extra' +import { join } from 'path' +import { fetchViaHTTP } from 'next-test-utils' +import { createNext, FileRef } from 'e2e-utils' +import { NextInstance } from 'test/lib/next-modes/base' + +jest.setTimeout(2 * 60 * 1000) + +export function runTests(example = '') { + let next: NextInstance + + beforeAll(async () => { + const srcDir = join(__dirname, '../../../../examples', example) + const srcFiles = await fs.readdir(srcDir) + + const packageJson = await fs.readJson(join(srcDir, 'package.json')) + + next = await createNext({ + files: srcFiles.reduce((prev, file) => { + if (file !== 'package.json') { + prev[file] = new FileRef(join(srcDir, file)) + } + return prev + }, {} as { [key: string]: FileRef }), + dependencies: { + ...packageJson.dependencies, + ...packageJson.devDependencies, + }, + installCommand: ({ dependencies }) => { + const pkgs = Object.keys(dependencies).reduce((prev, cur) => { + prev.push(`${cur}@${dependencies[cur]}`) + return prev + }, [] as string[]) + return `yarn set version berry && yarn config set enableGlobalCache true && yarn config set compressionLevel 0 && yarn add ${pkgs.join( + ' ' + )}` + }, + buildCommand: `yarn next build --no-lint`, + startCommand: (global as any).isNextDev ? `yarn next` : `yarn next start`, + }) + }) + afterAll(() => next?.destroy()) + + it(`should compile and serve the index page correctly ${example}`, async () => { + const res = await fetchViaHTTP(next.url, '/') + expect(res.status).toBe(200) + expect(await res.text()).toContain(' { + runTests('with-eslint') +}) diff --git a/test/e2e/yarn-pnp/test/with-mdx.test.ts b/test/e2e/yarn-pnp/test/with-mdx.test.ts new file mode 100644 index 0000000000000..e25d3400037b0 --- /dev/null +++ b/test/e2e/yarn-pnp/test/with-mdx.test.ts @@ -0,0 +1,5 @@ +import { runTests } from './utils' + +describe('yarn PnP', () => { + runTests('with-mdx') +}) diff --git a/test/e2e/yarn-pnp/test/with-next-sass.test.ts b/test/e2e/yarn-pnp/test/with-next-sass.test.ts new file mode 100644 index 0000000000000..d1e5319da1579 --- /dev/null +++ b/test/e2e/yarn-pnp/test/with-next-sass.test.ts @@ -0,0 +1,5 @@ +import { runTests } from './utils' + +describe('yarn PnP', () => { + runTests('with-next-sass') +}) diff --git a/test/e2e/yarn-pnp/test/with-styled-components.test.ts b/test/e2e/yarn-pnp/test/with-styled-components.test.ts new file mode 100644 index 0000000000000..f8ee921afe988 --- /dev/null +++ b/test/e2e/yarn-pnp/test/with-styled-components.test.ts @@ -0,0 +1,5 @@ +import { runTests } from './utils' + +describe('yarn PnP', () => { + runTests('with-styled-components') +}) diff --git a/test/e2e/yarn-pnp/test/with-typescript.test.ts b/test/e2e/yarn-pnp/test/with-typescript.test.ts new file mode 100644 index 0000000000000..07a11a31cea7a --- /dev/null +++ b/test/e2e/yarn-pnp/test/with-typescript.test.ts @@ -0,0 +1,5 @@ +import { runTests } from './utils' + +describe('yarn PnP', () => { + runTests('with-typescript') +}) diff --git a/test/integration/react-streaming-and-server-components/app/components/container.server.js b/test/integration/react-streaming-and-server-components/app/components/container.server.js new file mode 100644 index 0000000000000..ab63ebb0d37f0 --- /dev/null +++ b/test/integration/react-streaming-and-server-components/app/components/container.server.js @@ -0,0 +1,3 @@ +export default function Container({ children }) { + return
    {children}
    +} diff --git a/test/integration/react-streaming-and-server-components/app/pages/err.js b/test/integration/react-streaming-and-server-components/app/pages/err/index.js similarity index 100% rename from test/integration/react-streaming-and-server-components/app/pages/err.js rename to test/integration/react-streaming-and-server-components/app/pages/err/index.js diff --git a/test/integration/react-streaming-and-server-components/test/index.test.js b/test/integration/react-streaming-and-server-components/test/index.test.js index 2f28fcec96ee2..b5953a0c909cb 100644 --- a/test/integration/react-streaming-and-server-components/test/index.test.js +++ b/test/integration/react-streaming-and-server-components/test/index.test.js @@ -25,6 +25,7 @@ const nativeModuleTestAppDir = join(__dirname, '../unsupported-native-module') const distDir = join(__dirname, '../app/.next') const documentPage = new File(join(appDir, 'pages/_document.jsx')) const appPage = new File(join(appDir, 'pages/_app.js')) +const appServerPage = new File(join(appDir, 'pages/_app.server.js')) const error500Page = new File(join(appDir, 'pages/500.js')) const documentWithGip = ` @@ -47,6 +48,13 @@ Document.getInitialProps = (ctx) => { } ` +const rscAppPage = ` +import Container from '../components/container.server' +export default function App({children}) { + return {children} +} +` + const appWithGlobalCss = ` import '../styles.css' @@ -175,6 +183,22 @@ describe('concurrentFeatures - prod', () => { runBasicTests(context, 'prod') }) +const customAppPageSuite = { + runTests: (context) => { + it('should render container in app', async () => { + const indexHtml = await renderViaHTTP(context.appPort, '/') + const indexFlight = await renderViaHTTP(context.appPort, '/?__flight__=1') + expect(indexHtml).toContain('container-server') + expect(indexFlight).toContain('container-server') + }) + }, + before: () => appServerPage.write(rscAppPage), + after: () => appServerPage.delete(), +} + +runSuite('Custom App', 'dev', customAppPageSuite) +runSuite('Custom App', 'prod', customAppPageSuite) + describe('concurrentFeatures - dev', () => { const context = { appDir } diff --git a/test/lib/create-next-install.js b/test/lib/create-next-install.js index f3f5df619791f..824bf1b29cbf5 100644 --- a/test/lib/create-next-install.js +++ b/test/lib/create-next-install.js @@ -2,10 +2,11 @@ const os = require('os') const path = require('path') const execa = require('execa') const fs = require('fs-extra') +const childProcess = require('child_process') const { linkPackages } = require('../../.github/actions/next-stats-action/src/prepare/repo-setup')() -async function createNextInstall(dependencies) { +async function createNextInstall(dependencies, installCommand) { const tmpDir = await fs.realpath(process.env.NEXT_TEST_DIR || os.tmpdir()) const origRepoDir = path.join(__dirname, '../../') const installDir = path.join(tmpDir, `next-install-${Date.now()}`) @@ -45,30 +46,46 @@ async function createNextInstall(dependencies) { } const pkgPaths = await linkPackages(tmpRepoDir) + const combinedDependencies = { + ...dependencies, + next: pkgPaths.get('next'), + } await fs.ensureDir(installDir) await fs.writeFile( path.join(installDir, 'package.json'), JSON.stringify( { - dependencies: { - ...dependencies, - next: pkgPaths.get('next'), - }, + dependencies: combinedDependencies, private: true, }, null, 2 ) ) - await execa('yarn', ['install'], { - cwd: installDir, - stdio: ['ignore', 'inherit', 'inherit'], - env: { - ...process.env, - YARN_CACHE_FOLDER: path.join(installDir, '.yarn-cache'), - }, - }) + + if (installCommand) { + const installString = + typeof installCommand === 'function' + ? installCommand({ dependencies: combinedDependencies }) + : installCommand + + console.log('running install command', installString) + + childProcess.execSync(installString, { + cwd: installDir, + stdio: ['ignore', 'inherit', 'inherit'], + }) + } else { + await execa('yarn', ['install'], { + cwd: installDir, + stdio: ['ignore', 'inherit', 'inherit'], + env: { + ...process.env, + YARN_CACHE_FOLDER: path.join(installDir, '.yarn-cache'), + }, + }) + } await fs.remove(tmpRepoDir) return installDir diff --git a/test/lib/e2e-utils.ts b/test/lib/e2e-utils.ts index 736af74930d0d..dcfc054dac4bf 100644 --- a/test/lib/e2e-utils.ts +++ b/test/lib/e2e-utils.ts @@ -1,20 +1,34 @@ import path from 'path' import assert from 'assert' import { NextConfig } from 'next' -import { NextInstance } from './next-modes/base' +import { InstallCommand, NextInstance } from './next-modes/base' import { NextDevInstance } from './next-modes/next-dev' import { NextStartInstance } from './next-modes/next-start' -const testFile = module.parent.filename const testsFolder = path.join(__dirname, '..') +let testFile +const testFileRegex = /\.test\.(js|tsx?)/ + +const visitedModules = new Set() +const checkParent = (mod) => { + if (!mod?.parent || visitedModules.has(mod)) return + testFile = mod.parent.filename || '' + visitedModules.add(mod) + + if (!testFileRegex.test(testFile)) { + checkParent(mod.parent) + } +} +checkParent(module) + process.env.TEST_FILE_PATH = testFile let testMode = process.env.NEXT_TEST_MODE -if (!testFile.match(/\.test\.(js|tsx?)/)) { +if (!testFileRegex.test(testFile)) { throw new Error( - 'e2e-utils imported from non-test file (must end with .test.(js,ts,tsx)' + `e2e-utils imported from non-test file ${testFile} (must end with .test.(js,ts,tsx)` ) } @@ -97,6 +111,9 @@ export async function createNext(opts: { } nextConfig?: NextConfig skipStart?: boolean + installCommand?: InstallCommand + buildCommand?: string + startCommand?: string }): Promise { try { if (nextInstance) { diff --git a/test/lib/next-modes/base.ts b/test/lib/next-modes/base.ts index cb1c1e9a0e389..08f0689d29608 100644 --- a/test/lib/next-modes/base.ts +++ b/test/lib/next-modes/base.ts @@ -8,12 +8,18 @@ import { ChildProcess } from 'child_process' import { createNextInstall } from '../create-next-install' type Event = 'stdout' | 'stderr' | 'error' | 'destroy' +export type InstallCommand = + | string + | ((ctx: { dependencies: { [key: string]: string } }) => string) export class NextInstance { protected files: { [filename: string]: string | FileRef } protected nextConfig?: NextConfig + protected installCommand?: InstallCommand + protected buildCommand?: string + protected startCommand?: string protected dependencies?: { [name: string]: string } protected events: { [eventName: string]: Set } public testDir: string @@ -27,6 +33,9 @@ export class NextInstance { files, dependencies, nextConfig, + installCommand, + buildCommand, + startCommand, }: { files: { [filename: string]: string | FileRef @@ -35,10 +44,16 @@ export class NextInstance { [name: string]: string } nextConfig?: NextConfig + installCommand?: InstallCommand + buildCommand?: string + startCommand?: string }) { this.files = files this.dependencies = dependencies this.nextConfig = nextConfig + this.installCommand = installCommand + this.buildCommand = buildCommand + this.startCommand = startCommand this.events = {} this.isDestroyed = false this.isStopping = false @@ -59,15 +74,23 @@ export class NextInstance { `next-test-${Date.now()}-${(Math.random() * 1000) | 0}` ) - if (process.env.NEXT_TEST_STARTER && !this.dependencies) { + if ( + process.env.NEXT_TEST_STARTER && + !this.dependencies && + !this.installCommand + ) { await fs.copy(process.env.NEXT_TEST_STARTER, this.testDir) } else if (!skipIsolatedNext) { - this.testDir = await createNextInstall({ - react: 'latest', - 'react-dom': 'latest', - ...this.dependencies, - }) + this.testDir = await createNextInstall( + { + react: 'latest', + 'react-dom': 'latest', + ...this.dependencies, + }, + this.installCommand + ) } + console.log('created next.js install, writing test files') for (const filename of Object.keys(this.files)) { const item = this.files[filename] @@ -182,6 +205,7 @@ export class NextInstance { if (!process.env.NEXT_TEST_SKIP_CLEANUP) { await fs.remove(this.testDir) } + console.log(`destroyed next instance`) } public get url() { diff --git a/test/lib/next-modes/next-dev.ts b/test/lib/next-modes/next-dev.ts index 165eb32335859..0a27917038f9f 100644 --- a/test/lib/next-modes/next-dev.ts +++ b/test/lib/next-modes/next-dev.ts @@ -1,5 +1,3 @@ -import path from 'path' -import resolveFrom from 'resolve-from' import { spawn } from 'child_process' import { NextInstance } from './base' @@ -22,44 +20,47 @@ export class NextDevInstance extends NextInstance { if (this.childProcess) { throw new Error('next already started') } - // we don't use yarn next here as yarn detaches itself from the - // child process making it harder to kill all processes - const nextDir = path.dirname(resolveFrom(this.testDir, 'next/package.json')) + let startArgs = ['yarn', 'next'] - this.childProcess = spawn('node', [path.join(nextDir, '/dist/bin/next')], { - cwd: this.testDir, - stdio: ['ignore', 'pipe', 'pipe'], - shell: false, - env: { - ...process.env, - NODE_ENV: '' as any, - __NEXT_TEST_MODE: '1', - __NEXT_RAND_PORT: '1', - __NEXT_TEST_WITH_DEVTOOL: '1', - }, - }) + if (this.startCommand) { + startArgs = this.startCommand.split(' ') + } - this.childProcess.stdout.on('data', (chunk) => { - const msg = chunk.toString() - process.stdout.write(chunk) - this._cliOutput += msg - this.emit('stdout', [msg]) - }) - this.childProcess.stderr.on('data', (chunk) => { - const msg = chunk.toString() - process.stderr.write(chunk) - this._cliOutput += msg - this.emit('stderr', [msg]) - }) + await new Promise((resolve) => { + this.childProcess = spawn(startArgs[0], startArgs.slice(1), { + cwd: this.testDir, + stdio: ['ignore', 'pipe', 'pipe'], + shell: false, + env: { + ...process.env, + NODE_ENV: '' as any, + __NEXT_TEST_MODE: '1', + __NEXT_RAND_PORT: '1', + __NEXT_TEST_WITH_DEVTOOL: '1', + }, + }) - this.childProcess.on('close', (code) => { - if (this.isStopping) return - if (code) { - throw new Error(`next dev exited unexpectedly with code ${code}`) - } - }) + this.childProcess.stdout.on('data', (chunk) => { + const msg = chunk.toString() + process.stdout.write(chunk) + this._cliOutput += msg + this.emit('stdout', [msg]) + }) + this.childProcess.stderr.on('data', (chunk) => { + const msg = chunk.toString() + process.stderr.write(chunk) + this._cliOutput += msg + this.emit('stderr', [msg]) + }) - await new Promise((resolve) => { + this.childProcess.on('close', (code, signal) => { + if (this.isStopping) return + if (code || signal) { + throw new Error( + `next dev exited unexpectedly with code/signal ${code || signal}` + ) + } + }) const readyCb = (msg) => { if (msg.includes('started server on') && msg.includes('url:')) { this._url = msg.split('url: ').pop().trim() diff --git a/test/lib/next-modes/next-start.ts b/test/lib/next-modes/next-start.ts index 5ede3212a491f..6ab484c9e88ef 100644 --- a/test/lib/next-modes/next-start.ts +++ b/test/lib/next-modes/next-start.ts @@ -1,8 +1,7 @@ import path from 'path' import fs from 'fs-extra' -import resolveFrom from 'resolve-from' -import { spawn, SpawnOptions } from 'child_process' import { NextInstance } from './base' +import { spawn, SpawnOptions } from 'child_process' export class NextStartInstance extends NextInstance { private _buildId: string @@ -49,21 +48,29 @@ export class NextStartInstance extends NextInstance { this.emit('stderr', [msg]) }) } - const nextDir = path.dirname(resolveFrom(this.testDir, 'next/package.json')) + let buildArgs = ['yarn', 'next', 'build'] + let startArgs = ['yarn', 'next', 'start'] - this.childProcess = spawn( - 'node', - [path.join(nextDir, '/dist/bin/next'), 'build'], - spawnOpts - ) - handleStdio() + if (this.buildCommand) { + buildArgs = this.buildCommand.split(' ') + } + if (this.startCommand) { + startArgs = this.startCommand.split(' ') + } await new Promise((resolve, reject) => { - this.childProcess.on('exit', (code) => { - if (code) reject(new Error(`next build failed with code ${code}`)) + console.log('running', buildArgs.join(' ')) + this.childProcess = spawn(buildArgs[0], buildArgs.slice(1), spawnOpts) + handleStdio() + this.childProcess.on('exit', (code, signal) => { + if (code || signal) + reject( + new Error(`next build failed with code/signal ${code || signal}`) + ) else resolve() }) }) + this._buildId = ( await fs.readFile( path.join( @@ -74,23 +81,22 @@ export class NextStartInstance extends NextInstance { 'utf8' ) ).trim() - // we don't use yarn next here as yarn detaches itself from the - // child process making it harder to kill all processes - this.childProcess = spawn( - 'node', - [path.join(nextDir, '/dist/bin/next'), 'start'], - spawnOpts - ) - handleStdio() - this.childProcess.on('close', (code) => { - if (this.isStopping) return - if (code) { - throw new Error(`next start exited unexpectedly with code ${code}`) - } - }) + console.log('running', startArgs.join(' ')) await new Promise((resolve) => { + this.childProcess = spawn(startArgs[0], startArgs.slice(1), spawnOpts) + handleStdio() + + this.childProcess.on('close', (code, signal) => { + if (this.isStopping) return + if (code || signal) { + throw new Error( + `next start exited unexpectedly with code/signal ${code || signal}` + ) + } + }) + const readyCb = (msg) => { if (msg.includes('started server on') && msg.includes('url:')) { this._url = msg.split('url: ').pop().trim()