@spotpatch/next 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/bootstrap.ts","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/rdt-hook.js","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/install-hook-only.js","../src/client.ts"],"sourcesContent":["import { bootstrapSpotPatch } from \"@spotpatch/runtime\";\nimport {\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nconst MAX_BOOTSTRAP_RESPONSE_BYTES = 16_384;\n\nexport type NextClientBootstrapFailureCode =\n | \"CACHE_POLICY_INVALID\"\n | \"MOUNT_FAILED\"\n | \"REQUEST_FAILED\"\n | \"RESPONSE_INVALID\"\n | \"RESPONSE_REJECTED\"\n | \"RESPONSE_TOO_LARGE\";\n\nexport type NextClientBootstrapResult =\n | Readonly<{ ok: true }>\n | Readonly<{\n code: NextClientBootstrapFailureCode;\n ok: false;\n }>;\n\nclass BootstrapError extends Error {\n constructor(readonly code: NextClientBootstrapFailureCode) {\n super(code);\n this.name = \"SpotPatchNextBootstrapError\";\n }\n}\n\nfunction deepFreeze<T>(value: T): Readonly<T> {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n\n for (const child of Object.values(value as Readonly<Record<string, unknown>>)) {\n deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n\nasync function readBoundedJson(response: Response): Promise<unknown> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > MAX_BOOTSTRAP_RESPONSE_BYTES\n ) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n const text = await response.text();\n\n if (new TextEncoder().encode(text).byteLength > MAX_BOOTSTRAP_RESPONSE_BYTES) {\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n}\n\nfunction parseEnvelope(value: unknown): SpotPatchRuntimeConfig {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n\n if (!parsed.success || parsed.data.framework !== \"next\") {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n return deepFreeze(parsed.data);\n}\n\nasync function executeBootstrap(): Promise<void> {\n let response: Response;\n\n try {\n response = await fetch(SPOTPATCH_ENDPOINTS.bootstrap, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n cache: \"no-store\",\n credentials: \"same-origin\",\n });\n } catch {\n throw new BootstrapError(\"REQUEST_FAILED\");\n }\n\n if (!response.ok) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_REJECTED\");\n }\n\n if (!response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\")) {\n await response.body?.cancel();\n throw new BootstrapError(\"CACHE_POLICY_INVALID\");\n }\n\n const config = parseEnvelope(await readBoundedJson(response));\n\n try {\n bootstrapSpotPatch(config);\n } catch {\n throw new BootstrapError(\"MOUNT_FAILED\");\n }\n}\n\nexport async function bootstrapNextClient(): Promise<NextClientBootstrapResult> {\n try {\n await executeBootstrap();\n return Object.freeze({ ok: true });\n } catch (error: unknown) {\n return Object.freeze({\n code: error instanceof BootstrapError ? error.code : \"RESPONSE_INVALID\",\n ok: false,\n });\n }\n}\n","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nconst e=e=>Object.assign(e,{[Symbol.dispose]:e}),t=`0.6.1`,n=`bippy-${t}`,r=Object.defineProperty,i=Object.prototype.hasOwnProperty,a=()=>{},o=e=>{try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`)})}catch{}},s=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e);let c=!1,l;const u=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>c?!0:(e&&typeof e.inject==`function`&&(l=e.inject.toString()),!!l?.includes(`(injected)`)),d=new Set,f=new Set,p=new Set,m=new WeakSet;let h=null;const g=e=>{if(e.inject===h)return;let t=e.inject,n=n=>{let r=t.call(e,n);if(!m.has(n)){m.add(n);for(let e of p)e(n)}return r};e.inject=n,h=n},_=t=>(g(x()),p.add(t),e(()=>{p.delete(t)})),v=e=>{e&&d.add(e);let t=new Map,i=0,s={_instrumentationIsActive:!1,_instrumentationSource:n,checkDCE:o,hasUnsupportedRendererAttached:!1,inject(e){let n=++i;return t.set(n,e),f.add(e),s._instrumentationIsActive||(s._instrumentationIsActive=!0,d.forEach(e=>e())),n},on:a,onCommitFiberRoot:a,onCommitFiberUnmount:a,onPostCommitFiberRoot:a,renderers:t,supportsFiber:!0,supportsFlight:!0};try{r(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get(){return s},set(t){if(t&&typeof t==`object`){let n=s.renderers;s=t,n.size>0&&(n.forEach((e,n)=>{f.add(e),t.renderers.set(n,e)}),y(e))}}});let t=window.hasOwnProperty,n=!1;r(window,`hasOwnProperty`,{configurable:!0,value:function(...e){try{if(!n&&e[0]===`__REACT_DEVTOOLS_GLOBAL_HOOK__`)return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,n=!0,-0}catch{}return t.apply(this,e)},writable:!0})}catch{y(e)}return s},y=e=>{e&&d.add(e);try{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t)return;if(!t._instrumentationSource){t.checkDCE=o,t.supportsFiber=!0,t.supportsFlight=!0,t.hasUnsupportedRendererAttached=!1,t._instrumentationSource=n,t._instrumentationIsActive=!1;let e=s(t);if(e||(t.on=a),t.renderers.size){t._instrumentationIsActive=!0,d.forEach(e=>e());return}let r=t.inject,i=u(t);i&&!e&&(c=!0,t.inject({scheduleRefresh(){}})&&(t._instrumentationIsActive=!0)),t.inject=e=>{let n=r(e);return f.add(e),i&&t.renderers.set(n,e),t._instrumentationIsActive=!0,d.forEach(e=>e()),n}}(t.renderers.size||t._instrumentationIsActive||u())&&e?.()}catch{}},b=()=>i.call(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),x=e=>b()?(y(e),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__):v(e),S=()=>!!(typeof window<`u`&&(window.document?.createElement||window.navigator?.product===`ReactNative`)),C=()=>{try{S()&&x()}catch{}};export{b as a,u as c,y as d,C as f,x as i,s as l,e as m,d as n,v as o,t as p,f as r,S as s,n as t,_ as u};","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport{f as e}from\"./rdt-hook.js\";e();","import \"bippy/install-hook-only\";\n\nimport type { NextClientBootstrapFailureCode } from \"./client/bootstrap.js\";\n\ninterface NextClientState {\n code?: NextClientBootstrapFailureCode | \"MODULE_LOAD_FAILED\";\n readonly hookInstalled: boolean;\n readonly initializationDurationMs: number;\n status: \"bootstrapping\" | \"failed\" | \"ready\";\n}\n\ndeclare global {\n var __spotpatchNextClient__: NextClientState | undefined;\n}\n\nif (globalThis.__spotpatchNextClient__ === undefined) {\n const startedAt = performance.now();\n const state: NextClientState = {\n hookInstalled:\n typeof Reflect.get(globalThis, \"__REACT_DEVTOOLS_GLOBAL_HOOK__\") === \"object\",\n initializationDurationMs: performance.now() - startedAt,\n status: \"bootstrapping\",\n };\n globalThis.__spotpatchNextClient__ = state;\n\n void import(\"./client/bootstrap.js\")\n .then(({ bootstrapNextClient }) => bootstrapNextClient())\n .then((result) => {\n if (result.ok) {\n state.status = \"ready\";\n return;\n }\n\n state.code = result.code;\n state.status = \"failed\";\n console.warn(`[spotpatch:next:client] Bootstrap disabled (${result.code}).`);\n })\n .catch(() => {\n state.code = \"MODULE_LOAD_FAILED\";\n state.status = \"failed\";\n console.warn(\"[spotpatch:next:client] Bootstrap disabled (MODULE_LOAD_FAILED).\");\n });\n}\n"],"mappings":"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","names":["t","i","s","e","n","r","bootstrapNextClient"]}
1
+ {"version":3,"sources":["../src/client/bootstrap.ts","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/rdt-hook.js","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/install-hook-only.js","../src/client.ts"],"sourcesContent":["import { bootstrapSpotPatch } from \"@spotpatch/runtime\";\nimport {\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nconst MAX_BOOTSTRAP_RESPONSE_BYTES = 16_384;\n\nexport type NextClientBootstrapFailureCode =\n | \"CACHE_POLICY_INVALID\"\n | \"MOUNT_FAILED\"\n | \"REQUEST_FAILED\"\n | \"RESPONSE_INVALID\"\n | \"RESPONSE_REJECTED\"\n | \"RESPONSE_TOO_LARGE\";\n\nexport type NextClientBootstrapResult =\n | Readonly<{ ok: true }>\n | Readonly<{\n code: NextClientBootstrapFailureCode;\n ok: false;\n }>;\n\nclass BootstrapError extends Error {\n constructor(readonly code: NextClientBootstrapFailureCode) {\n super(code);\n this.name = \"SpotPatchNextBootstrapError\";\n }\n}\n\nfunction deepFreeze<T>(value: T): Readonly<T> {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n\n for (const child of Object.values(value as Readonly<Record<string, unknown>>)) {\n deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n\nasync function readBoundedJson(response: Response): Promise<unknown> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > MAX_BOOTSTRAP_RESPONSE_BYTES\n ) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n const text = await response.text();\n\n if (new TextEncoder().encode(text).byteLength > MAX_BOOTSTRAP_RESPONSE_BYTES) {\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n}\n\nfunction parseEnvelope(value: unknown): SpotPatchRuntimeConfig {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n\n if (!parsed.success || parsed.data.framework !== \"next\") {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n return deepFreeze(parsed.data);\n}\n\nasync function executeBootstrap(): Promise<void> {\n let response: Response;\n\n try {\n response = await fetch(SPOTPATCH_ENDPOINTS.bootstrap, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n cache: \"no-store\",\n credentials: \"same-origin\",\n });\n } catch {\n throw new BootstrapError(\"REQUEST_FAILED\");\n }\n\n if (!response.ok) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_REJECTED\");\n }\n\n if (!response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\")) {\n await response.body?.cancel();\n throw new BootstrapError(\"CACHE_POLICY_INVALID\");\n }\n\n const config = parseEnvelope(await readBoundedJson(response));\n\n try {\n if (config.externalAgent.enabled) {\n const extension = await import(\"@spotpatch/runtime/external-handoff-panel\");\n extension.registerExternalHandoffExtension(\n Object.freeze({\n createPanel: extension.createExternalHandoffPanel,\n createWorkflow: extension.createExternalHandoffWorkflow,\n }),\n );\n }\n\n bootstrapSpotPatch(config);\n } catch {\n throw new BootstrapError(\"MOUNT_FAILED\");\n }\n}\n\nexport async function bootstrapNextClient(): Promise<NextClientBootstrapResult> {\n try {\n await executeBootstrap();\n return Object.freeze({ ok: true });\n } catch (error: unknown) {\n return Object.freeze({\n code: error instanceof BootstrapError ? error.code : \"RESPONSE_INVALID\",\n ok: false,\n });\n }\n}\n","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nconst e=e=>Object.assign(e,{[Symbol.dispose]:e}),t=`0.6.1`,n=`bippy-${t}`,r=Object.defineProperty,i=Object.prototype.hasOwnProperty,a=()=>{},o=e=>{try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`)})}catch{}},s=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e);let c=!1,l;const u=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>c?!0:(e&&typeof e.inject==`function`&&(l=e.inject.toString()),!!l?.includes(`(injected)`)),d=new Set,f=new Set,p=new Set,m=new WeakSet;let h=null;const g=e=>{if(e.inject===h)return;let t=e.inject,n=n=>{let r=t.call(e,n);if(!m.has(n)){m.add(n);for(let e of p)e(n)}return r};e.inject=n,h=n},_=t=>(g(x()),p.add(t),e(()=>{p.delete(t)})),v=e=>{e&&d.add(e);let t=new Map,i=0,s={_instrumentationIsActive:!1,_instrumentationSource:n,checkDCE:o,hasUnsupportedRendererAttached:!1,inject(e){let n=++i;return t.set(n,e),f.add(e),s._instrumentationIsActive||(s._instrumentationIsActive=!0,d.forEach(e=>e())),n},on:a,onCommitFiberRoot:a,onCommitFiberUnmount:a,onPostCommitFiberRoot:a,renderers:t,supportsFiber:!0,supportsFlight:!0};try{r(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get(){return s},set(t){if(t&&typeof t==`object`){let n=s.renderers;s=t,n.size>0&&(n.forEach((e,n)=>{f.add(e),t.renderers.set(n,e)}),y(e))}}});let t=window.hasOwnProperty,n=!1;r(window,`hasOwnProperty`,{configurable:!0,value:function(...e){try{if(!n&&e[0]===`__REACT_DEVTOOLS_GLOBAL_HOOK__`)return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,n=!0,-0}catch{}return t.apply(this,e)},writable:!0})}catch{y(e)}return s},y=e=>{e&&d.add(e);try{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t)return;if(!t._instrumentationSource){t.checkDCE=o,t.supportsFiber=!0,t.supportsFlight=!0,t.hasUnsupportedRendererAttached=!1,t._instrumentationSource=n,t._instrumentationIsActive=!1;let e=s(t);if(e||(t.on=a),t.renderers.size){t._instrumentationIsActive=!0,d.forEach(e=>e());return}let r=t.inject,i=u(t);i&&!e&&(c=!0,t.inject({scheduleRefresh(){}})&&(t._instrumentationIsActive=!0)),t.inject=e=>{let n=r(e);return f.add(e),i&&t.renderers.set(n,e),t._instrumentationIsActive=!0,d.forEach(e=>e()),n}}(t.renderers.size||t._instrumentationIsActive||u())&&e?.()}catch{}},b=()=>i.call(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),x=e=>b()?(y(e),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__):v(e),S=()=>!!(typeof window<`u`&&(window.document?.createElement||window.navigator?.product===`ReactNative`)),C=()=>{try{S()&&x()}catch{}};export{b as a,u as c,y as d,C as f,x as i,s as l,e as m,d as n,v as o,t as p,f as r,S as s,n as t,_ as u};","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport{f as e}from\"./rdt-hook.js\";e();","import \"bippy/install-hook-only\";\n\nimport type { NextClientBootstrapFailureCode } from \"./client/bootstrap.js\";\n\ninterface NextClientState {\n code?: NextClientBootstrapFailureCode | \"MODULE_LOAD_FAILED\";\n readonly hookInstalled: boolean;\n readonly initializationDurationMs: number;\n status: \"bootstrapping\" | \"failed\" | \"ready\";\n}\n\ndeclare global {\n var __spotpatchNextClient__: NextClientState | undefined;\n}\n\nif (globalThis.__spotpatchNextClient__ === undefined) {\n const startedAt = performance.now();\n const state: NextClientState = {\n hookInstalled:\n typeof Reflect.get(globalThis, \"__REACT_DEVTOOLS_GLOBAL_HOOK__\") === \"object\",\n initializationDurationMs: performance.now() - startedAt,\n status: \"bootstrapping\",\n };\n globalThis.__spotpatchNextClient__ = state;\n\n void import(\"./client/bootstrap.js\")\n .then(({ bootstrapNextClient }) => bootstrapNextClient())\n .then((result) => {\n if (result.ok) {\n state.status = \"ready\";\n return;\n }\n\n state.code = result.code;\n state.status = \"failed\";\n console.warn(`[spotpatch:next:client] Bootstrap disabled (${result.code}).`);\n })\n .catch(() => {\n state.code = \"MODULE_LOAD_FAILED\";\n state.status = \"failed\";\n console.warn(\"[spotpatch:next:client] Bootstrap disabled (MODULE_LOAD_FAILED).\");\n });\n}\n"],"mappings":"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","names":["t","i","s","e","n","r","bootstrapNextClient"]}
package/dist/client.js CHANGED
@@ -76,6 +76,15 @@ async function executeBootstrap() {
76
76
  }
77
77
  const config = parseEnvelope(await readBoundedJson(response));
78
78
  try {
79
+ if (config.externalAgent.enabled) {
80
+ const extension = await import("@spotpatch/runtime/external-handoff-panel");
81
+ extension.registerExternalHandoffExtension(
82
+ Object.freeze({
83
+ createPanel: extension.createExternalHandoffPanel,
84
+ createWorkflow: extension.createExternalHandoffWorkflow
85
+ })
86
+ );
87
+ }
79
88
  bootstrapSpotPatch(config);
80
89
  } catch {
81
90
  throw new BootstrapError("MOUNT_FAILED");
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/client/bootstrap.ts","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/rdt-hook.js","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/install-hook-only.js","../src/client.ts"],"sourcesContent":["import { bootstrapSpotPatch } from \"@spotpatch/runtime\";\nimport {\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nconst MAX_BOOTSTRAP_RESPONSE_BYTES = 16_384;\n\nexport type NextClientBootstrapFailureCode =\n | \"CACHE_POLICY_INVALID\"\n | \"MOUNT_FAILED\"\n | \"REQUEST_FAILED\"\n | \"RESPONSE_INVALID\"\n | \"RESPONSE_REJECTED\"\n | \"RESPONSE_TOO_LARGE\";\n\nexport type NextClientBootstrapResult =\n | Readonly<{ ok: true }>\n | Readonly<{\n code: NextClientBootstrapFailureCode;\n ok: false;\n }>;\n\nclass BootstrapError extends Error {\n constructor(readonly code: NextClientBootstrapFailureCode) {\n super(code);\n this.name = \"SpotPatchNextBootstrapError\";\n }\n}\n\nfunction deepFreeze<T>(value: T): Readonly<T> {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n\n for (const child of Object.values(value as Readonly<Record<string, unknown>>)) {\n deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n\nasync function readBoundedJson(response: Response): Promise<unknown> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > MAX_BOOTSTRAP_RESPONSE_BYTES\n ) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n const text = await response.text();\n\n if (new TextEncoder().encode(text).byteLength > MAX_BOOTSTRAP_RESPONSE_BYTES) {\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n}\n\nfunction parseEnvelope(value: unknown): SpotPatchRuntimeConfig {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n\n if (!parsed.success || parsed.data.framework !== \"next\") {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n return deepFreeze(parsed.data);\n}\n\nasync function executeBootstrap(): Promise<void> {\n let response: Response;\n\n try {\n response = await fetch(SPOTPATCH_ENDPOINTS.bootstrap, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n cache: \"no-store\",\n credentials: \"same-origin\",\n });\n } catch {\n throw new BootstrapError(\"REQUEST_FAILED\");\n }\n\n if (!response.ok) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_REJECTED\");\n }\n\n if (!response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\")) {\n await response.body?.cancel();\n throw new BootstrapError(\"CACHE_POLICY_INVALID\");\n }\n\n const config = parseEnvelope(await readBoundedJson(response));\n\n try {\n bootstrapSpotPatch(config);\n } catch {\n throw new BootstrapError(\"MOUNT_FAILED\");\n }\n}\n\nexport async function bootstrapNextClient(): Promise<NextClientBootstrapResult> {\n try {\n await executeBootstrap();\n return Object.freeze({ ok: true });\n } catch (error: unknown) {\n return Object.freeze({\n code: error instanceof BootstrapError ? error.code : \"RESPONSE_INVALID\",\n ok: false,\n });\n }\n}\n","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nconst e=e=>Object.assign(e,{[Symbol.dispose]:e}),t=`0.6.1`,n=`bippy-${t}`,r=Object.defineProperty,i=Object.prototype.hasOwnProperty,a=()=>{},o=e=>{try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`)})}catch{}},s=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e);let c=!1,l;const u=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>c?!0:(e&&typeof e.inject==`function`&&(l=e.inject.toString()),!!l?.includes(`(injected)`)),d=new Set,f=new Set,p=new Set,m=new WeakSet;let h=null;const g=e=>{if(e.inject===h)return;let t=e.inject,n=n=>{let r=t.call(e,n);if(!m.has(n)){m.add(n);for(let e of p)e(n)}return r};e.inject=n,h=n},_=t=>(g(x()),p.add(t),e(()=>{p.delete(t)})),v=e=>{e&&d.add(e);let t=new Map,i=0,s={_instrumentationIsActive:!1,_instrumentationSource:n,checkDCE:o,hasUnsupportedRendererAttached:!1,inject(e){let n=++i;return t.set(n,e),f.add(e),s._instrumentationIsActive||(s._instrumentationIsActive=!0,d.forEach(e=>e())),n},on:a,onCommitFiberRoot:a,onCommitFiberUnmount:a,onPostCommitFiberRoot:a,renderers:t,supportsFiber:!0,supportsFlight:!0};try{r(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get(){return s},set(t){if(t&&typeof t==`object`){let n=s.renderers;s=t,n.size>0&&(n.forEach((e,n)=>{f.add(e),t.renderers.set(n,e)}),y(e))}}});let t=window.hasOwnProperty,n=!1;r(window,`hasOwnProperty`,{configurable:!0,value:function(...e){try{if(!n&&e[0]===`__REACT_DEVTOOLS_GLOBAL_HOOK__`)return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,n=!0,-0}catch{}return t.apply(this,e)},writable:!0})}catch{y(e)}return s},y=e=>{e&&d.add(e);try{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t)return;if(!t._instrumentationSource){t.checkDCE=o,t.supportsFiber=!0,t.supportsFlight=!0,t.hasUnsupportedRendererAttached=!1,t._instrumentationSource=n,t._instrumentationIsActive=!1;let e=s(t);if(e||(t.on=a),t.renderers.size){t._instrumentationIsActive=!0,d.forEach(e=>e());return}let r=t.inject,i=u(t);i&&!e&&(c=!0,t.inject({scheduleRefresh(){}})&&(t._instrumentationIsActive=!0)),t.inject=e=>{let n=r(e);return f.add(e),i&&t.renderers.set(n,e),t._instrumentationIsActive=!0,d.forEach(e=>e()),n}}(t.renderers.size||t._instrumentationIsActive||u())&&e?.()}catch{}},b=()=>i.call(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),x=e=>b()?(y(e),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__):v(e),S=()=>!!(typeof window<`u`&&(window.document?.createElement||window.navigator?.product===`ReactNative`)),C=()=>{try{S()&&x()}catch{}};export{b as a,u as c,y as d,C as f,x as i,s as l,e as m,d as n,v as o,t as p,f as r,S as s,n as t,_ as u};","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport{f as e}from\"./rdt-hook.js\";e();","import \"bippy/install-hook-only\";\n\nimport type { NextClientBootstrapFailureCode } from \"./client/bootstrap.js\";\n\ninterface NextClientState {\n code?: NextClientBootstrapFailureCode | \"MODULE_LOAD_FAILED\";\n readonly hookInstalled: boolean;\n readonly initializationDurationMs: number;\n status: \"bootstrapping\" | \"failed\" | \"ready\";\n}\n\ndeclare global {\n var __spotpatchNextClient__: NextClientState | undefined;\n}\n\nif (globalThis.__spotpatchNextClient__ === undefined) {\n const startedAt = performance.now();\n const state: NextClientState = {\n hookInstalled:\n typeof Reflect.get(globalThis, \"__REACT_DEVTOOLS_GLOBAL_HOOK__\") === \"object\",\n initializationDurationMs: performance.now() - startedAt,\n status: \"bootstrapping\",\n };\n globalThis.__spotpatchNextClient__ = state;\n\n void import(\"./client/bootstrap.js\")\n .then(({ bootstrapNextClient }) => bootstrapNextClient())\n .then((result) => {\n if (result.ok) {\n state.status = \"ready\";\n return;\n }\n\n state.code = result.code;\n state.status = \"failed\";\n console.warn(`[spotpatch:next:client] Bootstrap disabled (${result.code}).`);\n })\n .catch(() => {\n state.code = \"MODULE_LOAD_FAILED\";\n state.status = \"failed\";\n console.warn(\"[spotpatch:next:client] Bootstrap disabled (MODULE_LOAD_FAILED).\");\n });\n}\n"],"mappings":"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","names":["t","i","s","e","n","r","bootstrapNextClient"]}
1
+ {"version":3,"sources":["../src/client/bootstrap.ts","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/rdt-hook.js","../../../node_modules/.pnpm/bippy@0.6.1_react@19.2.8/node_modules/bippy/dist/install-hook-only.js","../src/client.ts"],"sourcesContent":["import { bootstrapSpotPatch } from \"@spotpatch/runtime\";\nimport {\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nconst MAX_BOOTSTRAP_RESPONSE_BYTES = 16_384;\n\nexport type NextClientBootstrapFailureCode =\n | \"CACHE_POLICY_INVALID\"\n | \"MOUNT_FAILED\"\n | \"REQUEST_FAILED\"\n | \"RESPONSE_INVALID\"\n | \"RESPONSE_REJECTED\"\n | \"RESPONSE_TOO_LARGE\";\n\nexport type NextClientBootstrapResult =\n | Readonly<{ ok: true }>\n | Readonly<{\n code: NextClientBootstrapFailureCode;\n ok: false;\n }>;\n\nclass BootstrapError extends Error {\n constructor(readonly code: NextClientBootstrapFailureCode) {\n super(code);\n this.name = \"SpotPatchNextBootstrapError\";\n }\n}\n\nfunction deepFreeze<T>(value: T): Readonly<T> {\n if (typeof value !== \"object\" || value === null || Object.isFrozen(value)) {\n return value;\n }\n\n for (const child of Object.values(value as Readonly<Record<string, unknown>>)) {\n deepFreeze(child);\n }\n\n return Object.freeze(value);\n}\n\nasync function readBoundedJson(response: Response): Promise<unknown> {\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > MAX_BOOTSTRAP_RESPONSE_BYTES\n ) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n const text = await response.text();\n\n if (new TextEncoder().encode(text).byteLength > MAX_BOOTSTRAP_RESPONSE_BYTES) {\n throw new BootstrapError(\"RESPONSE_TOO_LARGE\");\n }\n\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n}\n\nfunction parseEnvelope(value: unknown): SpotPatchRuntimeConfig {\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n\n if (!parsed.success || parsed.data.framework !== \"next\") {\n throw new BootstrapError(\"RESPONSE_INVALID\");\n }\n\n return deepFreeze(parsed.data);\n}\n\nasync function executeBootstrap(): Promise<void> {\n let response: Response;\n\n try {\n response = await fetch(SPOTPATCH_ENDPOINTS.bootstrap, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: \"{}\",\n cache: \"no-store\",\n credentials: \"same-origin\",\n });\n } catch {\n throw new BootstrapError(\"REQUEST_FAILED\");\n }\n\n if (!response.ok) {\n await response.body?.cancel();\n throw new BootstrapError(\"RESPONSE_REJECTED\");\n }\n\n if (!response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\")) {\n await response.body?.cancel();\n throw new BootstrapError(\"CACHE_POLICY_INVALID\");\n }\n\n const config = parseEnvelope(await readBoundedJson(response));\n\n try {\n if (config.externalAgent.enabled) {\n const extension = await import(\"@spotpatch/runtime/external-handoff-panel\");\n extension.registerExternalHandoffExtension(\n Object.freeze({\n createPanel: extension.createExternalHandoffPanel,\n createWorkflow: extension.createExternalHandoffWorkflow,\n }),\n );\n }\n\n bootstrapSpotPatch(config);\n } catch {\n throw new BootstrapError(\"MOUNT_FAILED\");\n }\n}\n\nexport async function bootstrapNextClient(): Promise<NextClientBootstrapResult> {\n try {\n await executeBootstrap();\n return Object.freeze({ ok: true });\n } catch (error: unknown) {\n return Object.freeze({\n code: error instanceof BootstrapError ? error.code : \"RESPONSE_INVALID\",\n ok: false,\n });\n }\n}\n","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nconst e=e=>Object.assign(e,{[Symbol.dispose]:e}),t=`0.6.1`,n=`bippy-${t}`,r=Object.defineProperty,i=Object.prototype.hasOwnProperty,a=()=>{},o=e=>{try{Function.prototype.toString.call(e).indexOf(`^_^`)>-1&&setTimeout(()=>{throw Error(`React is running in production mode, but dead code elimination has not been applied. Read how to correctly configure React for production: https://reactjs.org/link/perf-use-production-build`)})}catch{}},s=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>!!(e&&`getFiberRoots`in e);let c=!1,l;const u=(e=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__)=>c?!0:(e&&typeof e.inject==`function`&&(l=e.inject.toString()),!!l?.includes(`(injected)`)),d=new Set,f=new Set,p=new Set,m=new WeakSet;let h=null;const g=e=>{if(e.inject===h)return;let t=e.inject,n=n=>{let r=t.call(e,n);if(!m.has(n)){m.add(n);for(let e of p)e(n)}return r};e.inject=n,h=n},_=t=>(g(x()),p.add(t),e(()=>{p.delete(t)})),v=e=>{e&&d.add(e);let t=new Map,i=0,s={_instrumentationIsActive:!1,_instrumentationSource:n,checkDCE:o,hasUnsupportedRendererAttached:!1,inject(e){let n=++i;return t.set(n,e),f.add(e),s._instrumentationIsActive||(s._instrumentationIsActive=!0,d.forEach(e=>e())),n},on:a,onCommitFiberRoot:a,onCommitFiberUnmount:a,onPostCommitFiberRoot:a,renderers:t,supportsFiber:!0,supportsFlight:!0};try{r(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`,{configurable:!0,enumerable:!0,get(){return s},set(t){if(t&&typeof t==`object`){let n=s.renderers;s=t,n.size>0&&(n.forEach((e,n)=>{f.add(e),t.renderers.set(n,e)}),y(e))}}});let t=window.hasOwnProperty,n=!1;r(window,`hasOwnProperty`,{configurable:!0,value:function(...e){try{if(!n&&e[0]===`__REACT_DEVTOOLS_GLOBAL_HOOK__`)return globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__=void 0,n=!0,-0}catch{}return t.apply(this,e)},writable:!0})}catch{y(e)}return s},y=e=>{e&&d.add(e);try{let t=globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!t)return;if(!t._instrumentationSource){t.checkDCE=o,t.supportsFiber=!0,t.supportsFlight=!0,t.hasUnsupportedRendererAttached=!1,t._instrumentationSource=n,t._instrumentationIsActive=!1;let e=s(t);if(e||(t.on=a),t.renderers.size){t._instrumentationIsActive=!0,d.forEach(e=>e());return}let r=t.inject,i=u(t);i&&!e&&(c=!0,t.inject({scheduleRefresh(){}})&&(t._instrumentationIsActive=!0)),t.inject=e=>{let n=r(e);return f.add(e),i&&t.renderers.set(n,e),t._instrumentationIsActive=!0,d.forEach(e=>e()),n}}(t.renderers.size||t._instrumentationIsActive||u())&&e?.()}catch{}},b=()=>i.call(globalThis,`__REACT_DEVTOOLS_GLOBAL_HOOK__`),x=e=>b()?(y(e),globalThis.__REACT_DEVTOOLS_GLOBAL_HOOK__):v(e),S=()=>!!(typeof window<`u`&&(window.document?.createElement||window.navigator?.product===`ReactNative`)),C=()=>{try{S()&&x()}catch{}};export{b as a,u as c,y as d,C as f,x as i,s as l,e as m,d as n,v as o,t as p,f as r,S as s,n as t,_ as u};","/**\n * @license bippy\n *\n * Copyright (c) Aiden Bai\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\nimport{f as e}from\"./rdt-hook.js\";e();","import \"bippy/install-hook-only\";\n\nimport type { NextClientBootstrapFailureCode } from \"./client/bootstrap.js\";\n\ninterface NextClientState {\n code?: NextClientBootstrapFailureCode | \"MODULE_LOAD_FAILED\";\n readonly hookInstalled: boolean;\n readonly initializationDurationMs: number;\n status: \"bootstrapping\" | \"failed\" | \"ready\";\n}\n\ndeclare global {\n var __spotpatchNextClient__: NextClientState | undefined;\n}\n\nif (globalThis.__spotpatchNextClient__ === undefined) {\n const startedAt = performance.now();\n const state: NextClientState = {\n hookInstalled:\n typeof Reflect.get(globalThis, \"__REACT_DEVTOOLS_GLOBAL_HOOK__\") === \"object\",\n initializationDurationMs: performance.now() - startedAt,\n status: \"bootstrapping\",\n };\n globalThis.__spotpatchNextClient__ = state;\n\n void import(\"./client/bootstrap.js\")\n .then(({ bootstrapNextClient }) => bootstrapNextClient())\n .then((result) => {\n if (result.ok) {\n state.status = \"ready\";\n return;\n }\n\n state.code = result.code;\n state.status = \"failed\";\n console.warn(`[spotpatch:next:client] Bootstrap disabled (${result.code}).`);\n })\n .catch(() => {\n state.code = \"MODULE_LOAD_FAILED\";\n state.status = \"failed\";\n console.warn(\"[spotpatch:next:client] Bootstrap disabled (MODULE_LOAD_FAILED).\");\n });\n}\n"],"mappings":"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","names":["t","i","s","e","n","r","bootstrapNextClient"]}
package/dist/index.cjs CHANGED
@@ -468,9 +468,13 @@ function createWebpackWrapper(input) {
468
468
  };
469
469
  }
470
470
  function mergeProductionConfig(config, appRoot, paths) {
471
+ const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.noop]);
471
472
  return {
472
473
  ...config,
473
- turbopack: mergeTurbopackAlias(config, paths.turbopackNoop),
474
+ turbopack: {
475
+ ...mergeTurbopackAlias(config, paths.turbopackNoop),
476
+ root: turbopackRoot
477
+ },
474
478
  webpack: createWebpackWrapper({
475
479
  appRoot,
476
480
  development: false,
@@ -481,7 +485,7 @@ function mergeProductionConfig(config, appRoot, paths) {
481
485
  };
482
486
  }
483
487
  function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOrigin) {
484
- const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.turbopackLoader]);
488
+ const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.loader]);
485
489
  const existingRules = config.turbopack?.rules ?? {};
486
490
  const spotPatchRules = {};
487
491
  for (const key of NEXT_SOURCE_RULE_KEYS) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/config/with-spotpatch.ts","../src/internal/constants.ts","../src/config/handshake.ts","../src/internal/ipc.ts"],"sourcesContent":["export {\n withSpotPatch,\n type NextConfigContext,\n type NextConfigEnhancer,\n type NextConfigFactory,\n type NextConfigInput,\n type NextSpotPatchOptions,\n} from \"./config/with-spotpatch.js\";\n","import { createRequire } from \"node:module\";\nimport { realpath } from \"node:fs/promises\";\nimport { existsSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveProjectOptions,\n type SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\nimport { SPOTPATCH_API_BASE } from \"@spotpatch/shared\";\nimport type { NextConfig } from \"next\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"next/constants\";\n\nimport {\n NEXT_CLIENT_MODULE_ID,\n NEXT_DEFAULT_INCLUDE,\n NEXT_SOURCE_RULE_KEYS,\n} from \"../internal/constants.js\";\nimport { configureNextRuntime } from \"./handshake.js\";\n\nexport type NextSpotPatchOptions = Omit<SpotPatchOptions, \"allowLan\" | \"dataFlow\"> &\n Readonly<{\n allowLan?: false;\n dataFlow?: false;\n }>;\n\nexport interface NextConfigContext<\n Config extends object = Readonly<Record<string, unknown>>,\n> {\n readonly defaultConfig: Config;\n}\n\nexport type NextConfigFactory<\n Config extends object = Readonly<Record<string, unknown>>,\n> = (phase: string, context: NextConfigContext<Config>) => Config | Promise<Config>;\n\nexport type NextConfigInput<Config extends object = Readonly<Record<string, unknown>>> =\n Config | NextConfigFactory<Config>;\n\nexport type NextConfigEnhancer = <\n Config extends object = Readonly<Record<string, unknown>>,\n>(\n input?: NextConfigInput<Config>,\n) => NextConfigFactory<Config>;\n\ninterface AdapterModulePaths {\n readonly loader: string;\n readonly noop: string;\n readonly turbopackLoader: string;\n readonly turbopackNoop: string;\n}\n\ntype WebpackConfig = Record<string, unknown>;\ntype WebpackHandler = (config: unknown, context: unknown) => unknown;\n\ninterface WebpackContext extends Readonly<Record<string, unknown>> {\n readonly dev: boolean;\n}\n\ntype TurbopackRules = NonNullable<NonNullable<NextConfig[\"turbopack\"]>[\"rules\"]>;\n\nconst configuredWebpackConfigs = new WeakSet();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWebpackHandler(config: NextConfig): WebpackHandler | undefined {\n const value = (config as unknown as Readonly<Record<string, unknown>>).webpack;\n\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\"SpotPatch requires nextConfig.webpack to be a function.\");\n }\n\n return value as WebpackHandler;\n}\n\nfunction requireWebpackConfig(value: unknown): WebpackConfig {\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch received an invalid webpack configuration.\");\n }\n\n return value;\n}\n\nfunction requireWebpackContext(value: unknown): WebpackContext {\n if (!isRecord(value) || typeof value.dev !== \"boolean\") {\n throw new TypeError(\"SpotPatch received an invalid webpack context.\");\n }\n\n return value as WebpackContext;\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction findCommonFilesystemRoot(paths: readonly string[]): string {\n const normalized = paths.map((value) => path.resolve(value));\n const firstPath = normalized[0];\n\n if (firstPath === undefined) {\n throw new Error(\"SpotPatch requires at least one filesystem path.\");\n }\n\n let candidate = firstPath;\n\n while (!normalized.every((value) => isWithinRoot(candidate, value))) {\n const parent = path.dirname(candidate);\n\n if (parent === candidate) {\n throw new Error(\"SpotPatch paths do not share a safe filesystem root.\");\n }\n\n candidate = parent;\n }\n\n if (candidate === path.parse(candidate).root) {\n throw new Error(\"SpotPatch refuses to configure the filesystem root.\");\n }\n\n return candidate;\n}\n\nfunction findLogicalAdapterRoot(\n appRoot: string,\n resolvedAdapterRoot: string,\n): string | undefined {\n let directory = appRoot;\n\n while (directory !== path.dirname(directory)) {\n const candidate = path.join(directory, \"node_modules\", \"@spotpatch\", \"next\");\n\n if (existsSync(candidate) && realpathSync(candidate) === resolvedAdapterRoot) {\n return candidate;\n }\n\n directory = path.dirname(directory);\n }\n\n return undefined;\n}\n\nfunction resolveAdapterModulePaths(appRoot: string): AdapterModulePaths {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n const loader = resolveFromApplication.resolve(\"@spotpatch/next/loader\");\n const resolvedAdapterRoot = path.dirname(loader);\n const noop = path.join(resolvedAdapterRoot, \"dist\", \"noop.cjs\");\n const logicalAdapterRoot = findLogicalAdapterRoot(appRoot, resolvedAdapterRoot);\n const logicalNoop =\n logicalAdapterRoot === undefined\n ? undefined\n : path.join(logicalAdapterRoot, \"dist\", \"noop.js\");\n const relativeNoop =\n logicalNoop === undefined\n ? undefined\n : path.relative(appRoot, logicalNoop).split(path.sep).join(\"/\");\n\n return Object.freeze({\n loader,\n noop,\n turbopackLoader:\n logicalAdapterRoot === undefined\n ? loader\n : path.join(logicalAdapterRoot, \"loader.cjs\"),\n turbopackNoop:\n relativeNoop === undefined\n ? noop\n : relativeNoop.startsWith(\".\")\n ? relativeNoop\n : `./${relativeNoop}`,\n });\n}\n\nfunction mergeTurbopackRoot(\n config: NextConfig,\n requiredPaths: readonly string[],\n): string {\n const commonRoot = findCommonFilesystemRoot(requiredPaths);\n const existingRoot = config.turbopack?.root;\n\n if (\n existingRoot !== undefined &&\n !requiredPaths.every((value) => isWithinRoot(existingRoot, value))\n ) {\n throw new Error(\n \"SpotPatch cannot use the existing turbopack.root because it excludes an adapter module.\",\n );\n }\n\n return existingRoot ?? commonRoot;\n}\n\nfunction mergeTurbopackAlias(\n config: NextConfig,\n noopPath: string,\n): NonNullable<NextConfig[\"turbopack\"]> {\n const aliases = config.turbopack?.resolveAlias ?? {};\n const existing = aliases[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace turbopack.resolveAlias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n return {\n ...config.turbopack,\n resolveAlias: {\n ...aliases,\n [NEXT_CLIENT_MODULE_ID]: noopPath,\n },\n };\n}\n\nfunction mergeWebpackAlias(config: WebpackConfig, noopPath: string): void {\n const resolveValue = config.resolve;\n\n if (resolveValue !== undefined && !isRecord(resolveValue)) {\n throw new Error(\"SpotPatch requires webpack resolve to be an object.\");\n }\n\n const resolve = resolveValue ?? {};\n const alias = resolve.alias ?? {};\n\n if (!isRecord(alias)) {\n throw new Error(\"SpotPatch requires webpack resolve.alias to be an object.\");\n }\n\n const existing = alias[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace webpack resolve.alias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n resolve.alias = { ...alias, [NEXT_CLIENT_MODULE_ID]: noopPath };\n config.resolve = resolve;\n}\n\nfunction scopeWebpackFilesystemCache(\n config: WebpackConfig,\n registryEpoch: string,\n): void {\n const cache = config.cache;\n\n if (isRecord(cache) && cache.type === \"filesystem\") {\n const currentVersion = typeof cache.version === \"string\" ? cache.version : \"\";\n cache.version = [currentVersion, `spotpatch:${registryEpoch}`]\n .filter(Boolean)\n .join(\"|\");\n }\n}\n\nfunction appendWebpackLoader(\n config: WebpackConfig,\n context: WebpackContext,\n loaderPath: string,\n registryEpoch: string,\n appRoot: string,\n): void {\n if (!context.dev) {\n return;\n }\n\n const module = config.module;\n\n if (!isRecord(module) || !Array.isArray(module.rules)) {\n throw new Error(\"SpotPatch requires webpack module.rules to be an array.\");\n }\n\n if (configuredWebpackConfigs.has(config)) {\n return;\n }\n\n scopeWebpackFilesystemCache(config, registryEpoch);\n const rule = {\n enforce: \"pre\" as const,\n include: appRoot,\n test: /\\.(?:jsx|tsx)$/u,\n use: [\n {\n loader: loaderPath,\n options: { registryEpoch },\n },\n ],\n };\n module.rules.push(rule);\n configuredWebpackConfigs.add(config);\n}\n\nfunction rewriteCanClaimPrivateApi(source: string): boolean {\n return (\n source === SPOTPATCH_API_BASE ||\n source.startsWith(`${SPOTPATCH_API_BASE}/`) ||\n source.startsWith(\"/:path\") ||\n source.startsWith(\"/:slug\") ||\n source.includes(\"(.*)\")\n );\n}\n\nfunction assertRewriteCompatibility(\n rewrites: readonly Readonly<{ source: string }>[] | undefined,\n): void {\n const conflict = rewrites?.find(({ source }) => rewriteCanClaimPrivateApi(source));\n\n if (conflict !== undefined) {\n throw new Error(\n `SpotPatch API prefix conflicts with the host rewrite ${conflict.source}.`,\n );\n }\n}\n\nfunction createRewrites(\n config: NextConfig,\n sidecarOrigin: string,\n): NonNullable<NextConfig[\"rewrites\"]> {\n return async () => {\n const spotPatchRewrite = {\n basePath: false as const,\n destination: `${sidecarOrigin}${SPOTPATCH_API_BASE}/:path*`,\n source: `${SPOTPATCH_API_BASE}/:path*`,\n };\n const original = await config.rewrites?.();\n\n if (original === undefined) {\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: [],\n fallback: [],\n };\n }\n\n if (Array.isArray(original)) {\n assertRewriteCompatibility(original);\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: original,\n fallback: [],\n };\n }\n\n const beforeFiles = original.beforeFiles ?? [];\n const afterFiles = original.afterFiles ?? [];\n const fallback = original.fallback ?? [];\n assertRewriteCompatibility([...beforeFiles, ...afterFiles, ...fallback]);\n return {\n beforeFiles: [spotPatchRewrite, ...beforeFiles],\n afterFiles,\n fallback,\n };\n };\n}\n\nfunction createWebpackWrapper(input: {\n readonly appRoot: string;\n readonly development: boolean;\n readonly loaderPath: string;\n readonly noopPath: string;\n readonly original: WebpackHandler | undefined;\n readonly registryEpoch?: string;\n}): WebpackHandler {\n return (configValue, contextValue) => {\n const config = requireWebpackConfig(configValue);\n const context = requireWebpackContext(contextValue);\n const configuredValue = input.original?.(configValue, contextValue);\n const configured =\n configuredValue === undefined ? config : requireWebpackConfig(configuredValue);\n\n if (input.development) {\n if (input.registryEpoch === undefined) {\n throw new Error(\"SpotPatch is missing the development registry epoch.\");\n }\n\n appendWebpackLoader(\n configured,\n context,\n input.loaderPath,\n input.registryEpoch,\n input.appRoot,\n );\n } else {\n mergeWebpackAlias(configured, input.noopPath);\n }\n\n return configured;\n };\n}\n\nfunction mergeProductionConfig(\n config: NextConfig,\n appRoot: string,\n paths: AdapterModulePaths,\n): NextConfig {\n return {\n ...config,\n turbopack: mergeTurbopackAlias(config, paths.turbopackNoop),\n webpack: createWebpackWrapper({\n appRoot,\n development: false,\n loaderPath: paths.loader,\n noopPath: paths.noop,\n original: readWebpackHandler(config),\n }),\n };\n}\n\nfunction mergeDevelopmentConfig(\n config: NextConfig,\n appRoot: string,\n paths: AdapterModulePaths,\n registryEpoch: string,\n sidecarOrigin: string,\n): NextConfig {\n const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.turbopackLoader]);\n const existingRules = config.turbopack?.rules ?? {};\n const spotPatchRules: TurbopackRules = {};\n\n for (const key of NEXT_SOURCE_RULE_KEYS) {\n if (existingRules[key] !== undefined) {\n throw new Error(\n `SpotPatch cannot replace turbopack.rules[${JSON.stringify(key)}].`,\n );\n }\n\n spotPatchRules[key] = {\n condition: { all: [\"development\", { not: \"foreign\" }] },\n loaders: [\n {\n loader: paths.turbopackLoader,\n options: { registryEpoch },\n },\n ],\n };\n }\n\n return {\n ...config,\n rewrites: createRewrites(config, sidecarOrigin),\n turbopack: {\n ...config.turbopack,\n root: turbopackRoot,\n rules: { ...existingRules, ...spotPatchRules },\n },\n webpack: createWebpackWrapper({\n appRoot,\n development: true,\n loaderPath: paths.loader,\n noopPath: paths.noop,\n original: readWebpackHandler(config),\n registryEpoch,\n }),\n };\n}\n\nasync function resolveInputConfig<Config extends object>(\n input: NextConfigInput<Config> | undefined,\n phase: string,\n context: NextConfigContext<Config>,\n): Promise<Config> {\n if (typeof input === \"function\") {\n return await input(phase, context);\n }\n\n return input ?? ({} as Config);\n}\n\nexport function withSpotPatch(\n userOptions: NextSpotPatchOptions = {},\n): NextConfigEnhancer {\n const requestedDataFlow = (userOptions as Readonly<Record<string, unknown>>).dataFlow;\n\n if (requestedDataFlow !== undefined && requestedDataFlow !== false) {\n throw new RangeError(\n \"SpotPatch Next does not support component dataFlow yet; use dataFlow only with @spotpatch/vite.\",\n );\n }\n\n return <Config extends object = Readonly<Record<string, unknown>>>(\n input?: NextConfigInput<Config>,\n ): NextConfigFactory<Config> =>\n async (phase, context): Promise<Config> => {\n const inputConfig = await resolveInputConfig(input, phase, context);\n const config = inputConfig as unknown as NextConfig;\n const appRoot = await realpath(process.cwd());\n const paths = resolveAdapterModulePaths(appRoot);\n\n if (phase !== PHASE_DEVELOPMENT_SERVER) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(process.env).ai\n : false;\n const options = await resolveProjectOptions({\n appRoot,\n environmentAi,\n options: {\n ...userOptions,\n include: userOptions.include ?? NEXT_DEFAULT_INCLUDE,\n },\n });\n\n if (options.allowLan) {\n throw new RangeError(\n \"SpotPatch Next does not support allowLan; use a loopback development host.\",\n );\n }\n\n const carrier = await configureNextRuntime({\n appRoot,\n credentials: resolveCredentialEnvironment(options, process.env),\n options,\n });\n\n if (!options.enabled) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n return mergeDevelopmentConfig(\n config,\n appRoot,\n paths,\n carrier.registryEpoch,\n carrier.sidecarOrigin,\n ) as unknown as Config;\n };\n}\n","export const NEXT_IPC_PROTOCOL_VERSION = 1 as const;\nexport const NEXT_IPC_MESSAGE_LIMIT_BYTES = 256 * 1024;\nexport const NEXT_IPC_TIMEOUT_MS = 15_000;\nexport const NEXT_INTERNAL_REGISTRATION_PATH =\n \"/__spotpatch-internal/register\" as const;\nexport const NEXT_INTERNAL_CONFIGURATION_PATH =\n \"/__spotpatch-internal/configure\" as const;\n\nexport const NEXT_ENVIRONMENT_KEYS = Object.freeze({\n appRoot: \"SPOTPATCH_NEXT_APP_ROOT\",\n bundler: \"SPOTPATCH_NEXT_BUNDLER\",\n configurationSecret: \"SPOTPATCH_NEXT_CONFIGURATION_SECRET\",\n internalOrigin: \"SPOTPATCH_NEXT_INTERNAL_ORIGIN\",\n internalSecret: \"SPOTPATCH_NEXT_INTERNAL_SECRET\",\n launchNonce: \"SPOTPATCH_NEXT_LAUNCH_NONCE\",\n registryEpoch: \"SPOTPATCH_NEXT_REGISTRY_EPOCH\",\n sidecarOrigin: \"SPOTPATCH_NEXT_SIDECAR_ORIGIN\",\n} as const);\n\nexport const NEXT_SOURCE_RULE_KEYS = Object.freeze([\"*.jsx\", \"*.tsx\"] as const);\nexport const NEXT_CLIENT_MODULE_ID = \"@spotpatch/next/client\" as const;\n\nexport const NEXT_DEFAULT_INCLUDE = Object.freeze([/\\.(?:jsx|tsx)$/u]);\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n serializeResolvedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_IPC_PROTOCOL_VERSION,\n NEXT_IPC_TIMEOUT_MS,\n} from \"../internal/constants.js\";\nimport {\n assertIpcMessageSize,\n parseNextConfigureAck,\n type NextConfigureMessage,\n} from \"../internal/ipc.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\nconst ACKNOWLEDGEMENT_LIMIT_BYTES = 4_096;\n\nexport interface NextRuntimeCarrier {\n readonly registryEpoch: string;\n readonly sidecarOrigin: string;\n}\n\ninterface ConfigureInput {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly options: ResolvedSpotPatchOptions;\n}\n\nlet activeSignature: string | undefined;\nlet activeConfiguration: Promise<NextRuntimeCarrier> | undefined;\n\nfunction readRequiredEnvironment(name: string): string {\n const value = process.env[name];\n\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(\n \"SpotPatch Next development must be started with `spotpatch-next dev`.\",\n );\n }\n\n return value;\n}\n\nfunction readLoopbackOrigin(name: string): string {\n const value = readRequiredEnvironment(name);\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n if (\n url.origin !== value ||\n url.protocol !== \"http:\" ||\n url.hostname !== \"127.0.0.1\"\n ) {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n return url.origin;\n}\n\nfunction configurationSignature(input: ConfigureInput): string {\n return JSON.stringify({\n appRoot: input.appRoot,\n credentials: input.credentials,\n options: serializeResolvedSpotPatchOptions(input.options),\n });\n}\n\nasync function sendConfiguration(input: ConfigureInput): Promise<NextRuntimeCarrier> {\n const nonce = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.launchNonce);\n const expectedAppRoot = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.appRoot);\n const registryEpoch = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.registryEpoch);\n const sidecarOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.sidecarOrigin);\n const internalOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.internalOrigin);\n readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.internalSecret);\n const configurationSecret = readRequiredEnvironment(\n NEXT_ENVIRONMENT_KEYS.configurationSecret,\n );\n const bundler = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.bundler);\n\n if (\n input.appRoot !== expectedAppRoot ||\n internalOrigin !== sidecarOrigin ||\n (bundler !== \"turbopack\" && bundler !== \"webpack\") ||\n !CONFIGURATION_SECRET_PATTERN.test(configurationSecret) ||\n !ID_PATTERN.test(nonce) ||\n !ID_PATTERN.test(registryEpoch)\n ) {\n throw new Error(\"SpotPatch received an invalid CLI launch identity.\");\n }\n\n const requestId = randomBytes(18).toString(\"base64url\");\n const message = Object.freeze({\n appRoot: input.appRoot,\n credentials: input.credentials,\n nonce,\n options: serializeResolvedSpotPatchOptions(input.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId,\n type: \"spotpatch:next:configure\",\n }) satisfies NextConfigureMessage;\n assertIpcMessageSize(message);\n let response: Response;\n\n try {\n response = await fetch(new URL(NEXT_INTERNAL_CONFIGURATION_PATH, internalOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-SpotPatch-Configuration\": configurationSecret,\n },\n body: JSON.stringify(message),\n signal: AbortSignal.timeout(NEXT_IPC_TIMEOUT_MS),\n });\n } catch {\n throw new Error(\"SpotPatch Next configuration transport failed.\");\n }\n\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (Number.isFinite(declaredLength) && declaredLength > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const text = await response.text();\n\n if (Buffer.byteLength(text, \"utf8\") > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n let acknowledgementValue: unknown;\n\n try {\n acknowledgementValue = JSON.parse(text) as unknown;\n } catch {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const acknowledgement = parseNextConfigureAck(acknowledgementValue);\n\n if (\n !response.ok ||\n acknowledgement.nonce !== nonce ||\n acknowledgement.requestId !== requestId\n ) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n if (!acknowledgement.ok) {\n throw new Error(`SpotPatch Next configuration failed (${acknowledgement.code}).`);\n }\n\n return Object.freeze({ registryEpoch, sidecarOrigin });\n}\n\nexport function configureNextRuntime(\n input: ConfigureInput,\n): Promise<NextRuntimeCarrier> {\n const signature = configurationSignature(input);\n\n if (activeConfiguration !== undefined) {\n if (activeSignature !== signature) {\n return Promise.reject(\n new Error(\"SpotPatch Next received inconsistent repeated configuration.\"),\n );\n }\n\n return activeConfiguration;\n }\n\n activeSignature = signature;\n activeConfiguration = sendConfiguration(input).catch((error: unknown) => {\n activeConfiguration = undefined;\n activeSignature = undefined;\n throw error;\n });\n return activeConfiguration;\n}\n","import path from \"node:path\";\n\nimport {\n parseSerializedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n type SerializedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_IPC_MESSAGE_LIMIT_BYTES,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./constants.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst ENVIRONMENT_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/u;\n\nexport interface NextConfigureMessage {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly nonce: string;\n readonly options: SerializedSpotPatchOptions;\n readonly protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n readonly requestId: string;\n readonly type: \"spotpatch:next:configure\";\n}\n\nexport type NextConfigureAck =\n | Readonly<{\n nonce: string;\n ok: true;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n nonce: string;\n ok: false;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>;\n\nexport interface ParsedNextConfigureMessage extends Omit<\n NextConfigureMessage,\n \"options\"\n> {\n readonly options: ResolvedSpotPatchOptions;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n expectedKeys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...expectedKeys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function assertIpcMessageSize(value: unknown): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch IPC message is not serializable.\", {\n cause: error,\n });\n }\n\n if (Buffer.byteLength(serialized, \"utf8\") > NEXT_IPC_MESSAGE_LIMIT_BYTES) {\n throw new RangeError(\"The SpotPatch IPC message exceeds the size limit.\");\n }\n}\n\nfunction parseCredentials(value: unknown): Readonly<Record<string, string>> {\n if (!isRecord(value) || Object.keys(value).length > 32) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n const entries = Object.entries(value);\n const credentials: Record<string, string> = {};\n\n for (const [name, credential] of entries) {\n if (\n !ENVIRONMENT_NAME_PATTERN.test(name) ||\n typeof credential !== \"string\" ||\n credential.length === 0 ||\n credential.length > 16_384 ||\n credential.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n credentials[name] = credential;\n }\n\n return Object.freeze(credentials);\n}\n\nexport function parseNextConfigureMessage(value: unknown): ParsedNextConfigureMessage {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\n \"appRoot\",\n \"credentials\",\n \"nonce\",\n \"options\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n value.type !== \"spotpatch:next:configure\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId) ||\n typeof value.appRoot !== \"string\" ||\n !path.isAbsolute(value.appRoot) ||\n value.appRoot.length > 4_096 ||\n value.appRoot.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC message is invalid.\");\n }\n\n return Object.freeze({\n appRoot: value.appRoot,\n credentials: parseCredentials(value.credentials),\n nonce: value.nonce,\n options: parseSerializedSpotPatchOptions(value.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure\",\n });\n}\n\nexport function parseNextConfigureAck(value: unknown): NextConfigureAck {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n value.type !== \"spotpatch:next:configure-ack\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.ok !== \"boolean\" ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n if (value.ok) {\n if (!hasExactKeys(value, [\"nonce\", \"ok\", \"protocolVersion\", \"requestId\", \"type\"])) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n nonce: value.nonce,\n ok: true,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n }\n\n if (\n !hasExactKeys(value, [\n \"code\",\n \"nonce\",\n \"ok\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n (value.code !== \"CONFIGURATION_CONFLICT\" &&\n value.code !== \"CONFIGURATION_FAILED\" &&\n value.code !== \"INVALID_IPC\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n code: value.code,\n nonce: value.nonce,\n ok: false,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n"],"mappings":"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","names":["import_node_path","import_dev_server","import_constants","import_dev_server","ID_PATTERN","isRecord","path","module"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config/with-spotpatch.ts","../src/internal/constants.ts","../src/config/handshake.ts","../src/internal/ipc.ts"],"sourcesContent":["export {\n withSpotPatch,\n type NextConfigContext,\n type NextConfigEnhancer,\n type NextConfigFactory,\n type NextConfigInput,\n type NextSpotPatchOptions,\n} from \"./config/with-spotpatch.js\";\n","import { createRequire } from \"node:module\";\nimport { realpath } from \"node:fs/promises\";\nimport { existsSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveProjectOptions,\n type SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\nimport { SPOTPATCH_API_BASE } from \"@spotpatch/shared\";\nimport type { NextConfig } from \"next\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"next/constants\";\n\nimport {\n NEXT_CLIENT_MODULE_ID,\n NEXT_DEFAULT_INCLUDE,\n NEXT_SOURCE_RULE_KEYS,\n} from \"../internal/constants.js\";\nimport { configureNextRuntime } from \"./handshake.js\";\n\nexport type NextSpotPatchOptions = Omit<SpotPatchOptions, \"allowLan\" | \"dataFlow\"> &\n Readonly<{\n allowLan?: false;\n dataFlow?: false;\n }>;\n\nexport interface NextConfigContext<\n Config extends object = Readonly<Record<string, unknown>>,\n> {\n readonly defaultConfig: Config;\n}\n\nexport type NextConfigFactory<\n Config extends object = Readonly<Record<string, unknown>>,\n> = (phase: string, context: NextConfigContext<Config>) => Config | Promise<Config>;\n\nexport type NextConfigInput<Config extends object = Readonly<Record<string, unknown>>> =\n Config | NextConfigFactory<Config>;\n\nexport type NextConfigEnhancer = <\n Config extends object = Readonly<Record<string, unknown>>,\n>(\n input?: NextConfigInput<Config>,\n) => NextConfigFactory<Config>;\n\ninterface AdapterModulePaths {\n readonly loader: string;\n readonly noop: string;\n readonly turbopackLoader: string;\n readonly turbopackNoop: string;\n}\n\ntype WebpackConfig = Record<string, unknown>;\ntype WebpackHandler = (config: unknown, context: unknown) => unknown;\n\ninterface WebpackContext extends Readonly<Record<string, unknown>> {\n readonly dev: boolean;\n}\n\ntype TurbopackRules = NonNullable<NonNullable<NextConfig[\"turbopack\"]>[\"rules\"]>;\n\nconst configuredWebpackConfigs = new WeakSet();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWebpackHandler(config: NextConfig): WebpackHandler | undefined {\n const value = (config as unknown as Readonly<Record<string, unknown>>).webpack;\n\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\"SpotPatch requires nextConfig.webpack to be a function.\");\n }\n\n return value as WebpackHandler;\n}\n\nfunction requireWebpackConfig(value: unknown): WebpackConfig {\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch received an invalid webpack configuration.\");\n }\n\n return value;\n}\n\nfunction requireWebpackContext(value: unknown): WebpackContext {\n if (!isRecord(value) || typeof value.dev !== \"boolean\") {\n throw new TypeError(\"SpotPatch received an invalid webpack context.\");\n }\n\n return value as WebpackContext;\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction findCommonFilesystemRoot(paths: readonly string[]): string {\n const normalized = paths.map((value) => path.resolve(value));\n const firstPath = normalized[0];\n\n if (firstPath === undefined) {\n throw new Error(\"SpotPatch requires at least one filesystem path.\");\n }\n\n let candidate = firstPath;\n\n while (!normalized.every((value) => isWithinRoot(candidate, value))) {\n const parent = path.dirname(candidate);\n\n if (parent === candidate) {\n throw new Error(\"SpotPatch paths do not share a safe filesystem root.\");\n }\n\n candidate = parent;\n }\n\n if (candidate === path.parse(candidate).root) {\n throw new Error(\"SpotPatch refuses to configure the filesystem root.\");\n }\n\n return candidate;\n}\n\nfunction findLogicalAdapterRoot(\n appRoot: string,\n resolvedAdapterRoot: string,\n): string | undefined {\n let directory = appRoot;\n\n while (directory !== path.dirname(directory)) {\n const candidate = path.join(directory, \"node_modules\", \"@spotpatch\", \"next\");\n\n if (existsSync(candidate) && realpathSync(candidate) === resolvedAdapterRoot) {\n return candidate;\n }\n\n directory = path.dirname(directory);\n }\n\n return undefined;\n}\n\nfunction resolveAdapterModulePaths(appRoot: string): AdapterModulePaths {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n const loader = resolveFromApplication.resolve(\"@spotpatch/next/loader\");\n const resolvedAdapterRoot = path.dirname(loader);\n const noop = path.join(resolvedAdapterRoot, \"dist\", \"noop.cjs\");\n const logicalAdapterRoot = findLogicalAdapterRoot(appRoot, resolvedAdapterRoot);\n const logicalNoop =\n logicalAdapterRoot === undefined\n ? undefined\n : path.join(logicalAdapterRoot, \"dist\", \"noop.js\");\n const relativeNoop =\n logicalNoop === undefined\n ? undefined\n : path.relative(appRoot, logicalNoop).split(path.sep).join(\"/\");\n\n return Object.freeze({\n loader,\n noop,\n turbopackLoader:\n logicalAdapterRoot === undefined\n ? loader\n : path.join(logicalAdapterRoot, \"loader.cjs\"),\n turbopackNoop:\n relativeNoop === undefined\n ? noop\n : relativeNoop.startsWith(\".\")\n ? relativeNoop\n : `./${relativeNoop}`,\n });\n}\n\nfunction mergeTurbopackRoot(\n config: NextConfig,\n requiredPaths: readonly string[],\n): string {\n const commonRoot = findCommonFilesystemRoot(requiredPaths);\n const existingRoot = config.turbopack?.root;\n\n if (\n existingRoot !== undefined &&\n !requiredPaths.every((value) => isWithinRoot(existingRoot, value))\n ) {\n throw new Error(\n \"SpotPatch cannot use the existing turbopack.root because it excludes an adapter module.\",\n );\n }\n\n return existingRoot ?? commonRoot;\n}\n\nfunction mergeTurbopackAlias(\n config: NextConfig,\n noopPath: string,\n): NonNullable<NextConfig[\"turbopack\"]> {\n const aliases = config.turbopack?.resolveAlias ?? {};\n const existing = aliases[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace turbopack.resolveAlias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n return {\n ...config.turbopack,\n resolveAlias: {\n ...aliases,\n [NEXT_CLIENT_MODULE_ID]: noopPath,\n },\n };\n}\n\nfunction mergeWebpackAlias(config: WebpackConfig, noopPath: string): void {\n const resolveValue = config.resolve;\n\n if (resolveValue !== undefined && !isRecord(resolveValue)) {\n throw new Error(\"SpotPatch requires webpack resolve to be an object.\");\n }\n\n const resolve = resolveValue ?? {};\n const alias = resolve.alias ?? {};\n\n if (!isRecord(alias)) {\n throw new Error(\"SpotPatch requires webpack resolve.alias to be an object.\");\n }\n\n const existing = alias[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace webpack resolve.alias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n resolve.alias = { ...alias, [NEXT_CLIENT_MODULE_ID]: noopPath };\n config.resolve = resolve;\n}\n\nfunction scopeWebpackFilesystemCache(\n config: WebpackConfig,\n registryEpoch: string,\n): void {\n const cache = config.cache;\n\n if (isRecord(cache) && cache.type === \"filesystem\") {\n const currentVersion = typeof cache.version === \"string\" ? cache.version : \"\";\n cache.version = [currentVersion, `spotpatch:${registryEpoch}`]\n .filter(Boolean)\n .join(\"|\");\n }\n}\n\nfunction appendWebpackLoader(\n config: WebpackConfig,\n context: WebpackContext,\n loaderPath: string,\n registryEpoch: string,\n appRoot: string,\n): void {\n if (!context.dev) {\n return;\n }\n\n const module = config.module;\n\n if (!isRecord(module) || !Array.isArray(module.rules)) {\n throw new Error(\"SpotPatch requires webpack module.rules to be an array.\");\n }\n\n if (configuredWebpackConfigs.has(config)) {\n return;\n }\n\n scopeWebpackFilesystemCache(config, registryEpoch);\n const rule = {\n enforce: \"pre\" as const,\n include: appRoot,\n test: /\\.(?:jsx|tsx)$/u,\n use: [\n {\n loader: loaderPath,\n options: { registryEpoch },\n },\n ],\n };\n module.rules.push(rule);\n configuredWebpackConfigs.add(config);\n}\n\nfunction rewriteCanClaimPrivateApi(source: string): boolean {\n return (\n source === SPOTPATCH_API_BASE ||\n source.startsWith(`${SPOTPATCH_API_BASE}/`) ||\n source.startsWith(\"/:path\") ||\n source.startsWith(\"/:slug\") ||\n source.includes(\"(.*)\")\n );\n}\n\nfunction assertRewriteCompatibility(\n rewrites: readonly Readonly<{ source: string }>[] | undefined,\n): void {\n const conflict = rewrites?.find(({ source }) => rewriteCanClaimPrivateApi(source));\n\n if (conflict !== undefined) {\n throw new Error(\n `SpotPatch API prefix conflicts with the host rewrite ${conflict.source}.`,\n );\n }\n}\n\nfunction createRewrites(\n config: NextConfig,\n sidecarOrigin: string,\n): NonNullable<NextConfig[\"rewrites\"]> {\n return async () => {\n const spotPatchRewrite = {\n basePath: false as const,\n destination: `${sidecarOrigin}${SPOTPATCH_API_BASE}/:path*`,\n source: `${SPOTPATCH_API_BASE}/:path*`,\n };\n const original = await config.rewrites?.();\n\n if (original === undefined) {\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: [],\n fallback: [],\n };\n }\n\n if (Array.isArray(original)) {\n assertRewriteCompatibility(original);\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: original,\n fallback: [],\n };\n }\n\n const beforeFiles = original.beforeFiles ?? [];\n const afterFiles = original.afterFiles ?? [];\n const fallback = original.fallback ?? [];\n assertRewriteCompatibility([...beforeFiles, ...afterFiles, ...fallback]);\n return {\n beforeFiles: [spotPatchRewrite, ...beforeFiles],\n afterFiles,\n fallback,\n };\n };\n}\n\nfunction createWebpackWrapper(input: {\n readonly appRoot: string;\n readonly development: boolean;\n readonly loaderPath: string;\n readonly noopPath: string;\n readonly original: WebpackHandler | undefined;\n readonly registryEpoch?: string;\n}): WebpackHandler {\n return (configValue, contextValue) => {\n const config = requireWebpackConfig(configValue);\n const context = requireWebpackContext(contextValue);\n const configuredValue = input.original?.(configValue, contextValue);\n const configured =\n configuredValue === undefined ? config : requireWebpackConfig(configuredValue);\n\n if (input.development) {\n if (input.registryEpoch === undefined) {\n throw new Error(\"SpotPatch is missing the development registry epoch.\");\n }\n\n appendWebpackLoader(\n configured,\n context,\n input.loaderPath,\n input.registryEpoch,\n input.appRoot,\n );\n } else {\n mergeWebpackAlias(configured, input.noopPath);\n }\n\n return configured;\n };\n}\n\nfunction mergeProductionConfig(\n config: NextConfig,\n appRoot: string,\n paths: AdapterModulePaths,\n): NextConfig {\n const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.noop]);\n\n return {\n ...config,\n turbopack: {\n ...mergeTurbopackAlias(config, paths.turbopackNoop),\n root: turbopackRoot,\n },\n webpack: createWebpackWrapper({\n appRoot,\n development: false,\n loaderPath: paths.loader,\n noopPath: paths.noop,\n original: readWebpackHandler(config),\n }),\n };\n}\n\nfunction mergeDevelopmentConfig(\n config: NextConfig,\n appRoot: string,\n paths: AdapterModulePaths,\n registryEpoch: string,\n sidecarOrigin: string,\n): NextConfig {\n const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.loader]);\n const existingRules = config.turbopack?.rules ?? {};\n const spotPatchRules: TurbopackRules = {};\n\n for (const key of NEXT_SOURCE_RULE_KEYS) {\n if (existingRules[key] !== undefined) {\n throw new Error(\n `SpotPatch cannot replace turbopack.rules[${JSON.stringify(key)}].`,\n );\n }\n\n spotPatchRules[key] = {\n condition: { all: [\"development\", { not: \"foreign\" }] },\n loaders: [\n {\n loader: paths.turbopackLoader,\n options: { registryEpoch },\n },\n ],\n };\n }\n\n return {\n ...config,\n rewrites: createRewrites(config, sidecarOrigin),\n turbopack: {\n ...config.turbopack,\n root: turbopackRoot,\n rules: { ...existingRules, ...spotPatchRules },\n },\n webpack: createWebpackWrapper({\n appRoot,\n development: true,\n loaderPath: paths.loader,\n noopPath: paths.noop,\n original: readWebpackHandler(config),\n registryEpoch,\n }),\n };\n}\n\nasync function resolveInputConfig<Config extends object>(\n input: NextConfigInput<Config> | undefined,\n phase: string,\n context: NextConfigContext<Config>,\n): Promise<Config> {\n if (typeof input === \"function\") {\n return await input(phase, context);\n }\n\n return input ?? ({} as Config);\n}\n\nexport function withSpotPatch(\n userOptions: NextSpotPatchOptions = {},\n): NextConfigEnhancer {\n const requestedDataFlow = (userOptions as Readonly<Record<string, unknown>>).dataFlow;\n\n if (requestedDataFlow !== undefined && requestedDataFlow !== false) {\n throw new RangeError(\n \"SpotPatch Next does not support component dataFlow yet; use dataFlow only with @spotpatch/vite.\",\n );\n }\n\n return <Config extends object = Readonly<Record<string, unknown>>>(\n input?: NextConfigInput<Config>,\n ): NextConfigFactory<Config> =>\n async (phase, context): Promise<Config> => {\n const inputConfig = await resolveInputConfig(input, phase, context);\n const config = inputConfig as unknown as NextConfig;\n const appRoot = await realpath(process.cwd());\n const paths = resolveAdapterModulePaths(appRoot);\n\n if (phase !== PHASE_DEVELOPMENT_SERVER) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(process.env).ai\n : false;\n const options = await resolveProjectOptions({\n appRoot,\n environmentAi,\n options: {\n ...userOptions,\n include: userOptions.include ?? NEXT_DEFAULT_INCLUDE,\n },\n });\n\n if (options.allowLan) {\n throw new RangeError(\n \"SpotPatch Next does not support allowLan; use a loopback development host.\",\n );\n }\n\n const carrier = await configureNextRuntime({\n appRoot,\n credentials: resolveCredentialEnvironment(options, process.env),\n options,\n });\n\n if (!options.enabled) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n return mergeDevelopmentConfig(\n config,\n appRoot,\n paths,\n carrier.registryEpoch,\n carrier.sidecarOrigin,\n ) as unknown as Config;\n };\n}\n","export const NEXT_IPC_PROTOCOL_VERSION = 1 as const;\nexport const NEXT_IPC_MESSAGE_LIMIT_BYTES = 256 * 1024;\nexport const NEXT_IPC_TIMEOUT_MS = 15_000;\nexport const NEXT_INTERNAL_REGISTRATION_PATH =\n \"/__spotpatch-internal/register\" as const;\nexport const NEXT_INTERNAL_CONFIGURATION_PATH =\n \"/__spotpatch-internal/configure\" as const;\n\nexport const NEXT_ENVIRONMENT_KEYS = Object.freeze({\n appRoot: \"SPOTPATCH_NEXT_APP_ROOT\",\n bundler: \"SPOTPATCH_NEXT_BUNDLER\",\n configurationSecret: \"SPOTPATCH_NEXT_CONFIGURATION_SECRET\",\n internalOrigin: \"SPOTPATCH_NEXT_INTERNAL_ORIGIN\",\n internalSecret: \"SPOTPATCH_NEXT_INTERNAL_SECRET\",\n launchNonce: \"SPOTPATCH_NEXT_LAUNCH_NONCE\",\n registryEpoch: \"SPOTPATCH_NEXT_REGISTRY_EPOCH\",\n sidecarOrigin: \"SPOTPATCH_NEXT_SIDECAR_ORIGIN\",\n} as const);\n\nexport const NEXT_SOURCE_RULE_KEYS = Object.freeze([\"*.jsx\", \"*.tsx\"] as const);\nexport const NEXT_CLIENT_MODULE_ID = \"@spotpatch/next/client\" as const;\n\nexport const NEXT_DEFAULT_INCLUDE = Object.freeze([/\\.(?:jsx|tsx)$/u]);\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n serializeResolvedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_IPC_PROTOCOL_VERSION,\n NEXT_IPC_TIMEOUT_MS,\n} from \"../internal/constants.js\";\nimport {\n assertIpcMessageSize,\n parseNextConfigureAck,\n type NextConfigureMessage,\n} from \"../internal/ipc.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\nconst ACKNOWLEDGEMENT_LIMIT_BYTES = 4_096;\n\nexport interface NextRuntimeCarrier {\n readonly registryEpoch: string;\n readonly sidecarOrigin: string;\n}\n\ninterface ConfigureInput {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly options: ResolvedSpotPatchOptions;\n}\n\nlet activeSignature: string | undefined;\nlet activeConfiguration: Promise<NextRuntimeCarrier> | undefined;\n\nfunction readRequiredEnvironment(name: string): string {\n const value = process.env[name];\n\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(\n \"SpotPatch Next development must be started with `spotpatch-next dev`.\",\n );\n }\n\n return value;\n}\n\nfunction readLoopbackOrigin(name: string): string {\n const value = readRequiredEnvironment(name);\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n if (\n url.origin !== value ||\n url.protocol !== \"http:\" ||\n url.hostname !== \"127.0.0.1\"\n ) {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n return url.origin;\n}\n\nfunction configurationSignature(input: ConfigureInput): string {\n return JSON.stringify({\n appRoot: input.appRoot,\n credentials: input.credentials,\n options: serializeResolvedSpotPatchOptions(input.options),\n });\n}\n\nasync function sendConfiguration(input: ConfigureInput): Promise<NextRuntimeCarrier> {\n const nonce = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.launchNonce);\n const expectedAppRoot = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.appRoot);\n const registryEpoch = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.registryEpoch);\n const sidecarOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.sidecarOrigin);\n const internalOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.internalOrigin);\n readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.internalSecret);\n const configurationSecret = readRequiredEnvironment(\n NEXT_ENVIRONMENT_KEYS.configurationSecret,\n );\n const bundler = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.bundler);\n\n if (\n input.appRoot !== expectedAppRoot ||\n internalOrigin !== sidecarOrigin ||\n (bundler !== \"turbopack\" && bundler !== \"webpack\") ||\n !CONFIGURATION_SECRET_PATTERN.test(configurationSecret) ||\n !ID_PATTERN.test(nonce) ||\n !ID_PATTERN.test(registryEpoch)\n ) {\n throw new Error(\"SpotPatch received an invalid CLI launch identity.\");\n }\n\n const requestId = randomBytes(18).toString(\"base64url\");\n const message = Object.freeze({\n appRoot: input.appRoot,\n credentials: input.credentials,\n nonce,\n options: serializeResolvedSpotPatchOptions(input.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId,\n type: \"spotpatch:next:configure\",\n }) satisfies NextConfigureMessage;\n assertIpcMessageSize(message);\n let response: Response;\n\n try {\n response = await fetch(new URL(NEXT_INTERNAL_CONFIGURATION_PATH, internalOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-SpotPatch-Configuration\": configurationSecret,\n },\n body: JSON.stringify(message),\n signal: AbortSignal.timeout(NEXT_IPC_TIMEOUT_MS),\n });\n } catch {\n throw new Error(\"SpotPatch Next configuration transport failed.\");\n }\n\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (Number.isFinite(declaredLength) && declaredLength > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const text = await response.text();\n\n if (Buffer.byteLength(text, \"utf8\") > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n let acknowledgementValue: unknown;\n\n try {\n acknowledgementValue = JSON.parse(text) as unknown;\n } catch {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const acknowledgement = parseNextConfigureAck(acknowledgementValue);\n\n if (\n !response.ok ||\n acknowledgement.nonce !== nonce ||\n acknowledgement.requestId !== requestId\n ) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n if (!acknowledgement.ok) {\n throw new Error(`SpotPatch Next configuration failed (${acknowledgement.code}).`);\n }\n\n return Object.freeze({ registryEpoch, sidecarOrigin });\n}\n\nexport function configureNextRuntime(\n input: ConfigureInput,\n): Promise<NextRuntimeCarrier> {\n const signature = configurationSignature(input);\n\n if (activeConfiguration !== undefined) {\n if (activeSignature !== signature) {\n return Promise.reject(\n new Error(\"SpotPatch Next received inconsistent repeated configuration.\"),\n );\n }\n\n return activeConfiguration;\n }\n\n activeSignature = signature;\n activeConfiguration = sendConfiguration(input).catch((error: unknown) => {\n activeConfiguration = undefined;\n activeSignature = undefined;\n throw error;\n });\n return activeConfiguration;\n}\n","import path from \"node:path\";\n\nimport {\n parseSerializedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n type SerializedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_IPC_MESSAGE_LIMIT_BYTES,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./constants.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst ENVIRONMENT_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/u;\n\nexport interface NextConfigureMessage {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly nonce: string;\n readonly options: SerializedSpotPatchOptions;\n readonly protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n readonly requestId: string;\n readonly type: \"spotpatch:next:configure\";\n}\n\nexport type NextConfigureAck =\n | Readonly<{\n nonce: string;\n ok: true;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n nonce: string;\n ok: false;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>;\n\nexport interface ParsedNextConfigureMessage extends Omit<\n NextConfigureMessage,\n \"options\"\n> {\n readonly options: ResolvedSpotPatchOptions;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n expectedKeys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...expectedKeys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function assertIpcMessageSize(value: unknown): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch IPC message is not serializable.\", {\n cause: error,\n });\n }\n\n if (Buffer.byteLength(serialized, \"utf8\") > NEXT_IPC_MESSAGE_LIMIT_BYTES) {\n throw new RangeError(\"The SpotPatch IPC message exceeds the size limit.\");\n }\n}\n\nfunction parseCredentials(value: unknown): Readonly<Record<string, string>> {\n if (!isRecord(value) || Object.keys(value).length > 32) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n const entries = Object.entries(value);\n const credentials: Record<string, string> = {};\n\n for (const [name, credential] of entries) {\n if (\n !ENVIRONMENT_NAME_PATTERN.test(name) ||\n typeof credential !== \"string\" ||\n credential.length === 0 ||\n credential.length > 16_384 ||\n credential.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n credentials[name] = credential;\n }\n\n return Object.freeze(credentials);\n}\n\nexport function parseNextConfigureMessage(value: unknown): ParsedNextConfigureMessage {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\n \"appRoot\",\n \"credentials\",\n \"nonce\",\n \"options\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n value.type !== \"spotpatch:next:configure\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId) ||\n typeof value.appRoot !== \"string\" ||\n !path.isAbsolute(value.appRoot) ||\n value.appRoot.length > 4_096 ||\n value.appRoot.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC message is invalid.\");\n }\n\n return Object.freeze({\n appRoot: value.appRoot,\n credentials: parseCredentials(value.credentials),\n nonce: value.nonce,\n options: parseSerializedSpotPatchOptions(value.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure\",\n });\n}\n\nexport function parseNextConfigureAck(value: unknown): NextConfigureAck {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n value.type !== \"spotpatch:next:configure-ack\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.ok !== \"boolean\" ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n if (value.ok) {\n if (!hasExactKeys(value, [\"nonce\", \"ok\", \"protocolVersion\", \"requestId\", \"type\"])) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n nonce: value.nonce,\n ok: true,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n }\n\n if (\n !hasExactKeys(value, [\n \"code\",\n \"nonce\",\n \"ok\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n (value.code !== \"CONFIGURATION_CONFLICT\" &&\n value.code !== \"CONFIGURATION_FAILED\" &&\n value.code !== \"INVALID_IPC\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n code: value.code,\n nonce: value.nonce,\n ok: false,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n"],"mappings":"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","names":["import_node_path","import_dev_server","import_constants","import_dev_server","ID_PATTERN","isRecord","path","module"]}
package/dist/index.js CHANGED
@@ -440,9 +440,13 @@ function createWebpackWrapper(input) {
440
440
  };
441
441
  }
442
442
  function mergeProductionConfig(config, appRoot, paths) {
443
+ const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.noop]);
443
444
  return {
444
445
  ...config,
445
- turbopack: mergeTurbopackAlias(config, paths.turbopackNoop),
446
+ turbopack: {
447
+ ...mergeTurbopackAlias(config, paths.turbopackNoop),
448
+ root: turbopackRoot
449
+ },
446
450
  webpack: createWebpackWrapper({
447
451
  appRoot,
448
452
  development: false,
@@ -453,7 +457,7 @@ function mergeProductionConfig(config, appRoot, paths) {
453
457
  };
454
458
  }
455
459
  function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOrigin) {
456
- const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.turbopackLoader]);
460
+ const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.loader]);
457
461
  const existingRules = config.turbopack?.rules ?? {};
458
462
  const spotPatchRules = {};
459
463
  for (const key of NEXT_SOURCE_RULE_KEYS) {