From 997a4f3740f7b1e960a797bf8d52b96e9f0f54d0 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 24 Oct 2022 09:07:31 -0700 Subject: [PATCH 01/11] v12.3.2-canary.39 --- lerna.json | 2 +- packages/create-next-app/package.json | 2 +- packages/eslint-config-next/package.json | 4 ++-- packages/eslint-plugin-next/package.json | 2 +- packages/font/package.json | 2 +- packages/next-bundle-analyzer/package.json | 2 +- packages/next-codemod/package.json | 2 +- packages/next-env/package.json | 2 +- packages/next-mdx/package.json | 2 +- packages/next-plugin-storybook/package.json | 2 +- packages/next-polyfill-module/package.json | 2 +- packages/next-polyfill-nomodule/package.json | 2 +- packages/next-swc/package.json | 2 +- packages/next/package.json | 14 +++++++------- packages/react-dev-overlay/package.json | 2 +- packages/react-refresh-utils/package.json | 2 +- pnpm-lock.yaml | 14 +++++++------- 17 files changed, 30 insertions(+), 30 deletions(-) diff --git a/lerna.json b/lerna.json index 715e3b5caa3..f90621eab70 100644 --- a/lerna.json +++ b/lerna.json @@ -16,5 +16,5 @@ "registry": "https://registry.npmjs.org/" } }, - "version": "12.3.2-canary.38" + "version": "12.3.2-canary.39" } diff --git a/packages/create-next-app/package.json b/packages/create-next-app/package.json index 384deb79af2..dc7fb56171e 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.3.2-canary.38", + "version": "12.3.2-canary.39", "keywords": [ "react", "next", diff --git a/packages/eslint-config-next/package.json b/packages/eslint-config-next/package.json index c8e46611d6e..4dc20933339 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.3.2-canary.38", + "version": "12.3.2-canary.39", "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.3.2-canary.38", + "@next/eslint-plugin-next": "12.3.2-canary.39", "@rushstack/eslint-patch": "^1.1.3", "@typescript-eslint/parser": "^5.21.0", "eslint-import-resolver-node": "^0.3.6", diff --git a/packages/eslint-plugin-next/package.json b/packages/eslint-plugin-next/package.json index ea47b810785..f573dd54250 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.3.2-canary.38", + "version": "12.3.2-canary.39", "description": "ESLint plugin for NextJS.", "main": "dist/index.js", "license": "MIT", diff --git a/packages/font/package.json b/packages/font/package.json index a16b8f5956a..146810993f8 100644 --- a/packages/font/package.json +++ b/packages/font/package.json @@ -1,6 +1,6 @@ { "name": "@next/font", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "repository": { "url": "vercel/next.js", "directory": "packages/font" diff --git a/packages/next-bundle-analyzer/package.json b/packages/next-bundle-analyzer/package.json index bc5245be6f1..c1b75fb9d52 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.3.2-canary.38", + "version": "12.3.2-canary.39", "main": "index.js", "types": "index.d.ts", "license": "MIT", diff --git a/packages/next-codemod/package.json b/packages/next-codemod/package.json index c28b7d035ca..756b4cc9552 100644 --- a/packages/next-codemod/package.json +++ b/packages/next-codemod/package.json @@ -1,6 +1,6 @@ { "name": "@next/codemod", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "license": "MIT", "dependencies": { "chalk": "4.1.0", diff --git a/packages/next-env/package.json b/packages/next-env/package.json index 6f81936794c..7d270deb63c 100644 --- a/packages/next-env/package.json +++ b/packages/next-env/package.json @@ -1,6 +1,6 @@ { "name": "@next/env", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "keywords": [ "react", "next", diff --git a/packages/next-mdx/package.json b/packages/next-mdx/package.json index ad7982f1ef6..77afffc0d48 100644 --- a/packages/next-mdx/package.json +++ b/packages/next-mdx/package.json @@ -1,6 +1,6 @@ { "name": "@next/mdx", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "main": "index.js", "license": "MIT", "repository": { diff --git a/packages/next-plugin-storybook/package.json b/packages/next-plugin-storybook/package.json index 8d76a985705..918198252d6 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.3.2-canary.38", + "version": "12.3.2-canary.39", "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 9e070518fd5..fb136af5da6 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.3.2-canary.38", + "version": "12.3.2-canary.39", "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 854f787a520..cb6bce6749d 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.3.2-canary.38", + "version": "12.3.2-canary.39", "description": "A polyfill for non-dead, nomodule browsers.", "main": "dist/polyfill-nomodule.js", "license": "MIT", diff --git a/packages/next-swc/package.json b/packages/next-swc/package.json index a7356c277d3..088a07455f5 100644 --- a/packages/next-swc/package.json +++ b/packages/next-swc/package.json @@ -1,6 +1,6 @@ { "name": "@next/swc", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "private": true, "scripts": { "build-native": "napi build --platform -p next-swc-napi --cargo-name next_swc_napi --features plugin --js false native", diff --git a/packages/next/package.json b/packages/next/package.json index 9a8783497e3..c78f9b61bd8 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "next", - "version": "12.3.2-canary.38", + "version": "12.3.2-canary.39", "description": "The React Framework", "main": "./dist/server/next.js", "license": "MIT", @@ -74,7 +74,7 @@ ] }, "dependencies": { - "@next/env": "12.3.2-canary.38", + "@next/env": "12.3.2-canary.39", "@swc/helpers": "0.4.11", "caniuse-lite": "^1.0.30001406", "postcss": "8.4.14", @@ -125,11 +125,11 @@ "@hapi/accept": "5.0.2", "@napi-rs/cli": "2.12.0", "@napi-rs/triples": "1.1.0", - "@next/polyfill-module": "12.3.2-canary.38", - "@next/polyfill-nomodule": "12.3.2-canary.38", - "@next/react-dev-overlay": "12.3.2-canary.38", - "@next/react-refresh-utils": "12.3.2-canary.38", - "@next/swc": "12.3.2-canary.38", + "@next/polyfill-module": "12.3.2-canary.39", + "@next/polyfill-nomodule": "12.3.2-canary.39", + "@next/react-dev-overlay": "12.3.2-canary.39", + "@next/react-refresh-utils": "12.3.2-canary.39", + "@next/swc": "12.3.2-canary.39", "@segment/ajv-human-errors": "2.1.2", "@taskr/clear": "1.1.0", "@taskr/esnext": "1.1.0", diff --git a/packages/react-dev-overlay/package.json b/packages/react-dev-overlay/package.json index a75286a2cdf..4cff412ad2a 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.3.2-canary.38", + "version": "12.3.2-canary.39", "description": "A development-only overlay for developing React applications.", "repository": { "url": "vercel/next.js", diff --git a/packages/react-refresh-utils/package.json b/packages/react-refresh-utils/package.json index d02bd0d5383..0ddf4de4d57 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.3.2-canary.38", + "version": "12.3.2-canary.39", "description": "An experimental package providing utilities for React Refresh.", "repository": { "url": "vercel/next.js", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 61800869292..7997d7f0cdd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -401,7 +401,7 @@ importers: packages/eslint-config-next: specifiers: - '@next/eslint-plugin-next': 12.3.2-canary.38 + '@next/eslint-plugin-next': 12.3.2-canary.39 '@rushstack/eslint-patch': ^1.1.3 '@typescript-eslint/parser': ^5.21.0 eslint-import-resolver-node: ^0.3.6 @@ -469,12 +469,12 @@ importers: '@hapi/accept': 5.0.2 '@napi-rs/cli': 2.12.0 '@napi-rs/triples': 1.1.0 - '@next/env': 12.3.2-canary.38 - '@next/polyfill-module': 12.3.2-canary.38 - '@next/polyfill-nomodule': 12.3.2-canary.38 - '@next/react-dev-overlay': 12.3.2-canary.38 - '@next/react-refresh-utils': 12.3.2-canary.38 - '@next/swc': 12.3.2-canary.38 + '@next/env': 12.3.2-canary.39 + '@next/polyfill-module': 12.3.2-canary.39 + '@next/polyfill-nomodule': 12.3.2-canary.39 + '@next/react-dev-overlay': 12.3.2-canary.39 + '@next/react-refresh-utils': 12.3.2-canary.39 + '@next/swc': 12.3.2-canary.39 '@segment/ajv-human-errors': 2.1.2 '@swc/helpers': 0.4.11 '@taskr/clear': 1.1.0 From 89355298f29b1bac3f810ea27994500b1887c2a9 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Mon, 24 Oct 2022 19:49:49 +0200 Subject: [PATCH 02/11] Upgrade Edge Runtime v.1.1.0 (#41727) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Balázs Orbán --- package.json | 2 +- .../@edge-runtime/primitives/package.json | 2 +- packages/next/compiled/edge-runtime/index.js | 2 +- packages/next/package.json | 4 +- pnpm-lock.yaml | 49 ++++++++----------- 5 files changed, 26 insertions(+), 33 deletions(-) diff --git a/package.json b/package.json index 8e938aec5c9..29bee5564d1 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "@babel/plugin-proposal-object-rest-spread": "7.14.7", "@babel/preset-flow": "7.14.5", "@babel/preset-react": "7.14.5", - "@edge-runtime/jest-environment": "1.1.0-beta.36", + "@edge-runtime/jest-environment": "1.1.0", "@fullhuman/postcss-purgecss": "1.3.0", "@mdx-js/loader": "0.18.0", "@next/bundle-analyzer": "workspace:*", diff --git a/packages/next/compiled/@edge-runtime/primitives/package.json b/packages/next/compiled/@edge-runtime/primitives/package.json index 980ed9b27b6..8fb55b8ff13 100644 --- a/packages/next/compiled/@edge-runtime/primitives/package.json +++ b/packages/next/compiled/@edge-runtime/primitives/package.json @@ -1 +1 @@ -{"name":"@edge-runtime/primitives","version":"1.1.0-beta.37","main":"./index.js","license":"MPLv2"} +{"name":"@edge-runtime/primitives","version":"1.1.0","main":"./index.js","license":"MPLv2"} diff --git a/packages/next/compiled/edge-runtime/index.js b/packages/next/compiled/edge-runtime/index.js index 3349b2de577..4457fe4ff85 100644 --- a/packages/next/compiled/edge-runtime/index.js +++ b/packages/next/compiled/edge-runtime/index.js @@ -1 +1 @@ -(()=>{var __webpack_modules__={466:(__unused_webpack_module,exports,__nccwpck_require__)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.EdgeVM=void 0;const buffer_1=__nccwpck_require__(300);const require_1=__nccwpck_require__(65);const vm_1=__nccwpck_require__(378);const vm_2=__nccwpck_require__(144);class EdgeVM extends vm_1.VM{constructor(e={}){super({...e,extend:t=>e.extend?e.extend(addPrimitives(t)):addPrimitives(t)})}}exports.EdgeVM=EdgeVM;function addPrimitives(context){defineProperty(context,"self",{enumerable:true,value:context});defineProperty(context,"globalThis",{value:context});defineProperty(context,"Symbol",{value:Symbol});defineProperty(context,"clearInterval",{value:clearInterval});defineProperty(context,"clearTimeout",{value:clearTimeout});defineProperty(context,"setInterval",{value:setInterval});defineProperty(context,"setTimeout",{value:setTimeout});defineProperty(context,"EdgeRuntime",{value:"edge-runtime"});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/console"),scopedContext:{console:console}}),nonenumerable:["console"]});const encodings=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/encoding"),scopedContext:{Buffer:buffer_1.Buffer,global:{}}});defineProperties(context,{exports:encodings,nonenumerable:["atob","btoa","TextEncoder","TextDecoder"]});const streams=(0,require_1.requireWithCache)({path:require.resolve("next/dist/compiled/@edge-runtime/primitives/streams"),context:context});defineProperties(context,{exports:streams,nonenumerable:["ReadableStream","ReadableStreamBYOBReader","ReadableStreamDefaultReader","TransformStream","WritableStream","WritableStreamDefaultWriter"]});const abort=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/abort-controller")});defineProperties(context,{exports:abort,nonenumerable:["AbortController","AbortSignal","DOMException"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({cache:new Map([["punycode",{exports:__nccwpck_require__(477)}]]),context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/url"),scopedContext:{TextEncoder:encodings.TextEncoder,TextDecoder:encodings.TextDecoder}}),nonenumerable:["URL","URLSearchParams","URLPattern"]});const blob=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/blob")});defineProperties(context,{exports:blob,nonenumerable:["Blob"]});const webFetch=(0,require_1.requireWithCache)({context:context,cache:new Map([["abort-controller",{exports:abort}],["assert",{exports:__nccwpck_require__(491)}],["buffer",{exports:__nccwpck_require__(300)}],["events",{exports:__nccwpck_require__(361)}],["http",{exports:__nccwpck_require__(685)}],["net",{exports:__nccwpck_require__(808)}],["perf_hooks",{exports:__nccwpck_require__(74)}],["querystring",{exports:__nccwpck_require__(788)}],["stream",{exports:__nccwpck_require__(781)}],["tls",{exports:__nccwpck_require__(404)}],["util",{exports:__nccwpck_require__(837)}],["zlib",{exports:__nccwpck_require__(796)}],[require.resolve("next/dist/compiled/@edge-runtime/primitives/streams"),{exports:streams}],[require.resolve("next/dist/compiled/@edge-runtime/primitives/blob"),{exports:blob}]]),path:require.resolve("next/dist/compiled/@edge-runtime/primitives/fetch"),scopedContext:{Uint8Array:createUint8ArrayForContext(context),Buffer:buffer_1.Buffer,global:{},queueMicrotask:queueMicrotask,setImmediate:setImmediate,clearImmediate:clearImmediate}});defineProperties(context,{exports:webFetch,nonenumerable:["fetch","File","FormData","Headers","Request","Response"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({cache:new Map([[require.resolve("next/dist/compiled/@edge-runtime/primitives/fetch"),{exports:webFetch}]]),context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/cache"),scopedContext:{global:{}}}),enumerable:["caches"],nonenumerable:["Cache","CacheStorage"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,cache:new Map([["crypto",{exports:__nccwpck_require__(113)}],["process",{exports:__nccwpck_require__(282)}]]),path:require.resolve("next/dist/compiled/@edge-runtime/primitives/crypto"),scopedContext:{Buffer:buffer_1.Buffer,Uint8Array:createUint8ArrayForContext(context)}}),enumerable:["crypto"],nonenumerable:["Crypto","CryptoKey","SubtleCrypto"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/events")}),nonenumerable:["Event","EventTarget","FetchEvent","PromiseRejectionEvent"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/structured-clone")}),nonenumerable:["structuredClone"]});return context}function defineProperty(e,t,r){var n,o,s;Object.defineProperty(e,t,{configurable:(n=r.configurable)!==null&&n!==void 0?n:false,enumerable:(o=r.enumerable)!==null&&o!==void 0?o:false,value:r.value,writable:(s=r.writable)!==null&&s!==void 0?s:true})}function defineProperties(e,t){var r,n;for(const n of(r=t.enumerable)!==null&&r!==void 0?r:[]){if(!t.exports[n]){throw new Error(`Attempt to export a nullable value for "${n}"`)}defineProperty(e,n,{enumerable:true,value:t.exports[n]})}for(const r of(n=t.nonenumerable)!==null&&n!==void 0?n:[]){if(!t.exports[r]){throw new Error(`Attempt to export a nullable value for "${r}"`)}defineProperty(e,r,{value:t.exports[r]})}}function createUint8ArrayForContext(e){return new Proxy((0,vm_2.runInContext)("Uint8Array",e),{construct(e,t){const r=new e(...t);if(!(t[0]instanceof buffer_1.Buffer)){return r}return new e([...r])}})}},930:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.VM=t.EdgeVM=void 0;var n=r(466);Object.defineProperty(t,"EdgeVM",{enumerable:true,get:function(){return n.EdgeVM}});var o=r(378);Object.defineProperty(t,"VM",{enumerable:true,get:function(){return o.VM}})},65:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.requireWithCache=t.createRequire=t.requireDependencies=void 0;const n=r(147);const o=r(144);const s=r(17);function requireDependencies(e){const{context:t,requireCache:r,dependencies:n}=e;const o=createRequire(t,r);for(const{path:e,mapExports:r}of n){const n=o(e,e);for(const e of Object.keys(r)){t[r[e]]=n[e]}}}t.requireDependencies=requireDependencies;function createRequire(e,t,r,i={}){return function requireFn(a,c){const E=require.resolve(c,{paths:[(0,s.dirname)(a)]});const u=t.get(c)||t.get(E);if(u!==undefined&&u!==null){return u.exports}const d={exports:{},loaded:false,id:E};t.set(E,d);r===null||r===void 0?void 0:r.add(E);const _=(0,o.runInContext)(`(function(module,exports,require,__dirname,__filename,${Object.keys(i).join(",")}) {${(0,n.readFileSync)(E,"utf-8")}\n})`,e);try{_(d,d.exports,requireFn.bind(null,E),(0,s.dirname)(E),E,...Object.values(i))}catch(e){t.delete(E);throw e}d.loaded=true;return d.exports}}t.createRequire=createRequire;function requireWithCache(e){var t;return createRequire(e.context,(t=e.cache)!==null&&t!==void 0?t:new Map,e.references,e.scopedContext).call(null,e.path,e.path)}t.requireWithCache=requireWithCache},184:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.tempFile=void 0;const o=r(277);const s=n(r(17));const i=n(r(147));const a=n(r(37));function tempFile(e){const t=s.default.join(a.default.tmpdir(),o.crypto.randomUUID());i.default.writeFileSync(t,e);return{path:t,remove:()=>i.default.unlinkSync(t)}}t.tempFile=tempFile},378:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.VM=void 0;const n=r(144);const o=r(65);const s=r(184);class VM{constructor(e={}){var t,r,s,i;const a=(0,n.createContext)({},{name:"Edge Runtime",codeGeneration:(t=e.codeGeneration)!==null&&t!==void 0?t:{strings:false,wasm:true}});this.requireCache=(r=e.requireCache)!==null&&r!==void 0?r:new Map;this.context=(i=(s=e.extend)===null||s===void 0?void 0:s.call(e,a))!==null&&i!==void 0?i:a;this.requireFn=(0,o.createRequire)(this.context,this.requireCache)}evaluate(e){return(0,n.runInContext)(e,this.context)}require(e){return this.requireFn(e,e)}requireInContext(e){const t=this.require(e);for(const[e,r]of Object.entries(t)){this.context[e]=r}}requireInlineInContext(e){const t=(0,s.tempFile)(e);this.requireInContext(t.path);t.remove()}}t.VM=VM},162:e=>{"use strict";e.exports=e=>{const t=e[0]*1e9+e[1];const r=t/1e6;const n=t/1e9;return{seconds:n,milliseconds:r,nanoseconds:t}}},51:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.EdgeRuntime=void 0;const n=r(930);let o;let s;class EdgeRuntime extends n.EdgeVM{constructor(e){super({...e,extend:t=>{var r,n;return(n=(r=e===null||e===void 0?void 0:e.extend)===null||r===void 0?void 0:r.call(e,t))!==null&&n!==void 0?n:t}});defineHandlerProps({object:this,setterName:"__onUnhandledRejectionHandler",setter:e=>o=e,getterName:"__rejectionHandlers",getter:()=>o});defineHandlerProps({object:this,setterName:"__onErrorHandler",setter:e=>s=e,getterName:"__errorHandlers",getter:()=>s});this.evaluate(getDefineEventListenersCode());this.dispatchFetch=this.evaluate(getDispatchFetchCode());if(e===null||e===void 0?void 0:e.initialCode){this.evaluate(e.initialCode)}}}t.EdgeRuntime=EdgeRuntime;process.on("unhandledRejection",(function invokeRejectionHandlers(e,t){o===null||o===void 0?void 0:o.forEach((r=>r({reason:e,promise:t})))}));process.on("uncaughtException",(function invokeErrorHandlers(e){s===null||s===void 0?void 0:s.forEach((t=>t(e)))}));function getDefineEventListenersCode(){return`\n Object.defineProperty(self, '__listeners', {\n configurable: false,\n enumerable: false,\n value: {},\n writable: true,\n })\n\n function __conditionallyUpdatesHandlerList(eventType) {\n if (eventType === 'unhandledrejection') {\n self.__onUnhandledRejectionHandler = self.__listeners[eventType];\n } else if (eventType === 'error') {\n self.__onErrorHandler = self.__listeners[eventType];\n }\n }\n\n function addEventListener(type, handler) {\n const eventType = type.toLowerCase();\n if (eventType === 'fetch' && self.__listeners.fetch) {\n throw new TypeError('You can register just one "fetch" event listener');\n }\n\n self.__listeners[eventType] = self.__listeners[eventType] || [];\n self.__listeners[eventType].push(handler);\n __conditionallyUpdatesHandlerList(eventType);\n }\n\n function removeEventListener(type, handler) {\n const eventType = type.toLowerCase();\n if (self.__listeners[eventType]) {\n self.__listeners[eventType] = self.__listeners[eventType].filter(item => {\n return item !== handler;\n });\n\n if (self.__listeners[eventType].length === 0) {\n delete self.__listeners[eventType];\n }\n }\n __conditionallyUpdatesHandlerList(eventType);\n }\n `}function getDispatchFetchCode(){return`(async function dispatchFetch(input, init) {\n const request = new Request(input, init);\n const event = new FetchEvent(request);\n if (!self.__listeners.fetch) {\n throw new Error("No fetch event listeners found");\n }\n\n const getResponse = ({ response, error }) => {\n if (error || !response || !(response instanceof Response)) {\n console.error(error ? error.toString() : 'The event listener did not respond')\n response = new Response(null, {\n statusText: 'Internal Server Error',\n status: 500\n })\n }\n\n response.waitUntil = () => Promise.all(event.awaiting);\n\n if (response.status < 300 || response.status >= 400 ) {\n response.headers.delete('content-encoding');\n response.headers.delete('transform-encoding');\n response.headers.delete('content-length');\n }\n\n return response;\n }\n\n try {\n await self.__listeners.fetch[0].call(event, event)\n } catch (error) {\n return getResponse({ error })\n }\n\n return Promise.resolve(event.response)\n .then(response => getResponse({ response }))\n .catch(error => getResponse({ error }))\n })`}function defineHandlerProps({object:e,setterName:t,setter:r,getterName:n,getter:o}){Object.defineProperty(e.context,t,{set:r,configurable:false,enumerable:false});Object.defineProperty(e,n,{get:o,configurable:false,enumerable:false})}},392:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.consumeUint8ArrayReadableStream=t.getClonableBodyStream=void 0;const n=r(781);function getClonableBodyStream(e,t,r){let n=null;return{finalize(){if(n){replaceRequestBody(e,bodyStreamToNodeStream(n))}},cloneBodyStream(){const o=n!==null&&n!==void 0?n:requestToBodyStream(e,t,r);const[s,i]=o.tee();n=s;return i}}}t.getClonableBodyStream=getClonableBodyStream;function requestToBodyStream(e,t,r){const n=new r({start(r){e.on("data",(e=>r.enqueue(new t([...new Uint8Array(e)]))));e.on("end",(()=>r.terminate()));e.on("error",(e=>r.error(e)))}});return n.readable}function bodyStreamToNodeStream(e){const t=e.getReader();return n.Readable.from(async function*(){while(true){const{done:e,value:r}=await t.read();if(e){return}yield r}}())}function replaceRequestBody(e,t){for(const r in t){let n=t[r];if(typeof n==="function"){n=n.bind(t)}e[r]=n}return e}async function*consumeUint8ArrayReadableStream(e){var t;const r=e===null||e===void 0?void 0:e.getReader();if(r){while(true){const{done:e,value:n}=await r.read();if(e){return}if(((t=n===null||n===void 0?void 0:n.constructor)===null||t===void 0?void 0:t.name)!=="Uint8Array"){throw new TypeError("This ReadableStream did not return bytes.")}yield n}}}t.consumeUint8ArrayReadableStream=consumeUint8ArrayReadableStream},673:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.createHandler=void 0;const o=r(392);const s=r(392);const i=n(r(606));const a=n(r(632));const c=n(r(943));function createHandler(e){const t=new Set;return{handler:async(r,n)=>{var E,u;try{const d=(0,c.default)();const _=r.method!=="GET"&&r.method!=="HEAD"?(0,s.getClonableBodyStream)(r,e.runtime.evaluate("Uint8Array"),e.runtime.context.TransformStream):undefined;const l=await e.runtime.dispatchFetch(String(getURL(r)),{headers:toRequestInitHeaders(r),method:r.method,body:_===null||_===void 0?void 0:_.cloneBodyStream()});const S=l.waitUntil();t.add(S);S.finally((()=>t.delete(S)));n.statusCode=l.status;n.statusMessage=l.statusText;for(const[e,t]of Object.entries(toNodeHeaders(l.headers))){if(t!==undefined){n.setHeader(e,t)}}if(l.body){for await(const e of(0,o.consumeUint8ArrayReadableStream)(l.body)){n.write(e)}}const R=`${r.socket.remoteAddress} ${r.method} ${r.url}`;const h=`${(E=(0,i.default)(d()).match(/[a-zA-Z]+|[0-9]+/g))===null||E===void 0?void 0:E.join(" ")}`;const p=`${n.statusCode} ${a.default[n.statusCode]}`;(u=e.logger)===null||u===void 0?void 0:u.debug(`${R} → ${p} in ${h}`);n.end()}finally{if(!n.finished){n.end()}}},waitUntil:()=>Promise.all(t)}}t.createHandler=createHandler;function getURL(e){var t;const r=((t=e.socket)===null||t===void 0?void 0:t.encrypted)?"https":"http";return new URL(String(e.url),`${r}://${String(e.headers.host)}`)}function toRequestInitHeaders(e){return Object.keys(e.headers).map((t=>{const r=e.headers[t];return[t,Array.isArray(r)?r.join(", "):r!==null&&r!==void 0?r:""]}))}function toNodeHeaders(e){const t={};if(e){for(const[r,n]of e.entries()){t[r]=r.toLowerCase()==="set-cookie"?e.getAll("set-cookie"):n}}return t}},539:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.runServer=t.createHandler=t.consumeUint8ArrayReadableStream=void 0;var n=r(392);Object.defineProperty(t,"consumeUint8ArrayReadableStream",{enumerable:true,get:function(){return n.consumeUint8ArrayReadableStream}});var o=r(673);Object.defineProperty(t,"createHandler",{enumerable:true,get:function(){return o.createHandler}});var s=r(387);Object.defineProperty(t,"runServer",{enumerable:true,get:function(){return s.runServer}})},387:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.runServer=void 0;const o=r(673);const s=r(361);const i=n(r(685));async function runServer(e){const{handler:t,waitUntil:r}=(0,o.createHandler)(e);const n=i.default.createServer(t);n.listen(e.port);try{await(0,s.once)(n,"listening")}catch(t){if((t===null||t===void 0?void 0:t.code)==="EADDRINUSE"){return runServer({...e,port:undefined})}throw t}const a=n.address();const c=typeof a==="string"||a==null?String(a):`http://localhost:${a.port}`;return{url:c,close:async()=>{await r();await new Promise(((e,t)=>n.close((r=>{if(r)t(r);e()}))))},waitUntil:r}}t.runServer=runServer},632:e=>{var t;t={"1xx":"Informational","1xx_NAME":"INFORMATIONAL","1xx_MESSAGE":"Indicates an interim response for communicating connection status or request progress prior to completing the requested action and sending a final response.",INFORMATIONAL:"1xx","2xx":"Successful","2xx_NAME":"SUCCESSFUL","2xx_MESSAGE":"Indicates that the client's request was successfully received, understood, and accepted.",SUCCESSFUL:"2xx","3xx":"Redirection","3xx_NAME":"REDIRECTION","3xx_MESSAGE":"Indicates that further action needs to be taken by the user agent in order to fulfill the request.",REDIRECTION:"3xx","4xx":"Client Error","4xx_NAME":"CLIENT_ERROR","4xx_MESSAGE":"Indicates that the client seems to have erred.",CLIENT_ERROR:"4xx","5xx":"Server Error","5xx_NAME":"SERVER_ERROR","5xx_MESSAGE":"Indicates that the server is aware that it has erred or is incapable of performing the requested method.",SERVER_ERROR:"5xx"};e.exports={classes:t,100:"Continue","100_NAME":"CONTINUE","100_MESSAGE":"The server has received the request headers and the client should proceed to send the request body.","100_CLASS":t.INFORMATIONAL,CONTINUE:100,101:"Switching Protocols","101_NAME":"SWITCHING_PROTOCOLS","101_MESSAGE":"The requester has asked the server to switch protocols and the server has agreed to do so.","101_CLASS":t.INFORMATIONAL,SWITCHING_PROTOCOLS:101,102:"Processing","102_NAME":"PROCESSING","102_MESSAGE":"A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request. This code indicates that the server has received and is processing the request, but no response is available yet.[7] This prevents the client from timing out and assuming the request was lost.","102_CLASS":t.INFORMATIONAL,PROCESSING:102,103:"Early Hints","103_NAME":"EARLY_HINTS","103_MESSAGE":"Used to return some response headers before final HTTP message.","103_CLASS":t.INFORMATIONAL,EARLY_HINTS:103,200:"OK","200_NAME":"OK","200_MESSAGE":"Standard response for successful HTTP requests.","200_CLASS":t.SUCCESSFUL,OK:200,201:"Created","201_NAME":"CREATED","201_MESSAGE":"The request has been fulfilled, resulting in the creation of a new resource.","201_CLASS":t.SUCCESSFUL,CREATED:201,202:"Accepted","202_NAME":"ACCEPTED","202_MESSAGE":"The request has been accepted for processing, but the processing has not been completed.","202_CLASS":t.SUCCESSFUL,ACCEPTED:202,203:"Non-Authoritative Information","203_NAME":"NON_AUTHORITATIVE_INFORMATION","203_MESSAGE":"The server is a transforming proxy (e.g. a Web accelerator) that received a 200 OK from its origin, but is returning a modified version of the origin's response.","203_CLASS":t.SUCCESSFUL,NON_AUTHORITATIVE_INFORMATION:203,204:"No Content","204_NAME":"NO_CONTENT","204_MESSAGE":"The server successfully processed the request and is not returning any content.","204_CLASS":t.SUCCESSFUL,NO_CONTENT:204,205:"Reset Content","205_NAME":"RESET_CONTENT","205_MESSAGE":"The server successfully processed the request, but is not returning any content. Unlike a 204 response, this response requires that the requester reset the document view.","205_CLASS":t.SUCCESSFUL,RESET_CONTENT:205,206:"Partial Content","206_NAME":"PARTIAL_CONTENT","206_MESSAGE":"The server is delivering only part of the resource (byte serving) due to a range header sent by the client.","206_CLASS":t.SUCCESSFUL,PARTIAL_CONTENT:206,207:"Multi Status","207_NAME":"MULTI_STATUS","207_MESSAGE":"The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.","207_CLASS":t.SUCCESSFUL,MULTI_STATUS:207,208:"Already Reported","208_NAME":"ALREADY_REPORTED","208_MESSAGE":"The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.","208_CLASS":t.SUCCESSFUL,ALREADY_REPORTED:208,226:"IM Used","226_NAME":"IM_USED","226_MESSAGE":"The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.","226_CLASS":t.SUCCESSFUL,IM_USED:226,300:"Multiple Choices","300_NAME":"MULTIPLE_CHOICES","300_MESSAGE":"Indicates multiple options for the resource from which the client may choose.","300_CLASS":t.REDIRECTION,MULTIPLE_CHOICES:300,301:"Moved Permanently","301_NAME":"MOVED_PERMANENTLY","301_MESSAGE":"This and all future requests should be directed to the given URI.","301_CLASS":t.REDIRECTION,MOVED_PERMANENTLY:301,302:"Found","302_NAME":"FOUND","302_MESSAGE":'This is an example of industry practice contradicting the standard. The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviours.',"302_CLASS":t.REDIRECTION,FOUND:302,303:"See Other","303_NAME":"SEE_OTHER","303_MESSAGE":"The response to the request can be found under another URI using the GET method.","303_CLASS":t.REDIRECTION,SEE_OTHER:303,304:"Not Modified","304_NAME":"NOT_MODIFIED","304_MESSAGE":"Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.","304_CLASS":t.REDIRECTION,NOT_MODIFIED:304,305:"Use Proxy","305_NAME":"USE_PROXY","305_MESSAGE":"The requested resource is available only through a proxy, the address for which is provided in the response.","305_CLASS":t.REDIRECTION,USE_PROXY:305,306:"Switch Proxy","306_NAME":"SWITCH_PROXY","306_MESSAGE":'No longer used. Originally meant "Subsequent requests should use the specified proxy.',"306_CLASS":t.REDIRECTION,SWITCH_PROXY:306,307:"Temporary Redirect","307_NAME":"TEMPORARY_REDIRECT","307_MESSAGE":"In this case, the request should be repeated with another URI; however, future requests should still use the original URI.","307_CLASS":t.REDIRECTION,TEMPORARY_REDIRECT:307,308:"Permanent Redirect","308_NAME":"PERMANENT_REDIRECT","308_MESSAGE":"The request and all future requests should be repeated using another URI.","308_CLASS":t.REDIRECTION,PERMANENT_REDIRECT:308,400:"Bad Request","400_NAME":"BAD_REQUEST","400_MESSAGE":"The server cannot or will not process the request due to an apparent client error.","400_CLASS":t.CLIENT_ERROR,BAD_REQUEST:400,401:"Unauthorized","401_NAME":"UNAUTHORIZED","401_MESSAGE":"Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided.","401_CLASS":t.CLIENT_ERROR,UNAUTHORIZED:401,402:"Payment Required","402_NAME":"PAYMENT_REQUIRED","402_MESSAGE":"Reserved for future use. The original intention was that this code might be used as part of some form of digital cash or micropayment scheme, as proposed for example by GNU Taler, but that has not yet happened, and this code is not usually used.","402_CLASS":t.CLIENT_ERROR,PAYMENT_REQUIRED:402,403:"Forbidden","403_NAME":"FORBIDDEN","403_MESSAGE":"The request was valid, but the server is refusing action.","403_CLASS":t.CLIENT_ERROR,FORBIDDEN:403,404:"Not Found","404_NAME":"NOT_FOUND","404_MESSAGE":"The requested resource could not be found but may be available in the future. Subsequent requests by the client are permissible.","404_CLASS":t.CLIENT_ERROR,NOT_FOUND:404,405:"Method Not Allowed","405_NAME":"METHOD_NOT_ALLOWED","405_MESSAGE":"A request method is not supported for the requested resource.","405_CLASS":t.CLIENT_ERROR,METHOD_NOT_ALLOWED:405,406:"Not Acceptable","406_NAME":"NOT_ACCEPTABLE","406_MESSAGE":"The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.","406_CLASS":t.CLIENT_ERROR,NOT_ACCEPTABLE:406,407:"Proxy Authentication Required","407_NAME":"PROXY_AUTHENTICATION_REQUIRED","407_MESSAGE":"The client must first authenticate itself with the proxy.","407_CLASS":t.CLIENT_ERROR,PROXY_AUTHENTICATION_REQUIRED:407,408:"Request Time-out","408_NAME":"REQUEST_TIMEOUT","408_MESSAGE":"The server timed out waiting for the request.","408_CLASS":t.CLIENT_ERROR,REQUEST_TIMEOUT:408,409:"Conflict","409_NAME":"CONFLICT","409_MESSAGE":"Indicates that the request could not be processed because of conflict in the request, such as an edit conflict between multiple simultaneous updates.","409_CLASS":t.CLIENT_ERROR,CONFLICT:409,410:"Gone","410_NAME":"GONE","410_MESSAGE":"Indicates that the resource requested is no longer available and will not be available again.","410_CLASS":t.CLIENT_ERROR,GONE:410,411:"Length Required","411_NAME":"LENGTH_REQUIRED","411_MESSAGE":"The request did not specify the length of its content, which is required by the requested resource.","411_CLASS":t.CLIENT_ERROR,LENGTH_REQUIRED:411,412:"Precondition Failed","412_NAME":"PRECONDITION_FAILED","412_MESSAGE":"The server does not meet one of the preconditions that the requester put on the request.","412_CLASS":t.CLIENT_ERROR,PRECONDITION_FAILED:412,413:"Request Entity Too Large","413_NAME":"REQUEST_ENTITY_TOO_LARGE","413_MESSAGE":'The request is larger than the server is willing or able to process. Previously called "Request Entity Too Large".',"413_CLASS":t.CLIENT_ERROR,REQUEST_ENTITY_TOO_LARGE:413,414:"Request-URI Too Large","414_NAME":"REQUEST_URI_TOO_LONG","414_MESSAGE":"The URI provided was too long for the server to process.","414_CLASS":t.CLIENT_ERROR,REQUEST_URI_TOO_LONG:414,415:"Unsupported Media Type","415_NAME":"UNSUPPORTED_MEDIA_TYPE","415_MESSAGE":"The request entity has a media type which the server or resource does not support.","415_CLASS":t.CLIENT_ERROR,UNSUPPORTED_MEDIA_TYPE:415,416:"Requested Range not Satisfiable","416_NAME":"REQUESTED_RANGE_NOT_SATISFIABLE","416_MESSAGE":"The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.","416_CLASS":t.CLIENT_ERROR,REQUESTED_RANGE_NOT_SATISFIABLE:416,417:"Expectation Failed","417_NAME":"EXPECTATION_FAILED","417_MESSAGE":"The server cannot meet the requirements of the Expect request-header field.","417_CLASS":t.CLIENT_ERROR,EXPECTATION_FAILED:417,418:"I'm a teapot","418_NAME":"IM_A_TEAPOT","418_MESSAGE":'Any attempt to brew coffee with a teapot should result in the error code "418 I\'m a teapot". The resulting entity body MAY be short and stout.',"418_CLASS":t.CLIENT_ERROR,IM_A_TEAPOT:418,421:"Misdirected Request","421_NAME":"MISDIRECTED_REQUEST","421_MESSAGE":"The request was directed at a server that is not able to produce a response.","421_CLASS":t.CLIENT_ERROR,MISDIRECTED_REQUEST:421,422:"Unprocessable Entity","422_NAME":"UNPROCESSABLE_ENTITY","422_MESSAGE":"The request was well-formed but was unable to be followed due to semantic errors.","422_CLASS":t.CLIENT_ERROR,UNPROCESSABLE_ENTITY:422,423:"Locked","423_NAME":"LOCKED","423_MESSAGE":"The resource that is being accessed is locked.","423_CLASS":t.CLIENT_ERROR,LOCKED:423,424:"Failed Dependency","424_NAME":"FAILED_DEPENDENCY","424_MESSAGE":"The request failed because it depended on another request and that request failed.","424_CLASS":t.CLIENT_ERROR,FAILED_DEPENDENCY:424,426:"Upgrade Required","426_NAME":"UPGRADE_REQUIRED","426_MESSAGE":"The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.","426_CLASS":t.CLIENT_ERROR,UPGRADE_REQUIRED:426,428:"Precondition Required","428_NAME":"PRECONDITION_REQUIRED","428_MESSAGE":"The origin server requires the request to be conditional.","428_CLASS":t.CLIENT_ERROR,PRECONDITION_REQUIRED:428,429:"Too Many Requests","429_NAME":"TOO_MANY_REQUESTS","429_MESSAGE":"The user has sent too many requests in a given amount of time.","429_CLASS":t.CLIENT_ERROR,TOO_MANY_REQUESTS:429,431:"Request Header Fields Too Large","431_NAME":"REQUEST_HEADER_FIELDS_TOO_LARGE","431_MESSAGE":"The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.","431_CLASS":t.CLIENT_ERROR,REQUEST_HEADER_FIELDS_TOO_LARGE:431,451:"Unavailable For Legal Reasons","451_NAME":"UNAVAILABLE_FOR_LEGAL_REASONS","451_MESSAGE":"A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.","451_CLASS":t.CLIENT_ERROR,UNAVAILABLE_FOR_LEGAL_REASONS:451,500:"Internal Server Error","500_NAME":"INTERNAL_SERVER_ERROR","500_MESSAGE":"A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.","500_CLASS":t.SERVER_ERROR,INTERNAL_SERVER_ERROR:500,501:"Not Implemented","501_NAME":"NOT_IMPLEMENTED","501_MESSAGE":"The server either does not recognize the request method, or it lacks the ability to fulfil the request. Usually this implies future availability.","501_CLASS":t.SERVER_ERROR,NOT_IMPLEMENTED:501,502:"Bad Gateway","502_NAME":"BAD_GATEWAY","502_MESSAGE":"The server was acting as a gateway or proxy and received an invalid response from the upstream server.","502_CLASS":t.SERVER_ERROR,BAD_GATEWAY:502,503:"Service Unavailable","503_NAME":"SERVICE_UNAVAILABLE","503_MESSAGE":"The server is currently unavailable (because it is overloaded or down for maintenance). Generally, this is a temporary state.","503_CLASS":t.SERVER_ERROR,SERVICE_UNAVAILABLE:503,504:"Gateway Time-out","504_NAME":"GATEWAY_TIMEOUT","504_MESSAGE":"The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.","504_CLASS":t.SERVER_ERROR,GATEWAY_TIMEOUT:504,505:"HTTP Version not Supported","505_NAME":"HTTP_VERSION_NOT_SUPPORTED","505_MESSAGE":"The server does not support the HTTP protocol version used in the request.","505_CLASS":t.SERVER_ERROR,HTTP_VERSION_NOT_SUPPORTED:505,506:"Variant Also Negotiates","506_NAME":"VARIANT_ALSO_NEGOTIATES","506_MESSAGE":"Transparent content negotiation for the request results in a circular reference.","506_CLASS":t.SERVER_ERROR,VARIANT_ALSO_NEGOTIATES:506,507:"Insufficient Storage","507_NAME":"INSUFFICIENT_STORAGE","507_MESSAGE":"The server is unable to store the representation needed to complete the request.","507_CLASS":t.SERVER_ERROR,INSUFFICIENT_STORAGE:507,508:"Loop Detected","508_NAME":"LOOP_DETECTED","508_MESSAGE":"The server detected an infinite loop while processing the request.","508_CLASS":t.SERVER_ERROR,LOOP_DETECTED:508,510:"Not Extended","510_NAME":"NOT_EXTENDED","510_MESSAGE":"Further extensions to the request are required for the server to fulfil it.","510_CLASS":t.SERVER_ERROR,NOT_EXTENDED:510,511:"Network Authentication Required","511_NAME":"NETWORK_AUTHENTICATION_REQUIRED","511_MESSAGE":"The client needs to authenticate to gain network access. Intended for use by intercepting proxies used to control access to the network.","511_CLASS":t.SERVER_ERROR,NETWORK_AUTHENTICATION_REQUIRED:511,extra:{unofficial:{103:"Checkpoint","103_NAME":"CHECKPOINT","103_MESSAGE":"Used in the resumable requests proposal to resume aborted PUT or POST requests.","103_CLASS":t.INFORMATIONAL,CHECKPOINT:103,419:"Page Expired","419_NAME":"PAGE_EXPIRED","419_MESSAGE":"Used by the Laravel Framework when a CSRF Token is missing or expired.","419_CLASS":t.CLIENT_ERROR,PAGE_EXPIRED:419,218:"This is fine","218_NAME":"THIS_IS_FINE","218_MESSAGE":"Used as a catch-all error condition for allowing response bodies to flow through Apache when ProxyErrorOverride is enabled. When ProxyErrorOverride is enabled in Apache, response bodies that contain a status code of 4xx or 5xx are automatically discarded by Apache in favor of a generic response or a custom response specified by the ErrorDocument directive.","218_CLASS":t.SUCCESSFUL,THIS_IS_FINE:218,420:"Enhance Your Calm","420_NAME":"ENHANCE_YOUR_CALM","420_MESSAGE":"Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead.","420_CLASS":t.CLIENT_ERROR,ENHANCE_YOUR_CALM:420,450:"Blocked by Windows Parental Controls","450_NAME":"BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS","450_MESSAGE":"The Microsoft extension code indicated when Windows Parental Controls are turned on and are blocking access to the requested webpage.","450_CLASS":t.CLIENT_ERROR,BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS:450,498:"Invalid Token","498_NAME":"INVALID_TOKEN","498_MESSAGE":"Returned by ArcGIS for Server. Code 498 indicates an expired or otherwise invalid token.","498_CLASS":t.CLIENT_ERROR,INVALID_TOKEN:498,499:"Token Required","499_NAME":"TOKEN_REQUIRED","499_MESSAGE":"Returned by ArcGIS for Server. Code 499 indicates that a token is required but was not submitted.","499_CLASS":t.CLIENT_ERROR,TOKEN_REQUIRED:499,509:"Bandwidth Limit Exceeded","509_NAME":"BANDWIDTH_LIMIT_EXCEEDED","509_MESSAGE":"The server has exceeded the bandwidth specified by the server administrator.","509_CLASS":t.SERVER_ERROR,BANDWIDTH_LIMIT_EXCEEDED:509,530:"Site is frozen","530_NAME":"SITE_IS_FROZEN","530_MESSAGE":"Used by the Pantheon web platform to indicate a site that has been frozen due to inactivity.","530_CLASS":t.SERVER_ERROR,SITE_IS_FROZEN:530,598:"Network read timeout error","598_NAME":"NETWORK_READ_TIMEOUT_ERROR","598_MESSAGE":"Used by some HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy.","598_CLASS":t.SERVER_ERROR,NETWORK_READ_TIMEOUT_ERROR:598},iis:{440:"Login Time-out","440_NAME":"LOGIN_TIME_OUT","440_MESSAGE":"The client's session has expired and must log in again.","440_CLASS":t.CLIENT_ERROR,LOGIN_TIME_OUT:440,449:"Retry With","449_NAME":"RETRY_WITH","449_MESSAGE":"The server cannot honour the request because the user has not provided the required information.","449_CLASS":t.CLIENT_ERROR,RETRY_WITH:449,451:"Redirect","451_NAME":"REDIRECT","451_MESSAGE":"Used in Exchange ActiveSync when either a more efficient server is available or the server cannot access the users' mailbox.","451_CLASS":t.CLIENT_ERROR,REDIRECT:451},nginx:{444:"No Response","444_NAME":"NO_RESPONSE","444_MESSAGE":"Used internally to instruct the server to return no information to the client and close the connection immediately.","444_CLASS":t.CLIENT_ERROR,NO_RESPONSE:444,494:"Request header too large","494_NAME":"REQUEST_HEADER_TOO_LARGE","494_MESSAGE":"Client sent too large request or too long header line.","494_CLASS":t.CLIENT_ERROR,REQUEST_HEADER_TOO_LARGE:494,495:"SSL Certificate Error","495_NAME":"SSL_CERTIFICATE_ERROR","495_MESSAGE":"An expansion of the 400 Bad Request response code, used when the client has provided an invalid client certificate.","495_CLASS":t.CLIENT_ERROR,SSL_CERTIFICATE_ERROR:495,496:"SSL Certificate Required","496_NAME":"SSL_CERTIFICATE_REQUIRED","496_MESSAGE":"An expansion of the 400 Bad Request response code, used when a client certificate is required but not provided.","496_CLASS":t.CLIENT_ERROR,SSL_CERTIFICATE_REQUIRED:496,497:"HTTP Request Sent to HTTPS Port","497_NAME":"HTTP_REQUEST_SENT_TO_HTTPS_PORT","497_MESSAGE":"An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for HTTPS requests.","497_CLASS":t.CLIENT_ERROR,HTTP_REQUEST_SENT_TO_HTTPS_PORT:497,499:"Client Closed Request","499_NAME":"CLIENT_CLOSED_REQUEST","499_MESSAGE":"Used when the client has closed the request before the server could send a response.","499_CLASS":t.CLIENT_ERROR,CLIENT_CLOSED_REQUEST:499},cloudflare:{520:"Unknown Error","520_NAME":"UNKNOWN_ERROR","520_MESSAGE":'The 520 error is used as a "catch-all response for when the origin server returns something unexpected", listing connection resets, large headers, and empty or invalid responses as common triggers.',"520_CLASS":t.SERVER_ERROR,UNKNOWN_ERROR:520,521:"Web Server Is Down","521_NAME":"WEB_SERVER_IS_DOWN","521_MESSAGE":"The origin server has refused the connection from Cloudflare.","521_CLASS":t.SERVER_ERROR,WEB_SERVER_IS_DOWN:521,522:"Connection Timed Out","522_NAME":"CONNECTION_TIMED_OUT","522_MESSAGE":"Cloudflare could not negotiate a TCP handshake with the origin server.","522_CLASS":t.SERVER_ERROR,CONNECTION_TIMED_OUT:522,523:"Origin Is Unreachable","523_NAME":"ORIGIN_IS_UNREACHABLE","523_MESSAGE":"Cloudflare could not reach the origin server.","523_CLASS":t.SERVER_ERROR,ORIGIN_IS_UNREACHABLE:523,524:"A Timeout Occurred","524_NAME":"A_TIMEOUT_OCCURRED","524_MESSAGE":"Cloudflare was able to complete a TCP connection to the origin server, but did not receive a timely HTTP response.","524_CLASS":t.SERVER_ERROR,A_TIMEOUT_OCCURRED:524,525:"SSL Handshake Failed","525_NAME":"SSL_HANDSHAKE_FAILED","525_MESSAGE":"Cloudflare could not negotiate a SSL/TLS handshake with the origin server.","525_CLASS":t.SERVER_ERROR,SSL_HANDSHAKE_FAILED:525,526:"Invalid SSL Certificate","526_NAME":"INVALID_SSL_CERTIFICATE","526_MESSAGE":"Cloudflare could not validate the SSL/TLS certificate that the origin server presented.","526_CLASS":t.SERVER_ERROR,INVALID_SSL_CERTIFICATE:526,527:"Railgun Error","527_NAME":"RAILGUN_ERROR","527_MESSAGE":"Error 527 indicates that the request timed out or failed after the WAN connection had been established.","527_CLASS":t.SERVER_ERROR,RAILGUN_ERROR:527}}}},523:e=>{"use strict";e.exports=e=>{if(typeof e!=="number"){throw new TypeError("Expected a number")}const t=e>0?Math.floor:Math.ceil;return{days:t(e/864e5),hours:t(e/36e5)%24,minutes:t(e/6e4)%60,seconds:t(e/1e3)%60,milliseconds:t(e)%1e3,microseconds:t(e*1e3)%1e3,nanoseconds:t(e*1e6)%1e3}}},606:(e,t,r)=>{"use strict";const n=r(523);const pluralize=(e,t)=>t===1?e:`${e}s`;const o=1e-7;e.exports=(e,t={})=>{if(!Number.isFinite(e)){throw new TypeError("Expected a finite number")}if(t.colonNotation){t.compact=false;t.formatSubMilliseconds=false;t.separateMilliseconds=false;t.verbose=false}if(t.compact){t.secondsDecimalDigits=0;t.millisecondsDecimalDigits=0}const r=[];const floorDecimals=(e,t)=>{const r=Math.floor(e*10**t+o);const n=Math.round(r)/10**t;return n.toFixed(t)};const add=(e,n,o,s)=>{if((r.length===0||!t.colonNotation)&&e===0&&!(t.colonNotation&&o==="m")){return}s=(s||e||"0").toString();let i;let a;if(t.colonNotation){i=r.length>0?":":"";a="";const e=s.includes(".")?s.split(".")[0].length:s.length;const t=r.length>0?2:1;s="0".repeat(Math.max(0,t-e))+s}else{i="";a=t.verbose?" "+pluralize(n,e):o}r.push(i+s+a)};const s=n(e);add(Math.trunc(s.days/365),"year","y");add(s.days%365,"day","d");add(s.hours,"hour","h");add(s.minutes,"minute","m");if(t.separateMilliseconds||t.formatSubMilliseconds||!t.colonNotation&&e<1e3){add(s.seconds,"second","s");if(t.formatSubMilliseconds){add(s.milliseconds,"millisecond","ms");add(s.microseconds,"microsecond","µs");add(s.nanoseconds,"nanosecond","ns")}else{const e=s.milliseconds+s.microseconds/1e3+s.nanoseconds/1e6;const r=typeof t.millisecondsDecimalDigits==="number"?t.millisecondsDecimalDigits:0;const n=e>=1?Math.round(e):Math.ceil(e);const o=r?e.toFixed(r):n;add(Number.parseFloat(o,10),"millisecond","ms",o)}}else{const r=e/1e3%60;const n=typeof t.secondsDecimalDigits==="number"?t.secondsDecimalDigits:1;const o=floorDecimals(r,n);const s=t.keepDecimalsOnWholeSeconds?o:o.replace(/\.0+$/,"");add(Number.parseFloat(s,10),"second","s",s)}if(r.length===0){return"0"+(t.verbose?" milliseconds":"ms")}if(t.compact){return r[0]}if(typeof t.unitCount==="number"){const e=t.colonNotation?"":" ";return r.slice(0,Math.max(t.unitCount,1)).join(e)}return t.colonNotation?r.join(""):r.join(" ")}},943:(e,t,r)=>{"use strict";const n=r(162);e.exports=()=>{const e=process.hrtime();const end=t=>n(process.hrtime(e))[t];const returnValue=()=>end("milliseconds");returnValue.rounded=()=>Math.round(end("milliseconds"));returnValue.seconds=()=>end("seconds");returnValue.nanoseconds=()=>end("nanoseconds");return returnValue}},491:e=>{"use strict";e.exports=require("assert")},300:e=>{"use strict";e.exports=require("buffer")},113:e=>{"use strict";e.exports=require("crypto")},361:e=>{"use strict";e.exports=require("events")},147:e=>{"use strict";e.exports=require("fs")},685:e=>{"use strict";e.exports=require("http")},808:e=>{"use strict";e.exports=require("net")},277:e=>{"use strict";e.exports=require("next/dist/compiled/@edge-runtime/primitives/crypto")},37:e=>{"use strict";e.exports=require("os")},17:e=>{"use strict";e.exports=require("path")},74:e=>{"use strict";e.exports=require("perf_hooks")},282:e=>{"use strict";e.exports=require("process")},477:e=>{"use strict";e.exports=require("punycode")},788:e=>{"use strict";e.exports=require("querystring")},781:e=>{"use strict";e.exports=require("stream")},404:e=>{"use strict";e.exports=require("tls")},837:e=>{"use strict";e.exports=require("util")},144:e=>{"use strict";e.exports=require("vm")},796:e=>{"use strict";e.exports=require("zlib")}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var r=__webpack_module_cache__[e]={exports:{}};var n=true;try{__webpack_modules__[e].call(r.exports,r,r.exports,__nccwpck_require__);n=false}finally{if(n)delete __webpack_module_cache__[e]}return r.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__={};(()=>{"use strict";var e=__webpack_exports__;Object.defineProperty(e,"__esModule",{value:true});e.EdgeRuntime=e.runServer=e.createHandler=e.consumeUint8ArrayReadableStream=void 0;var t=__nccwpck_require__(539);Object.defineProperty(e,"consumeUint8ArrayReadableStream",{enumerable:true,get:function(){return t.consumeUint8ArrayReadableStream}});Object.defineProperty(e,"createHandler",{enumerable:true,get:function(){return t.createHandler}});Object.defineProperty(e,"runServer",{enumerable:true,get:function(){return t.runServer}});var r=__nccwpck_require__(51);Object.defineProperty(e,"EdgeRuntime",{enumerable:true,get:function(){return r.EdgeRuntime}})})();module.exports=__webpack_exports__})(); \ No newline at end of file +(()=>{var __webpack_modules__={331:(__unused_webpack_module,exports,__nccwpck_require__)=>{"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.EdgeVM=void 0;const buffer_1=__nccwpck_require__(300);const require_1=__nccwpck_require__(179);const vm_1=__nccwpck_require__(547);const vm_2=__nccwpck_require__(144);class EdgeVM extends vm_1.VM{constructor(e={}){super({...e,extend:t=>e.extend?e.extend(addPrimitives(t)):addPrimitives(t)})}}exports.EdgeVM=EdgeVM;function addPrimitives(context){defineProperty(context,"self",{enumerable:true,value:context});defineProperty(context,"globalThis",{value:context});defineProperty(context,"Symbol",{value:Symbol});defineProperty(context,"clearInterval",{value:clearInterval});defineProperty(context,"clearTimeout",{value:clearTimeout});defineProperty(context,"setInterval",{value:setInterval});defineProperty(context,"setTimeout",{value:setTimeout});defineProperty(context,"EdgeRuntime",{value:"edge-runtime"});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/console"),scopedContext:{console:console}}),nonenumerable:["console"]});const encodings=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/encoding"),scopedContext:{Buffer:buffer_1.Buffer,global:{}}});defineProperties(context,{exports:encodings,nonenumerable:["atob","btoa","TextEncoder","TextDecoder"]});const streams=(0,require_1.requireWithCache)({path:require.resolve("next/dist/compiled/@edge-runtime/primitives/streams"),context:context});defineProperties(context,{exports:streams,nonenumerable:["ReadableStream","ReadableStreamBYOBReader","ReadableStreamDefaultReader","TransformStream","WritableStream","WritableStreamDefaultWriter"]});const abort=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/abort-controller")});defineProperties(context,{exports:abort,nonenumerable:["AbortController","AbortSignal","DOMException"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({cache:new Map([["punycode",{exports:__nccwpck_require__(477)}]]),context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/url"),scopedContext:{TextEncoder:encodings.TextEncoder,TextDecoder:encodings.TextDecoder}}),nonenumerable:["URL","URLSearchParams","URLPattern"]});const blob=(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/blob")});defineProperties(context,{exports:blob,nonenumerable:["Blob"]});const webFetch=(0,require_1.requireWithCache)({context:context,cache:new Map([["abort-controller",{exports:abort}],["assert",{exports:__nccwpck_require__(491)}],["buffer",{exports:__nccwpck_require__(300)}],["events",{exports:__nccwpck_require__(361)}],["http",{exports:__nccwpck_require__(685)}],["net",{exports:__nccwpck_require__(808)}],["perf_hooks",{exports:__nccwpck_require__(74)}],["querystring",{exports:__nccwpck_require__(788)}],["stream",{exports:__nccwpck_require__(781)}],["tls",{exports:__nccwpck_require__(404)}],["util",{exports:__nccwpck_require__(837)}],["zlib",{exports:__nccwpck_require__(796)}],[require.resolve("next/dist/compiled/@edge-runtime/primitives/streams"),{exports:streams}],[require.resolve("next/dist/compiled/@edge-runtime/primitives/blob"),{exports:blob}]]),path:require.resolve("next/dist/compiled/@edge-runtime/primitives/fetch"),scopedContext:{Uint8Array:createUint8ArrayForContext(context),Buffer:buffer_1.Buffer,global:{},queueMicrotask:queueMicrotask,setImmediate:setImmediate,clearImmediate:clearImmediate}});defineProperties(context,{exports:webFetch,nonenumerable:["fetch","File","FormData","Headers","Request","Response"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({cache:new Map([[require.resolve("next/dist/compiled/@edge-runtime/primitives/fetch"),{exports:webFetch}]]),context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/cache"),scopedContext:{global:{}}}),enumerable:["caches"],nonenumerable:["Cache","CacheStorage"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,cache:new Map([["crypto",{exports:__nccwpck_require__(113)}],["process",{exports:__nccwpck_require__(282)}]]),path:require.resolve("next/dist/compiled/@edge-runtime/primitives/crypto"),scopedContext:{Buffer:buffer_1.Buffer,Uint8Array:createUint8ArrayForContext(context)}}),enumerable:["crypto"],nonenumerable:["Crypto","CryptoKey","SubtleCrypto"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/events")}),nonenumerable:["Event","EventTarget","FetchEvent","PromiseRejectionEvent"]});defineProperties(context,{exports:(0,require_1.requireWithCache)({context:context,path:require.resolve("next/dist/compiled/@edge-runtime/primitives/structured-clone")}),nonenumerable:["structuredClone"]});return context}function defineProperty(e,t,r){var n,o,s;Object.defineProperty(e,t,{configurable:(n=r.configurable)!==null&&n!==void 0?n:false,enumerable:(o=r.enumerable)!==null&&o!==void 0?o:false,value:r.value,writable:(s=r.writable)!==null&&s!==void 0?s:true})}function defineProperties(e,t){var r,n;for(const n of(r=t.enumerable)!==null&&r!==void 0?r:[]){if(!t.exports[n]){throw new Error(`Attempt to export a nullable value for "${n}"`)}defineProperty(e,n,{enumerable:true,value:t.exports[n]})}for(const r of(n=t.nonenumerable)!==null&&n!==void 0?n:[]){if(!t.exports[r]){throw new Error(`Attempt to export a nullable value for "${r}"`)}defineProperty(e,r,{value:t.exports[r]})}}function createUint8ArrayForContext(e){return new Proxy((0,vm_2.runInContext)("Uint8Array",e),{construct(e,t){const r=new e(...t);if(!(t[0]instanceof buffer_1.Buffer)){return r}return new e([...r])}})}},994:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.VM=t.EdgeVM=void 0;var n=r(331);Object.defineProperty(t,"EdgeVM",{enumerable:true,get:function(){return n.EdgeVM}});var o=r(547);Object.defineProperty(t,"VM",{enumerable:true,get:function(){return o.VM}})},179:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.requireWithCache=t.createRequire=t.requireDependencies=void 0;const n=r(147);const o=r(144);const s=r(17);function requireDependencies(e){const{context:t,requireCache:r,dependencies:n}=e;const o=createRequire(t,r);for(const{path:e,mapExports:r}of n){const n=o(e,e);for(const e of Object.keys(r)){t[r[e]]=n[e]}}}t.requireDependencies=requireDependencies;function createRequire(e,t,r,i={}){return function requireFn(a,c){const E=require.resolve(c,{paths:[(0,s.dirname)(a)]});const u=t.get(c)||t.get(E);if(u!==undefined&&u!==null){return u.exports}const d={exports:{},loaded:false,id:E};t.set(E,d);r===null||r===void 0?void 0:r.add(E);const _=(0,o.runInContext)(`(function(module,exports,require,__dirname,__filename,${Object.keys(i).join(",")}) {${(0,n.readFileSync)(E,"utf-8")}\n})`,e);try{_(d,d.exports,requireFn.bind(null,E),(0,s.dirname)(E),E,...Object.values(i))}catch(e){t.delete(E);throw e}d.loaded=true;return d.exports}}t.createRequire=createRequire;function requireWithCache(e){var t;return createRequire(e.context,(t=e.cache)!==null&&t!==void 0?t:new Map,e.references,e.scopedContext).call(null,e.path,e.path)}t.requireWithCache=requireWithCache},579:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.tempFile=void 0;const o=r(277);const s=n(r(17));const i=n(r(147));const a=n(r(37));function tempFile(e){const t=s.default.join(a.default.tmpdir(),o.crypto.randomUUID());i.default.writeFileSync(t,e);return{path:t,remove:()=>i.default.unlinkSync(t)}}t.tempFile=tempFile},547:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.VM=void 0;const n=r(144);const o=r(179);const s=r(579);class VM{constructor(e={}){var t,r,s,i;const a=(0,n.createContext)({},{name:"Edge Runtime",codeGeneration:(t=e.codeGeneration)!==null&&t!==void 0?t:{strings:false,wasm:true}});this.requireCache=(r=e.requireCache)!==null&&r!==void 0?r:new Map;this.context=(i=(s=e.extend)===null||s===void 0?void 0:s.call(e,a))!==null&&i!==void 0?i:a;this.requireFn=(0,o.createRequire)(this.context,this.requireCache)}evaluate(e){return(0,n.runInContext)(e,this.context)}require(e){return this.requireFn(e,e)}requireInContext(e){const t=this.require(e);for(const[e,r]of Object.entries(t)){this.context[e]=r}}requireInlineInContext(e){const t=(0,s.tempFile)(e);this.requireInContext(t.path);t.remove()}}t.VM=VM},162:e=>{"use strict";e.exports=e=>{const t=e[0]*1e9+e[1];const r=t/1e6;const n=t/1e9;return{seconds:n,milliseconds:r,nanoseconds:t}}},458:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.EdgeRuntime=void 0;const n=r(994);let o;let s;class EdgeRuntime extends n.EdgeVM{constructor(e){super({...e,extend:t=>{var r,n;return(n=(r=e===null||e===void 0?void 0:e.extend)===null||r===void 0?void 0:r.call(e,t))!==null&&n!==void 0?n:t}});defineHandlerProps({object:this,setterName:"__onUnhandledRejectionHandler",setter:e=>o=e,getterName:"__rejectionHandlers",getter:()=>o});defineHandlerProps({object:this,setterName:"__onErrorHandler",setter:e=>s=e,getterName:"__errorHandlers",getter:()=>s});this.evaluate(getDefineEventListenersCode());this.dispatchFetch=this.evaluate(getDispatchFetchCode());if(e===null||e===void 0?void 0:e.initialCode){this.evaluate(e.initialCode)}}}t.EdgeRuntime=EdgeRuntime;process.on("unhandledRejection",(function invokeRejectionHandlers(e,t){o===null||o===void 0?void 0:o.forEach((r=>r({reason:e,promise:t})))}));process.on("uncaughtException",(function invokeErrorHandlers(e){s===null||s===void 0?void 0:s.forEach((t=>t(e)))}));function getDefineEventListenersCode(){return`\n Object.defineProperty(self, '__listeners', {\n configurable: false,\n enumerable: false,\n value: {},\n writable: true,\n })\n\n function __conditionallyUpdatesHandlerList(eventType) {\n if (eventType === 'unhandledrejection') {\n self.__onUnhandledRejectionHandler = self.__listeners[eventType];\n } else if (eventType === 'error') {\n self.__onErrorHandler = self.__listeners[eventType];\n }\n }\n\n function addEventListener(type, handler) {\n const eventType = type.toLowerCase();\n if (eventType === 'fetch' && self.__listeners.fetch) {\n throw new TypeError('You can register just one "fetch" event listener');\n }\n\n self.__listeners[eventType] = self.__listeners[eventType] || [];\n self.__listeners[eventType].push(handler);\n __conditionallyUpdatesHandlerList(eventType);\n }\n\n function removeEventListener(type, handler) {\n const eventType = type.toLowerCase();\n if (self.__listeners[eventType]) {\n self.__listeners[eventType] = self.__listeners[eventType].filter(item => {\n return item !== handler;\n });\n\n if (self.__listeners[eventType].length === 0) {\n delete self.__listeners[eventType];\n }\n }\n __conditionallyUpdatesHandlerList(eventType);\n }\n `}function getDispatchFetchCode(){return`(async function dispatchFetch(input, init) {\n const request = new Request(input, init);\n const event = new FetchEvent(request);\n if (!self.__listeners.fetch) {\n throw new Error("No fetch event listeners found");\n }\n\n const getResponse = ({ response, error }) => {\n if (error || !response || !(response instanceof Response)) {\n console.error(error ? error.toString() : 'The event listener did not respond')\n response = new Response(null, {\n statusText: 'Internal Server Error',\n status: 500\n })\n }\n\n response.waitUntil = () => Promise.all(event.awaiting);\n\n if (response.status < 300 || response.status >= 400 ) {\n response.headers.delete('content-encoding');\n response.headers.delete('transform-encoding');\n response.headers.delete('content-length');\n }\n\n return response;\n }\n\n try {\n await self.__listeners.fetch[0].call(event, event)\n } catch (error) {\n return getResponse({ error })\n }\n\n return Promise.resolve(event.response)\n .then(response => getResponse({ response }))\n .catch(error => getResponse({ error }))\n })`}function defineHandlerProps({object:e,setterName:t,setter:r,getterName:n,getter:o}){Object.defineProperty(e.context,t,{set:r,configurable:false,enumerable:false});Object.defineProperty(e,n,{get:o,configurable:false,enumerable:false})}},612:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.consumeUint8ArrayReadableStream=t.getClonableBodyStream=void 0;const n=r(781);function getClonableBodyStream(e,t,r){let n=null;return{finalize(){if(n){replaceRequestBody(e,bodyStreamToNodeStream(n))}},cloneBodyStream(){const o=n!==null&&n!==void 0?n:requestToBodyStream(e,t,r);const[s,i]=o.tee();n=s;return i}}}t.getClonableBodyStream=getClonableBodyStream;function requestToBodyStream(e,t,r){const n=new r({start(r){e.on("data",(e=>r.enqueue(new t([...new Uint8Array(e)]))));e.on("end",(()=>r.terminate()));e.on("error",(e=>r.error(e)))}});return n.readable}function bodyStreamToNodeStream(e){const t=e.getReader();return n.Readable.from(async function*(){while(true){const{done:e,value:r}=await t.read();if(e){return}yield r}}())}function replaceRequestBody(e,t){for(const r in t){let n=t[r];if(typeof n==="function"){n=n.bind(t)}e[r]=n}return e}async function*consumeUint8ArrayReadableStream(e){var t;const r=e===null||e===void 0?void 0:e.getReader();if(r){while(true){const{done:e,value:n}=await r.read();if(e){return}if(((t=n===null||n===void 0?void 0:n.constructor)===null||t===void 0?void 0:t.name)!=="Uint8Array"){throw new TypeError("This ReadableStream did not return bytes.")}yield n}}}t.consumeUint8ArrayReadableStream=consumeUint8ArrayReadableStream},857:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.createHandler=void 0;const o=r(612);const s=r(612);const i=n(r(606));const a=n(r(632));const c=n(r(943));function createHandler(e){const t=new Set;return{handler:async(r,n)=>{var E,u;try{const d=(0,c.default)();const _=r.method!=="GET"&&r.method!=="HEAD"?(0,s.getClonableBodyStream)(r,e.runtime.evaluate("Uint8Array"),e.runtime.context.TransformStream):undefined;const l=await e.runtime.dispatchFetch(String(getURL(r)),{headers:toRequestInitHeaders(r),method:r.method,body:_===null||_===void 0?void 0:_.cloneBodyStream()});const S=l.waitUntil();t.add(S);S.finally((()=>t.delete(S)));n.statusCode=l.status;n.statusMessage=l.statusText;for(const[e,t]of Object.entries(toNodeHeaders(l.headers))){if(t!==undefined){n.setHeader(e,t)}}if(l.body){for await(const e of(0,o.consumeUint8ArrayReadableStream)(l.body)){n.write(e)}}const R=`${r.socket.remoteAddress} ${r.method} ${r.url}`;const h=`${(E=(0,i.default)(d()).match(/[a-zA-Z]+|[0-9]+/g))===null||E===void 0?void 0:E.join(" ")}`;const p=`${n.statusCode} ${a.default[n.statusCode]}`;(u=e.logger)===null||u===void 0?void 0:u.debug(`${R} → ${p} in ${h}`);n.end()}finally{if(!n.finished){n.end()}}},waitUntil:()=>Promise.all(t)}}t.createHandler=createHandler;function getURL(e){var t;const r=((t=e.socket)===null||t===void 0?void 0:t.encrypted)?"https":"http";return new URL(String(e.url),`${r}://${String(e.headers.host)}`)}function toRequestInitHeaders(e){return Object.keys(e.headers).map((t=>{const r=e.headers[t];return[t,Array.isArray(r)?r.join(", "):r!==null&&r!==void 0?r:""]}))}function toNodeHeaders(e){const t={};if(e){for(const[r,n]of e.entries()){t[r]=r.toLowerCase()==="set-cookie"?e.getAll("set-cookie"):n}}return t}},492:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.runServer=t.createHandler=t.consumeUint8ArrayReadableStream=void 0;var n=r(612);Object.defineProperty(t,"consumeUint8ArrayReadableStream",{enumerable:true,get:function(){return n.consumeUint8ArrayReadableStream}});var o=r(857);Object.defineProperty(t,"createHandler",{enumerable:true,get:function(){return o.createHandler}});var s=r(757);Object.defineProperty(t,"runServer",{enumerable:true,get:function(){return s.runServer}})},757:function(e,t,r){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.runServer=void 0;const o=r(857);const s=r(361);const i=n(r(685));async function runServer(e){const{handler:t,waitUntil:r}=(0,o.createHandler)(e);const n=i.default.createServer(t);n.listen(e.port);try{await(0,s.once)(n,"listening")}catch(t){if((t===null||t===void 0?void 0:t.code)==="EADDRINUSE"){return runServer({...e,port:undefined})}throw t}const a=n.address();const c=typeof a==="string"||a==null?String(a):`http://localhost:${a.port}`;return{url:c,close:async()=>{await r();await new Promise(((e,t)=>n.close((r=>{if(r)t(r);e()}))))},waitUntil:r}}t.runServer=runServer},632:e=>{var t;t={"1xx":"Informational","1xx_NAME":"INFORMATIONAL","1xx_MESSAGE":"Indicates an interim response for communicating connection status or request progress prior to completing the requested action and sending a final response.",INFORMATIONAL:"1xx","2xx":"Successful","2xx_NAME":"SUCCESSFUL","2xx_MESSAGE":"Indicates that the client's request was successfully received, understood, and accepted.",SUCCESSFUL:"2xx","3xx":"Redirection","3xx_NAME":"REDIRECTION","3xx_MESSAGE":"Indicates that further action needs to be taken by the user agent in order to fulfill the request.",REDIRECTION:"3xx","4xx":"Client Error","4xx_NAME":"CLIENT_ERROR","4xx_MESSAGE":"Indicates that the client seems to have erred.",CLIENT_ERROR:"4xx","5xx":"Server Error","5xx_NAME":"SERVER_ERROR","5xx_MESSAGE":"Indicates that the server is aware that it has erred or is incapable of performing the requested method.",SERVER_ERROR:"5xx"};e.exports={classes:t,100:"Continue","100_NAME":"CONTINUE","100_MESSAGE":"The server has received the request headers and the client should proceed to send the request body.","100_CLASS":t.INFORMATIONAL,CONTINUE:100,101:"Switching Protocols","101_NAME":"SWITCHING_PROTOCOLS","101_MESSAGE":"The requester has asked the server to switch protocols and the server has agreed to do so.","101_CLASS":t.INFORMATIONAL,SWITCHING_PROTOCOLS:101,102:"Processing","102_NAME":"PROCESSING","102_MESSAGE":"A WebDAV request may contain many sub-requests involving file operations, requiring a long time to complete the request. This code indicates that the server has received and is processing the request, but no response is available yet.[7] This prevents the client from timing out and assuming the request was lost.","102_CLASS":t.INFORMATIONAL,PROCESSING:102,103:"Early Hints","103_NAME":"EARLY_HINTS","103_MESSAGE":"Used to return some response headers before final HTTP message.","103_CLASS":t.INFORMATIONAL,EARLY_HINTS:103,200:"OK","200_NAME":"OK","200_MESSAGE":"Standard response for successful HTTP requests.","200_CLASS":t.SUCCESSFUL,OK:200,201:"Created","201_NAME":"CREATED","201_MESSAGE":"The request has been fulfilled, resulting in the creation of a new resource.","201_CLASS":t.SUCCESSFUL,CREATED:201,202:"Accepted","202_NAME":"ACCEPTED","202_MESSAGE":"The request has been accepted for processing, but the processing has not been completed.","202_CLASS":t.SUCCESSFUL,ACCEPTED:202,203:"Non-Authoritative Information","203_NAME":"NON_AUTHORITATIVE_INFORMATION","203_MESSAGE":"The server is a transforming proxy (e.g. a Web accelerator) that received a 200 OK from its origin, but is returning a modified version of the origin's response.","203_CLASS":t.SUCCESSFUL,NON_AUTHORITATIVE_INFORMATION:203,204:"No Content","204_NAME":"NO_CONTENT","204_MESSAGE":"The server successfully processed the request and is not returning any content.","204_CLASS":t.SUCCESSFUL,NO_CONTENT:204,205:"Reset Content","205_NAME":"RESET_CONTENT","205_MESSAGE":"The server successfully processed the request, but is not returning any content. Unlike a 204 response, this response requires that the requester reset the document view.","205_CLASS":t.SUCCESSFUL,RESET_CONTENT:205,206:"Partial Content","206_NAME":"PARTIAL_CONTENT","206_MESSAGE":"The server is delivering only part of the resource (byte serving) due to a range header sent by the client.","206_CLASS":t.SUCCESSFUL,PARTIAL_CONTENT:206,207:"Multi Status","207_NAME":"MULTI_STATUS","207_MESSAGE":"The message body that follows is by default an XML message and can contain a number of separate response codes, depending on how many sub-requests were made.","207_CLASS":t.SUCCESSFUL,MULTI_STATUS:207,208:"Already Reported","208_NAME":"ALREADY_REPORTED","208_MESSAGE":"The members of a DAV binding have already been enumerated in a preceding part of the (multistatus) response, and are not being included again.","208_CLASS":t.SUCCESSFUL,ALREADY_REPORTED:208,226:"IM Used","226_NAME":"IM_USED","226_MESSAGE":"The server has fulfilled a request for the resource, and the response is a representation of the result of one or more instance-manipulations applied to the current instance.","226_CLASS":t.SUCCESSFUL,IM_USED:226,300:"Multiple Choices","300_NAME":"MULTIPLE_CHOICES","300_MESSAGE":"Indicates multiple options for the resource from which the client may choose.","300_CLASS":t.REDIRECTION,MULTIPLE_CHOICES:300,301:"Moved Permanently","301_NAME":"MOVED_PERMANENTLY","301_MESSAGE":"This and all future requests should be directed to the given URI.","301_CLASS":t.REDIRECTION,MOVED_PERMANENTLY:301,302:"Found","302_NAME":"FOUND","302_MESSAGE":'This is an example of industry practice contradicting the standard. The HTTP/1.0 specification (RFC 1945) required the client to perform a temporary redirect (the original describing phrase was "Moved Temporarily"), but popular browsers implemented 302 with the functionality of a 303 See Other. Therefore, HTTP/1.1 added status codes 303 and 307 to distinguish between the two behaviours.',"302_CLASS":t.REDIRECTION,FOUND:302,303:"See Other","303_NAME":"SEE_OTHER","303_MESSAGE":"The response to the request can be found under another URI using the GET method.","303_CLASS":t.REDIRECTION,SEE_OTHER:303,304:"Not Modified","304_NAME":"NOT_MODIFIED","304_MESSAGE":"Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-None-Match.","304_CLASS":t.REDIRECTION,NOT_MODIFIED:304,305:"Use Proxy","305_NAME":"USE_PROXY","305_MESSAGE":"The requested resource is available only through a proxy, the address for which is provided in the response.","305_CLASS":t.REDIRECTION,USE_PROXY:305,306:"Switch Proxy","306_NAME":"SWITCH_PROXY","306_MESSAGE":'No longer used. Originally meant "Subsequent requests should use the specified proxy.',"306_CLASS":t.REDIRECTION,SWITCH_PROXY:306,307:"Temporary Redirect","307_NAME":"TEMPORARY_REDIRECT","307_MESSAGE":"In this case, the request should be repeated with another URI; however, future requests should still use the original URI.","307_CLASS":t.REDIRECTION,TEMPORARY_REDIRECT:307,308:"Permanent Redirect","308_NAME":"PERMANENT_REDIRECT","308_MESSAGE":"The request and all future requests should be repeated using another URI.","308_CLASS":t.REDIRECTION,PERMANENT_REDIRECT:308,400:"Bad Request","400_NAME":"BAD_REQUEST","400_MESSAGE":"The server cannot or will not process the request due to an apparent client error.","400_CLASS":t.CLIENT_ERROR,BAD_REQUEST:400,401:"Unauthorized","401_NAME":"UNAUTHORIZED","401_MESSAGE":"Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided.","401_CLASS":t.CLIENT_ERROR,UNAUTHORIZED:401,402:"Payment Required","402_NAME":"PAYMENT_REQUIRED","402_MESSAGE":"Reserved for future use. The original intention was that this code might be used as part of some form of digital cash or micropayment scheme, as proposed for example by GNU Taler, but that has not yet happened, and this code is not usually used.","402_CLASS":t.CLIENT_ERROR,PAYMENT_REQUIRED:402,403:"Forbidden","403_NAME":"FORBIDDEN","403_MESSAGE":"The request was valid, but the server is refusing action.","403_CLASS":t.CLIENT_ERROR,FORBIDDEN:403,404:"Not Found","404_NAME":"NOT_FOUND","404_MESSAGE":"The requested resource could not be found but may be available in the future. Subsequent requests by the client are permissible.","404_CLASS":t.CLIENT_ERROR,NOT_FOUND:404,405:"Method Not Allowed","405_NAME":"METHOD_NOT_ALLOWED","405_MESSAGE":"A request method is not supported for the requested resource.","405_CLASS":t.CLIENT_ERROR,METHOD_NOT_ALLOWED:405,406:"Not Acceptable","406_NAME":"NOT_ACCEPTABLE","406_MESSAGE":"The requested resource is capable of generating only content not acceptable according to the Accept headers sent in the request.","406_CLASS":t.CLIENT_ERROR,NOT_ACCEPTABLE:406,407:"Proxy Authentication Required","407_NAME":"PROXY_AUTHENTICATION_REQUIRED","407_MESSAGE":"The client must first authenticate itself with the proxy.","407_CLASS":t.CLIENT_ERROR,PROXY_AUTHENTICATION_REQUIRED:407,408:"Request Time-out","408_NAME":"REQUEST_TIMEOUT","408_MESSAGE":"The server timed out waiting for the request.","408_CLASS":t.CLIENT_ERROR,REQUEST_TIMEOUT:408,409:"Conflict","409_NAME":"CONFLICT","409_MESSAGE":"Indicates that the request could not be processed because of conflict in the request, such as an edit conflict between multiple simultaneous updates.","409_CLASS":t.CLIENT_ERROR,CONFLICT:409,410:"Gone","410_NAME":"GONE","410_MESSAGE":"Indicates that the resource requested is no longer available and will not be available again.","410_CLASS":t.CLIENT_ERROR,GONE:410,411:"Length Required","411_NAME":"LENGTH_REQUIRED","411_MESSAGE":"The request did not specify the length of its content, which is required by the requested resource.","411_CLASS":t.CLIENT_ERROR,LENGTH_REQUIRED:411,412:"Precondition Failed","412_NAME":"PRECONDITION_FAILED","412_MESSAGE":"The server does not meet one of the preconditions that the requester put on the request.","412_CLASS":t.CLIENT_ERROR,PRECONDITION_FAILED:412,413:"Request Entity Too Large","413_NAME":"REQUEST_ENTITY_TOO_LARGE","413_MESSAGE":'The request is larger than the server is willing or able to process. Previously called "Request Entity Too Large".',"413_CLASS":t.CLIENT_ERROR,REQUEST_ENTITY_TOO_LARGE:413,414:"Request-URI Too Large","414_NAME":"REQUEST_URI_TOO_LONG","414_MESSAGE":"The URI provided was too long for the server to process.","414_CLASS":t.CLIENT_ERROR,REQUEST_URI_TOO_LONG:414,415:"Unsupported Media Type","415_NAME":"UNSUPPORTED_MEDIA_TYPE","415_MESSAGE":"The request entity has a media type which the server or resource does not support.","415_CLASS":t.CLIENT_ERROR,UNSUPPORTED_MEDIA_TYPE:415,416:"Requested Range not Satisfiable","416_NAME":"REQUESTED_RANGE_NOT_SATISFIABLE","416_MESSAGE":"The client has asked for a portion of the file (byte serving), but the server cannot supply that portion.","416_CLASS":t.CLIENT_ERROR,REQUESTED_RANGE_NOT_SATISFIABLE:416,417:"Expectation Failed","417_NAME":"EXPECTATION_FAILED","417_MESSAGE":"The server cannot meet the requirements of the Expect request-header field.","417_CLASS":t.CLIENT_ERROR,EXPECTATION_FAILED:417,418:"I'm a teapot","418_NAME":"IM_A_TEAPOT","418_MESSAGE":'Any attempt to brew coffee with a teapot should result in the error code "418 I\'m a teapot". The resulting entity body MAY be short and stout.',"418_CLASS":t.CLIENT_ERROR,IM_A_TEAPOT:418,421:"Misdirected Request","421_NAME":"MISDIRECTED_REQUEST","421_MESSAGE":"The request was directed at a server that is not able to produce a response.","421_CLASS":t.CLIENT_ERROR,MISDIRECTED_REQUEST:421,422:"Unprocessable Entity","422_NAME":"UNPROCESSABLE_ENTITY","422_MESSAGE":"The request was well-formed but was unable to be followed due to semantic errors.","422_CLASS":t.CLIENT_ERROR,UNPROCESSABLE_ENTITY:422,423:"Locked","423_NAME":"LOCKED","423_MESSAGE":"The resource that is being accessed is locked.","423_CLASS":t.CLIENT_ERROR,LOCKED:423,424:"Failed Dependency","424_NAME":"FAILED_DEPENDENCY","424_MESSAGE":"The request failed because it depended on another request and that request failed.","424_CLASS":t.CLIENT_ERROR,FAILED_DEPENDENCY:424,426:"Upgrade Required","426_NAME":"UPGRADE_REQUIRED","426_MESSAGE":"The client should switch to a different protocol such as TLS/1.0, given in the Upgrade header field.","426_CLASS":t.CLIENT_ERROR,UPGRADE_REQUIRED:426,428:"Precondition Required","428_NAME":"PRECONDITION_REQUIRED","428_MESSAGE":"The origin server requires the request to be conditional.","428_CLASS":t.CLIENT_ERROR,PRECONDITION_REQUIRED:428,429:"Too Many Requests","429_NAME":"TOO_MANY_REQUESTS","429_MESSAGE":"The user has sent too many requests in a given amount of time.","429_CLASS":t.CLIENT_ERROR,TOO_MANY_REQUESTS:429,431:"Request Header Fields Too Large","431_NAME":"REQUEST_HEADER_FIELDS_TOO_LARGE","431_MESSAGE":"The server is unwilling to process the request because either an individual header field, or all the header fields collectively, are too large.","431_CLASS":t.CLIENT_ERROR,REQUEST_HEADER_FIELDS_TOO_LARGE:431,451:"Unavailable For Legal Reasons","451_NAME":"UNAVAILABLE_FOR_LEGAL_REASONS","451_MESSAGE":"A server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.","451_CLASS":t.CLIENT_ERROR,UNAVAILABLE_FOR_LEGAL_REASONS:451,500:"Internal Server Error","500_NAME":"INTERNAL_SERVER_ERROR","500_MESSAGE":"A generic error message, given when an unexpected condition was encountered and no more specific message is suitable.","500_CLASS":t.SERVER_ERROR,INTERNAL_SERVER_ERROR:500,501:"Not Implemented","501_NAME":"NOT_IMPLEMENTED","501_MESSAGE":"The server either does not recognize the request method, or it lacks the ability to fulfil the request. Usually this implies future availability.","501_CLASS":t.SERVER_ERROR,NOT_IMPLEMENTED:501,502:"Bad Gateway","502_NAME":"BAD_GATEWAY","502_MESSAGE":"The server was acting as a gateway or proxy and received an invalid response from the upstream server.","502_CLASS":t.SERVER_ERROR,BAD_GATEWAY:502,503:"Service Unavailable","503_NAME":"SERVICE_UNAVAILABLE","503_MESSAGE":"The server is currently unavailable (because it is overloaded or down for maintenance). Generally, this is a temporary state.","503_CLASS":t.SERVER_ERROR,SERVICE_UNAVAILABLE:503,504:"Gateway Time-out","504_NAME":"GATEWAY_TIMEOUT","504_MESSAGE":"The server was acting as a gateway or proxy and did not receive a timely response from the upstream server.","504_CLASS":t.SERVER_ERROR,GATEWAY_TIMEOUT:504,505:"HTTP Version not Supported","505_NAME":"HTTP_VERSION_NOT_SUPPORTED","505_MESSAGE":"The server does not support the HTTP protocol version used in the request.","505_CLASS":t.SERVER_ERROR,HTTP_VERSION_NOT_SUPPORTED:505,506:"Variant Also Negotiates","506_NAME":"VARIANT_ALSO_NEGOTIATES","506_MESSAGE":"Transparent content negotiation for the request results in a circular reference.","506_CLASS":t.SERVER_ERROR,VARIANT_ALSO_NEGOTIATES:506,507:"Insufficient Storage","507_NAME":"INSUFFICIENT_STORAGE","507_MESSAGE":"The server is unable to store the representation needed to complete the request.","507_CLASS":t.SERVER_ERROR,INSUFFICIENT_STORAGE:507,508:"Loop Detected","508_NAME":"LOOP_DETECTED","508_MESSAGE":"The server detected an infinite loop while processing the request.","508_CLASS":t.SERVER_ERROR,LOOP_DETECTED:508,510:"Not Extended","510_NAME":"NOT_EXTENDED","510_MESSAGE":"Further extensions to the request are required for the server to fulfil it.","510_CLASS":t.SERVER_ERROR,NOT_EXTENDED:510,511:"Network Authentication Required","511_NAME":"NETWORK_AUTHENTICATION_REQUIRED","511_MESSAGE":"The client needs to authenticate to gain network access. Intended for use by intercepting proxies used to control access to the network.","511_CLASS":t.SERVER_ERROR,NETWORK_AUTHENTICATION_REQUIRED:511,extra:{unofficial:{103:"Checkpoint","103_NAME":"CHECKPOINT","103_MESSAGE":"Used in the resumable requests proposal to resume aborted PUT or POST requests.","103_CLASS":t.INFORMATIONAL,CHECKPOINT:103,419:"Page Expired","419_NAME":"PAGE_EXPIRED","419_MESSAGE":"Used by the Laravel Framework when a CSRF Token is missing or expired.","419_CLASS":t.CLIENT_ERROR,PAGE_EXPIRED:419,218:"This is fine","218_NAME":"THIS_IS_FINE","218_MESSAGE":"Used as a catch-all error condition for allowing response bodies to flow through Apache when ProxyErrorOverride is enabled. When ProxyErrorOverride is enabled in Apache, response bodies that contain a status code of 4xx or 5xx are automatically discarded by Apache in favor of a generic response or a custom response specified by the ErrorDocument directive.","218_CLASS":t.SUCCESSFUL,THIS_IS_FINE:218,420:"Enhance Your Calm","420_NAME":"ENHANCE_YOUR_CALM","420_MESSAGE":"Returned by version 1 of the Twitter Search and Trends API when the client is being rate limited; versions 1.1 and later use the 429 Too Many Requests response code instead.","420_CLASS":t.CLIENT_ERROR,ENHANCE_YOUR_CALM:420,450:"Blocked by Windows Parental Controls","450_NAME":"BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS","450_MESSAGE":"The Microsoft extension code indicated when Windows Parental Controls are turned on and are blocking access to the requested webpage.","450_CLASS":t.CLIENT_ERROR,BLOCKED_BY_WINDOWS_PARENTAL_CONTROLS:450,498:"Invalid Token","498_NAME":"INVALID_TOKEN","498_MESSAGE":"Returned by ArcGIS for Server. Code 498 indicates an expired or otherwise invalid token.","498_CLASS":t.CLIENT_ERROR,INVALID_TOKEN:498,499:"Token Required","499_NAME":"TOKEN_REQUIRED","499_MESSAGE":"Returned by ArcGIS for Server. Code 499 indicates that a token is required but was not submitted.","499_CLASS":t.CLIENT_ERROR,TOKEN_REQUIRED:499,509:"Bandwidth Limit Exceeded","509_NAME":"BANDWIDTH_LIMIT_EXCEEDED","509_MESSAGE":"The server has exceeded the bandwidth specified by the server administrator.","509_CLASS":t.SERVER_ERROR,BANDWIDTH_LIMIT_EXCEEDED:509,530:"Site is frozen","530_NAME":"SITE_IS_FROZEN","530_MESSAGE":"Used by the Pantheon web platform to indicate a site that has been frozen due to inactivity.","530_CLASS":t.SERVER_ERROR,SITE_IS_FROZEN:530,598:"Network read timeout error","598_NAME":"NETWORK_READ_TIMEOUT_ERROR","598_MESSAGE":"Used by some HTTP proxies to signal a network read timeout behind the proxy to a client in front of the proxy.","598_CLASS":t.SERVER_ERROR,NETWORK_READ_TIMEOUT_ERROR:598},iis:{440:"Login Time-out","440_NAME":"LOGIN_TIME_OUT","440_MESSAGE":"The client's session has expired and must log in again.","440_CLASS":t.CLIENT_ERROR,LOGIN_TIME_OUT:440,449:"Retry With","449_NAME":"RETRY_WITH","449_MESSAGE":"The server cannot honour the request because the user has not provided the required information.","449_CLASS":t.CLIENT_ERROR,RETRY_WITH:449,451:"Redirect","451_NAME":"REDIRECT","451_MESSAGE":"Used in Exchange ActiveSync when either a more efficient server is available or the server cannot access the users' mailbox.","451_CLASS":t.CLIENT_ERROR,REDIRECT:451},nginx:{444:"No Response","444_NAME":"NO_RESPONSE","444_MESSAGE":"Used internally to instruct the server to return no information to the client and close the connection immediately.","444_CLASS":t.CLIENT_ERROR,NO_RESPONSE:444,494:"Request header too large","494_NAME":"REQUEST_HEADER_TOO_LARGE","494_MESSAGE":"Client sent too large request or too long header line.","494_CLASS":t.CLIENT_ERROR,REQUEST_HEADER_TOO_LARGE:494,495:"SSL Certificate Error","495_NAME":"SSL_CERTIFICATE_ERROR","495_MESSAGE":"An expansion of the 400 Bad Request response code, used when the client has provided an invalid client certificate.","495_CLASS":t.CLIENT_ERROR,SSL_CERTIFICATE_ERROR:495,496:"SSL Certificate Required","496_NAME":"SSL_CERTIFICATE_REQUIRED","496_MESSAGE":"An expansion of the 400 Bad Request response code, used when a client certificate is required but not provided.","496_CLASS":t.CLIENT_ERROR,SSL_CERTIFICATE_REQUIRED:496,497:"HTTP Request Sent to HTTPS Port","497_NAME":"HTTP_REQUEST_SENT_TO_HTTPS_PORT","497_MESSAGE":"An expansion of the 400 Bad Request response code, used when the client has made a HTTP request to a port listening for HTTPS requests.","497_CLASS":t.CLIENT_ERROR,HTTP_REQUEST_SENT_TO_HTTPS_PORT:497,499:"Client Closed Request","499_NAME":"CLIENT_CLOSED_REQUEST","499_MESSAGE":"Used when the client has closed the request before the server could send a response.","499_CLASS":t.CLIENT_ERROR,CLIENT_CLOSED_REQUEST:499},cloudflare:{520:"Unknown Error","520_NAME":"UNKNOWN_ERROR","520_MESSAGE":'The 520 error is used as a "catch-all response for when the origin server returns something unexpected", listing connection resets, large headers, and empty or invalid responses as common triggers.',"520_CLASS":t.SERVER_ERROR,UNKNOWN_ERROR:520,521:"Web Server Is Down","521_NAME":"WEB_SERVER_IS_DOWN","521_MESSAGE":"The origin server has refused the connection from Cloudflare.","521_CLASS":t.SERVER_ERROR,WEB_SERVER_IS_DOWN:521,522:"Connection Timed Out","522_NAME":"CONNECTION_TIMED_OUT","522_MESSAGE":"Cloudflare could not negotiate a TCP handshake with the origin server.","522_CLASS":t.SERVER_ERROR,CONNECTION_TIMED_OUT:522,523:"Origin Is Unreachable","523_NAME":"ORIGIN_IS_UNREACHABLE","523_MESSAGE":"Cloudflare could not reach the origin server.","523_CLASS":t.SERVER_ERROR,ORIGIN_IS_UNREACHABLE:523,524:"A Timeout Occurred","524_NAME":"A_TIMEOUT_OCCURRED","524_MESSAGE":"Cloudflare was able to complete a TCP connection to the origin server, but did not receive a timely HTTP response.","524_CLASS":t.SERVER_ERROR,A_TIMEOUT_OCCURRED:524,525:"SSL Handshake Failed","525_NAME":"SSL_HANDSHAKE_FAILED","525_MESSAGE":"Cloudflare could not negotiate a SSL/TLS handshake with the origin server.","525_CLASS":t.SERVER_ERROR,SSL_HANDSHAKE_FAILED:525,526:"Invalid SSL Certificate","526_NAME":"INVALID_SSL_CERTIFICATE","526_MESSAGE":"Cloudflare could not validate the SSL/TLS certificate that the origin server presented.","526_CLASS":t.SERVER_ERROR,INVALID_SSL_CERTIFICATE:526,527:"Railgun Error","527_NAME":"RAILGUN_ERROR","527_MESSAGE":"Error 527 indicates that the request timed out or failed after the WAN connection had been established.","527_CLASS":t.SERVER_ERROR,RAILGUN_ERROR:527}}}},523:e=>{"use strict";e.exports=e=>{if(typeof e!=="number"){throw new TypeError("Expected a number")}const t=e>0?Math.floor:Math.ceil;return{days:t(e/864e5),hours:t(e/36e5)%24,minutes:t(e/6e4)%60,seconds:t(e/1e3)%60,milliseconds:t(e)%1e3,microseconds:t(e*1e3)%1e3,nanoseconds:t(e*1e6)%1e3}}},606:(e,t,r)=>{"use strict";const n=r(523);const pluralize=(e,t)=>t===1?e:`${e}s`;const o=1e-7;e.exports=(e,t={})=>{if(!Number.isFinite(e)){throw new TypeError("Expected a finite number")}if(t.colonNotation){t.compact=false;t.formatSubMilliseconds=false;t.separateMilliseconds=false;t.verbose=false}if(t.compact){t.secondsDecimalDigits=0;t.millisecondsDecimalDigits=0}const r=[];const floorDecimals=(e,t)=>{const r=Math.floor(e*10**t+o);const n=Math.round(r)/10**t;return n.toFixed(t)};const add=(e,n,o,s)=>{if((r.length===0||!t.colonNotation)&&e===0&&!(t.colonNotation&&o==="m")){return}s=(s||e||"0").toString();let i;let a;if(t.colonNotation){i=r.length>0?":":"";a="";const e=s.includes(".")?s.split(".")[0].length:s.length;const t=r.length>0?2:1;s="0".repeat(Math.max(0,t-e))+s}else{i="";a=t.verbose?" "+pluralize(n,e):o}r.push(i+s+a)};const s=n(e);add(Math.trunc(s.days/365),"year","y");add(s.days%365,"day","d");add(s.hours,"hour","h");add(s.minutes,"minute","m");if(t.separateMilliseconds||t.formatSubMilliseconds||!t.colonNotation&&e<1e3){add(s.seconds,"second","s");if(t.formatSubMilliseconds){add(s.milliseconds,"millisecond","ms");add(s.microseconds,"microsecond","µs");add(s.nanoseconds,"nanosecond","ns")}else{const e=s.milliseconds+s.microseconds/1e3+s.nanoseconds/1e6;const r=typeof t.millisecondsDecimalDigits==="number"?t.millisecondsDecimalDigits:0;const n=e>=1?Math.round(e):Math.ceil(e);const o=r?e.toFixed(r):n;add(Number.parseFloat(o,10),"millisecond","ms",o)}}else{const r=e/1e3%60;const n=typeof t.secondsDecimalDigits==="number"?t.secondsDecimalDigits:1;const o=floorDecimals(r,n);const s=t.keepDecimalsOnWholeSeconds?o:o.replace(/\.0+$/,"");add(Number.parseFloat(s,10),"second","s",s)}if(r.length===0){return"0"+(t.verbose?" milliseconds":"ms")}if(t.compact){return r[0]}if(typeof t.unitCount==="number"){const e=t.colonNotation?"":" ";return r.slice(0,Math.max(t.unitCount,1)).join(e)}return t.colonNotation?r.join(""):r.join(" ")}},943:(e,t,r)=>{"use strict";const n=r(162);e.exports=()=>{const e=process.hrtime();const end=t=>n(process.hrtime(e))[t];const returnValue=()=>end("milliseconds");returnValue.rounded=()=>Math.round(end("milliseconds"));returnValue.seconds=()=>end("seconds");returnValue.nanoseconds=()=>end("nanoseconds");return returnValue}},491:e=>{"use strict";e.exports=require("assert")},300:e=>{"use strict";e.exports=require("buffer")},113:e=>{"use strict";e.exports=require("crypto")},361:e=>{"use strict";e.exports=require("events")},147:e=>{"use strict";e.exports=require("fs")},685:e=>{"use strict";e.exports=require("http")},808:e=>{"use strict";e.exports=require("net")},277:e=>{"use strict";e.exports=require("next/dist/compiled/@edge-runtime/primitives/crypto")},37:e=>{"use strict";e.exports=require("os")},17:e=>{"use strict";e.exports=require("path")},74:e=>{"use strict";e.exports=require("perf_hooks")},282:e=>{"use strict";e.exports=require("process")},477:e=>{"use strict";e.exports=require("punycode")},788:e=>{"use strict";e.exports=require("querystring")},781:e=>{"use strict";e.exports=require("stream")},404:e=>{"use strict";e.exports=require("tls")},837:e=>{"use strict";e.exports=require("util")},144:e=>{"use strict";e.exports=require("vm")},796:e=>{"use strict";e.exports=require("zlib")}};var __webpack_module_cache__={};function __nccwpck_require__(e){var t=__webpack_module_cache__[e];if(t!==undefined){return t.exports}var r=__webpack_module_cache__[e]={exports:{}};var n=true;try{__webpack_modules__[e].call(r.exports,r,r.exports,__nccwpck_require__);n=false}finally{if(n)delete __webpack_module_cache__[e]}return r.exports}if(typeof __nccwpck_require__!=="undefined")__nccwpck_require__.ab=__dirname+"/";var __webpack_exports__={};(()=>{"use strict";var e=__webpack_exports__;Object.defineProperty(e,"__esModule",{value:true});e.EdgeRuntime=e.runServer=e.createHandler=e.consumeUint8ArrayReadableStream=void 0;var t=__nccwpck_require__(492);Object.defineProperty(e,"consumeUint8ArrayReadableStream",{enumerable:true,get:function(){return t.consumeUint8ArrayReadableStream}});Object.defineProperty(e,"createHandler",{enumerable:true,get:function(){return t.createHandler}});Object.defineProperty(e,"runServer",{enumerable:true,get:function(){return t.runServer}});var r=__nccwpck_require__(458);Object.defineProperty(e,"EdgeRuntime",{enumerable:true,get:function(){return r.EdgeRuntime}})})();module.exports=__webpack_exports__})(); \ No newline at end of file diff --git a/packages/next/package.json b/packages/next/package.json index c78f9b61bd8..2a8d05e7d67 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -121,7 +121,7 @@ "@babel/runtime": "7.15.4", "@babel/traverse": "7.18.0", "@babel/types": "7.18.0", - "@edge-runtime/primitives": "1.1.0-beta.37", + "@edge-runtime/primitives": "1.1.0", "@hapi/accept": "5.0.2", "@napi-rs/cli": "2.12.0", "@napi-rs/triples": "1.1.0", @@ -204,7 +204,7 @@ "debug": "4.1.1", "devalue": "2.0.1", "domain-browser": "4.19.0", - "edge-runtime": "1.1.0-beta.40", + "edge-runtime": "1.1.0", "events": "3.3.0", "find-cache-dir": "3.3.1", "find-up": "4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7997d7f0cdd..4db41f6969d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -18,7 +18,7 @@ importers: '@babel/plugin-proposal-object-rest-spread': 7.14.7 '@babel/preset-flow': 7.14.5 '@babel/preset-react': 7.14.5 - '@edge-runtime/jest-environment': 1.1.0-beta.36 + '@edge-runtime/jest-environment': 1.1.0 '@fullhuman/postcss-purgecss': 1.3.0 '@mdx-js/loader': 0.18.0 '@next/bundle-analyzer': workspace:* @@ -179,7 +179,7 @@ importers: '@babel/plugin-proposal-object-rest-spread': 7.14.7_@babel+core@7.18.0 '@babel/preset-flow': 7.14.5_@babel+core@7.18.0 '@babel/preset-react': 7.14.5_@babel+core@7.18.0 - '@edge-runtime/jest-environment': 1.1.0-beta.36 + '@edge-runtime/jest-environment': 1.1.0 '@fullhuman/postcss-purgecss': 1.3.0 '@mdx-js/loader': 0.18.0_uuaxwgga6hqycsez5ok7v2wg4i '@next/bundle-analyzer': link:packages/next-bundle-analyzer @@ -465,7 +465,7 @@ importers: '@babel/runtime': 7.15.4 '@babel/traverse': 7.18.0 '@babel/types': 7.18.0 - '@edge-runtime/primitives': 1.1.0-beta.37 + '@edge-runtime/primitives': 1.1.0 '@hapi/accept': 5.0.2 '@napi-rs/cli': 2.12.0 '@napi-rs/triples': 1.1.0 @@ -551,7 +551,7 @@ importers: debug: 4.1.1 devalue: 2.0.1 domain-browser: 4.19.0 - edge-runtime: 1.1.0-beta.40 + edge-runtime: 1.1.0 events: 3.3.0 find-cache-dir: 3.3.1 find-up: 4.1.0 @@ -666,7 +666,7 @@ importers: '@babel/runtime': 7.15.4 '@babel/traverse': 7.18.0 '@babel/types': 7.18.0 - '@edge-runtime/primitives': 1.1.0-beta.37 + '@edge-runtime/primitives': 1.1.0 '@hapi/accept': 5.0.2 '@napi-rs/cli': 2.12.0 '@napi-rs/triples': 1.1.0 @@ -749,7 +749,7 @@ importers: debug: 4.1.1 devalue: 2.0.1 domain-browser: 4.19.0 - edge-runtime: 1.1.0-beta.40 + edge-runtime: 1.1.0 events: 3.3.0 find-cache-dir: 3.3.1 find-up: 4.1.0 @@ -4002,20 +4002,20 @@ packages: protobufjs: 6.11.2 dev: true - /@edge-runtime/format/1.1.0-beta.34: + /@edge-runtime/format/1.1.0: resolution: { - integrity: sha512-AdV7FlpBDDiwdPxmrCmq2ICMxzJr3Zoq/bUuIMC09jEmx8fpIAepAABVTEqr+X/6vhIiD2ermIog8qvAG4RZMg==, + integrity: sha512-MkLDDtPhXZIMx83NykdFmOpF7gVWIdd6GBHYb8V/E+PKWvD2pK/qWx9B30oN1iDJ2XBm0SGDjz02S8nDHI9lMQ==, } dev: true - /@edge-runtime/jest-environment/1.1.0-beta.36: + /@edge-runtime/jest-environment/1.1.0: resolution: { - integrity: sha512-A4geGu+6i61CBlOGd5eqwNGiREatm7aWO3wJ4gUGcA2BH23v4SgVIJUdt0cpNQku69nMshb0AGk3XhHnqUC5rg==, + integrity: sha512-YwiR+zxAt3BksS1DrOuVdqnDw+18EZxm3vpGo8vuxqKXOg9UNdmj7c3nfkdTdhQ3gr3+sSpcS/4+vLoqW1QSKA==, } dependencies: - '@edge-runtime/vm': 1.1.0-beta.37 + '@edge-runtime/vm': 1.1.0 '@jest/environment': 28.1.3 '@jest/fake-timers': 28.1.3 '@jest/types': 28.1.3 @@ -4023,20 +4023,20 @@ packages: jest-util: 28.1.3 dev: true - /@edge-runtime/primitives/1.1.0-beta.37: + /@edge-runtime/primitives/1.1.0: resolution: { - integrity: sha512-S3aN8X6wXhM7CJI3FRF480CMNkw4mH6grMV/enQz8VWGrvD1U5njQNRh/Zymoe0RHzEI/aIDjSk3V49h+ULt9g==, + integrity: sha512-MpL5fKlOs9mz5DMRuFchLe3Il84t7XpfbPq4qtaEK37uNMCRx1MzA3d7A4aTsR/guXSZvV/AtEbKVqBWjuSThA==, } dev: true - /@edge-runtime/vm/1.1.0-beta.37: + /@edge-runtime/vm/1.1.0: resolution: { - integrity: sha512-1OrFifIxDFpwb1VyrFD8kwWVppc6D1uN7xh5jQzW7jHaVJ0Dw4C2nSAbLe6YKPYj67o09vW72WLzfUcryeD0Pg==, + integrity: sha512-a3PSCdznoop5+ifkNDaSINB9V+Anwh+wpoaASIWhq9PLQuBF9D6Yxe/mLRZkuZRkOJ2ZmaTzMGDI5ROUChTL7g==, } dependencies: - '@edge-runtime/primitives': 1.1.0-beta.37 + '@edge-runtime/primitives': 1.1.0 dev: true /@emotion/is-prop-valid/0.8.8: @@ -13487,15 +13487,15 @@ packages: safe-buffer: 5.2.0 dev: true - /edge-runtime/1.1.0-beta.40: + /edge-runtime/1.1.0: resolution: { - integrity: sha512-KuoSRsQZUMyec6gtD9YOFA5ohmWtquTXKco+pLv1/1zcHmD0/rXU1QkTkE40BKwq+O02Esk9iPlx9LkHaQr3vg==, + integrity: sha512-CvUOrwV3Qx0V56LttLEvQWyuRsjaEKJH+UOT5Z8xmy0vr3/PAJC2RGW317LCl3XZgbiym4gcf36kQAbrsjKXmw==, } hasBin: true dependencies: - '@edge-runtime/format': 1.1.0-beta.34 - '@edge-runtime/vm': 1.1.0-beta.37 + '@edge-runtime/format': 1.1.0 + '@edge-runtime/vm': 1.1.0 exit-hook: 2.2.1 http-status: 1.5.3 mri: 1.2.0 @@ -24848,7 +24848,7 @@ packages: '@jest/schemas': 28.1.3 ansi-regex: 5.0.1 ansi-styles: 5.1.0 - react-is: 18.1.0 + react-is: 18.2.0 dev: true /pretty-hrtime/1.0.3: @@ -25405,13 +25405,6 @@ packages: } dev: true - /react-is/18.1.0: - resolution: - { - integrity: sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==, - } - dev: true - /react-is/18.2.0: resolution: { From fedcae42d035f783f6b307b02fb3c4a964957764 Mon Sep 17 00:00:00 2001 From: Hugo Date: Mon, 24 Oct 2022 20:00:14 +0100 Subject: [PATCH 03/11] Update custom-error-page for getServerSideProps (#41723) `fetch` output type has `status` but no `statusCode`, see MDN https://developer.mozilla.org/en-US/docs/Web/API/Response/status ## Documentation / Examples - [x] Make sure the linting passes by running `pnpm lint` - [x] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) --- docs/advanced-features/custom-error-page.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/advanced-features/custom-error-page.md b/docs/advanced-features/custom-error-page.md index 6b3a2b860b1..cd5977c4672 100644 --- a/docs/advanced-features/custom-error-page.md +++ b/docs/advanced-features/custom-error-page.md @@ -74,7 +74,7 @@ import Error from 'next/error' export async function getServerSideProps() { const res = await fetch('https://api.github.com/repos/vercel/next.js') - const errorCode = res.ok ? false : res.statusCode + const errorCode = res.ok ? false : res.status const json = await res.json() return { From 792c661264dd92b264f127d2e563ad2665d12dd0 Mon Sep 17 00:00:00 2001 From: Charly POLY <1252066+charlypoly@users.noreply.github.com> Date: Mon, 24 Oct 2022 21:03:08 +0200 Subject: [PATCH 04/11] examples(with-typescript-graphql): migrate to Yoga v3 and codegen new `preset: client` (#41597) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Balázs Orbán --- .eslintignore | 1 + examples/with-typescript-graphql/codegen.ts | 23 +++ examples/with-typescript-graphql/codegen.yml | 14 -- .../lib/documents/updateName.graphql | 7 - .../lib/documents/viewer.graphql | 11 -- .../lib/gql/fragment-masking.ts | 44 ++++++ .../with-typescript-graphql/lib/gql/gql.ts | 25 ++++ .../lib/gql/graphql.ts | 136 ++++++++++++++++++ .../with-typescript-graphql/lib/gql/index.ts | 2 + examples/with-typescript-graphql/package.json | 15 +- .../pages/api/graphql.ts | 22 +-- .../with-typescript-graphql/pages/index.tsx | 35 ++++- 12 files changed, 279 insertions(+), 56 deletions(-) create mode 100644 examples/with-typescript-graphql/codegen.ts delete mode 100644 examples/with-typescript-graphql/codegen.yml delete mode 100644 examples/with-typescript-graphql/lib/documents/updateName.graphql delete mode 100644 examples/with-typescript-graphql/lib/documents/viewer.graphql create mode 100644 examples/with-typescript-graphql/lib/gql/fragment-masking.ts create mode 100644 examples/with-typescript-graphql/lib/gql/gql.ts create mode 100644 examples/with-typescript-graphql/lib/gql/graphql.ts create mode 100644 examples/with-typescript-graphql/lib/gql/index.ts diff --git a/.eslintignore b/.eslintignore index 7727b9a8f75..7e00238ebef 100644 --- a/.eslintignore +++ b/.eslintignore @@ -34,3 +34,4 @@ packages/next-swc/crates/** bench/nested-deps/pages/** bench/nested-deps/components/** packages/next-bundle-analyzer/index.d.ts +examples/with-typescript-graphql/lib/gql/ diff --git a/examples/with-typescript-graphql/codegen.ts b/examples/with-typescript-graphql/codegen.ts new file mode 100644 index 00000000000..e9634c92cc2 --- /dev/null +++ b/examples/with-typescript-graphql/codegen.ts @@ -0,0 +1,23 @@ +import type { CodegenConfig } from '@graphql-codegen/cli' + +const config: CodegenConfig = { + schema: [ + { + 'lib/schema.ts': { + noRequire: true, + }, + }, + ], + documents: './pages/**/*.tsx', + generates: { + './lib/gql/': { + preset: 'client', + plugins: [], + }, + './lib/resolvers-types.ts': { + plugins: ['typescript', 'typescript-resolvers'], + }, + }, +} + +export default config diff --git a/examples/with-typescript-graphql/codegen.yml b/examples/with-typescript-graphql/codegen.yml deleted file mode 100644 index f53d625d190..00000000000 --- a/examples/with-typescript-graphql/codegen.yml +++ /dev/null @@ -1,14 +0,0 @@ -schema: - - 'lib/schema.ts': - noRequire: true -documents: ./lib/documents/*.graphql -generates: - ./lib/graphql-operations.ts: - plugins: - - typescript - - typescript-operations - - typed-document-node - ./lib/resolvers-types.ts: - plugins: - - typescript - - typescript-resolvers diff --git a/examples/with-typescript-graphql/lib/documents/updateName.graphql b/examples/with-typescript-graphql/lib/documents/updateName.graphql deleted file mode 100644 index 8c457c478d0..00000000000 --- a/examples/with-typescript-graphql/lib/documents/updateName.graphql +++ /dev/null @@ -1,7 +0,0 @@ -mutation UpdateName($name: String!) { - updateName(name: $name) { - id - name - status - } -} diff --git a/examples/with-typescript-graphql/lib/documents/viewer.graphql b/examples/with-typescript-graphql/lib/documents/viewer.graphql deleted file mode 100644 index 5b4bc2effea..00000000000 --- a/examples/with-typescript-graphql/lib/documents/viewer.graphql +++ /dev/null @@ -1,11 +0,0 @@ -query Viewer { - viewer { - ...Partial - status - } -} - -fragment Partial on User { - id - name -} diff --git a/examples/with-typescript-graphql/lib/gql/fragment-masking.ts b/examples/with-typescript-graphql/lib/gql/fragment-masking.ts new file mode 100644 index 00000000000..4de725491dd --- /dev/null +++ b/examples/with-typescript-graphql/lib/gql/fragment-masking.ts @@ -0,0 +1,44 @@ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core' + +export type FragmentType> = + TDocumentType extends DocumentNode + ? TType extends { ' $fragmentName'?: infer TKey } + ? TKey extends string + ? { ' $fragmentRefs'?: { [key in TKey]: TType } } + : never + : never + : never + +// return non-nullable if `fragmentType` is non-nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: FragmentType> +): TType +// return nullable if `fragmentType` is nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: FragmentType> | null | undefined +): TType | null | undefined +// return array of non-nullable if `fragmentType` is array of non-nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: ReadonlyArray>> +): ReadonlyArray +// return array of nullable if `fragmentType` is array of nullable +export function useFragment( + _documentNode: DocumentNode, + fragmentType: + | ReadonlyArray>> + | null + | undefined +): ReadonlyArray | null | undefined +export function useFragment( + _documentNode: DocumentNode, + fragmentType: + | FragmentType> + | ReadonlyArray>> + | null + | undefined +): TType | ReadonlyArray | null | undefined { + return fragmentType as any +} diff --git a/examples/with-typescript-graphql/lib/gql/gql.ts b/examples/with-typescript-graphql/lib/gql/gql.ts new file mode 100644 index 00000000000..58566100db1 --- /dev/null +++ b/examples/with-typescript-graphql/lib/gql/gql.ts @@ -0,0 +1,25 @@ +/* eslint-disable */ +import * as types from './graphql' +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core' + +const documents = { + '\n mutation UpdateName($name: String!) {\n updateName(name: $name) {\n id\n name\n status\n }\n }\n': + types.UpdateNameDocument, + '\n query Viewer {\n viewer {\n id\n name\n status\n }\n }\n': + types.ViewerDocument, +} + +export function graphql( + source: '\n mutation UpdateName($name: String!) {\n updateName(name: $name) {\n id\n name\n status\n }\n }\n' +): typeof documents['\n mutation UpdateName($name: String!) {\n updateName(name: $name) {\n id\n name\n status\n }\n }\n'] +export function graphql( + source: '\n query Viewer {\n viewer {\n id\n name\n status\n }\n }\n' +): typeof documents['\n query Viewer {\n viewer {\n id\n name\n status\n }\n }\n'] + +export function graphql(source: string): unknown +export function graphql(source: string) { + return (documents as any)[source] ?? {} +} + +export type DocumentType> = + TDocumentNode extends DocumentNode ? TType : never diff --git a/examples/with-typescript-graphql/lib/gql/graphql.ts b/examples/with-typescript-graphql/lib/gql/graphql.ts new file mode 100644 index 00000000000..a2526a76952 --- /dev/null +++ b/examples/with-typescript-graphql/lib/gql/graphql.ts @@ -0,0 +1,136 @@ +/* eslint-disable */ +import { TypedDocumentNode as DocumentNode } from '@graphql-typed-document-node/core' +export type Maybe = T | null +export type InputMaybe = Maybe +export type Exact = { + [K in keyof T]: T[K] +} +export type MakeOptional = Omit & { + [SubKey in K]?: Maybe +} +export type MakeMaybe = Omit & { + [SubKey in K]: Maybe +} +/** All built-in and custom scalars, mapped to their actual values */ +export type Scalars = { + ID: string + String: string + Boolean: boolean + Int: number + Float: number +} + +export type Mutation = { + __typename?: 'Mutation' + updateName: User +} + +export type MutationUpdateNameArgs = { + name: Scalars['String'] +} + +export type Query = { + __typename?: 'Query' + viewer: User +} + +export type User = { + __typename?: 'User' + id: Scalars['ID'] + name: Scalars['String'] + status: Scalars['String'] +} + +export type UpdateNameMutationVariables = Exact<{ + name: Scalars['String'] +}> + +export type UpdateNameMutation = { + __typename?: 'Mutation' + updateName: { __typename?: 'User'; id: string; name: string; status: string } +} + +export type ViewerQueryVariables = Exact<{ [key: string]: never }> + +export type ViewerQuery = { + __typename?: 'Query' + viewer: { __typename?: 'User'; id: string; name: string; status: string } +} + +export const UpdateNameDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'mutation', + name: { kind: 'Name', value: 'UpdateName' }, + variableDefinitions: [ + { + kind: 'VariableDefinition', + variable: { kind: 'Variable', name: { kind: 'Name', value: 'name' } }, + type: { + kind: 'NonNullType', + type: { + kind: 'NamedType', + name: { kind: 'Name', value: 'String' }, + }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'updateName' }, + arguments: [ + { + kind: 'Argument', + name: { kind: 'Name', value: 'name' }, + value: { + kind: 'Variable', + name: { kind: 'Name', value: 'name' }, + }, + }, + ], + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode +export const ViewerDocument = { + kind: 'Document', + definitions: [ + { + kind: 'OperationDefinition', + operation: 'query', + name: { kind: 'Name', value: 'Viewer' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { + kind: 'Field', + name: { kind: 'Name', value: 'viewer' }, + selectionSet: { + kind: 'SelectionSet', + selections: [ + { kind: 'Field', name: { kind: 'Name', value: 'id' } }, + { kind: 'Field', name: { kind: 'Name', value: 'name' } }, + { kind: 'Field', name: { kind: 'Name', value: 'status' } }, + ], + }, + }, + ], + }, + }, + ], +} as unknown as DocumentNode diff --git a/examples/with-typescript-graphql/lib/gql/index.ts b/examples/with-typescript-graphql/lib/gql/index.ts new file mode 100644 index 00000000000..99775ae23cb --- /dev/null +++ b/examples/with-typescript-graphql/lib/gql/index.ts @@ -0,0 +1,2 @@ +export * from './gql' +export * from './fragment-masking' diff --git a/examples/with-typescript-graphql/package.json b/examples/with-typescript-graphql/package.json index 346f287a477..0d85d5e3652 100644 --- a/examples/with-typescript-graphql/package.json +++ b/examples/with-typescript-graphql/package.json @@ -1,17 +1,17 @@ { "private": true, "scripts": { - "codegen": "graphql-codegen -r ts-node/register", - "dev": "yarn codegen && next", - "build": "yarn codegen && next build", - "test": "yarn codegen && jest", + "codegen": "graphql-codegen -w", + "dev": "yarn graphql-codegen && next", + "build": "yarn graphql-codegen && next build", + "test": "yarn graphql-codegen && jest", "start": "next start" }, "dependencies": { "@apollo/client": "^3.5.10", "graphql-tag": "^2.12.6", "@graphql-tools/load-files": "6.0.18", - "@graphql-yoga/node": "^2.2.1", + "graphql-yoga": "three", "@graphql-tools/merge": "6.0.18", "@graphql-tools/schema": "6.0.18", "graphql": "15.6.0", @@ -21,9 +21,8 @@ }, "devDependencies": { "@graphql-codegen/typed-document-node": "^2.2.8", - "@graphql-codegen/cli": "^2.6.2", - "@graphql-codegen/typescript": "^2.4.8", - "@graphql-codegen/typescript-operations": "^2.3.5", + "@graphql-codegen/cli": "2.13.7", + "@graphql-codegen/client-preset": "1.1.0", "@graphql-codegen/typescript-resolvers": "^2.6.1", "@types/jest": "^27.0.2", "@types/mocha": "^9.0.0", diff --git a/examples/with-typescript-graphql/pages/api/graphql.ts b/examples/with-typescript-graphql/pages/api/graphql.ts index 1228b87ab55..1880f33a119 100644 --- a/examples/with-typescript-graphql/pages/api/graphql.ts +++ b/examples/with-typescript-graphql/pages/api/graphql.ts @@ -1,16 +1,20 @@ -import { createServer } from '@graphql-yoga/node' +import { createSchema, createYoga } from 'graphql-yoga' import gql from 'graphql-tag' import resolvers from 'lib/resolvers' import typeDefs from 'lib/schema' +import { NextApiRequest, NextApiResponse } from 'next' -const server = createServer({ - schema: { - typeDefs: gql(typeDefs), - resolvers, - }, - endpoint: '/api/graphql', - // graphiql: false // uncomment to disable GraphiQL +const schema = createSchema({ + typeDefs: gql(typeDefs), + resolvers, }) -export default server +export default createYoga<{ + req: NextApiRequest + res: NextApiResponse +}>({ + schema, + // Needed to be defined explicitly because our endpoint lives at a different path other than `/graphql` + graphqlEndpoint: '/api/graphql', +}) diff --git a/examples/with-typescript-graphql/pages/index.tsx b/examples/with-typescript-graphql/pages/index.tsx index f9a2de3b04a..aa96a0bbd14 100644 --- a/examples/with-typescript-graphql/pages/index.tsx +++ b/examples/with-typescript-graphql/pages/index.tsx @@ -1,13 +1,33 @@ import { useMutation, useQuery } from '@apollo/client' -import { UpdateNameDocument, ViewerDocument } from 'lib/graphql-operations' +import { graphql } from 'lib/gql' import Link from 'next/link' import { useState } from 'react' import { initializeApollo } from '../lib/apollo' +const updateNameDocument = graphql(/* GraphQL */ ` + mutation UpdateName($name: String!) { + updateName(name: $name) { + id + name + status + } + } +`) + +const viewerDocument = graphql(/* GraphQL */ ` + query Viewer { + viewer { + id + name + status + } + } +`) + const Index = () => { - const { data } = useQuery(ViewerDocument) + const { data } = useQuery(viewerDocument) const [newName, setNewName] = useState('') - const [updateNameMutation] = useMutation(UpdateNameDocument) + const [updateNameMutation] = useMutation(updateNameDocument) const onChangeName = () => { updateNameMutation({ @@ -21,15 +41,16 @@ const Index = () => { if (!data) return // Cancel updating name in cache if no data is returned from mutation. // Read the data from our cache for this query. const result = cache.readQuery({ - query: ViewerDocument, + query: viewerDocument, }) + const newViewer = result ? { ...result.viewer } : null // Add our comment from the mutation to the end. // Write our data back to the cache. if (newViewer) { newViewer.name = data.updateName.name cache.writeQuery({ - query: ViewerDocument, + query: viewerDocument, data: { viewer: newViewer }, }) } @@ -37,7 +58,7 @@ const Index = () => { }) } - const viewer = data?.viewer + const viewer = data.viewer return viewer ? (
@@ -62,7 +83,7 @@ export async function getStaticProps() { const apolloClient = initializeApollo() await apolloClient.query({ - query: ViewerDocument, + query: viewerDocument, }) return { From 5223d66abd66a8049d9f476518c22917c03e225a Mon Sep 17 00:00:00 2001 From: Saullo Almeida Date: Mon, 24 Oct 2022 16:12:27 -0300 Subject: [PATCH 05/11] Bump version tailwindcss example to 3.2 (#41681) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) Co-authored-by: Balázs Orbán <18369201+balazsorban44@users.noreply.github.com> --- examples/with-tailwindcss/package.json | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/examples/with-tailwindcss/package.json b/examples/with-tailwindcss/package.json index 08014894d15..eae0739c2d0 100644 --- a/examples/with-tailwindcss/package.json +++ b/examples/with-tailwindcss/package.json @@ -7,16 +7,16 @@ }, "dependencies": { "next": "latest", - "react": "18.1.0", - "react-dom": "18.1.0" + "react": "18.2.0", + "react-dom": "18.2.0" }, "devDependencies": { - "@types/node": "17.0.35", - "@types/react": "18.0.9", - "@types/react-dom": "18.0.5", - "autoprefixer": "^10.4.7", - "postcss": "^8.4.14", - "tailwindcss": "^3.1.2", - "typescript": "4.7.2" + "@types/node": "18.11.3", + "@types/react": "18.0.21", + "@types/react-dom": "18.0.6", + "autoprefixer": "^10.4.12", + "postcss": "^8.4.18", + "tailwindcss": "^3.2.1", + "typescript": "4.8.4" } } From ef62bf3bf17a92d96c48962ae8f965bcf20ace0e Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 24 Oct 2022 12:32:43 -0700 Subject: [PATCH 06/11] Fix module trace error messages to not include queries (#41738) This improves errors like this: ``` One of these is marked as a client entry with "use client": app/page2/page.tsx?__edge_ssr_entry__ ``` ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .../build/webpack/plugins/wellknown-errors-plugin/parseRSC.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/next/build/webpack/plugins/wellknown-errors-plugin/parseRSC.ts b/packages/next/build/webpack/plugins/wellknown-errors-plugin/parseRSC.ts index 0c78ff1d82f..7b3a271a5a0 100644 --- a/packages/next/build/webpack/plugins/wellknown-errors-plugin/parseRSC.ts +++ b/packages/next/build/webpack/plugins/wellknown-errors-plugin/parseRSC.ts @@ -89,7 +89,9 @@ export function getRscError( formattedError[1] + moduleTrace .map((m) => - m.resource ? ' ' + relative(compiler.context, m.resource) : '' + m.resource + ? ' ' + relative(compiler.context, m.resource).replace(/\?.+$/, '') + : '' ) .filter(Boolean) .join('\n') From fa04df25e1d5b5b524e9fa1486b94c96ed353fc9 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 24 Oct 2022 13:18:49 -0700 Subject: [PATCH 07/11] Fix ignored file path (#41747) ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) --- packages/next/lib/typescript/writeVscodeConfigurations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/next/lib/typescript/writeVscodeConfigurations.ts b/packages/next/lib/typescript/writeVscodeConfigurations.ts index 8075b9a8821..c9b7af89eb4 100644 --- a/packages/next/lib/typescript/writeVscodeConfigurations.ts +++ b/packages/next/lib/typescript/writeVscodeConfigurations.ts @@ -45,6 +45,6 @@ export async function writeVscodeConfigurations( await fs.writeFile(gitIgnore, `${gitIgnoreContent}\n.vscode\n`) } } catch (e) { - await fs.writeFile(gitIgnore, `vscode\n`) + await fs.writeFile(gitIgnore, `.vscode\n`) } } From 3a0fc134df81b785596e554c2f5a9e3263ccfcd8 Mon Sep 17 00:00:00 2001 From: JJ Kasper Date: Mon, 24 Oct 2022 13:23:00 -0700 Subject: [PATCH 08/11] Update CNA app template (#41701) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates the template ## Documentation / Examples - [x] Make sure the linting passes by running `pnpm lint` - [x] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) Co-authored-by: Jared Palmer Co-authored-by: Lee Robinson Co-authored-by: Balázs Orbán --- .../experimental-app/app/globals.css | 26 ++++ .../templates/experimental-app/app/layout.tsx | 10 +- .../experimental-app/app/page.module.css | 146 ++++++++++++++++++ .../templates/experimental-app/app/page.tsx | 58 ++++++- .../experimental-app/public/favicon.ico | Bin 0 -> 25931 bytes .../experimental-app/public/vercel.svg | 4 + 6 files changed, 239 insertions(+), 5 deletions(-) create mode 100644 packages/create-next-app/templates/experimental-app/app/globals.css create mode 100644 packages/create-next-app/templates/experimental-app/app/page.module.css create mode 100644 packages/create-next-app/templates/experimental-app/public/favicon.ico create mode 100644 packages/create-next-app/templates/experimental-app/public/vercel.svg diff --git a/packages/create-next-app/templates/experimental-app/app/globals.css b/packages/create-next-app/templates/experimental-app/app/globals.css new file mode 100644 index 00000000000..4f1842163d2 --- /dev/null +++ b/packages/create-next-app/templates/experimental-app/app/globals.css @@ -0,0 +1,26 @@ +html, +body { + padding: 0; + margin: 0; + font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, + Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; +} + +a { + color: inherit; + text-decoration: none; +} + +* { + box-sizing: border-box; +} + +@media (prefers-color-scheme: dark) { + html { + color-scheme: dark; + } + body { + color: white; + background: black; + } +} diff --git a/packages/create-next-app/templates/experimental-app/app/layout.tsx b/packages/create-next-app/templates/experimental-app/app/layout.tsx index 858c345c779..44facc948f4 100644 --- a/packages/create-next-app/templates/experimental-app/app/layout.tsx +++ b/packages/create-next-app/templates/experimental-app/app/layout.tsx @@ -1,8 +1,16 @@ -export default function RootLayout({ children }) { +import './globals.css' + +export default function RootLayout({ + children, +}: { + children: React.ReactNode +}) { return ( Create Next App + + {children} diff --git a/packages/create-next-app/templates/experimental-app/app/page.module.css b/packages/create-next-app/templates/experimental-app/app/page.module.css new file mode 100644 index 00000000000..a978c99de57 --- /dev/null +++ b/packages/create-next-app/templates/experimental-app/app/page.module.css @@ -0,0 +1,146 @@ +.container { + padding: 0 2rem; +} + +.main { + min-height: 100vh; + padding: 4rem 0; + flex: 1; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; +} + +.footer { + display: flex; + flex: 1; + padding: 2rem 0; + border-top: 1px solid #eaeaea; + justify-content: center; + align-items: center; +} + +.footer a { + display: flex; + justify-content: center; + align-items: center; + flex-grow: 1; +} + +.title { + margin: 0; + line-height: 1.15; + font-size: 4rem; + font-style: normal; + font-weight: 800; + letter-spacing: -0.025em; +} + +.title a { + text-decoration: none; + color: #0070f3; +} + +.title a:hover, +.title a:focus, +.title a:active { + text-decoration: underline; +} + +.title, +.description { + text-align: center; +} + +.description { + margin: 4rem 0; + line-height: 1.5; + font-size: 1.5rem; +} + +.code { + background: #fafafa; + border-radius: 5px; + padding: 0.75rem; + font-size: 1.1rem; + font-family: Menlo, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, + Bitstream Vera Sans Mono, Courier New, monospace; +} + +.grid { + display: flex; + align-items: center; + justify-content: center; + flex-wrap: wrap; + max-width: 1200px; +} + +.card { + margin: 1rem; + padding: 1.5rem; + text-align: left; + color: inherit; + text-decoration: none; + border: 1px solid #eaeaea; + border-radius: 10px; + transition: color 0.15s ease, border-color 0.15s ease; + max-width: 300px; +} + +.card:hover, +.card:focus, +.card:active { + color: #0070f3; + border-color: #0070f3; +} + +.card h2 { + margin: 0 0 1rem 0; + font-size: 1.5rem; +} + +.card p { + margin: 0; + font-size: 1.25rem; + line-height: 1.5; +} + +.logo { + height: 1em; + margin-left: 0.5rem; +} + +@media (max-width: 600px) { + .grid { + width: 100%; + flex-direction: column; + } +} + +@media (prefers-color-scheme: dark) { + .title { + background: linear-gradient(180deg, #ffffff 0%, #aaaaaa 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; + } + .title a { + background: linear-gradient(180deg, #0070f3 0%, #0153af 100%); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + background-clip: text; + text-fill-color: transparent; + } + .card, + .footer { + border-color: #222; + } + .code { + background: #111; + } + .logo img { + filter: invert(1); + } +} diff --git a/packages/create-next-app/templates/experimental-app/app/page.tsx b/packages/create-next-app/templates/experimental-app/app/page.tsx index b9e0c47294c..35bd2649d4c 100644 --- a/packages/create-next-app/templates/experimental-app/app/page.tsx +++ b/packages/create-next-app/templates/experimental-app/app/page.tsx @@ -1,7 +1,57 @@ -export default function Page() { +import Image from 'next/image' +import styles from './page.module.css' + +export default function Home() { return ( -

- Welcome to Next.js! -

+ ) } diff --git a/packages/create-next-app/templates/experimental-app/public/favicon.ico b/packages/create-next-app/templates/experimental-app/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/packages/create-next-app/templates/experimental-app/public/vercel.svg b/packages/create-next-app/templates/experimental-app/public/vercel.svg new file mode 100644 index 00000000000..fbf0e25a651 --- /dev/null +++ b/packages/create-next-app/templates/experimental-app/public/vercel.svg @@ -0,0 +1,4 @@ + + + \ No newline at end of file From 383ec5a6a67d9ffef81f0404842bbf603a09a005 Mon Sep 17 00:00:00 2001 From: Shu Ding Date: Mon, 24 Oct 2022 13:38:30 -0700 Subject: [PATCH 09/11] Fix static generation and crawler requests (#41735) Right now the SSG condition is determined _only_ based on `supportsDynamicHTML`. However that `supportsDynamicHTML` flag can be affected by bots too. Here we exclude the `isBot` condition from the SSG flag, and set proper status and meta tags for static HTML requests (and/or 404 cases). ## Bug - [ ] Related issues linked using `fixes #number` - [x] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) Co-authored-by: JJ Kasper --- packages/next/server/app-render.tsx | 32 +++++++++++++++++++++++------ packages/next/server/base-server.ts | 3 +++ packages/next/server/render.tsx | 1 + test/e2e/app-dir/index.test.ts | 18 ++++++++++++++++ 4 files changed, 48 insertions(+), 6 deletions(-) diff --git a/packages/next/server/app-render.tsx b/packages/next/server/app-render.tsx index 754aeb22e9d..6270c4f3b22 100644 --- a/packages/next/server/app-render.tsx +++ b/packages/next/server/app-render.tsx @@ -142,6 +142,7 @@ export type RenderOptsPartial = { serverComponents?: boolean assetPrefix?: string fontLoaderManifest?: FontLoaderManifest + isBot?: boolean } export type RenderOpts = LoadComponentsReturnType & RenderOptsPartial @@ -172,9 +173,12 @@ function createErrorHandler( * Used for debugging */ _source: string, - capturedErrors: Error[] + capturedErrors: Error[], + allCapturedErrors?: Error[] ) { return (err: any): string => { + if (allCapturedErrors) allCapturedErrors.push(err) + if ( err.digest === DYNAMIC_ERROR_CODE || err.digest === NOT_FOUND_ERROR_CODE || @@ -700,10 +704,12 @@ export async function renderToHTMLOrFlight( * These rules help ensure that other existing features like request caching, * coalescing, and ISR continue working as intended. */ - const isStaticGeneration = renderOpts.supportsDynamicHTML !== true + const isStaticGeneration = + renderOpts.supportsDynamicHTML !== true && !renderOpts.isBot const isFlight = req.headers.__rsc__ !== undefined const capturedErrors: Error[] = [] + const allCapturedErrors: Error[] = [] const serverComponentsErrorHandler = createErrorHandler( 'serverComponentsRenderer', @@ -715,7 +721,8 @@ export async function renderToHTMLOrFlight( ) const htmlRendererErrorHandler = createErrorHandler( 'htmlRenderer', - capturedErrors + capturedErrors, + allCapturedErrors ) const { @@ -726,9 +733,11 @@ export async function renderToHTMLOrFlight( ComponentMod, dev, fontLoaderManifest, + supportsDynamicHTML, } = renderOpts patchFetch(ComponentMod) + const generateStaticHTML = supportsDynamicHTML !== true const staticGenerationAsyncStorage = ComponentMod.staticGenerationAsyncStorage const requestAsyncStorage = ComponentMod.requestAsyncStorage @@ -1505,20 +1514,31 @@ export async function renderToHTMLOrFlight( }, }) - return await continueFromInitialStream(renderStream, { + const result = await continueFromInitialStream(renderStream, { dataStream: serverComponentsInlinedTransformStream?.readable, - generateStaticHTML: isStaticGeneration, + generateStaticHTML: isStaticGeneration || generateStaticHTML, getServerInsertedHTML, serverInsertedHTMLToHead: true, ...validateRootLayout, }) + + return result } catch (err: any) { + const shouldNotIndex = err.digest === NOT_FOUND_ERROR_CODE + if (err.digest === NOT_FOUND_ERROR_CODE) { + res.statusCode = 404 + } + // TODO-APP: show error overlay in development. `element` should probably be wrapped in AppRouter for this case. const renderStream = await renderToInitialStream({ ReactDOMServer, element: ( - + + {shouldNotIndex ? ( + + ) : null} + ), diff --git a/packages/next/server/base-server.ts b/packages/next/server/base-server.ts index 9182931e180..cc3cf15b4d8 100644 --- a/packages/next/server/base-server.ts +++ b/packages/next/server/base-server.ts @@ -205,6 +205,7 @@ export default abstract class Server { serverComponents?: boolean crossOrigin?: string supportsDynamicHTML?: boolean + isBot?: boolean serverComponentManifest?: any serverCSSManifest?: any fontLoaderManifest?: FontLoaderManifest @@ -868,6 +869,7 @@ export default abstract class Server { renderOpts: { ...this.renderOpts, supportsDynamicHTML: !isBotRequest, + isBot: !!isBotRequest, }, } as const const payload = await fn(ctx) @@ -1160,6 +1162,7 @@ export default abstract class Server { // cache if there are no dynamic data requirements opts.supportsDynamicHTML = !isSSG && !isBotRequest && !query.amp && isSupportedDocument + opts.isBot = isBotRequest } const defaultLocale = isSSG diff --git a/packages/next/server/render.tsx b/packages/next/server/render.tsx index 89291cc8afb..b602c646895 100644 --- a/packages/next/server/render.tsx +++ b/packages/next/server/render.tsx @@ -253,6 +253,7 @@ export type RenderOptsPartial = { domainLocales?: DomainLocale[] disableOptimizedLoading?: boolean supportsDynamicHTML?: boolean + isBot?: boolean runtime?: ServerRuntime serverComponents?: boolean customServer?: boolean diff --git a/test/e2e/app-dir/index.test.ts b/test/e2e/app-dir/index.test.ts index 5c04a18d1a7..b80f8316362 100644 --- a/test/e2e/app-dir/index.test.ts +++ b/test/e2e/app-dir/index.test.ts @@ -1899,6 +1899,24 @@ describe('app dir', () => { }) }) + describe('bots', () => { + it('should block rendering for bots and return 404 status', async () => { + const res = await fetchViaHTTP( + next.url, + '/not-found/servercomponent', + '', + { + headers: { + 'User-Agent': 'Googlebot', + }, + } + ) + + expect(res.status).toBe(404) + expect(await res.text()).toInclude('"noindex"') + }) + }) + describe('redirect', () => { describe('components', () => { it('should redirect in a server component', async () => { From b17701372c8aef0029752550613f0faed4711c35 Mon Sep 17 00:00:00 2001 From: Steven Date: Mon, 24 Oct 2022 13:42:11 -0700 Subject: [PATCH 10/11] Add error if `app` detected but config is missing (#41696) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Previously, creating the `app` dir without enabling the config would print an error about `pages` missing: > Couldn't find a `pages` directory. Please create one under the project root This PR prints a better error message: > The `app` dir is experimental. Please add `{experimental:{appDir: true}}` to your `next.config.js` to enable it Co-authored-by: Balázs Orbán --- packages/next/lib/find-pages-dir.ts | 23 +++-- .../appdir-missing-config/app/layout.js | 10 ++ .../appdir-missing-config/app/page.js | 3 + .../appdir-missing-config/test/index.test.ts | 94 +++++++++++++++++++ 4 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 test/integration/appdir-missing-config/app/layout.js create mode 100644 test/integration/appdir-missing-config/app/page.js create mode 100644 test/integration/appdir-missing-config/test/index.test.ts diff --git a/packages/next/lib/find-pages-dir.ts b/packages/next/lib/find-pages-dir.ts index 966766309cf..2e0a8943690 100644 --- a/packages/next/lib/find-pages-dir.ts +++ b/packages/next/lib/find-pages-dir.ts @@ -1,5 +1,6 @@ import fs from 'fs' import path from 'path' +import * as Log from '../build/output/log' export const existsSync = (f: string): boolean => { try { @@ -29,21 +30,25 @@ export function findPagesDir( appDir: string | undefined } { const pagesDir = findDir(dir, 'pages') || undefined - let appDir: undefined | string + const appDir = findDir(dir, 'app') || undefined - if (isAppDirEnabled) { - appDir = findDir(dir, 'app') || undefined - } - const hasAppDir = - !!appDir && fs.existsSync(appDir) && fs.statSync(appDir).isDirectory() - - if (hasAppDir && appDir == null && pagesDir == null) { + if (isAppDirEnabled && appDir == null && pagesDir == null) { throw new Error( "> Couldn't find any `pages` or `app` directory. Please create one under the project root" ) } if (!isAppDirEnabled) { + if (appDir != null && pagesDir == null) { + throw new Error( + '> The `app` dir is experimental. Please add `{experimental:{appDir: true}}` to your `next.config.js` to enable it' + ) + } + if (appDir != null && pagesDir != null) { + Log.warn( + 'The `app` dir is experimental. Please add `{experimental:{appDir: true}}` to your `next.config.js` to enable it' + ) + } if (pagesDir == null) { throw new Error( "> Couldn't find a `pages` directory. Please create one under the project root" @@ -53,6 +58,6 @@ export function findPagesDir( return { pagesDir, - appDir, + appDir: isAppDirEnabled ? appDir : undefined, } } diff --git a/test/integration/appdir-missing-config/app/layout.js b/test/integration/appdir-missing-config/app/layout.js new file mode 100644 index 00000000000..89c40edee2d --- /dev/null +++ b/test/integration/appdir-missing-config/app/layout.js @@ -0,0 +1,10 @@ +export default function Root({ children }) { + return ( + + + Missing Config + + {children} + + ) +} diff --git a/test/integration/appdir-missing-config/app/page.js b/test/integration/appdir-missing-config/app/page.js new file mode 100644 index 00000000000..2ae6a13dc25 --- /dev/null +++ b/test/integration/appdir-missing-config/app/page.js @@ -0,0 +1,3 @@ +export default function Page() { + return

hello from app

+} diff --git a/test/integration/appdir-missing-config/test/index.test.ts b/test/integration/appdir-missing-config/test/index.test.ts new file mode 100644 index 00000000000..c6d6cbefe6b --- /dev/null +++ b/test/integration/appdir-missing-config/test/index.test.ts @@ -0,0 +1,94 @@ +/* eslint-env jest */ + +import path from 'path' +import fs from 'fs-extra' +import { + killApp, + findPort, + launchApp, + nextBuild, + waitFor, +} from 'next-test-utils' + +const dir = path.join(__dirname, '..') +const nextConfig = path.join(dir, 'next.config.js') +const pagesIndex = path.join(dir, 'pages', 'index.js') +const msg = + 'The `app` dir is experimental. Please add `{experimental:{appDir: true}}` to your `next.config.js` to enable it' + +function runTests(justPutIt: () => Promise) { + it('should print error when missing config with app', async () => { + const output = await justPutIt() + expect(output).toMatch(`Error: > ${msg}`) + }) + it('should print warning when missing config with app and pages', async () => { + await fs.outputFile(pagesIndex, 'module.exports = "index"') + const output = await justPutIt() + expect(output).toMatch(`warn - ${msg}`) + }) + it('should not print when config found with app', async () => { + await fs.writeFile( + nextConfig, + 'module.exports = {experimental:{appDir: true}}' + ) + const output = await justPutIt() + expect(output).not.toMatch(`Error: > ${msg}`) + expect(output).not.toMatch(`warn - ${msg}`) + }) + it('should not print when config found with app and pages', async () => { + await fs.outputFile(pagesIndex, 'module.exports = "index"') + await fs.writeFile( + nextConfig, + 'module.exports = {experimental:{appDir: true}}' + ) + const output = await justPutIt() + expect(output).not.toMatch(`Error: > ${msg}`) + expect(output).not.toMatch(`warn - ${msg}`) + }) +} + +describe('Error when app dir is present without experimental.appDir', () => { + describe('next dev', () => { + const justPutIt = async () => { + let app + try { + const appPort = await findPort() + let output = '' + app = await launchApp(dir, appPort, { + onStdout(data: string) { + output += data + }, + onStderr(data: string) { + output += data + }, + }) + await waitFor(200) + return output + } finally { + if (app?.pid) killApp(app) + await fs.remove(nextConfig) + await fs.remove(path.join(dir, 'pages')) + } + } + runTests(justPutIt) + }) + + describe('next build', () => { + const justPutIt = async () => { + let app + try { + app = await nextBuild(dir, [], { + stdout: true, + stderr: true, + env: { NEXT_SKIP_APP_REACT_INSTALL: '1' }, + }) + return app.stdout + app.stderr + } finally { + if (app?.pid) killApp(app) + await fs.remove(nextConfig) + await fs.remove(path.join(dir, 'pages')) + } + } + runTests(justPutIt) + }) +}) From c5111f772f9be58a442e3797c124e9dc92a07303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20Born=C3=B6?= Date: Mon, 24 Oct 2022 22:47:19 +0200 Subject: [PATCH 11/11] Update font avg (#41734) Update the avg calculations. ## Bug - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Errors have a helpful link attached, see `contributing.md` ## Feature - [ ] Implements an existing feature request or RFC. Make sure the feature request has been accepted for implementation before opening a PR. - [ ] Related issues linked using `fixes #number` - [ ] Integration tests added - [ ] Documentation added - [ ] Telemetry added. In case of a feature if it's used or not. - [ ] Errors have a helpful link attached, see `contributing.md` ## Documentation / Examples - [ ] Make sure the linting passes by running `pnpm lint` - [ ] The "examples guidelines" are followed from [our contributing doc](https://github.com/vercel/next.js/blob/canary/contributing/examples/adding-examples.md) Co-authored-by: JJ Kasper --- packages/font/src/google/loader.ts | 34 ++++--- packages/font/src/google/utils.ts | 4 + packages/font/src/local/loader.ts | 32 ++---- packages/font/src/local/utils.ts | 11 --- packages/font/src/utils.ts | 57 +++++++++++ ...b1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2 | Bin 0 -> 15616 bytes ...b1603gg7S2nfgRYIctxuTBv7Tp05GNyXkb24.woff2 | Bin 0 -> 5532 bytes ...8nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2 | Bin 0 -> 17508 bytes .../m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2 | Bin 0 -> 19100 bytes .../next-font/google-font-mocked-responses.js | 22 ++++- test/e2e/next-font/index.test.ts | 68 +++++-------- test/unit/google-font-loader.test.ts | 92 ------------------ 12 files changed, 130 insertions(+), 190 deletions(-) create mode 100644 packages/font/src/utils.ts create mode 100644 test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2 create mode 100644 test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTBv7Tp05GNyXkb24.woff2 create mode 100644 test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2 create mode 100644 test/e2e/next-font/fonts/m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2 diff --git a/packages/font/src/google/loader.ts b/packages/font/src/google/loader.ts index 2857fd938a2..ae98a182d44 100644 --- a/packages/font/src/google/loader.ts +++ b/packages/font/src/google/loader.ts @@ -1,10 +1,11 @@ import type { AdjustFontFallback, FontLoader } from 'next/font' // @ts-ignore -import { calculateSizeAdjustValues } from 'next/dist/server/font-utils' -// @ts-ignore import * as Log from 'next/dist/build/output/log' // @ts-ignore import chalk from 'next/dist/compiled/chalk' +// @ts-ignore +// eslint-disable-next-line import/no-extraneous-dependencies +import fontFromBuffer from '@next/font/dist/fontkit' import { fetchCSSFromGoogleFonts, fetchFontFile, @@ -12,6 +13,7 @@ import { getUrl, validateData, } from './utils' +import { calculateFallbackFontValues } from '../utils' const cssCache = new Map>() const fontCache = new Map() @@ -64,6 +66,7 @@ const downloadGoogleFonts: FontLoader = async ({ const fontFiles: Array<{ googleFontFileUrl: string preloadFontFile: boolean + isLatin: boolean }> = [] let currentSubset = '' for (const line of fontFaceDeclarations.split('\n')) { @@ -78,17 +81,24 @@ const downloadGoogleFonts: FontLoader = async ({ googleFontFileUrl, preloadFontFile: !!preload && (callSubsets ?? subsets).includes(currentSubset), + isLatin: currentSubset === 'latin', }) } } } // Download font files + let latinFont: any const downloadedFiles = await Promise.all( - fontFiles.map(async ({ googleFontFileUrl, preloadFontFile }) => { + fontFiles.map(async ({ googleFontFileUrl, preloadFontFile, isLatin }) => { let cachedFontRequest = fontCache.get(googleFontFileUrl) const fontFileBuffer = cachedFontRequest ?? (await fetchFontFile(googleFontFileUrl)) + if (isLatin) { + try { + latinFont = fontFromBuffer(fontFileBuffer) + } catch {} + } if (!cachedFontRequest) { fontCache.set(googleFontFileUrl, fontFileBuffer) } else { @@ -121,19 +131,13 @@ const downloadGoogleFonts: FontLoader = async ({ // Add fallback font let adjustFontFallbackMetrics: AdjustFontFallback | undefined - if (adjustFontFallback) { + if (adjustFontFallback && latinFont) { try { - const { ascent, descent, lineGap, fallbackFont, sizeAdjust } = - calculateSizeAdjustValues( - require('next/dist/server/google-font-metrics.json')[fontFamily] - ) - adjustFontFallbackMetrics = { - fallbackFont, - ascentOverride: `${ascent}%`, - descentOverride: `${descent}%`, - lineGapOverride: `${lineGap}%`, - sizeAdjust: `${sizeAdjust}%`, - } + adjustFontFallbackMetrics = calculateFallbackFontValues( + latinFont, + require('next/dist/server/google-font-metrics.json')[fontFamily] + .category + ) } catch { Log.error( `Failed to find font override values for font \`${fontFamily}\`` diff --git a/packages/font/src/google/utils.ts b/packages/font/src/google/utils.ts index 31d77c4f4b0..70000c031b5 100644 --- a/packages/font/src/google/utils.ts +++ b/packages/font/src/google/utils.ts @@ -1,3 +1,4 @@ +import fs from 'fs' // @ts-ignore import fetch from 'next/dist/compiled/node-fetch' import fontData from './font-data.json' @@ -161,6 +162,9 @@ export async function fetchCSSFromGoogleFonts(url: string, fontFamily: string) { export async function fetchFontFile(url: string) { if (process.env.NEXT_FONT_GOOGLE_MOCKED_RESPONSES) { + if (url.startsWith('/')) { + return fs.readFileSync(url) + } return Buffer.from(url) } const arrayBuffer = await fetch(url).then((r: any) => r.arrayBuffer()) diff --git a/packages/font/src/local/loader.ts b/packages/font/src/local/loader.ts index 622a1f0d11e..9b62a4e1dcb 100644 --- a/packages/font/src/local/loader.ts +++ b/packages/font/src/local/loader.ts @@ -1,12 +1,11 @@ // @ts-ignore -import { calculateSizeAdjustValues } from 'next/dist/server/font-utils' -// @ts-ignore // eslint-disable-next-line import/no-extraneous-dependencies import fontFromBuffer from '@next/font/dist/fontkit' import type { AdjustFontFallback, FontLoader } from 'next/font' import { promisify } from 'util' -import { calcAzWidth, validateData } from './utils' +import { validateData } from './utils' +import { calculateFallbackFontValues } from '../utils' const fetchFonts: FontLoader = async ({ functionName, @@ -44,29 +43,10 @@ const fetchFonts: FontLoader = async ({ // Add fallback font let adjustFontFallbackMetrics: AdjustFontFallback | undefined if (fontMetadata && adjustFontFallback !== false) { - const { - ascent, - descent, - lineGap, - fallbackFont, - sizeAdjust: fallbackSizeAdjust, - } = calculateSizeAdjustValues({ - category: - adjustFontFallback === 'Times New Roman' ? 'serif' : 'sans-serif', - ascent: fontMetadata.ascent, - descent: fontMetadata.descent, - lineGap: fontMetadata.lineGap, - unitsPerEm: fontMetadata.unitsPerEm, - xAvgCharWidth: (fontMetadata as any)['OS/2']?.xAvgCharWidth, - azAvgWidth: calcAzWidth(fontMetadata), - }) - adjustFontFallbackMetrics = { - fallbackFont, - ascentOverride: `${ascent}%`, - descentOverride: `${descent}%`, - lineGapOverride: `${lineGap}%`, - sizeAdjust: `${fallbackSizeAdjust}%`, - } + adjustFontFallbackMetrics = calculateFallbackFontValues( + fontMetadata, + adjustFontFallback === 'Times New Roman' ? 'serif' : 'sans-serif' + ) } const fontFaceProperties = [ diff --git a/packages/font/src/local/utils.ts b/packages/font/src/local/utils.ts index 90cdf807e15..c23f2524d42 100644 --- a/packages/font/src/local/utils.ts +++ b/packages/font/src/local/utils.ts @@ -1,5 +1,3 @@ -import type { Font } from 'fontkit' - const allowedDisplayValues = ['auto', 'block', 'swap', 'fallback', 'optional'] const formatValues = (values: string[]) => @@ -93,12 +91,3 @@ export function validateData(functionName: string, data: any): FontOptions { declarations, } } - -// Calculating the a-z average width -export function calcAzWidth(font: Font) { - const widths = font - .glyphsForString('abcdefghijklmnopqrstuvwxyz') - .map((glyph) => glyph.advanceWidth) - const totalWidth = widths.reduce((sum, width) => sum + width, 0) - return totalWidth / widths.length -} diff --git a/packages/font/src/utils.ts b/packages/font/src/utils.ts new file mode 100644 index 00000000000..8f403412aeb --- /dev/null +++ b/packages/font/src/utils.ts @@ -0,0 +1,57 @@ +import type { Font } from 'fontkit' +import type { AdjustFontFallback } from 'next/font' + +const DEFAULT_SANS_SERIF_FONT = { + name: 'Arial', + azAvgWidth: 934.5116279069767, + unitsPerEm: 2048, +} +const DEFAULT_SERIF_FONT = { + name: 'Times New Roman', + azAvgWidth: 854.3953488372093, + unitsPerEm: 2048, +} + +function calcAverageWidth(font: Font): number | undefined { + const avgCharacters = 'aaabcdeeeefghiijklmnnoopqrrssttuvwxyz ' + const hasAllChars = font + .glyphsForString(avgCharacters) + .flatMap((glyph) => glyph.codePoints) + .every((codePoint) => font.hasGlyphForCodePoint(codePoint)) + + if (!hasAllChars) return undefined + + const widths = font + .glyphsForString(avgCharacters) + .map((glyph) => glyph.advanceWidth) + const totalWidth = widths.reduce((sum, width) => sum + width, 0) + return totalWidth / widths.length +} + +function formatOverrideValue(val: number) { + return Math.abs(val * 100).toFixed(2) + '%' +} + +export function calculateFallbackFontValues( + font: Font, + category = 'serif' +): AdjustFontFallback { + const fallbackFont = + category === 'serif' ? DEFAULT_SERIF_FONT : DEFAULT_SANS_SERIF_FONT + + const azAvgWidth = calcAverageWidth(font) + const { ascent, descent, lineGap, unitsPerEm } = font + + const fallbackFontAvgWidth = fallbackFont.azAvgWidth / fallbackFont.unitsPerEm + let sizeAdjust = azAvgWidth + ? azAvgWidth / unitsPerEm / fallbackFontAvgWidth + : 1 + + return { + ascentOverride: formatOverrideValue(ascent / (unitsPerEm * sizeAdjust)), + descentOverride: formatOverrideValue(descent / (unitsPerEm * sizeAdjust)), + lineGapOverride: formatOverrideValue(lineGap / (unitsPerEm * sizeAdjust)), + fallbackFont: fallbackFont.name, + sizeAdjust: formatOverrideValue(sizeAdjust), + } +} diff --git a/test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2 b/test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..3cb8b345a83df3d049514e7c4d9b1f50625a9439 GIT binary patch literal 15616 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 literal 0 HcmV?d00001 diff --git a/test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2 b/test/e2e/next-font/fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..a6b3c3a9d69faa7447699b148f39a2205119ac31 GIT binary patch literal 17508 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 literal 0 HcmV?d00001 diff --git a/test/e2e/next-font/fonts/m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2 b/test/e2e/next-font/fonts/m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ac8adf10ed94280cababe8fd87d0a4971b6d2e8f GIT binary patch literal 19100 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 literal 0 HcmV?d00001 diff --git a/test/e2e/next-font/google-font-mocked-responses.js b/test/e2e/next-font/google-font-mocked-responses.js index ad932d5e13e..40b9da03a2d 100644 --- a/test/e2e/next-font/google-font-mocked-responses.js +++ b/test/e2e/next-font/google-font-mocked-responses.js @@ -1,3 +1,5 @@ +const path = require('path') + module.exports = { 'https://fonts.googleapis.com/css2?family=Open+Sans:wght@300..800&display=optional': ` /* cyrillic-ext */ @@ -499,7 +501,10 @@ module.exports = { font-style: normal; font-weight: 400; font-display: optional; - src: url(https://fonts.gstatic.com/s/fraunces/v24/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTBv7Tp05GNyXkb24.woff2) format('woff2'); + src: url(${path.join( + __dirname, + './fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTBv7Tp05GNyXkb24.woff2' + )}) format('woff2'); unicode-range: U+0102-0103, U+0110-0111, U+0128-0129, U+0168-0169, U+01A0-01A1, U+01AF-01B0, U+1EA0-1EF9, U+20AB; } /* latin-ext */ @@ -508,7 +513,10 @@ module.exports = { font-style: normal; font-weight: 400; font-display: optional; - src: url(https://fonts.gstatic.com/s/fraunces/v24/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2) format('woff2'); + src: url(${path.join( + __dirname, + './fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTB_7Tp05GNyXkb24.woff2' + )}) format('woff2'); unicode-range: U+0100-024F, U+0259, U+1E00-1EFF, U+2020, U+20A0-20AB, U+20AD-20CF, U+2113, U+2C60-2C7F, U+A720-A7FF; } /* latin */ @@ -517,7 +525,10 @@ module.exports = { font-style: normal; font-weight: 400; font-display: optional; - src: url(https://fonts.gstatic.com/s/fraunces/v24/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2) format('woff2'); + src: url(${path.join( + __dirname, + './fonts/6NUh8FyLNQOQZAnv9bYEvDiIdE9Ea92uemAk_WBq8U_9v0c2Wa0K7iN7hzFUPJH58nib1603gg7S2nfgRYIctxuTCf7Tp05GNyXk.woff2' + )}) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }`, 'https://fonts.googleapis.com/css2?family=Indie+Flower:wght@400&display=optional': `/* latin */ @@ -526,7 +537,10 @@ module.exports = { font-style: normal; font-weight: 400; font-display: optional; - src: url(https://fonts.gstatic.com/s/indieflower/v17/m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2) format('woff2'); + src: url(${path.join( + __dirname, + './fonts/m8JVjfNVeKWVnh3QMuKkFcZVaUuH99GUDg.woff2' + )}) format('woff2'); unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD; }`, } diff --git a/test/e2e/next-font/index.test.ts b/test/e2e/next-font/index.test.ts index 7977e2166b3..a68a6f27013 100644 --- a/test/e2e/next-font/index.test.ts +++ b/test/e2e/next-font/index.test.ts @@ -45,9 +45,7 @@ describe('@next/font/google', () => { className: expect.stringMatching(/^__className_.{6}$/), variable: expect.stringMatching(/^__variable_.{6}$/), style: { - fontFamily: expect.stringMatching( - /^'__Open_Sans_.{6}', '__Open_Sans_Fallback_.{6}'$/ - ), + fontFamily: expect.stringMatching(/^'__Open_Sans_.{6}'$/), fontStyle: 'normal', }, }) @@ -57,9 +55,7 @@ describe('@next/font/google', () => { className: expect.stringMatching(/^__className_.{6}$/), variable: expect.stringMatching(/^__variable_.{6}$/), style: { - fontFamily: expect.stringMatching( - /^'__Open_Sans_.{6}', '__Open_Sans_Fallback_.{6}'$/ - ), + fontFamily: expect.stringMatching(/^'__Open_Sans_.{6}'$/), fontStyle: 'normal', }, }) @@ -68,9 +64,7 @@ describe('@next/font/google', () => { expect(JSON.parse($('#comp-with-fonts-inter').text())).toEqual({ className: expect.stringMatching(/^__className_.{6}$/), style: { - fontFamily: expect.stringMatching( - /^'__Inter_.{6}', '__Inter_Fallback_.{6}'$/ - ), + fontFamily: expect.stringMatching(/^'__Inter_.{6}'$/), fontWeight: 900, fontStyle: 'normal', }, @@ -78,9 +72,7 @@ describe('@next/font/google', () => { expect(JSON.parse($('#comp-with-fonts-roboto').text())).toEqual({ className: expect.stringMatching(/^__className_.{6}$/), style: { - fontFamily: expect.stringMatching( - /^'__Roboto_.{6}', '__Roboto_Fallback_.{6}'$/ - ), + fontFamily: expect.stringMatching(/^'__Roboto_.{6}'$/), fontStyle: 'italic', fontWeight: 100, }, @@ -96,9 +88,7 @@ describe('@next/font/google', () => { className: expect.stringMatching(/__className_.{6}/), variable: expect.stringMatching(/__variable_.{6}/), style: { - fontFamily: expect.stringMatching( - /^'__Open_Sans_.{6}', '__Open_Sans_Fallback_.{6}'$/ - ), + fontFamily: expect.stringMatching(/^'__Open_Sans_.{6}'$/), fontStyle: 'normal', }, }) @@ -135,7 +125,7 @@ describe('@next/font/google', () => { await browser.eval( 'getComputedStyle(document.querySelector("#app-open-sans")).fontFamily' ) - ).toMatch(/^__Open_Sans_.{6}, __Open_Sans_Fallback_.{6}$/) + ).toMatch(/^__Open_Sans_.{6}$/) expect( await browser.eval( 'getComputedStyle(document.querySelector("#app-open-sans")).fontWeight' @@ -152,7 +142,7 @@ describe('@next/font/google', () => { await browser.eval( 'getComputedStyle(document.querySelector("#with-fonts-open-sans")).fontFamily' ) - ).toMatch(/^__Open_Sans_.{6}, __Open_Sans_Fallback_.{6}$/) + ).toMatch(/^__Open_Sans_.{6}$/) expect( await browser.eval( 'getComputedStyle(document.querySelector("#with-fonts-open-sans")).fontWeight' @@ -179,7 +169,7 @@ describe('@next/font/google', () => { await browser.eval( 'getComputedStyle(document.querySelector("#comp-with-fonts-inter")).fontFamily' ) - ).toMatch(/^__Inter_.{6}, __Inter_Fallback_.{6}$/) + ).toMatch(/^__Inter_.{6}$/) expect( await browser.eval( 'getComputedStyle(document.querySelector("#comp-with-fonts-inter")).fontWeight' @@ -195,7 +185,7 @@ describe('@next/font/google', () => { await browser.eval( 'getComputedStyle(document.querySelector("#comp-with-fonts-roboto")).fontFamily' ) - ).toMatch(/^__Roboto_.{6}, __Roboto_Fallback_.{6}$/) + ).toMatch(/^__Roboto_.{6}$/) expect( await browser.eval( 'getComputedStyle(document.querySelector("#comp-with-fonts-roboto")).fontWeight' @@ -212,7 +202,7 @@ describe('@next/font/google', () => { const browser = await webdriver(next.url, '/variables') // Fira Code Variable - const firaCodeRegex = /^__Fira_Code_.{6}, __Fira_Code_Fallback_.{6}$/ + const firaCodeRegex = /^__Fira_Code_.{6}$/ expect( await browser.eval( 'getComputedStyle(document.querySelector("#variables-fira-code")).fontFamily' @@ -225,7 +215,7 @@ describe('@next/font/google', () => { ).not.toMatch(firaCodeRegex) // Roboto 100 Italic - const roboto100ItalicRegex = /^__Roboto_.{6}, __Roboto_Fallback_.{6}$/ + const roboto100ItalicRegex = /^__Roboto_.{6}$/ expect( await browser.eval( 'getComputedStyle(document.querySelector("#variables-roboto-100-italic")).fontFamily' @@ -259,27 +249,21 @@ describe('@next/font/google', () => { await browser.eval( 'getComputedStyle(document.querySelector("#with-fallback-fonts-classname")).fontFamily' ) - ).toMatch( - /^__Open_Sans_.{6}, system-ui, Arial, __Open_Sans_Fallback_.{6}$/ - ) + ).toMatch(/^__Open_Sans_.{6}, system-ui, Arial$/) // .style expect( await browser.eval( 'getComputedStyle(document.querySelector("#with-fallback-fonts-style")).fontFamily' ) - ).toMatch( - /^__Open_Sans_.{6}, system-ui, Arial, __Open_Sans_Fallback_.{6}$/ - ) + ).toMatch(/^__Open_Sans_.{6}, system-ui, Arial$/) // .variable expect( await browser.eval( 'getComputedStyle(document.querySelector("#with-fallback-fonts-variable")).fontFamily' ) - ).toMatch( - /^__Open_Sans_.{6}, system-ui, Arial, __Open_Sans_Fallback_.{6}$/ - ) + ).toMatch(/^__Open_Sans_.{6}, system-ui, Arial$/) }) }) @@ -363,12 +347,12 @@ describe('@next/font/google', () => { const ascentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).ascentOverride' ) - expect(ascentOverride).toBe('109.1%') + expect(ascentOverride).toBe('103.26%') const descentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).descentOverride' ) - expect(descentOverride).toBe('54.88%') + expect(descentOverride).toBe('51.94%') const lineGapOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).lineGapOverride' @@ -378,7 +362,7 @@ describe('@next/font/google', () => { const sizeAdjust = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).sizeAdjust' ) - expect(sizeAdjust).toBe('88.97%') + expect(sizeAdjust).toBe('94%') }) test('Fraunces', async () => { @@ -387,12 +371,12 @@ describe('@next/font/google', () => { const ascentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).ascentOverride' ) - expect(ascentOverride).toBe('83.79%') + expect(ascentOverride).toBe('84.71%') const descentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).descentOverride' ) - expect(descentOverride).toBe('21.85%') + expect(descentOverride).toBe('22.09%') const lineGapOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).lineGapOverride' @@ -402,7 +386,7 @@ describe('@next/font/google', () => { const sizeAdjust = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).sizeAdjust' ) - expect(sizeAdjust).toBe('116.72%') + expect(sizeAdjust).toBe('115.45%') }) }) @@ -413,12 +397,12 @@ describe('@next/font/google', () => { const ascentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).ascentOverride' ) - expect(ascentOverride).toBe('109.1%') + expect(ascentOverride).toBe('103.26%') const descentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).descentOverride' ) - expect(descentOverride).toBe('54.88%') + expect(descentOverride).toBe('51.94%') const lineGapOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).lineGapOverride' @@ -428,7 +412,7 @@ describe('@next/font/google', () => { const sizeAdjust = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Indie_Flower_Fallback")).sizeAdjust' ) - expect(sizeAdjust).toBe('88.97%') + expect(sizeAdjust).toBe('94%') }) test('Fraunces', async () => { @@ -437,12 +421,12 @@ describe('@next/font/google', () => { const ascentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).ascentOverride' ) - expect(ascentOverride).toBe('83.79%') + expect(ascentOverride).toBe('84.71%') const descentOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).descentOverride' ) - expect(descentOverride).toBe('21.85%') + expect(descentOverride).toBe('22.09%') const lineGapOverride = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).lineGapOverride' @@ -452,7 +436,7 @@ describe('@next/font/google', () => { const sizeAdjust = await browser.eval( 'Array.from(document.fonts.values()).find(font => font.family.includes("Fraunces_Fallback")).sizeAdjust' ) - expect(sizeAdjust).toBe('116.72%') + expect(sizeAdjust).toBe('115.45%') }) }) }) diff --git a/test/unit/google-font-loader.test.ts b/test/unit/google-font-loader.test.ts index f5aafb72db1..d44ccfe2975 100644 --- a/test/unit/google-font-loader.test.ts +++ b/test/unit/google-font-loader.test.ts @@ -93,98 +93,6 @@ describe('@next/font/google loader', () => { }) }) - describe('Fallback fonts', () => { - test('Inter', async () => { - fetch.mockResolvedValue({ - ok: true, - text: async () => '', - }) - const { adjustFontFallback, fallbackFonts } = await loader({ - functionName: 'Inter', - data: [], - config: { subsets: [] }, - emitFontFile: jest.fn(), - resolve: jest.fn(), - fs: {} as any, - isServer: true, - }) - expect(adjustFontFallback).toEqual({ - ascentOverride: '88.84%', - descentOverride: '22.14%', - fallbackFont: 'Arial', - lineGapOverride: '0.00%', - sizeAdjust: '109.04%', - }) - expect(fallbackFonts).toBeUndefined() - }) - - test('Source Code Pro', async () => { - fetch.mockResolvedValue({ - ok: true, - text: async () => '', - }) - const { fallbackFonts, adjustFontFallback } = await loader({ - functionName: 'Source_Code_Pro', - data: [], - config: { subsets: [] }, - emitFontFile: jest.fn(), - resolve: jest.fn(), - fs: {} as any, - isServer: true, - }) - expect(adjustFontFallback).toEqual({ - ascentOverride: '80.28%', - descentOverride: '22.27%', - fallbackFont: 'Arial', - lineGapOverride: '0.00%', - sizeAdjust: '122.56%', - }) - expect(fallbackFonts).toBeUndefined() - }) - - test('Fraunces', async () => { - fetch.mockResolvedValue({ - ok: true, - text: async () => '', - }) - const { adjustFontFallback, fallbackFonts } = await loader({ - functionName: 'Fraunces', - data: [{ fallback: ['Abc', 'Def'] }], - config: { subsets: [] }, - emitFontFile: jest.fn(), - resolve: jest.fn(), - fs: {} as any, - isServer: true, - }) - expect(adjustFontFallback).toEqual({ - ascentOverride: '83.79%', - descentOverride: '21.85%', - fallbackFont: 'Times New Roman', - lineGapOverride: '0.00%', - sizeAdjust: '116.72%', - }) - expect(fallbackFonts).toEqual(['Abc', 'Def']) - }) - - test('adjustFontFallback disabled', async () => { - fetch.mockResolvedValue({ - ok: true, - text: async () => '', - }) - const { css, fallbackFonts } = await loader({ - functionName: 'Inter', - data: [{ adjustFontFallback: false, fallback: ['system-ui', 'Arial'] }], - config: { subsets: [] }, - emitFontFile: jest.fn(), - resolve: jest.fn(), - fs: {} as any, - isServer: true, - }) - expect(css).toBe('') - expect(fallbackFonts).toEqual(['system-ui', 'Arial']) - }) - }) - describe('Errors', () => { test('Failed to fetch', async () => { fetch.mockResolvedValue({