@spotpatch/next 0.5.0 → 0.7.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.
- package/README.md +60 -0
- package/dist/cli.js +579 -48
- package/dist/cli.js.map +1 -1
- package/dist/client.cjs +29 -0
- package/dist/client.cjs.map +1 -1
- package/dist/client.js +9 -0
- package/dist/client.js.map +1 -1
- package/dist/index.cjs +20 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -5
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
package/dist/client.cjs
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
2
3
|
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
8
|
var __esm = (fn, res) => function __init() {
|
|
5
9
|
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
6
10
|
};
|
|
@@ -8,6 +12,22 @@ var __export = (target, all) => {
|
|
|
8
12
|
for (var name in all)
|
|
9
13
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
10
14
|
};
|
|
15
|
+
var __copyProps = (to, from, except, desc) => {
|
|
16
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
17
|
+
for (let key of __getOwnPropNames(from))
|
|
18
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
19
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
20
|
+
}
|
|
21
|
+
return to;
|
|
22
|
+
};
|
|
23
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
24
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
25
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
26
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
27
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
28
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
29
|
+
mod
|
|
30
|
+
));
|
|
11
31
|
|
|
12
32
|
// src/client/bootstrap.ts
|
|
13
33
|
var bootstrap_exports = {};
|
|
@@ -72,6 +92,15 @@ async function executeBootstrap() {
|
|
|
72
92
|
}
|
|
73
93
|
const config = parseEnvelope(await readBoundedJson(response));
|
|
74
94
|
try {
|
|
95
|
+
if (config.externalAgent.enabled) {
|
|
96
|
+
const extension = await import("@spotpatch/runtime/external-handoff-panel");
|
|
97
|
+
extension.registerExternalHandoffExtension(
|
|
98
|
+
Object.freeze({
|
|
99
|
+
createPanel: extension.createExternalHandoffPanel,
|
|
100
|
+
createWorkflow: extension.createExternalHandoffWorkflow
|
|
101
|
+
})
|
|
102
|
+
);
|
|
103
|
+
}
|
|
75
104
|
(0, import_runtime.bootstrapSpotPatch)(config);
|
|
76
105
|
} catch {
|
|
77
106
|
throw new BootstrapError("MOUNT_FAILED");
|
package/dist/client.cjs.map
CHANGED
|
@@ -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");
|
package/dist/client.js.map
CHANGED
|
@@ -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
|
@@ -306,19 +306,26 @@ function findLogicalAdapterRoot(appRoot, resolvedAdapterRoot) {
|
|
|
306
306
|
}
|
|
307
307
|
return void 0;
|
|
308
308
|
}
|
|
309
|
+
function relativeModulePath(appRoot, target) {
|
|
310
|
+
const relative = import_node_path2.default.relative(appRoot, target).split(import_node_path2.default.sep).join("/");
|
|
311
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
312
|
+
}
|
|
309
313
|
function resolveAdapterModulePaths(appRoot) {
|
|
310
314
|
const resolveFromApplication = (0, import_node_module.createRequire)(import_node_path2.default.join(appRoot, "package.json"));
|
|
315
|
+
const client = resolveFromApplication.resolve("@spotpatch/next/client");
|
|
311
316
|
const loader = resolveFromApplication.resolve("@spotpatch/next/loader");
|
|
312
317
|
const resolvedAdapterRoot = import_node_path2.default.dirname(loader);
|
|
313
318
|
const noop = import_node_path2.default.join(resolvedAdapterRoot, "dist", "noop.cjs");
|
|
314
319
|
const logicalAdapterRoot = findLogicalAdapterRoot(appRoot, resolvedAdapterRoot);
|
|
320
|
+
const logicalClient = logicalAdapterRoot === void 0 ? void 0 : import_node_path2.default.join(logicalAdapterRoot, "dist", "client.js");
|
|
315
321
|
const logicalNoop = logicalAdapterRoot === void 0 ? void 0 : import_node_path2.default.join(logicalAdapterRoot, "dist", "noop.js");
|
|
316
|
-
const relativeNoop = logicalNoop === void 0 ? void 0 : import_node_path2.default.relative(appRoot, logicalNoop).split(import_node_path2.default.sep).join("/");
|
|
317
322
|
return Object.freeze({
|
|
323
|
+
client,
|
|
318
324
|
loader,
|
|
319
325
|
noop,
|
|
326
|
+
turbopackClient: logicalClient === void 0 ? client : relativeModulePath(appRoot, logicalClient),
|
|
320
327
|
turbopackLoader: logicalAdapterRoot === void 0 ? loader : import_node_path2.default.join(logicalAdapterRoot, "loader.cjs"),
|
|
321
|
-
turbopackNoop:
|
|
328
|
+
turbopackNoop: logicalNoop === void 0 ? noop : relativeModulePath(appRoot, logicalNoop)
|
|
322
329
|
});
|
|
323
330
|
}
|
|
324
331
|
function mergeTurbopackRoot(config, requiredPaths) {
|
|
@@ -468,9 +475,13 @@ function createWebpackWrapper(input) {
|
|
|
468
475
|
};
|
|
469
476
|
}
|
|
470
477
|
function mergeProductionConfig(config, appRoot, paths) {
|
|
478
|
+
const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.noop]);
|
|
471
479
|
return {
|
|
472
480
|
...config,
|
|
473
|
-
turbopack:
|
|
481
|
+
turbopack: {
|
|
482
|
+
...mergeTurbopackAlias(config, paths.turbopackNoop),
|
|
483
|
+
root: turbopackRoot
|
|
484
|
+
},
|
|
474
485
|
webpack: createWebpackWrapper({
|
|
475
486
|
appRoot,
|
|
476
487
|
development: false,
|
|
@@ -481,7 +492,11 @@ function mergeProductionConfig(config, appRoot, paths) {
|
|
|
481
492
|
};
|
|
482
493
|
}
|
|
483
494
|
function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOrigin) {
|
|
484
|
-
const turbopackRoot = mergeTurbopackRoot(config, [
|
|
495
|
+
const turbopackRoot = mergeTurbopackRoot(config, [
|
|
496
|
+
appRoot,
|
|
497
|
+
paths.client,
|
|
498
|
+
paths.loader
|
|
499
|
+
]);
|
|
485
500
|
const existingRules = config.turbopack?.rules ?? {};
|
|
486
501
|
const spotPatchRules = {};
|
|
487
502
|
for (const key of NEXT_SOURCE_RULE_KEYS) {
|
|
@@ -504,7 +519,7 @@ function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOr
|
|
|
504
519
|
...config,
|
|
505
520
|
rewrites: createRewrites(config, sidecarOrigin),
|
|
506
521
|
turbopack: {
|
|
507
|
-
...config.
|
|
522
|
+
...mergeTurbopackAlias(config, paths.turbopackClient),
|
|
508
523
|
root: turbopackRoot,
|
|
509
524
|
rules: { ...existingRules, ...spotPatchRules }
|
|
510
525
|
},
|
package/dist/index.cjs.map
CHANGED
|
@@ -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 client: string;\n readonly loader: string;\n readonly noop: string;\n readonly turbopackClient: 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 relativeModulePath(appRoot: string, target: string): string {\n const relative = path.relative(appRoot, target).split(path.sep).join(\"/\");\n return relative.startsWith(\".\") ? relative : `./${relative}`;\n}\n\nfunction resolveAdapterModulePaths(appRoot: string): AdapterModulePaths {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n const client = resolveFromApplication.resolve(\"@spotpatch/next/client\");\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 logicalClient =\n logicalAdapterRoot === undefined\n ? undefined\n : path.join(logicalAdapterRoot, \"dist\", \"client.js\");\n const logicalNoop =\n logicalAdapterRoot === undefined\n ? undefined\n : path.join(logicalAdapterRoot, \"dist\", \"noop.js\");\n\n return Object.freeze({\n client,\n loader,\n noop,\n turbopackClient:\n logicalClient === undefined ? client : relativeModulePath(appRoot, logicalClient),\n turbopackLoader:\n logicalAdapterRoot === undefined\n ? loader\n : path.join(logicalAdapterRoot, \"loader.cjs\"),\n turbopackNoop:\n logicalNoop === undefined ? noop : relativeModulePath(appRoot, logicalNoop),\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, [\n appRoot,\n paths.client,\n paths.loader,\n ]);\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 ...mergeTurbopackAlias(config, paths.turbopackClient),\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
|
@@ -278,19 +278,26 @@ function findLogicalAdapterRoot(appRoot, resolvedAdapterRoot) {
|
|
|
278
278
|
}
|
|
279
279
|
return void 0;
|
|
280
280
|
}
|
|
281
|
+
function relativeModulePath(appRoot, target) {
|
|
282
|
+
const relative = path2.relative(appRoot, target).split(path2.sep).join("/");
|
|
283
|
+
return relative.startsWith(".") ? relative : `./${relative}`;
|
|
284
|
+
}
|
|
281
285
|
function resolveAdapterModulePaths(appRoot) {
|
|
282
286
|
const resolveFromApplication = createRequire(path2.join(appRoot, "package.json"));
|
|
287
|
+
const client = resolveFromApplication.resolve("@spotpatch/next/client");
|
|
283
288
|
const loader = resolveFromApplication.resolve("@spotpatch/next/loader");
|
|
284
289
|
const resolvedAdapterRoot = path2.dirname(loader);
|
|
285
290
|
const noop = path2.join(resolvedAdapterRoot, "dist", "noop.cjs");
|
|
286
291
|
const logicalAdapterRoot = findLogicalAdapterRoot(appRoot, resolvedAdapterRoot);
|
|
292
|
+
const logicalClient = logicalAdapterRoot === void 0 ? void 0 : path2.join(logicalAdapterRoot, "dist", "client.js");
|
|
287
293
|
const logicalNoop = logicalAdapterRoot === void 0 ? void 0 : path2.join(logicalAdapterRoot, "dist", "noop.js");
|
|
288
|
-
const relativeNoop = logicalNoop === void 0 ? void 0 : path2.relative(appRoot, logicalNoop).split(path2.sep).join("/");
|
|
289
294
|
return Object.freeze({
|
|
295
|
+
client,
|
|
290
296
|
loader,
|
|
291
297
|
noop,
|
|
298
|
+
turbopackClient: logicalClient === void 0 ? client : relativeModulePath(appRoot, logicalClient),
|
|
292
299
|
turbopackLoader: logicalAdapterRoot === void 0 ? loader : path2.join(logicalAdapterRoot, "loader.cjs"),
|
|
293
|
-
turbopackNoop:
|
|
300
|
+
turbopackNoop: logicalNoop === void 0 ? noop : relativeModulePath(appRoot, logicalNoop)
|
|
294
301
|
});
|
|
295
302
|
}
|
|
296
303
|
function mergeTurbopackRoot(config, requiredPaths) {
|
|
@@ -440,9 +447,13 @@ function createWebpackWrapper(input) {
|
|
|
440
447
|
};
|
|
441
448
|
}
|
|
442
449
|
function mergeProductionConfig(config, appRoot, paths) {
|
|
450
|
+
const turbopackRoot = mergeTurbopackRoot(config, [appRoot, paths.noop]);
|
|
443
451
|
return {
|
|
444
452
|
...config,
|
|
445
|
-
turbopack:
|
|
453
|
+
turbopack: {
|
|
454
|
+
...mergeTurbopackAlias(config, paths.turbopackNoop),
|
|
455
|
+
root: turbopackRoot
|
|
456
|
+
},
|
|
446
457
|
webpack: createWebpackWrapper({
|
|
447
458
|
appRoot,
|
|
448
459
|
development: false,
|
|
@@ -453,7 +464,11 @@ function mergeProductionConfig(config, appRoot, paths) {
|
|
|
453
464
|
};
|
|
454
465
|
}
|
|
455
466
|
function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOrigin) {
|
|
456
|
-
const turbopackRoot = mergeTurbopackRoot(config, [
|
|
467
|
+
const turbopackRoot = mergeTurbopackRoot(config, [
|
|
468
|
+
appRoot,
|
|
469
|
+
paths.client,
|
|
470
|
+
paths.loader
|
|
471
|
+
]);
|
|
457
472
|
const existingRules = config.turbopack?.rules ?? {};
|
|
458
473
|
const spotPatchRules = {};
|
|
459
474
|
for (const key of NEXT_SOURCE_RULE_KEYS) {
|
|
@@ -476,7 +491,7 @@ function mergeDevelopmentConfig(config, appRoot, paths, registryEpoch, sidecarOr
|
|
|
476
491
|
...config,
|
|
477
492
|
rewrites: createRewrites(config, sidecarOrigin),
|
|
478
493
|
turbopack: {
|
|
479
|
-
...config.
|
|
494
|
+
...mergeTurbopackAlias(config, paths.turbopackClient),
|
|
480
495
|
root: turbopackRoot,
|
|
481
496
|
rules: { ...existingRules, ...spotPatchRules }
|
|
482
497
|
},
|