@spotpatch/next 0.4.0 → 0.5.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 CHANGED
@@ -18,6 +18,8 @@
18
18
 
19
19
  The preview connects SpotPatch's element picker, source-aware context, bilingual multi-target requests, and optional review-gated AI Agent to a Next.js development server.
20
20
 
21
+ Component `dataFlow` is not part of the Next.js preview yet. `spotpatch-next init` intentionally does not write that option, and `withSpotPatch({ dataFlow: {} })` is rejected instead of displaying a non-functional or misleading panel. The currently implemented data-flow Beta remains Vite + React 18 only.
22
+
21
23
  ### Implemented preview path
22
24
 
23
25
  - `withSpotPatch()` composes an existing `next.config` without evaluating it twice.
@@ -119,6 +121,8 @@ If React reports only a removed body attribute such as `cz-shortcut-listen="true
119
121
 
120
122
  当前预览把 SpotPatch 的元素选择、源码上下文、中英文多目标修改要求和可选审阅式 AI Agent 接入 Next.js 开发服务器。
121
123
 
124
+ 组件 `dataFlow` 尚未进入 Next.js 预览范围。`spotpatch-next init` 会有意不写入该选项;`withSpotPatch({ dataFlow: {} })` 会直接拒绝,而不是显示一个不能工作的误导性面板。当前已实现的数据链路 Beta 仍仅限 Vite + React 18。
125
+
122
126
  ### 已实现的预览链路
123
127
 
124
128
  - `withSpotPatch()` 组合现有 `next.config`,不会重复执行宿主配置。
package/dist/cli.js CHANGED
@@ -283,6 +283,7 @@ import {
283
283
  import {
284
284
  createAgentJobManager,
285
285
  createRuntimeAiConfig,
286
+ createRuntimeDataFlowConfig,
286
287
  createSession,
287
288
  createSourceRegistrationService,
288
289
  createSourceRegistry,
@@ -297,7 +298,7 @@ import {
297
298
  // package.json
298
299
  var package_default = {
299
300
  name: "@spotpatch/next",
300
- version: "0.4.0",
301
+ version: "0.5.0",
301
302
  description: "Development-only Next.js adapter and CLI for SpotPatch.",
302
303
  license: "MIT",
303
304
  repository: {
@@ -621,6 +622,7 @@ async function createNextSidecar(sidecarOptions) {
621
622
  apiBase: SPOTPATCH_API_BASE,
622
623
  ai: createRuntimeAiConfig(input.options.ai),
623
624
  budget: input.options.budget,
625
+ dataFlow: createRuntimeDataFlowConfig(input.options.dataFlow),
624
626
  bundler: input.bundler,
625
627
  debug: input.options.debug,
626
628
  editor: input.options.editor,
@@ -1120,6 +1122,27 @@ function wrappedFactoryCall(declaration, wrapperName) {
1120
1122
  const callee = unwrapParentheses(factoryCall.callee);
1121
1123
  return callee.type === "Identifier" && callee.name === wrapperName ? factoryCall : void 0;
1122
1124
  }
1125
+ function staticPropertyName(property) {
1126
+ if (property.computed) return void 0;
1127
+ if (property.key.type === "Identifier") return property.key.name;
1128
+ return property.key.type === "Literal" && typeof property.key.value === "string" ? property.key.value : void 0;
1129
+ }
1130
+ function assertSupportedDataFlowOption(factory) {
1131
+ const argument = factory.arguments[0];
1132
+ if (argument?.type !== "ObjectExpression") return;
1133
+ const properties = argument.properties.filter(
1134
+ (property2) => property2.type === "Property" && staticPropertyName(property2) === "dataFlow"
1135
+ );
1136
+ if (properties.length > 1) {
1137
+ throw new Error("SpotPatch init found duplicate dataFlow options.");
1138
+ }
1139
+ const property = properties[0];
1140
+ if (property !== void 0 && !(property.value.type === "Literal" && property.value.value === false)) {
1141
+ throw new Error(
1142
+ "SpotPatch Next does not support component dataFlow yet; remove dataFlow or set it to false."
1143
+ );
1144
+ }
1145
+ }
1123
1146
  function transformNextConfig(absolutePath, source, trustedFastModeAvailable) {
1124
1147
  if (absolutePath.endsWith(".cjs") || absolutePath.endsWith(".cts")) {
1125
1148
  throw new Error(
@@ -1138,6 +1161,7 @@ function transformNextConfig(absolutePath, source, trustedFastModeAvailable) {
1138
1161
  const wrapperName = existingWrapperName ?? chooseWrapperName(program);
1139
1162
  const existingFactory = existingWrapperName === void 0 ? void 0 : wrappedFactoryCall(defaultExport.declaration, existingWrapperName);
1140
1163
  if (existingFactory !== void 0) {
1164
+ assertSupportedDataFlowOption(existingFactory);
1141
1165
  if (trustedFastModeAvailable && existingFactory.arguments.length === 0) {
1142
1166
  magicString.overwrite(
1143
1167
  existingFactory.start,
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli.ts","../src/cli-owner.ts","../src/cli-args.ts","../src/internal/constants.ts","../src/internal/ipc.ts","../src/project.ts","../src/sidecar.ts","../package.json","../src/internal/configuration-server.ts","../src/initializer.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { runNextDevelopment } from \"./cli-owner.js\";\nimport {\n applyNextIntegrationPlan,\n checkNextIntegration,\n planNextIntegration,\n} from \"./initializer.js\";\nimport { inspectNextProject } from \"./project.js\";\n\nfunction writeUsage(): void {\n process.stderr.write(\n \"Usage: spotpatch-next <dev|init|check>\\n\" +\n \" dev [next dev options] Start the local Next.js development server.\\n\" +\n \" init Preview and apply safe integration changes.\\n\" +\n \" check Verify the integration without writing files.\\n\",\n );\n}\n\nfunction verifyAdapterExports(appRoot: string): void {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n for (const moduleId of [\n \"@spotpatch/next\",\n \"@spotpatch/next/client\",\n \"@spotpatch/next/loader\",\n \"@spotpatch/next/noop\",\n ]) {\n try {\n resolveFromApplication.resolve(moduleId);\n } catch (error: unknown) {\n throw new Error(`SpotPatch could not resolve the required export ${moduleId}.`, {\n cause: error,\n });\n }\n }\n}\n\nfunction writeTrustedModeStatus(available: boolean): void {\n process.stdout.write(\n available\n ? \"[spotpatch:next] trusted fast mode is available in the page selector.\\n\"\n : \"[spotpatch:next] review mode is ready; trusted fast mode needs a local TypeScript project check.\\n\",\n );\n}\n\nasync function runInit(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch init does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const plan = await planNextIntegration(project.appRoot);\n\n if (plan.changes.length === 0) {\n process.stdout.write(\"[spotpatch:next] integration is already up to date.\\n\");\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n }\n\n process.stdout.write(\"[spotpatch:next] integration preview (resulting files):\\n\");\n\n for (const change of plan.changes) {\n process.stdout.write(`\\n--- ${change.relativePath}\\n${change.nextContent}`);\n\n if (!change.nextContent.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n await applyNextIntegrationPlan(plan);\n process.stdout.write(\n `[spotpatch:next] updated ${String(plan.changes.length)} integration file(s).\\n`,\n );\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n}\n\nasync function runCheck(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch check does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const result = await checkNextIntegration(project.appRoot);\n\n if (!result.ok) {\n for (const issue of result.issues) {\n process.stderr.write(`[spotpatch:next] ${issue}\\n`);\n }\n\n return 1;\n }\n\n const mode = result.trustedFastModeAvailable\n ? \"trusted fast mode available\"\n : \"review mode\";\n process.stdout.write(\n `[spotpatch:next] integration verified for Next.js ${project.nextVersion} · ${mode}.\\n`,\n );\n return 0;\n}\n\nasync function main(arguments_: readonly string[]): Promise<number> {\n const [command, ...rest] = arguments_;\n\n if (command === \"dev\") {\n const integration = await checkNextIntegration();\n\n if (!integration.ok) {\n throw new Error(\n \"SpotPatch Next integration is incomplete; run `spotpatch-next init` first.\",\n );\n }\n\n return runNextDevelopment(rest);\n }\n\n if (command === \"init\") {\n return runInit(rest);\n }\n\n if (command === \"check\") {\n return runCheck(rest);\n }\n\n writeUsage();\n return 1;\n}\n\ntry {\n process.exitCode = await main(process.argv.slice(2));\n} catch (error: unknown) {\n process.stderr.write(\n `[spotpatch:next] ${\n error instanceof Error ? error.message : \"The command failed.\"\n }\\n`,\n );\n process.exitCode = 1;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\n\nimport { serializeResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nimport { parseNextDevArguments } from \"./cli-args.js\";\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./internal/constants.js\";\nimport {\n parseNextConfigureMessage,\n type NextConfigureAck,\n type ParsedNextConfigureMessage,\n} from \"./internal/ipc.js\";\nimport { inspectNextProject } from \"./project.js\";\nimport { createNextSidecar, type NextSidecar } from \"./sidecar.js\";\n\nconst CONFIGURATION_STARTUP_TIMEOUT_MS = 60_000;\nconst FORCED_TERMINATION_TIMEOUT_MS = 5_000;\nconst MAX_CONFIGURATION_REQUESTS = 32;\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\n\ninterface ChildResult {\n readonly code: number | null;\n readonly error: boolean;\n readonly signal: NodeJS.Signals | null;\n}\n\ninterface Correlation {\n readonly nonce: string;\n readonly requestId: string;\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 defaultBundler(nextVersion: string): SpotPatchNextBundler {\n return Number(nextVersion.split(\".\", 1)[0]) >= 16 ? \"turbopack\" : \"webpack\";\n}\n\nfunction signalExitCode(signal: NodeJS.Signals | null): number {\n return signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 1;\n}\n\nfunction sortedRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).sort(([left], [right]) => left.localeCompare(right)),\n ),\n );\n}\n\nfunction configurationSignature(message: ParsedNextConfigureMessage): string {\n return JSON.stringify({\n appRoot: message.appRoot,\n credentials: sortedRecord(message.credentials),\n options: serializeResolvedSpotPatchOptions(message.options),\n });\n}\n\nfunction readCorrelation(value: unknown, nonce: string): Correlation | undefined {\n if (\n !isRecord(value) ||\n typeof value.nonce !== \"string\" ||\n value.nonce !== nonce ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n return undefined;\n }\n\n return Object.freeze({ nonce, requestId: value.requestId });\n}\n\nfunction createAck(\n correlation: Correlation,\n result:\n | Readonly<{ ok: true }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n ok: false;\n }>,\n): NextConfigureAck {\n return Object.freeze({\n ...result,\n nonce: correlation.nonce,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: correlation.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n\nfunction waitForChild(child: ChildProcess): Promise<ChildResult> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ChildResult): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(Object.freeze(result));\n };\n\n child.once(\"error\", () => {\n finish({ code: null, error: true, signal: null });\n });\n child.once(\"exit\", (code, signal) => {\n finish({ code, error: false, signal });\n });\n });\n}\n\nasync function closeSidecar(sidecar: NextSidecar): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n await Promise.race([\n sidecar.close(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(\"SpotPatch Sidecar shutdown timed out.\"));\n }, FORCED_TERMINATION_TIMEOUT_MS);\n timer.unref();\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function runNextDevelopment(\n arguments_: readonly string[],\n): Promise<number> {\n const project = await inspectNextProject();\n const dev = parseNextDevArguments(\n arguments_,\n process.env,\n defaultBundler(project.nextVersion),\n );\n const launchNonce = randomBytes(24).toString(\"base64url\");\n const configurationSecret = randomBytes(32).toString(\"base64url\");\n const internalSecret = randomBytes(32).toString(\"base64url\");\n const registryEpoch = randomBytes(24).toString(\"base64url\");\n const lifecycle: {\n child?: ChildProcess;\n sidecar?: NextSidecar;\n sidecarFailed: boolean;\n } = {\n sidecarFailed: false,\n };\n const seenRequestIds = new Set<string>();\n let acceptedSignature: string | undefined;\n let activationFailed = false;\n let configured = false;\n let failureCode: string | undefined;\n let configurationQueue: Promise<void> = Promise.resolve();\n\n const handleConfiguration = async (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const correlation = readCorrelation(value, launchNonce);\n let message: ParsedNextConfigureMessage;\n\n try {\n message = parseNextConfigureMessage(value);\n } catch {\n failureCode = \"INVALID_IPC\";\n\n if (correlation !== undefined) {\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(correlation, { code: \"INVALID_IPC\", ok: false });\n }\n\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n }\n\n if (\n message.nonce !== launchNonce ||\n message.appRoot !== project.appRoot ||\n message.options.allowLan ||\n seenRequestIds.has(message.requestId) ||\n seenRequestIds.size >= MAX_CONFIGURATION_REQUESTS\n ) {\n failureCode = \"INVALID_IPC\";\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(message, { code: \"INVALID_IPC\", ok: false });\n }\n\n seenRequestIds.add(message.requestId);\n const signature = configurationSignature(message);\n\n if (acceptedSignature !== undefined && acceptedSignature !== signature) {\n failureCode = \"CONFIGURATION_CONFLICT\";\n return createAck(message, {\n code: \"CONFIGURATION_CONFLICT\",\n ok: false,\n });\n }\n\n if (activationFailed) {\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n if (acceptedSignature === undefined) {\n acceptedSignature = signature;\n const sidecar = lifecycle.sidecar;\n\n if (sidecar === undefined) {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n try {\n await sidecar.activate({\n appRoot: project.appRoot,\n bundler: dev.bundler,\n credentials: message.credentials,\n internalSecret,\n nextVersion: project.nextVersion,\n options: message.options,\n projectRoot: project.projectRoot,\n publicOrigin: dev.publicOrigin,\n registryEpoch,\n routerKind: project.routerKind,\n });\n } catch {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n }\n\n if (!configured) {\n configured = true;\n clearTimeout(startupTimer);\n\n process.stdout.write(\n `[spotpatch:next] ready for Next.js ${project.nextVersion} (${dev.bundler}) at ${dev.publicOrigin}\\n`,\n );\n }\n\n return createAck(message, { ok: true });\n };\n const enqueueConfiguration = (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const result = configurationQueue.then(() => handleConfiguration(value));\n configurationQueue = result.then(\n () => undefined,\n () => undefined,\n );\n\n return result.catch(() => {\n failureCode = \"CONFIGURATION_FAILURE\";\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n });\n };\n const sidecar = await createNextSidecar({\n configuration: {\n configurationSecret,\n onConfiguration: enqueueConfiguration,\n },\n onFatalError() {\n lifecycle.sidecarFailed = true;\n lifecycle.child?.kill(\"SIGTERM\");\n },\n });\n lifecycle.sidecar = sidecar;\n const childEnvironment: NodeJS.ProcessEnv = {\n ...process.env,\n [NEXT_ENVIRONMENT_KEYS.appRoot]: project.appRoot,\n [NEXT_ENVIRONMENT_KEYS.bundler]: dev.bundler,\n [NEXT_ENVIRONMENT_KEYS.configurationSecret]: configurationSecret,\n [NEXT_ENVIRONMENT_KEYS.internalOrigin]: sidecar.origin,\n [NEXT_ENVIRONMENT_KEYS.internalSecret]: internalSecret,\n [NEXT_ENVIRONMENT_KEYS.launchNonce]: launchNonce,\n [NEXT_ENVIRONMENT_KEYS.registryEpoch]: registryEpoch,\n [NEXT_ENVIRONMENT_KEYS.sidecarOrigin]: sidecar.origin,\n };\n const child = spawn(\n process.execPath,\n [project.nextEntry, \"dev\", ...dev.nextArguments],\n {\n cwd: project.appRoot,\n env: childEnvironment,\n shell: false,\n stdio: \"inherit\",\n windowsHide: true,\n },\n );\n lifecycle.child = child;\n const startupTimer = setTimeout(() => {\n failureCode = \"CONFIGURATION_TIMEOUT\";\n child.kill(\"SIGTERM\");\n }, CONFIGURATION_STARTUP_TIMEOUT_MS);\n startupTimer.unref();\n\n let requestedSignal: NodeJS.Signals | undefined;\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n const forwardSignal = (signal: NodeJS.Signals): void => {\n if (requestedSignal !== undefined) {\n return;\n }\n\n requestedSignal = signal;\n child.kill(signal);\n forceTimer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, FORCED_TERMINATION_TIMEOUT_MS);\n forceTimer.unref();\n };\n const onSigint = (): void => {\n forwardSignal(\"SIGINT\");\n };\n const onSigterm = (): void => {\n forwardSignal(\"SIGTERM\");\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n\n const result = await waitForChild(child);\n clearTimeout(startupTimer);\n\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n\n if (forceTimer !== undefined) {\n clearTimeout(forceTimer);\n }\n\n await configurationQueue;\n\n try {\n await closeSidecar(sidecar);\n } catch {\n failureCode ??= \"SHUTDOWN_FAILED\";\n }\n\n if (failureCode !== undefined) {\n process.stderr.write(`[spotpatch:next] stopped (${failureCode}).\\n`);\n return 1;\n }\n\n if (lifecycle.sidecarFailed || result.error) {\n process.stderr.write(\"[spotpatch:next] stopped (PROCESS_FAILURE).\\n\");\n return 1;\n }\n\n if (result.signal !== null || requestedSignal !== undefined) {\n return signalExitCode(result.signal ?? requestedSignal ?? null);\n }\n\n return result.code ?? 1;\n}\n","import { isLoopbackHostname } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nexport interface NextDevArguments {\n readonly bundler: SpotPatchNextBundler;\n readonly hostname: string;\n readonly nextArguments: readonly string[];\n readonly port: number;\n readonly publicOrigin: string;\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n\n if (\n !/^\\d+$/u.test(value) ||\n !Number.isSafeInteger(port) ||\n port < 1 ||\n port > 65_535\n ) {\n throw new RangeError(\"SpotPatch Next requires a valid development port.\");\n }\n\n return port;\n}\n\nfunction parseOptionValue(\n arguments_: readonly string[],\n index: number,\n longName: string,\n shortName: string,\n): Readonly<{ consumed: number; value?: string }> {\n const argument = arguments_[index];\n\n if (argument === longName || argument === shortName) {\n const value = arguments_[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`SpotPatch Next requires a value after ${argument}.`);\n }\n\n return Object.freeze({ consumed: 1, value });\n }\n\n const longPrefix = `${longName}=`;\n const shortPrefix = `${shortName}=`;\n\n if (argument?.startsWith(longPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(longPrefix.length) });\n }\n\n if (argument?.startsWith(shortPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(shortPrefix.length) });\n }\n\n return Object.freeze({ consumed: 0 });\n}\n\nexport function parseNextDevArguments(\n arguments_: readonly string[],\n environment: Readonly<Record<string, string | undefined>> = process.env,\n defaultBundler: SpotPatchNextBundler = \"turbopack\",\n): NextDevArguments {\n let hostname: string | undefined;\n let port: number | undefined;\n let webpack = false;\n let turbopack = false;\n\n for (let index = 0; index < arguments_.length; index += 1) {\n const argument = arguments_[index];\n const hostOption = parseOptionValue(arguments_, index, \"--hostname\", \"-H\");\n\n if (hostOption.value !== undefined) {\n if (hostname !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate hostname options.\");\n }\n\n hostname = hostOption.value;\n index += hostOption.consumed;\n continue;\n }\n\n const portOption = parseOptionValue(arguments_, index, \"--port\", \"-p\");\n\n if (portOption.value !== undefined) {\n if (port !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate port options.\");\n }\n\n port = parsePort(portOption.value);\n index += portOption.consumed;\n continue;\n }\n\n if (argument === \"--webpack\") {\n webpack = true;\n } else if (argument === \"--turbopack\" || argument === \"--turbo\") {\n turbopack = true;\n }\n }\n\n const resolvedHostname = hostname ?? \"localhost\";\n\n if (!isLoopbackHostname(resolvedHostname)) {\n throw new Error(\n \"SpotPatch Next only supports a loopback --hostname in its first release.\",\n );\n }\n\n if (webpack && turbopack) {\n throw new Error(\"SpotPatch Next cannot enable webpack and Turbopack together.\");\n }\n\n const resolvedPort =\n port ?? (environment.PORT === undefined ? 3_000 : parsePort(environment.PORT));\n const hostForUrl = resolvedHostname.includes(\":\")\n ? `[${resolvedHostname}]`\n : resolvedHostname;\n const nextArguments = [...arguments_];\n\n if (hostname === undefined) {\n nextArguments.push(\"--hostname\", resolvedHostname);\n }\n\n if (port === undefined) {\n nextArguments.push(\"--port\", String(resolvedPort));\n }\n\n return Object.freeze({\n bundler: webpack ? \"webpack\" : turbopack ? \"turbopack\" : defaultBundler,\n hostname: resolvedHostname,\n nextArguments: Object.freeze(nextArguments),\n port: resolvedPort,\n publicOrigin: `http://${hostForUrl}:${String(resolvedPort)}`,\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 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","import { execFile } from \"node:child_process\";\nimport { access, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { SpotPatchNextRouterKind } from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst VERSION_PATTERN = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z.-]+)?$/u;\n\nexport interface NextProject {\n readonly appRoot: string;\n readonly nextEntry: string;\n readonly nextVersion: string;\n readonly projectRoot: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\nasync function pathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertSupportedNextVersion(version: string): void {\n const match = VERSION_PATTERN.exec(version);\n const major = Number(match?.[1]);\n const minor = Number(match?.[2]);\n\n if (\n match === null ||\n !Number.isSafeInteger(major) ||\n !Number.isSafeInteger(minor) ||\n major < 15 ||\n major >= 17 ||\n (major === 15 && minor < 3)\n ) {\n throw new Error(\n `SpotPatch Next requires Next.js >=15.3.0 <17.0.0; found ${version}.`,\n );\n }\n}\n\nasync function detectRouterKind(appRoot: string): Promise<SpotPatchNextRouterKind> {\n const [appCandidates, pagesCandidates] = await Promise.all([\n Promise.all([\n pathExists(path.join(appRoot, \"app\")),\n pathExists(path.join(appRoot, \"src\", \"app\")),\n ]),\n Promise.all([\n pathExists(path.join(appRoot, \"pages\")),\n pathExists(path.join(appRoot, \"src\", \"pages\")),\n ]),\n ]);\n const hasApp = appCandidates.some(Boolean);\n const hasPages = pagesCandidates.some(Boolean);\n\n if (hasApp && hasPages) {\n return \"hybrid\";\n }\n\n if (hasApp) {\n return \"app\";\n }\n\n if (hasPages) {\n return \"pages\";\n }\n\n throw new Error(\"SpotPatch could not find an App or Pages Router directory.\");\n}\n\nasync function findProjectRoot(appRoot: string): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n });\n const candidate = await realpath(result.stdout.trim());\n const relative = path.relative(candidate, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return candidate;\n }\n } catch {\n // A non-Git application can still use picker/editor features with AI disabled.\n }\n\n return appRoot;\n}\n\nexport async function inspectNextProject(\n directory = process.cwd(),\n): Promise<NextProject> {\n const appRoot = await realpath(directory);\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n let nextEntry: string;\n let manifestPath: string;\n\n try {\n nextEntry = resolveFromApplication.resolve(\"next/dist/bin/next\");\n manifestPath = resolveFromApplication.resolve(\"next/package.json\");\n } catch (error: unknown) {\n throw new Error(\"SpotPatch could not resolve the application's local Next.js.\", {\n cause: error,\n });\n }\n\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest !== \"object\" ||\n manifest === null ||\n !(\"version\" in manifest) ||\n typeof manifest.version !== \"string\"\n ) {\n throw new Error(\"SpotPatch could not read the local Next.js version.\");\n }\n\n assertSupportedNextVersion(manifest.version);\n const [projectRoot, routerKind] = await Promise.all([\n findProjectRoot(appRoot),\n detectRouterKind(appRoot),\n ]);\n\n return Object.freeze({\n appRoot,\n nextEntry,\n nextVersion: manifest.version,\n projectRoot,\n routerKind,\n });\n}\n","import {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\n\nimport {\n createAgentJobManager,\n createRuntimeAiConfig,\n createSession,\n createSourceRegistrationService,\n createSourceRegistry,\n createSpotPatchMiddleware,\n type AgentJobManager,\n type ResolvedSpotPatchOptions,\n type SourceRegistry,\n} from \"@spotpatch/dev-server\";\nimport {\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchNextBundler,\n type SpotPatchNextRouterKind,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport {\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_INTERNAL_REGISTRATION_PATH,\n} from \"./internal/constants.js\";\nimport {\n createConfigurationRequestHandler,\n type ConfigurationServerOptions,\n} from \"./internal/configuration-server.js\";\n\nconst SIDECAR_SELF_CHECK_LIMIT_BYTES = 16_384;\nconst SIDECAR_SELF_CHECK_TIMEOUT_MS = 3_000;\n\ninterface ActivateSidecarInput {\n readonly appRoot: string;\n readonly bundler: SpotPatchNextBundler;\n readonly credentials: Readonly<Record<string, string>>;\n readonly internalSecret: string;\n readonly nextVersion: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly projectRoot: string;\n readonly publicOrigin: string;\n readonly registryEpoch: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\ntype RequestHandler = (request: IncomingMessage, response: ServerResponse) => void;\n\nexport interface NextSidecar {\n readonly origin: string;\n activate(input: ActivateSidecarInput): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface NextSidecarOptions {\n readonly configuration: ConfigurationServerOptions;\n readonly onFatalError?: () => void;\n}\n\nfunction requestPath(url: string | undefined): string {\n try {\n return new URL(url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nfunction writeUnavailable(response: ServerResponse, statusCode: number): void {\n const body = JSON.stringify({ ok: false });\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction validateCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n credentials: Readonly<Record<string, string>>,\n): void {\n const expected =\n options.ai === false\n ? []\n : [\n ...new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n ),\n ].sort();\n const actual = Object.keys(credentials).sort();\n\n if (\n actual.length !== expected.length ||\n actual.some((name, index) => name !== expected[index])\n ) {\n throw new TypeError(\"The SpotPatch credential environment is inconsistent.\");\n }\n}\n\nasync function selfCheckSidecar(\n sidecarOrigin: string,\n publicOrigin: string,\n expectedConfig: SpotPatchRuntimeConfig,\n): Promise<void> {\n const response = await fetch(new URL(SPOTPATCH_ENDPOINTS.bootstrap, sidecarOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: publicOrigin,\n \"Sec-Fetch-Site\": \"same-origin\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(SIDECAR_SELF_CHECK_TIMEOUT_MS),\n });\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const text = await response.text();\n\n if (\n !response.ok ||\n !response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\") ||\n Buffer.byteLength(text, \"utf8\") > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n let value: unknown;\n\n try {\n value = JSON.parse(text) as unknown;\n } catch (error: unknown) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\", { cause: error });\n }\n\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 Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n const parsedExpected = runtimeConfigSchema.safeParse(expectedConfig);\n\n if (\n !parsed.success ||\n !parsedExpected.success ||\n JSON.stringify(parsed.data) !== JSON.stringify(parsedExpected.data)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((error) => {\n if (\n error === undefined ||\n (\"code\" in error && error.code === \"ERR_SERVER_NOT_RUNNING\")\n ) {\n resolve();\n return;\n }\n\n reject(error);\n });\n });\n}\n\nexport async function createNextSidecar(\n sidecarOptions: NextSidecarOptions,\n): Promise<NextSidecar> {\n let active = false;\n let closed = false;\n let registry: SourceRegistry | undefined;\n let agentManager: AgentJobManager | undefined;\n let handler: RequestHandler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n const configurationHandler = createConfigurationRequestHandler(\n sidecarOptions.configuration,\n );\n const server = createServer((request, response) => {\n try {\n if (requestPath(request.url) === NEXT_INTERNAL_CONFIGURATION_PATH) {\n configurationHandler(request, response);\n return;\n }\n\n handler(request, response);\n } catch {\n writeUnavailable(response, 500);\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error): void => {\n reject(error);\n };\n server.once(\"error\", onError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n server.on(\"error\", () => {\n if (!closed) {\n sidecarOptions.onFatalError?.();\n }\n });\n const address = server.address();\n\n if (address === null || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"SpotPatch Sidecar did not bind a loopback address.\");\n }\n const sidecarOrigin = `http://127.0.0.1:${String(address.port)}`;\n\n return Object.freeze({\n origin: sidecarOrigin,\n async activate(input: ActivateSidecarInput): Promise<void> {\n if (closed || active) {\n throw new Error(\"SpotPatch Sidecar activation is not available.\");\n }\n\n validateCredentialEnvironment(input.options, input.credentials);\n\n if (!input.options.enabled) {\n handler = (_request, response) => {\n writeUnavailable(response, 404);\n };\n active = true;\n return;\n }\n\n const sourceRegistry = createSourceRegistry();\n const session = createSession();\n const runtimeConfig = Object.freeze({\n apiBase: SPOTPATCH_API_BASE,\n ai: createRuntimeAiConfig(input.options.ai),\n budget: input.options.budget,\n bundler: input.bundler,\n debug: input.options.debug,\n editor: input.options.editor,\n framework: \"next\",\n frameworkVersion: input.nextVersion,\n locale: input.options.locale,\n maxTargets: input.options.maxTargets,\n redact: input.options.redact,\n sessionId: session.id,\n routerKind: input.routerKind,\n sessionToken: session.token,\n shortcut: input.options.shortcut,\n spotPatchVersion: packageMetadata.version,\n }) satisfies SpotPatchRuntimeConfig;\n const manager =\n input.options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: input.options.ai,\n environment: input.credentials,\n root: input.projectRoot,\n });\n const middleware = createSpotPatchMiddleware({\n ...(manager === undefined ? {} : { agentManager: manager }),\n bootstrap: {\n expectedOrigin: input.publicOrigin,\n runtimeConfig,\n },\n logger: {\n warn(message) {\n process.stderr.write(`${message}\\n`);\n },\n },\n options: input.options,\n registry: sourceRegistry,\n root: input.appRoot,\n session,\n });\n const registration = await createSourceRegistrationService({\n internalSecret: input.internalSecret,\n options: input.options,\n registry: sourceRegistry,\n registryEpoch: input.registryEpoch,\n root: input.appRoot,\n });\n\n registry = sourceRegistry;\n agentManager = manager;\n handler = (request, response) => {\n if (requestPath(request.url) === NEXT_INTERNAL_REGISTRATION_PATH) {\n registration.handler(request, response);\n return;\n }\n\n middleware(request, response, () => {\n writeUnavailable(response, 404);\n });\n };\n await selfCheckSidecar(sidecarOrigin, input.publicOrigin, runtimeConfig);\n active = true;\n },\n async close(): Promise<void> {\n if (closed) {\n return;\n }\n\n closed = true;\n handler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n registry?.clear();\n await agentManager?.close();\n server.closeIdleConnections();\n const closing = closeServer(server);\n server.closeAllConnections();\n await closing;\n },\n });\n}\n","{\n \"name\": \"@spotpatch/next\",\n \"version\": \"0.4.0\",\n \"description\": \"Development-only Next.js adapter and CLI for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/next\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"nextjs\",\n \"react\",\n \"developer-tools\"\n ],\n \"type\": \"module\",\n \"sideEffects\": [\n \"./dist/client.cjs\",\n \"./dist/client.js\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"loader.cjs\",\n \"loader.d.cts\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-next\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/client.d.ts\",\n \"default\": \"./dist/client.js\"\n },\n \"require\": {\n \"types\": \"./dist/client.d.cts\",\n \"default\": \"./dist/client.cjs\"\n }\n },\n \"./loader\": {\n \"types\": \"./loader.d.cts\",\n \"default\": \"./loader.cjs\"\n },\n \"./noop\": {\n \"import\": {\n \"types\": \"./dist/noop.d.ts\",\n \"default\": \"./dist/noop.js\"\n },\n \"require\": {\n \"types\": \"./dist/noop.d.cts\",\n \"default\": \"./dist/noop.cjs\"\n }\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"client\": [\n \"dist/client.d.ts\"\n ],\n \"loader\": [\n \"loader.d.cts\"\n ],\n \"noop\": [\n \"dist/noop.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.loader.config.ts && tsup --config tsup.client.config.ts && pnpm verify:loader\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\",\n \"verify:loader\": \"node scripts/verify-loader.cjs\"\n },\n \"dependencies\": {\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"bippy\": \"0.6.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.3.0 <17.0.0\",\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"devDependencies\": {\n \"next\": \"16.3.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { isLoopbackHostname, readJsonRequestBody } from \"@spotpatch/dev-server\";\n\nimport { NEXT_IPC_MESSAGE_LIMIT_BYTES } from \"./constants.js\";\nimport { assertIpcMessageSize, type NextConfigureAck } from \"./ipc.js\";\n\nconst CONFIGURATION_SECRET_HEADER = \"x-spotpatch-configuration\";\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\n\nexport interface ConfigurationServerOptions {\n readonly configurationSecret: string;\n readonly onConfiguration: (value: unknown) => Promise<NextConfigureAck | undefined>;\n}\n\nexport type ConfigurationRequestHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction secretsMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction hasLoopbackHost(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nexport function createConfigurationRequestHandler(\n options: ConfigurationServerOptions,\n): ConfigurationRequestHandler {\n if (!CONFIGURATION_SECRET_PATTERN.test(options.configurationSecret)) {\n throw new TypeError(\"The SpotPatch configuration secret is invalid.\");\n }\n\n return (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !hasLoopbackHost(request) ||\n getSingleHeader(request, \"origin\") !== undefined ||\n !secretsMatch(\n getSingleHeader(request, CONFIGURATION_SECRET_HEADER),\n options.configurationSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const value = await readJsonRequestBody(request, NEXT_IPC_MESSAGE_LIMIT_BYTES);\n const acknowledgement = await options.onConfiguration(value);\n\n if (acknowledgement === undefined) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n assertIpcMessageSize(acknowledgement);\n writeJson(response, 200, acknowledgement);\n };\n\n void handle().catch(() => {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n writeJson(response, 400, { ok: false });\n });\n };\n}\n","import path from \"node:path\";\n\nimport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n discoverProjectValidationCheck,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n} from \"@spotpatch/dev-server\";\nimport { DEFAULT_AGENT_LIMITS } from \"@spotpatch/shared\";\nimport { MagicString } from \"magic-string\";\nimport {\n parseSync,\n Visitor,\n type CallExpression,\n type ExportDefaultDeclaration,\n type ImportDeclaration,\n type Program,\n} from \"oxc-parser\";\n\nconst ADAPTER_PACKAGE_NAME = \"@spotpatch/next\";\nconst CLIENT_MODULE_ID = \"@spotpatch/next/client\";\nconst CONFIG_FILE_NAMES = Object.freeze([\n \"next.config.ts\",\n \"next.config.mts\",\n \"next.config.js\",\n \"next.config.mjs\",\n \"next.config.cts\",\n \"next.config.cjs\",\n] as const);\nconst INSTRUMENTATION_EXTENSIONS = Object.freeze([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n] as const);\nconst SIMPLE_SCRIPT_ARGUMENT_PATTERN = /^[A-Za-z0-9._:/=@%+,-]+$/u;\n\nexport interface NextIntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n readonly trustedFastModeAvailable: boolean;\n}\n\nexport interface NextIntegrationCheck {\n readonly appRoot: string;\n readonly issues: readonly string[];\n readonly ok: boolean;\n readonly trustedFastModeAvailable: boolean;\n}\n\ninterface PackageManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly optionalDependencies?: Readonly<Record<string, unknown>>;\n readonly scripts?: Readonly<Record<string, unknown>>;\n readonly [key: string]: unknown;\n}\n\ninterface ParsedModule {\n readonly program: Program;\n readonly source: string;\n}\n\nfunction isParserErrorSeverity(value: unknown): boolean {\n return value === \"Error\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseModule(absolutePath: string, source: string): ParsedModule {\n const result = parseSync(absolutePath, source, {\n sourceType: \"module\",\n showSemanticErrors: true,\n });\n const error = result.errors.find((entry) => isParserErrorSeverity(entry.severity));\n\n if (error !== undefined) {\n throw new SyntaxError(\n `SpotPatch could not safely parse ${path.basename(absolutePath)} (${error.message}).`,\n );\n }\n\n return Object.freeze({ program: result.program, source });\n}\n\nfunction importsOf(program: Program): readonly ImportDeclaration[] {\n return program.body.filter(\n (statement): statement is ImportDeclaration =>\n statement.type === \"ImportDeclaration\",\n );\n}\n\nfunction importInsertionOffset(program: Program): number {\n const imports = importsOf(program);\n const lastImport = imports.at(-1);\n\n if (lastImport !== undefined) {\n return lastImport.end;\n }\n\n const directives = program.body.filter(\n (statement) =>\n statement.type === \"ExpressionStatement\" &&\n \"directive\" in statement &&\n typeof statement.directive === \"string\",\n );\n return directives.at(-1)?.end ?? program.hashbang?.end ?? 0;\n}\n\nfunction insertStaticImport(\n magicString: MagicString,\n program: Program,\n statement: string,\n): void {\n const offset = importInsertionOffset(program);\n\n if (offset === 0) {\n magicString.prepend(`${statement}\\n\\n`);\n return;\n }\n\n magicString.appendRight(offset, `\\n${statement}`);\n}\n\nfunction findDefaultExport(program: Program): ExportDefaultDeclaration {\n const exports = program.body.filter(\n (statement): statement is ExportDefaultDeclaration =>\n statement.type === \"ExportDefaultDeclaration\",\n );\n\n if (exports.length !== 1) {\n throw new Error(\n \"SpotPatch init requires exactly one ESM default export in next.config.\",\n );\n }\n\n const defaultExport = exports[0];\n\n if (defaultExport === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config default export.\");\n }\n\n return defaultExport;\n}\n\nfunction importedWrapperName(program: Program): string | undefined {\n const adapterImports = importsOf(program).filter(\n (statement) => statement.source.value === ADAPTER_PACKAGE_NAME,\n );\n\n if (adapterImports.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple @spotpatch/next imports in next.config.\",\n );\n }\n\n const adapterImport = adapterImports[0];\n\n if (adapterImport === undefined) {\n return undefined;\n }\n\n const wrapper = adapterImport.specifiers.find(\n (specifier) =>\n specifier.type === \"ImportSpecifier\" &&\n specifier.imported.type === \"Identifier\" &&\n specifier.imported.name === \"withSpotPatch\" &&\n specifier.importKind !== \"type\",\n );\n\n if (wrapper === undefined) {\n throw new Error(\n \"SpotPatch init cannot safely merge the existing @spotpatch/next import.\",\n );\n }\n\n return wrapper.local.name;\n}\n\nfunction collectIdentifierNames(program: Program): ReadonlySet<string> {\n const names = new Set<string>();\n new Visitor({\n Identifier(node) {\n names.add(node.name);\n },\n }).visit(program);\n return names;\n}\n\nfunction chooseWrapperName(program: Program): string {\n const names = collectIdentifierNames(program);\n let suffix = 0;\n let candidate = \"withSpotPatch\";\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `withSpotPatch${String(suffix)}`;\n }\n\n return candidate;\n}\n\nfunction unwrapParentheses(\n expression: CallExpression[\"callee\"],\n): CallExpression[\"callee\"] {\n let current = expression;\n\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction wrappedFactoryCall(\n declaration: ExportDefaultDeclaration[\"declaration\"],\n wrapperName: string,\n): CallExpression | undefined {\n if (declaration.type !== \"CallExpression\" || declaration.arguments.length !== 1) {\n return undefined;\n }\n\n const factoryCall = unwrapParentheses(declaration.callee);\n\n if (factoryCall.type !== \"CallExpression\") {\n return undefined;\n }\n\n const callee = unwrapParentheses(factoryCall.callee);\n return callee.type === \"Identifier\" && callee.name === wrapperName\n ? factoryCall\n : undefined;\n}\n\nfunction transformNextConfig(\n absolutePath: string,\n source: string,\n trustedFastModeAvailable: boolean,\n): string {\n if (absolutePath.endsWith(\".cjs\") || absolutePath.endsWith(\".cts\")) {\n throw new Error(\n \"SpotPatch init does not rewrite CommonJS next.config files; add withSpotPatch manually.\",\n );\n }\n\n const { program } = parseModule(absolutePath, source);\n const defaultExport = findDefaultExport(program);\n const existingWrapperName = importedWrapperName(program);\n\n if (\n defaultExport.declaration.type === \"FunctionDeclaration\" ||\n defaultExport.declaration.type === \"TSDeclareFunction\" ||\n defaultExport.declaration.type === \"ClassDeclaration\" ||\n defaultExport.declaration.type === \"TSInterfaceDeclaration\"\n ) {\n throw new Error(\n \"SpotPatch init cannot safely wrap this next.config default declaration; use an exported config expression.\",\n );\n }\n\n const magicString = new MagicString(source);\n const wrapperName = existingWrapperName ?? chooseWrapperName(program);\n const existingFactory =\n existingWrapperName === undefined\n ? undefined\n : wrappedFactoryCall(defaultExport.declaration, existingWrapperName);\n\n if (existingFactory !== undefined) {\n if (trustedFastModeAvailable && existingFactory.arguments.length === 0) {\n magicString.overwrite(\n existingFactory.start,\n existingFactory.end,\n `${wrapperName}({ trustedFastMode: true })`,\n );\n return magicString.toString();\n }\n\n return source;\n }\n\n if (existingWrapperName === undefined) {\n const specifier =\n wrapperName === \"withSpotPatch\"\n ? \"withSpotPatch\"\n : `withSpotPatch as ${wrapperName}`;\n insertStaticImport(\n magicString,\n program,\n `import { ${specifier} } from ${JSON.stringify(ADAPTER_PACKAGE_NAME)};`,\n );\n }\n\n const expression = source.slice(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n );\n magicString.overwrite(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n `${wrapperName}(${trustedFastModeAvailable ? \"{ trustedFastMode: true }\" : \"\"})(${expression})`,\n );\n return magicString.toString();\n}\n\nfunction transformInstrumentationClient(absolutePath: string, source: string): string {\n const { program } = parseModule(absolutePath, source);\n const clientImports = importsOf(program).filter(\n (statement) =>\n statement.source.value === CLIENT_MODULE_ID &&\n statement.importKind !== \"type\" &&\n (statement.specifiers.length === 0 ||\n statement.specifiers.some(\n (specifier) =>\n specifier.type !== \"ImportSpecifier\" || specifier.importKind !== \"type\",\n )),\n );\n\n if (clientImports.length > 1) {\n throw new Error(\"SpotPatch init found duplicate @spotpatch/next/client imports.\");\n }\n\n if (clientImports.length === 1) {\n return source;\n }\n\n const magicString = new MagicString(source);\n insertStaticImport(\n magicString,\n program,\n `import ${JSON.stringify(CLIENT_MODULE_ID)};`,\n );\n return magicString.toString();\n}\n\nfunction parsePackageManifest(source: string): PackageManifest {\n let value: unknown;\n\n try {\n value = JSON.parse(source) as unknown;\n } catch (error: unknown) {\n throw new SyntaxError(\"SpotPatch could not parse package.json.\", {\n cause: error,\n });\n }\n\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch requires package.json to contain an object.\");\n }\n\n return value;\n}\n\nfunction hasAdapterDependency(manifest: PackageManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.optionalDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies[ADAPTER_PACKAGE_NAME] === \"string\",\n );\n}\n\nfunction transformDevScript(script: string): string {\n const tokens = script.trim().split(/\\s+/u);\n\n if (tokens[0] === \"spotpatch-next\" && tokens[1] === \"dev\") {\n if (tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))) {\n return script;\n }\n\n throw new Error(\"SpotPatch init cannot verify the existing dev script safely.\");\n }\n\n if (\n tokens[0] !== \"next\" ||\n tokens[1] !== \"dev\" ||\n !tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))\n ) {\n throw new Error(\"SpotPatch init only rewrites a simple `next dev` package script.\");\n }\n\n return [\"spotpatch-next\", ...tokens.slice(1)].join(\" \");\n}\n\nfunction detectIndent(source: string): string {\n return /^([\\t ]+)\"/mu.exec(source)?.[1] ?? \" \";\n}\n\nfunction transformPackageJson(source: string): string {\n const manifest = parsePackageManifest(source);\n\n if (!hasAdapterDependency(manifest)) {\n throw new Error(\n \"SpotPatch init requires @spotpatch/next in package dependencies first.\",\n );\n }\n\n if (!isRecord(manifest.scripts) || typeof manifest.scripts.dev !== \"string\") {\n throw new Error(\"SpotPatch init requires a string package script named dev.\");\n }\n\n const dev = transformDevScript(manifest.scripts.dev);\n\n if (dev === manifest.scripts.dev) {\n return source;\n }\n\n const nextManifest = {\n ...manifest,\n scripts: { ...manifest.scripts, dev },\n };\n const lineEnding = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const serialized = JSON.stringify(nextManifest, undefined, detectIndent(source));\n return `${serialized.replaceAll(\"\\n\", lineEnding)}${lineEnding}`;\n}\n\nasync function findNextConfig(appRoot: string): Promise<string> {\n const candidates = (\n await Promise.all(\n CONFIG_FILE_NAMES.map(async (name) => {\n const absolutePath = path.join(appRoot, name);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (candidates.length !== 1) {\n throw new Error(\"SpotPatch init requires exactly one supported next.config file.\");\n }\n\n const configPath = candidates[0];\n\n if (configPath === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config path.\");\n }\n\n return configPath;\n}\n\nasync function resolveInstrumentationPath(\n appRoot: string,\n configPath: string,\n): Promise<string> {\n const rootRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"app\")),\n integrationPathExists(path.join(appRoot, \"pages\")),\n ]);\n const sourceRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"src\", \"app\")),\n integrationPathExists(path.join(appRoot, \"src\", \"pages\")),\n ]);\n const hasRootRouter = rootRouters.some(Boolean);\n const hasSourceRouter = sourceRouters.some(Boolean);\n\n if (hasRootRouter && hasSourceRouter) {\n throw new Error(\n \"SpotPatch init cannot choose an instrumentation location for mixed root/src routers.\",\n );\n }\n\n if (!hasRootRouter && !hasSourceRouter) {\n throw new Error(\"SpotPatch init could not find an App or Pages Router.\");\n }\n\n const directory = hasSourceRouter ? path.join(appRoot, \"src\") : appRoot;\n const existing = (\n await Promise.all(\n INSTRUMENTATION_EXTENSIONS.map(async (extension) => {\n const absolutePath = path.join(directory, `instrumentation-client${extension}`);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (existing.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple instrumentation-client entry files.\",\n );\n }\n\n if (existing[0] !== undefined) {\n return existing[0];\n }\n\n const useTypeScript =\n configPath.endsWith(\".ts\") ||\n configPath.endsWith(\".mts\") ||\n configPath.endsWith(\".cts\") ||\n (await integrationPathExists(path.join(appRoot, \"tsconfig.json\")));\n return path.join(directory, `instrumentation-client.${useTypeScript ? \"ts\" : \"js\"}`);\n}\n\nexport async function planNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationPlan> {\n const appRoot = path.resolve(directory);\n const packagePath = path.join(appRoot, \"package.json\");\n const [packageSource, configPath] = await Promise.all([\n readIntegrationFile(packagePath),\n findNextConfig(appRoot),\n ]);\n const [configSource, discoveredCheck] = await Promise.all([\n readIntegrationFile(configPath),\n discoverProjectValidationCheck({\n appRoot,\n timeoutMs: DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n }),\n ]);\n const trustedFastModeAvailable = discoveredCheck !== undefined;\n const instrumentationPath = await resolveInstrumentationPath(appRoot, configPath);\n const instrumentationSource = (await integrationPathExists(instrumentationPath))\n ? await readIntegrationFile(instrumentationPath)\n : undefined;\n const changes = [\n createIntegrationFileChange(\n appRoot,\n configPath,\n transformNextConfig(configPath, configSource, trustedFastModeAvailable),\n configSource,\n ),\n createIntegrationFileChange(\n appRoot,\n instrumentationPath,\n transformInstrumentationClient(instrumentationPath, instrumentationSource ?? \"\"),\n instrumentationSource,\n ),\n createIntegrationFileChange(\n appRoot,\n packagePath,\n transformPackageJson(packageSource),\n packageSource,\n ),\n ].filter((change): change is IntegrationFileChange => change !== undefined);\n\n return Object.freeze({\n appRoot,\n changes: Object.freeze(changes),\n trustedFastModeAvailable,\n });\n}\n\nexport async function applyNextIntegrationPlan(\n plan: NextIntegrationPlan,\n): Promise<void> {\n await applyIntegrationPlan(plan);\n}\n\nexport async function checkNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationCheck> {\n try {\n const plan = await planNextIntegration(directory);\n const issues = plan.changes.map(\n (change) => `INTEGRATION_REQUIRED:${change.relativePath}`,\n );\n return Object.freeze({\n appRoot: plan.appRoot,\n issues: Object.freeze(issues),\n ok: issues.length === 0,\n trustedFastModeAvailable: plan.trustedFastModeAvailable,\n });\n } catch (error: unknown) {\n return Object.freeze({\n appRoot: path.resolve(directory),\n issues: Object.freeze([\n error instanceof Error ? error.message : \"SpotPatch integration check failed.\",\n ]),\n ok: false,\n trustedFastModeAvailable: false,\n });\n }\n}\n"],"mappings":"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","names":["createRequire","path","defaultBundler","path","isLoopbackHostname","isLoopbackHostname","ID_PATTERN","isRecord","sidecar","result","path","isRecord","createRequire","path"]}
1
+ {"version":3,"sources":["../src/cli.ts","../src/cli-owner.ts","../src/cli-args.ts","../src/internal/constants.ts","../src/internal/ipc.ts","../src/project.ts","../src/sidecar.ts","../package.json","../src/internal/configuration-server.ts","../src/initializer.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { runNextDevelopment } from \"./cli-owner.js\";\nimport {\n applyNextIntegrationPlan,\n checkNextIntegration,\n planNextIntegration,\n} from \"./initializer.js\";\nimport { inspectNextProject } from \"./project.js\";\n\nfunction writeUsage(): void {\n process.stderr.write(\n \"Usage: spotpatch-next <dev|init|check>\\n\" +\n \" dev [next dev options] Start the local Next.js development server.\\n\" +\n \" init Preview and apply safe integration changes.\\n\" +\n \" check Verify the integration without writing files.\\n\",\n );\n}\n\nfunction verifyAdapterExports(appRoot: string): void {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n for (const moduleId of [\n \"@spotpatch/next\",\n \"@spotpatch/next/client\",\n \"@spotpatch/next/loader\",\n \"@spotpatch/next/noop\",\n ]) {\n try {\n resolveFromApplication.resolve(moduleId);\n } catch (error: unknown) {\n throw new Error(`SpotPatch could not resolve the required export ${moduleId}.`, {\n cause: error,\n });\n }\n }\n}\n\nfunction writeTrustedModeStatus(available: boolean): void {\n process.stdout.write(\n available\n ? \"[spotpatch:next] trusted fast mode is available in the page selector.\\n\"\n : \"[spotpatch:next] review mode is ready; trusted fast mode needs a local TypeScript project check.\\n\",\n );\n}\n\nasync function runInit(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch init does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const plan = await planNextIntegration(project.appRoot);\n\n if (plan.changes.length === 0) {\n process.stdout.write(\"[spotpatch:next] integration is already up to date.\\n\");\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n }\n\n process.stdout.write(\"[spotpatch:next] integration preview (resulting files):\\n\");\n\n for (const change of plan.changes) {\n process.stdout.write(`\\n--- ${change.relativePath}\\n${change.nextContent}`);\n\n if (!change.nextContent.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n await applyNextIntegrationPlan(plan);\n process.stdout.write(\n `[spotpatch:next] updated ${String(plan.changes.length)} integration file(s).\\n`,\n );\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n}\n\nasync function runCheck(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch check does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const result = await checkNextIntegration(project.appRoot);\n\n if (!result.ok) {\n for (const issue of result.issues) {\n process.stderr.write(`[spotpatch:next] ${issue}\\n`);\n }\n\n return 1;\n }\n\n const mode = result.trustedFastModeAvailable\n ? \"trusted fast mode available\"\n : \"review mode\";\n process.stdout.write(\n `[spotpatch:next] integration verified for Next.js ${project.nextVersion} · ${mode}.\\n`,\n );\n return 0;\n}\n\nasync function main(arguments_: readonly string[]): Promise<number> {\n const [command, ...rest] = arguments_;\n\n if (command === \"dev\") {\n const integration = await checkNextIntegration();\n\n if (!integration.ok) {\n throw new Error(\n \"SpotPatch Next integration is incomplete; run `spotpatch-next init` first.\",\n );\n }\n\n return runNextDevelopment(rest);\n }\n\n if (command === \"init\") {\n return runInit(rest);\n }\n\n if (command === \"check\") {\n return runCheck(rest);\n }\n\n writeUsage();\n return 1;\n}\n\ntry {\n process.exitCode = await main(process.argv.slice(2));\n} catch (error: unknown) {\n process.stderr.write(\n `[spotpatch:next] ${\n error instanceof Error ? error.message : \"The command failed.\"\n }\\n`,\n );\n process.exitCode = 1;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\n\nimport { serializeResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nimport { parseNextDevArguments } from \"./cli-args.js\";\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./internal/constants.js\";\nimport {\n parseNextConfigureMessage,\n type NextConfigureAck,\n type ParsedNextConfigureMessage,\n} from \"./internal/ipc.js\";\nimport { inspectNextProject } from \"./project.js\";\nimport { createNextSidecar, type NextSidecar } from \"./sidecar.js\";\n\nconst CONFIGURATION_STARTUP_TIMEOUT_MS = 60_000;\nconst FORCED_TERMINATION_TIMEOUT_MS = 5_000;\nconst MAX_CONFIGURATION_REQUESTS = 32;\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\n\ninterface ChildResult {\n readonly code: number | null;\n readonly error: boolean;\n readonly signal: NodeJS.Signals | null;\n}\n\ninterface Correlation {\n readonly nonce: string;\n readonly requestId: string;\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 defaultBundler(nextVersion: string): SpotPatchNextBundler {\n return Number(nextVersion.split(\".\", 1)[0]) >= 16 ? \"turbopack\" : \"webpack\";\n}\n\nfunction signalExitCode(signal: NodeJS.Signals | null): number {\n return signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 1;\n}\n\nfunction sortedRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).sort(([left], [right]) => left.localeCompare(right)),\n ),\n );\n}\n\nfunction configurationSignature(message: ParsedNextConfigureMessage): string {\n return JSON.stringify({\n appRoot: message.appRoot,\n credentials: sortedRecord(message.credentials),\n options: serializeResolvedSpotPatchOptions(message.options),\n });\n}\n\nfunction readCorrelation(value: unknown, nonce: string): Correlation | undefined {\n if (\n !isRecord(value) ||\n typeof value.nonce !== \"string\" ||\n value.nonce !== nonce ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n return undefined;\n }\n\n return Object.freeze({ nonce, requestId: value.requestId });\n}\n\nfunction createAck(\n correlation: Correlation,\n result:\n | Readonly<{ ok: true }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n ok: false;\n }>,\n): NextConfigureAck {\n return Object.freeze({\n ...result,\n nonce: correlation.nonce,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: correlation.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n\nfunction waitForChild(child: ChildProcess): Promise<ChildResult> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ChildResult): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(Object.freeze(result));\n };\n\n child.once(\"error\", () => {\n finish({ code: null, error: true, signal: null });\n });\n child.once(\"exit\", (code, signal) => {\n finish({ code, error: false, signal });\n });\n });\n}\n\nasync function closeSidecar(sidecar: NextSidecar): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n await Promise.race([\n sidecar.close(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(\"SpotPatch Sidecar shutdown timed out.\"));\n }, FORCED_TERMINATION_TIMEOUT_MS);\n timer.unref();\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function runNextDevelopment(\n arguments_: readonly string[],\n): Promise<number> {\n const project = await inspectNextProject();\n const dev = parseNextDevArguments(\n arguments_,\n process.env,\n defaultBundler(project.nextVersion),\n );\n const launchNonce = randomBytes(24).toString(\"base64url\");\n const configurationSecret = randomBytes(32).toString(\"base64url\");\n const internalSecret = randomBytes(32).toString(\"base64url\");\n const registryEpoch = randomBytes(24).toString(\"base64url\");\n const lifecycle: {\n child?: ChildProcess;\n sidecar?: NextSidecar;\n sidecarFailed: boolean;\n } = {\n sidecarFailed: false,\n };\n const seenRequestIds = new Set<string>();\n let acceptedSignature: string | undefined;\n let activationFailed = false;\n let configured = false;\n let failureCode: string | undefined;\n let configurationQueue: Promise<void> = Promise.resolve();\n\n const handleConfiguration = async (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const correlation = readCorrelation(value, launchNonce);\n let message: ParsedNextConfigureMessage;\n\n try {\n message = parseNextConfigureMessage(value);\n } catch {\n failureCode = \"INVALID_IPC\";\n\n if (correlation !== undefined) {\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(correlation, { code: \"INVALID_IPC\", ok: false });\n }\n\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n }\n\n if (\n message.nonce !== launchNonce ||\n message.appRoot !== project.appRoot ||\n message.options.allowLan ||\n seenRequestIds.has(message.requestId) ||\n seenRequestIds.size >= MAX_CONFIGURATION_REQUESTS\n ) {\n failureCode = \"INVALID_IPC\";\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(message, { code: \"INVALID_IPC\", ok: false });\n }\n\n seenRequestIds.add(message.requestId);\n const signature = configurationSignature(message);\n\n if (acceptedSignature !== undefined && acceptedSignature !== signature) {\n failureCode = \"CONFIGURATION_CONFLICT\";\n return createAck(message, {\n code: \"CONFIGURATION_CONFLICT\",\n ok: false,\n });\n }\n\n if (activationFailed) {\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n if (acceptedSignature === undefined) {\n acceptedSignature = signature;\n const sidecar = lifecycle.sidecar;\n\n if (sidecar === undefined) {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n try {\n await sidecar.activate({\n appRoot: project.appRoot,\n bundler: dev.bundler,\n credentials: message.credentials,\n internalSecret,\n nextVersion: project.nextVersion,\n options: message.options,\n projectRoot: project.projectRoot,\n publicOrigin: dev.publicOrigin,\n registryEpoch,\n routerKind: project.routerKind,\n });\n } catch {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n }\n\n if (!configured) {\n configured = true;\n clearTimeout(startupTimer);\n\n process.stdout.write(\n `[spotpatch:next] ready for Next.js ${project.nextVersion} (${dev.bundler}) at ${dev.publicOrigin}\\n`,\n );\n }\n\n return createAck(message, { ok: true });\n };\n const enqueueConfiguration = (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const result = configurationQueue.then(() => handleConfiguration(value));\n configurationQueue = result.then(\n () => undefined,\n () => undefined,\n );\n\n return result.catch(() => {\n failureCode = \"CONFIGURATION_FAILURE\";\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n });\n };\n const sidecar = await createNextSidecar({\n configuration: {\n configurationSecret,\n onConfiguration: enqueueConfiguration,\n },\n onFatalError() {\n lifecycle.sidecarFailed = true;\n lifecycle.child?.kill(\"SIGTERM\");\n },\n });\n lifecycle.sidecar = sidecar;\n const childEnvironment: NodeJS.ProcessEnv = {\n ...process.env,\n [NEXT_ENVIRONMENT_KEYS.appRoot]: project.appRoot,\n [NEXT_ENVIRONMENT_KEYS.bundler]: dev.bundler,\n [NEXT_ENVIRONMENT_KEYS.configurationSecret]: configurationSecret,\n [NEXT_ENVIRONMENT_KEYS.internalOrigin]: sidecar.origin,\n [NEXT_ENVIRONMENT_KEYS.internalSecret]: internalSecret,\n [NEXT_ENVIRONMENT_KEYS.launchNonce]: launchNonce,\n [NEXT_ENVIRONMENT_KEYS.registryEpoch]: registryEpoch,\n [NEXT_ENVIRONMENT_KEYS.sidecarOrigin]: sidecar.origin,\n };\n const child = spawn(\n process.execPath,\n [project.nextEntry, \"dev\", ...dev.nextArguments],\n {\n cwd: project.appRoot,\n env: childEnvironment,\n shell: false,\n stdio: \"inherit\",\n windowsHide: true,\n },\n );\n lifecycle.child = child;\n const startupTimer = setTimeout(() => {\n failureCode = \"CONFIGURATION_TIMEOUT\";\n child.kill(\"SIGTERM\");\n }, CONFIGURATION_STARTUP_TIMEOUT_MS);\n startupTimer.unref();\n\n let requestedSignal: NodeJS.Signals | undefined;\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n const forwardSignal = (signal: NodeJS.Signals): void => {\n if (requestedSignal !== undefined) {\n return;\n }\n\n requestedSignal = signal;\n child.kill(signal);\n forceTimer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, FORCED_TERMINATION_TIMEOUT_MS);\n forceTimer.unref();\n };\n const onSigint = (): void => {\n forwardSignal(\"SIGINT\");\n };\n const onSigterm = (): void => {\n forwardSignal(\"SIGTERM\");\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n\n const result = await waitForChild(child);\n clearTimeout(startupTimer);\n\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n\n if (forceTimer !== undefined) {\n clearTimeout(forceTimer);\n }\n\n await configurationQueue;\n\n try {\n await closeSidecar(sidecar);\n } catch {\n failureCode ??= \"SHUTDOWN_FAILED\";\n }\n\n if (failureCode !== undefined) {\n process.stderr.write(`[spotpatch:next] stopped (${failureCode}).\\n`);\n return 1;\n }\n\n if (lifecycle.sidecarFailed || result.error) {\n process.stderr.write(\"[spotpatch:next] stopped (PROCESS_FAILURE).\\n\");\n return 1;\n }\n\n if (result.signal !== null || requestedSignal !== undefined) {\n return signalExitCode(result.signal ?? requestedSignal ?? null);\n }\n\n return result.code ?? 1;\n}\n","import { isLoopbackHostname } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nexport interface NextDevArguments {\n readonly bundler: SpotPatchNextBundler;\n readonly hostname: string;\n readonly nextArguments: readonly string[];\n readonly port: number;\n readonly publicOrigin: string;\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n\n if (\n !/^\\d+$/u.test(value) ||\n !Number.isSafeInteger(port) ||\n port < 1 ||\n port > 65_535\n ) {\n throw new RangeError(\"SpotPatch Next requires a valid development port.\");\n }\n\n return port;\n}\n\nfunction parseOptionValue(\n arguments_: readonly string[],\n index: number,\n longName: string,\n shortName: string,\n): Readonly<{ consumed: number; value?: string }> {\n const argument = arguments_[index];\n\n if (argument === longName || argument === shortName) {\n const value = arguments_[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`SpotPatch Next requires a value after ${argument}.`);\n }\n\n return Object.freeze({ consumed: 1, value });\n }\n\n const longPrefix = `${longName}=`;\n const shortPrefix = `${shortName}=`;\n\n if (argument?.startsWith(longPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(longPrefix.length) });\n }\n\n if (argument?.startsWith(shortPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(shortPrefix.length) });\n }\n\n return Object.freeze({ consumed: 0 });\n}\n\nexport function parseNextDevArguments(\n arguments_: readonly string[],\n environment: Readonly<Record<string, string | undefined>> = process.env,\n defaultBundler: SpotPatchNextBundler = \"turbopack\",\n): NextDevArguments {\n let hostname: string | undefined;\n let port: number | undefined;\n let webpack = false;\n let turbopack = false;\n\n for (let index = 0; index < arguments_.length; index += 1) {\n const argument = arguments_[index];\n const hostOption = parseOptionValue(arguments_, index, \"--hostname\", \"-H\");\n\n if (hostOption.value !== undefined) {\n if (hostname !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate hostname options.\");\n }\n\n hostname = hostOption.value;\n index += hostOption.consumed;\n continue;\n }\n\n const portOption = parseOptionValue(arguments_, index, \"--port\", \"-p\");\n\n if (portOption.value !== undefined) {\n if (port !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate port options.\");\n }\n\n port = parsePort(portOption.value);\n index += portOption.consumed;\n continue;\n }\n\n if (argument === \"--webpack\") {\n webpack = true;\n } else if (argument === \"--turbopack\" || argument === \"--turbo\") {\n turbopack = true;\n }\n }\n\n const resolvedHostname = hostname ?? \"localhost\";\n\n if (!isLoopbackHostname(resolvedHostname)) {\n throw new Error(\n \"SpotPatch Next only supports a loopback --hostname in its first release.\",\n );\n }\n\n if (webpack && turbopack) {\n throw new Error(\"SpotPatch Next cannot enable webpack and Turbopack together.\");\n }\n\n const resolvedPort =\n port ?? (environment.PORT === undefined ? 3_000 : parsePort(environment.PORT));\n const hostForUrl = resolvedHostname.includes(\":\")\n ? `[${resolvedHostname}]`\n : resolvedHostname;\n const nextArguments = [...arguments_];\n\n if (hostname === undefined) {\n nextArguments.push(\"--hostname\", resolvedHostname);\n }\n\n if (port === undefined) {\n nextArguments.push(\"--port\", String(resolvedPort));\n }\n\n return Object.freeze({\n bundler: webpack ? \"webpack\" : turbopack ? \"turbopack\" : defaultBundler,\n hostname: resolvedHostname,\n nextArguments: Object.freeze(nextArguments),\n port: resolvedPort,\n publicOrigin: `http://${hostForUrl}:${String(resolvedPort)}`,\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 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","import { execFile } from \"node:child_process\";\nimport { access, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { SpotPatchNextRouterKind } from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst VERSION_PATTERN = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z.-]+)?$/u;\n\nexport interface NextProject {\n readonly appRoot: string;\n readonly nextEntry: string;\n readonly nextVersion: string;\n readonly projectRoot: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\nasync function pathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertSupportedNextVersion(version: string): void {\n const match = VERSION_PATTERN.exec(version);\n const major = Number(match?.[1]);\n const minor = Number(match?.[2]);\n\n if (\n match === null ||\n !Number.isSafeInteger(major) ||\n !Number.isSafeInteger(minor) ||\n major < 15 ||\n major >= 17 ||\n (major === 15 && minor < 3)\n ) {\n throw new Error(\n `SpotPatch Next requires Next.js >=15.3.0 <17.0.0; found ${version}.`,\n );\n }\n}\n\nasync function detectRouterKind(appRoot: string): Promise<SpotPatchNextRouterKind> {\n const [appCandidates, pagesCandidates] = await Promise.all([\n Promise.all([\n pathExists(path.join(appRoot, \"app\")),\n pathExists(path.join(appRoot, \"src\", \"app\")),\n ]),\n Promise.all([\n pathExists(path.join(appRoot, \"pages\")),\n pathExists(path.join(appRoot, \"src\", \"pages\")),\n ]),\n ]);\n const hasApp = appCandidates.some(Boolean);\n const hasPages = pagesCandidates.some(Boolean);\n\n if (hasApp && hasPages) {\n return \"hybrid\";\n }\n\n if (hasApp) {\n return \"app\";\n }\n\n if (hasPages) {\n return \"pages\";\n }\n\n throw new Error(\"SpotPatch could not find an App or Pages Router directory.\");\n}\n\nasync function findProjectRoot(appRoot: string): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n });\n const candidate = await realpath(result.stdout.trim());\n const relative = path.relative(candidate, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return candidate;\n }\n } catch {\n // A non-Git application can still use picker/editor features with AI disabled.\n }\n\n return appRoot;\n}\n\nexport async function inspectNextProject(\n directory = process.cwd(),\n): Promise<NextProject> {\n const appRoot = await realpath(directory);\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n let nextEntry: string;\n let manifestPath: string;\n\n try {\n nextEntry = resolveFromApplication.resolve(\"next/dist/bin/next\");\n manifestPath = resolveFromApplication.resolve(\"next/package.json\");\n } catch (error: unknown) {\n throw new Error(\"SpotPatch could not resolve the application's local Next.js.\", {\n cause: error,\n });\n }\n\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest !== \"object\" ||\n manifest === null ||\n !(\"version\" in manifest) ||\n typeof manifest.version !== \"string\"\n ) {\n throw new Error(\"SpotPatch could not read the local Next.js version.\");\n }\n\n assertSupportedNextVersion(manifest.version);\n const [projectRoot, routerKind] = await Promise.all([\n findProjectRoot(appRoot),\n detectRouterKind(appRoot),\n ]);\n\n return Object.freeze({\n appRoot,\n nextEntry,\n nextVersion: manifest.version,\n projectRoot,\n routerKind,\n });\n}\n","import {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\n\nimport {\n createAgentJobManager,\n createRuntimeAiConfig,\n createRuntimeDataFlowConfig,\n createSession,\n createSourceRegistrationService,\n createSourceRegistry,\n createSpotPatchMiddleware,\n type AgentJobManager,\n type ResolvedSpotPatchOptions,\n type SourceRegistry,\n} from \"@spotpatch/dev-server\";\nimport {\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchNextBundler,\n type SpotPatchNextRouterKind,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport {\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_INTERNAL_REGISTRATION_PATH,\n} from \"./internal/constants.js\";\nimport {\n createConfigurationRequestHandler,\n type ConfigurationServerOptions,\n} from \"./internal/configuration-server.js\";\n\nconst SIDECAR_SELF_CHECK_LIMIT_BYTES = 16_384;\nconst SIDECAR_SELF_CHECK_TIMEOUT_MS = 3_000;\n\ninterface ActivateSidecarInput {\n readonly appRoot: string;\n readonly bundler: SpotPatchNextBundler;\n readonly credentials: Readonly<Record<string, string>>;\n readonly internalSecret: string;\n readonly nextVersion: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly projectRoot: string;\n readonly publicOrigin: string;\n readonly registryEpoch: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\ntype RequestHandler = (request: IncomingMessage, response: ServerResponse) => void;\n\nexport interface NextSidecar {\n readonly origin: string;\n activate(input: ActivateSidecarInput): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface NextSidecarOptions {\n readonly configuration: ConfigurationServerOptions;\n readonly onFatalError?: () => void;\n}\n\nfunction requestPath(url: string | undefined): string {\n try {\n return new URL(url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nfunction writeUnavailable(response: ServerResponse, statusCode: number): void {\n const body = JSON.stringify({ ok: false });\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction validateCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n credentials: Readonly<Record<string, string>>,\n): void {\n const expected =\n options.ai === false\n ? []\n : [\n ...new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n ),\n ].sort();\n const actual = Object.keys(credentials).sort();\n\n if (\n actual.length !== expected.length ||\n actual.some((name, index) => name !== expected[index])\n ) {\n throw new TypeError(\"The SpotPatch credential environment is inconsistent.\");\n }\n}\n\nasync function selfCheckSidecar(\n sidecarOrigin: string,\n publicOrigin: string,\n expectedConfig: SpotPatchRuntimeConfig,\n): Promise<void> {\n const response = await fetch(new URL(SPOTPATCH_ENDPOINTS.bootstrap, sidecarOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: publicOrigin,\n \"Sec-Fetch-Site\": \"same-origin\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(SIDECAR_SELF_CHECK_TIMEOUT_MS),\n });\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const text = await response.text();\n\n if (\n !response.ok ||\n !response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\") ||\n Buffer.byteLength(text, \"utf8\") > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n let value: unknown;\n\n try {\n value = JSON.parse(text) as unknown;\n } catch (error: unknown) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\", { cause: error });\n }\n\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 Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n const parsedExpected = runtimeConfigSchema.safeParse(expectedConfig);\n\n if (\n !parsed.success ||\n !parsedExpected.success ||\n JSON.stringify(parsed.data) !== JSON.stringify(parsedExpected.data)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((error) => {\n if (\n error === undefined ||\n (\"code\" in error && error.code === \"ERR_SERVER_NOT_RUNNING\")\n ) {\n resolve();\n return;\n }\n\n reject(error);\n });\n });\n}\n\nexport async function createNextSidecar(\n sidecarOptions: NextSidecarOptions,\n): Promise<NextSidecar> {\n let active = false;\n let closed = false;\n let registry: SourceRegistry | undefined;\n let agentManager: AgentJobManager | undefined;\n let handler: RequestHandler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n const configurationHandler = createConfigurationRequestHandler(\n sidecarOptions.configuration,\n );\n const server = createServer((request, response) => {\n try {\n if (requestPath(request.url) === NEXT_INTERNAL_CONFIGURATION_PATH) {\n configurationHandler(request, response);\n return;\n }\n\n handler(request, response);\n } catch {\n writeUnavailable(response, 500);\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error): void => {\n reject(error);\n };\n server.once(\"error\", onError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n server.on(\"error\", () => {\n if (!closed) {\n sidecarOptions.onFatalError?.();\n }\n });\n const address = server.address();\n\n if (address === null || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"SpotPatch Sidecar did not bind a loopback address.\");\n }\n const sidecarOrigin = `http://127.0.0.1:${String(address.port)}`;\n\n return Object.freeze({\n origin: sidecarOrigin,\n async activate(input: ActivateSidecarInput): Promise<void> {\n if (closed || active) {\n throw new Error(\"SpotPatch Sidecar activation is not available.\");\n }\n\n validateCredentialEnvironment(input.options, input.credentials);\n\n if (!input.options.enabled) {\n handler = (_request, response) => {\n writeUnavailable(response, 404);\n };\n active = true;\n return;\n }\n\n const sourceRegistry = createSourceRegistry();\n const session = createSession();\n const runtimeConfig = Object.freeze({\n apiBase: SPOTPATCH_API_BASE,\n ai: createRuntimeAiConfig(input.options.ai),\n budget: input.options.budget,\n dataFlow: createRuntimeDataFlowConfig(input.options.dataFlow),\n bundler: input.bundler,\n debug: input.options.debug,\n editor: input.options.editor,\n framework: \"next\",\n frameworkVersion: input.nextVersion,\n locale: input.options.locale,\n maxTargets: input.options.maxTargets,\n redact: input.options.redact,\n sessionId: session.id,\n routerKind: input.routerKind,\n sessionToken: session.token,\n shortcut: input.options.shortcut,\n spotPatchVersion: packageMetadata.version,\n }) satisfies SpotPatchRuntimeConfig;\n const manager =\n input.options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: input.options.ai,\n environment: input.credentials,\n root: input.projectRoot,\n });\n const middleware = createSpotPatchMiddleware({\n ...(manager === undefined ? {} : { agentManager: manager }),\n bootstrap: {\n expectedOrigin: input.publicOrigin,\n runtimeConfig,\n },\n logger: {\n warn(message) {\n process.stderr.write(`${message}\\n`);\n },\n },\n options: input.options,\n registry: sourceRegistry,\n root: input.appRoot,\n session,\n });\n const registration = await createSourceRegistrationService({\n internalSecret: input.internalSecret,\n options: input.options,\n registry: sourceRegistry,\n registryEpoch: input.registryEpoch,\n root: input.appRoot,\n });\n\n registry = sourceRegistry;\n agentManager = manager;\n handler = (request, response) => {\n if (requestPath(request.url) === NEXT_INTERNAL_REGISTRATION_PATH) {\n registration.handler(request, response);\n return;\n }\n\n middleware(request, response, () => {\n writeUnavailable(response, 404);\n });\n };\n await selfCheckSidecar(sidecarOrigin, input.publicOrigin, runtimeConfig);\n active = true;\n },\n async close(): Promise<void> {\n if (closed) {\n return;\n }\n\n closed = true;\n handler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n registry?.clear();\n await agentManager?.close();\n server.closeIdleConnections();\n const closing = closeServer(server);\n server.closeAllConnections();\n await closing;\n },\n });\n}\n","{\n \"name\": \"@spotpatch/next\",\n \"version\": \"0.5.0\",\n \"description\": \"Development-only Next.js adapter and CLI for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/next\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"nextjs\",\n \"react\",\n \"developer-tools\"\n ],\n \"type\": \"module\",\n \"sideEffects\": [\n \"./dist/client.cjs\",\n \"./dist/client.js\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"loader.cjs\",\n \"loader.d.cts\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-next\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/client.d.ts\",\n \"default\": \"./dist/client.js\"\n },\n \"require\": {\n \"types\": \"./dist/client.d.cts\",\n \"default\": \"./dist/client.cjs\"\n }\n },\n \"./loader\": {\n \"types\": \"./loader.d.cts\",\n \"default\": \"./loader.cjs\"\n },\n \"./noop\": {\n \"import\": {\n \"types\": \"./dist/noop.d.ts\",\n \"default\": \"./dist/noop.js\"\n },\n \"require\": {\n \"types\": \"./dist/noop.d.cts\",\n \"default\": \"./dist/noop.cjs\"\n }\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"client\": [\n \"dist/client.d.ts\"\n ],\n \"loader\": [\n \"loader.d.cts\"\n ],\n \"noop\": [\n \"dist/noop.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.loader.config.ts && tsup --config tsup.client.config.ts && pnpm verify:loader\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\",\n \"verify:loader\": \"node scripts/verify-loader.cjs\"\n },\n \"dependencies\": {\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"bippy\": \"0.6.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.3.0 <17.0.0\",\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"devDependencies\": {\n \"next\": \"16.3.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { isLoopbackHostname, readJsonRequestBody } from \"@spotpatch/dev-server\";\n\nimport { NEXT_IPC_MESSAGE_LIMIT_BYTES } from \"./constants.js\";\nimport { assertIpcMessageSize, type NextConfigureAck } from \"./ipc.js\";\n\nconst CONFIGURATION_SECRET_HEADER = \"x-spotpatch-configuration\";\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\n\nexport interface ConfigurationServerOptions {\n readonly configurationSecret: string;\n readonly onConfiguration: (value: unknown) => Promise<NextConfigureAck | undefined>;\n}\n\nexport type ConfigurationRequestHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction secretsMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction hasLoopbackHost(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nexport function createConfigurationRequestHandler(\n options: ConfigurationServerOptions,\n): ConfigurationRequestHandler {\n if (!CONFIGURATION_SECRET_PATTERN.test(options.configurationSecret)) {\n throw new TypeError(\"The SpotPatch configuration secret is invalid.\");\n }\n\n return (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !hasLoopbackHost(request) ||\n getSingleHeader(request, \"origin\") !== undefined ||\n !secretsMatch(\n getSingleHeader(request, CONFIGURATION_SECRET_HEADER),\n options.configurationSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const value = await readJsonRequestBody(request, NEXT_IPC_MESSAGE_LIMIT_BYTES);\n const acknowledgement = await options.onConfiguration(value);\n\n if (acknowledgement === undefined) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n assertIpcMessageSize(acknowledgement);\n writeJson(response, 200, acknowledgement);\n };\n\n void handle().catch(() => {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n writeJson(response, 400, { ok: false });\n });\n };\n}\n","import path from \"node:path\";\n\nimport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n discoverProjectValidationCheck,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n} from \"@spotpatch/dev-server\";\nimport { DEFAULT_AGENT_LIMITS } from \"@spotpatch/shared\";\nimport { MagicString } from \"magic-string\";\nimport {\n parseSync,\n Visitor,\n type CallExpression,\n type ExportDefaultDeclaration,\n type ImportDeclaration,\n type ObjectProperty,\n type Program,\n} from \"oxc-parser\";\n\nconst ADAPTER_PACKAGE_NAME = \"@spotpatch/next\";\nconst CLIENT_MODULE_ID = \"@spotpatch/next/client\";\nconst CONFIG_FILE_NAMES = Object.freeze([\n \"next.config.ts\",\n \"next.config.mts\",\n \"next.config.js\",\n \"next.config.mjs\",\n \"next.config.cts\",\n \"next.config.cjs\",\n] as const);\nconst INSTRUMENTATION_EXTENSIONS = Object.freeze([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n] as const);\nconst SIMPLE_SCRIPT_ARGUMENT_PATTERN = /^[A-Za-z0-9._:/=@%+,-]+$/u;\n\nexport interface NextIntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n readonly trustedFastModeAvailable: boolean;\n}\n\nexport interface NextIntegrationCheck {\n readonly appRoot: string;\n readonly issues: readonly string[];\n readonly ok: boolean;\n readonly trustedFastModeAvailable: boolean;\n}\n\ninterface PackageManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly optionalDependencies?: Readonly<Record<string, unknown>>;\n readonly scripts?: Readonly<Record<string, unknown>>;\n readonly [key: string]: unknown;\n}\n\ninterface ParsedModule {\n readonly program: Program;\n readonly source: string;\n}\n\nfunction isParserErrorSeverity(value: unknown): boolean {\n return value === \"Error\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseModule(absolutePath: string, source: string): ParsedModule {\n const result = parseSync(absolutePath, source, {\n sourceType: \"module\",\n showSemanticErrors: true,\n });\n const error = result.errors.find((entry) => isParserErrorSeverity(entry.severity));\n\n if (error !== undefined) {\n throw new SyntaxError(\n `SpotPatch could not safely parse ${path.basename(absolutePath)} (${error.message}).`,\n );\n }\n\n return Object.freeze({ program: result.program, source });\n}\n\nfunction importsOf(program: Program): readonly ImportDeclaration[] {\n return program.body.filter(\n (statement): statement is ImportDeclaration =>\n statement.type === \"ImportDeclaration\",\n );\n}\n\nfunction importInsertionOffset(program: Program): number {\n const imports = importsOf(program);\n const lastImport = imports.at(-1);\n\n if (lastImport !== undefined) {\n return lastImport.end;\n }\n\n const directives = program.body.filter(\n (statement) =>\n statement.type === \"ExpressionStatement\" &&\n \"directive\" in statement &&\n typeof statement.directive === \"string\",\n );\n return directives.at(-1)?.end ?? program.hashbang?.end ?? 0;\n}\n\nfunction insertStaticImport(\n magicString: MagicString,\n program: Program,\n statement: string,\n): void {\n const offset = importInsertionOffset(program);\n\n if (offset === 0) {\n magicString.prepend(`${statement}\\n\\n`);\n return;\n }\n\n magicString.appendRight(offset, `\\n${statement}`);\n}\n\nfunction findDefaultExport(program: Program): ExportDefaultDeclaration {\n const exports = program.body.filter(\n (statement): statement is ExportDefaultDeclaration =>\n statement.type === \"ExportDefaultDeclaration\",\n );\n\n if (exports.length !== 1) {\n throw new Error(\n \"SpotPatch init requires exactly one ESM default export in next.config.\",\n );\n }\n\n const defaultExport = exports[0];\n\n if (defaultExport === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config default export.\");\n }\n\n return defaultExport;\n}\n\nfunction importedWrapperName(program: Program): string | undefined {\n const adapterImports = importsOf(program).filter(\n (statement) => statement.source.value === ADAPTER_PACKAGE_NAME,\n );\n\n if (adapterImports.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple @spotpatch/next imports in next.config.\",\n );\n }\n\n const adapterImport = adapterImports[0];\n\n if (adapterImport === undefined) {\n return undefined;\n }\n\n const wrapper = adapterImport.specifiers.find(\n (specifier) =>\n specifier.type === \"ImportSpecifier\" &&\n specifier.imported.type === \"Identifier\" &&\n specifier.imported.name === \"withSpotPatch\" &&\n specifier.importKind !== \"type\",\n );\n\n if (wrapper === undefined) {\n throw new Error(\n \"SpotPatch init cannot safely merge the existing @spotpatch/next import.\",\n );\n }\n\n return wrapper.local.name;\n}\n\nfunction collectIdentifierNames(program: Program): ReadonlySet<string> {\n const names = new Set<string>();\n new Visitor({\n Identifier(node) {\n names.add(node.name);\n },\n }).visit(program);\n return names;\n}\n\nfunction chooseWrapperName(program: Program): string {\n const names = collectIdentifierNames(program);\n let suffix = 0;\n let candidate = \"withSpotPatch\";\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `withSpotPatch${String(suffix)}`;\n }\n\n return candidate;\n}\n\nfunction unwrapParentheses(\n expression: CallExpression[\"callee\"],\n): CallExpression[\"callee\"] {\n let current = expression;\n\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction wrappedFactoryCall(\n declaration: ExportDefaultDeclaration[\"declaration\"],\n wrapperName: string,\n): CallExpression | undefined {\n if (declaration.type !== \"CallExpression\" || declaration.arguments.length !== 1) {\n return undefined;\n }\n\n const factoryCall = unwrapParentheses(declaration.callee);\n\n if (factoryCall.type !== \"CallExpression\") {\n return undefined;\n }\n\n const callee = unwrapParentheses(factoryCall.callee);\n return callee.type === \"Identifier\" && callee.name === wrapperName\n ? factoryCall\n : undefined;\n}\n\nfunction staticPropertyName(property: ObjectProperty): string | undefined {\n if (property.computed) return undefined;\n\n if (property.key.type === \"Identifier\") return property.key.name;\n\n return property.key.type === \"Literal\" && typeof property.key.value === \"string\"\n ? property.key.value\n : undefined;\n}\n\nfunction assertSupportedDataFlowOption(factory: CallExpression): void {\n const argument = factory.arguments[0];\n\n if (argument?.type !== \"ObjectExpression\") return;\n\n const properties = argument.properties.filter(\n (property): property is ObjectProperty =>\n property.type === \"Property\" && staticPropertyName(property) === \"dataFlow\",\n );\n\n if (properties.length > 1) {\n throw new Error(\"SpotPatch init found duplicate dataFlow options.\");\n }\n\n const property = properties[0];\n\n if (\n property !== undefined &&\n !(property.value.type === \"Literal\" && property.value.value === false)\n ) {\n throw new Error(\n \"SpotPatch Next does not support component dataFlow yet; remove dataFlow or set it to false.\",\n );\n }\n}\n\nfunction transformNextConfig(\n absolutePath: string,\n source: string,\n trustedFastModeAvailable: boolean,\n): string {\n if (absolutePath.endsWith(\".cjs\") || absolutePath.endsWith(\".cts\")) {\n throw new Error(\n \"SpotPatch init does not rewrite CommonJS next.config files; add withSpotPatch manually.\",\n );\n }\n\n const { program } = parseModule(absolutePath, source);\n const defaultExport = findDefaultExport(program);\n const existingWrapperName = importedWrapperName(program);\n\n if (\n defaultExport.declaration.type === \"FunctionDeclaration\" ||\n defaultExport.declaration.type === \"TSDeclareFunction\" ||\n defaultExport.declaration.type === \"ClassDeclaration\" ||\n defaultExport.declaration.type === \"TSInterfaceDeclaration\"\n ) {\n throw new Error(\n \"SpotPatch init cannot safely wrap this next.config default declaration; use an exported config expression.\",\n );\n }\n\n const magicString = new MagicString(source);\n const wrapperName = existingWrapperName ?? chooseWrapperName(program);\n const existingFactory =\n existingWrapperName === undefined\n ? undefined\n : wrappedFactoryCall(defaultExport.declaration, existingWrapperName);\n\n if (existingFactory !== undefined) {\n assertSupportedDataFlowOption(existingFactory);\n\n if (trustedFastModeAvailable && existingFactory.arguments.length === 0) {\n magicString.overwrite(\n existingFactory.start,\n existingFactory.end,\n `${wrapperName}({ trustedFastMode: true })`,\n );\n return magicString.toString();\n }\n\n return source;\n }\n\n if (existingWrapperName === undefined) {\n const specifier =\n wrapperName === \"withSpotPatch\"\n ? \"withSpotPatch\"\n : `withSpotPatch as ${wrapperName}`;\n insertStaticImport(\n magicString,\n program,\n `import { ${specifier} } from ${JSON.stringify(ADAPTER_PACKAGE_NAME)};`,\n );\n }\n\n const expression = source.slice(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n );\n magicString.overwrite(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n `${wrapperName}(${trustedFastModeAvailable ? \"{ trustedFastMode: true }\" : \"\"})(${expression})`,\n );\n return magicString.toString();\n}\n\nfunction transformInstrumentationClient(absolutePath: string, source: string): string {\n const { program } = parseModule(absolutePath, source);\n const clientImports = importsOf(program).filter(\n (statement) =>\n statement.source.value === CLIENT_MODULE_ID &&\n statement.importKind !== \"type\" &&\n (statement.specifiers.length === 0 ||\n statement.specifiers.some(\n (specifier) =>\n specifier.type !== \"ImportSpecifier\" || specifier.importKind !== \"type\",\n )),\n );\n\n if (clientImports.length > 1) {\n throw new Error(\"SpotPatch init found duplicate @spotpatch/next/client imports.\");\n }\n\n if (clientImports.length === 1) {\n return source;\n }\n\n const magicString = new MagicString(source);\n insertStaticImport(\n magicString,\n program,\n `import ${JSON.stringify(CLIENT_MODULE_ID)};`,\n );\n return magicString.toString();\n}\n\nfunction parsePackageManifest(source: string): PackageManifest {\n let value: unknown;\n\n try {\n value = JSON.parse(source) as unknown;\n } catch (error: unknown) {\n throw new SyntaxError(\"SpotPatch could not parse package.json.\", {\n cause: error,\n });\n }\n\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch requires package.json to contain an object.\");\n }\n\n return value;\n}\n\nfunction hasAdapterDependency(manifest: PackageManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.optionalDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies[ADAPTER_PACKAGE_NAME] === \"string\",\n );\n}\n\nfunction transformDevScript(script: string): string {\n const tokens = script.trim().split(/\\s+/u);\n\n if (tokens[0] === \"spotpatch-next\" && tokens[1] === \"dev\") {\n if (tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))) {\n return script;\n }\n\n throw new Error(\"SpotPatch init cannot verify the existing dev script safely.\");\n }\n\n if (\n tokens[0] !== \"next\" ||\n tokens[1] !== \"dev\" ||\n !tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))\n ) {\n throw new Error(\"SpotPatch init only rewrites a simple `next dev` package script.\");\n }\n\n return [\"spotpatch-next\", ...tokens.slice(1)].join(\" \");\n}\n\nfunction detectIndent(source: string): string {\n return /^([\\t ]+)\"/mu.exec(source)?.[1] ?? \" \";\n}\n\nfunction transformPackageJson(source: string): string {\n const manifest = parsePackageManifest(source);\n\n if (!hasAdapterDependency(manifest)) {\n throw new Error(\n \"SpotPatch init requires @spotpatch/next in package dependencies first.\",\n );\n }\n\n if (!isRecord(manifest.scripts) || typeof manifest.scripts.dev !== \"string\") {\n throw new Error(\"SpotPatch init requires a string package script named dev.\");\n }\n\n const dev = transformDevScript(manifest.scripts.dev);\n\n if (dev === manifest.scripts.dev) {\n return source;\n }\n\n const nextManifest = {\n ...manifest,\n scripts: { ...manifest.scripts, dev },\n };\n const lineEnding = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const serialized = JSON.stringify(nextManifest, undefined, detectIndent(source));\n return `${serialized.replaceAll(\"\\n\", lineEnding)}${lineEnding}`;\n}\n\nasync function findNextConfig(appRoot: string): Promise<string> {\n const candidates = (\n await Promise.all(\n CONFIG_FILE_NAMES.map(async (name) => {\n const absolutePath = path.join(appRoot, name);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (candidates.length !== 1) {\n throw new Error(\"SpotPatch init requires exactly one supported next.config file.\");\n }\n\n const configPath = candidates[0];\n\n if (configPath === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config path.\");\n }\n\n return configPath;\n}\n\nasync function resolveInstrumentationPath(\n appRoot: string,\n configPath: string,\n): Promise<string> {\n const rootRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"app\")),\n integrationPathExists(path.join(appRoot, \"pages\")),\n ]);\n const sourceRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"src\", \"app\")),\n integrationPathExists(path.join(appRoot, \"src\", \"pages\")),\n ]);\n const hasRootRouter = rootRouters.some(Boolean);\n const hasSourceRouter = sourceRouters.some(Boolean);\n\n if (hasRootRouter && hasSourceRouter) {\n throw new Error(\n \"SpotPatch init cannot choose an instrumentation location for mixed root/src routers.\",\n );\n }\n\n if (!hasRootRouter && !hasSourceRouter) {\n throw new Error(\"SpotPatch init could not find an App or Pages Router.\");\n }\n\n const directory = hasSourceRouter ? path.join(appRoot, \"src\") : appRoot;\n const existing = (\n await Promise.all(\n INSTRUMENTATION_EXTENSIONS.map(async (extension) => {\n const absolutePath = path.join(directory, `instrumentation-client${extension}`);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (existing.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple instrumentation-client entry files.\",\n );\n }\n\n if (existing[0] !== undefined) {\n return existing[0];\n }\n\n const useTypeScript =\n configPath.endsWith(\".ts\") ||\n configPath.endsWith(\".mts\") ||\n configPath.endsWith(\".cts\") ||\n (await integrationPathExists(path.join(appRoot, \"tsconfig.json\")));\n return path.join(directory, `instrumentation-client.${useTypeScript ? \"ts\" : \"js\"}`);\n}\n\nexport async function planNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationPlan> {\n const appRoot = path.resolve(directory);\n const packagePath = path.join(appRoot, \"package.json\");\n const [packageSource, configPath] = await Promise.all([\n readIntegrationFile(packagePath),\n findNextConfig(appRoot),\n ]);\n const [configSource, discoveredCheck] = await Promise.all([\n readIntegrationFile(configPath),\n discoverProjectValidationCheck({\n appRoot,\n timeoutMs: DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n }),\n ]);\n const trustedFastModeAvailable = discoveredCheck !== undefined;\n const instrumentationPath = await resolveInstrumentationPath(appRoot, configPath);\n const instrumentationSource = (await integrationPathExists(instrumentationPath))\n ? await readIntegrationFile(instrumentationPath)\n : undefined;\n const changes = [\n createIntegrationFileChange(\n appRoot,\n configPath,\n transformNextConfig(configPath, configSource, trustedFastModeAvailable),\n configSource,\n ),\n createIntegrationFileChange(\n appRoot,\n instrumentationPath,\n transformInstrumentationClient(instrumentationPath, instrumentationSource ?? \"\"),\n instrumentationSource,\n ),\n createIntegrationFileChange(\n appRoot,\n packagePath,\n transformPackageJson(packageSource),\n packageSource,\n ),\n ].filter((change): change is IntegrationFileChange => change !== undefined);\n\n return Object.freeze({\n appRoot,\n changes: Object.freeze(changes),\n trustedFastModeAvailable,\n });\n}\n\nexport async function applyNextIntegrationPlan(\n plan: NextIntegrationPlan,\n): Promise<void> {\n await applyIntegrationPlan(plan);\n}\n\nexport async function checkNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationCheck> {\n try {\n const plan = await planNextIntegration(directory);\n const issues = plan.changes.map(\n (change) => `INTEGRATION_REQUIRED:${change.relativePath}`,\n );\n return Object.freeze({\n appRoot: plan.appRoot,\n issues: Object.freeze(issues),\n ok: issues.length === 0,\n trustedFastModeAvailable: plan.trustedFastModeAvailable,\n });\n } catch (error: unknown) {\n return Object.freeze({\n appRoot: path.resolve(directory),\n issues: Object.freeze([\n error instanceof Error ? error.message : \"SpotPatch integration check failed.\",\n ]),\n ok: false,\n trustedFastModeAvailable: false,\n });\n }\n}\n"],"mappings":"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","names":["createRequire","path","defaultBundler","path","isLoopbackHostname","isLoopbackHostname","ID_PATTERN","isRecord","sidecar","result","path","isRecord","property","createRequire","path"]}
package/dist/index.cjs CHANGED
@@ -525,6 +525,12 @@ async function resolveInputConfig(input, phase, context) {
525
525
  return input ?? {};
526
526
  }
527
527
  function withSpotPatch(userOptions = {}) {
528
+ const requestedDataFlow = userOptions.dataFlow;
529
+ if (requestedDataFlow !== void 0 && requestedDataFlow !== false) {
530
+ throw new RangeError(
531
+ "SpotPatch Next does not support component dataFlow yet; use dataFlow only with @spotpatch/vite."
532
+ );
533
+ }
528
534
  return (input) => async (phase, context) => {
529
535
  const inputConfig = await resolveInputConfig(input, phase, context);
530
536
  const config = inputConfig;
@@ -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\"> &\n Readonly<{ allowLan?: false }>;\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 return <Config extends object = Readonly<Record<string, unknown>>>(\n input?: NextConfigInput<Config>,\n ): NextConfigFactory<Config> =>\n async (phase, context): Promise<Config> => {\n const inputConfig = await resolveInputConfig(input, phase, context);\n const config = inputConfig as unknown as NextConfig;\n const appRoot = await realpath(process.cwd());\n const paths = resolveAdapterModulePaths(appRoot);\n\n if (phase !== PHASE_DEVELOPMENT_SERVER) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n const environmentAi =\n userOptions.ai === undefined\n ? resolveEnvironmentAiConfiguration(process.env).ai\n : false;\n const options = await resolveProjectOptions({\n appRoot,\n environmentAi,\n options: {\n ...userOptions,\n include: userOptions.include ?? NEXT_DEFAULT_INCLUDE,\n },\n });\n\n if (options.allowLan) {\n throw new RangeError(\n \"SpotPatch Next does not support allowLan; use a loopback development host.\",\n );\n }\n\n const carrier = await configureNextRuntime({\n appRoot,\n credentials: resolveCredentialEnvironment(options, process.env),\n options,\n });\n\n if (!options.enabled) {\n return mergeProductionConfig(config, appRoot, paths) as unknown as Config;\n }\n\n return mergeDevelopmentConfig(\n config,\n appRoot,\n paths,\n carrier.registryEpoch,\n carrier.sidecarOrigin,\n ) as unknown as Config;\n };\n}\n","export const NEXT_IPC_PROTOCOL_VERSION = 1 as const;\nexport const NEXT_IPC_MESSAGE_LIMIT_BYTES = 256 * 1024;\nexport const NEXT_IPC_TIMEOUT_MS = 15_000;\nexport const NEXT_INTERNAL_REGISTRATION_PATH =\n \"/__spotpatch-internal/register\" as const;\nexport const NEXT_INTERNAL_CONFIGURATION_PATH =\n \"/__spotpatch-internal/configure\" as const;\n\nexport const NEXT_ENVIRONMENT_KEYS = Object.freeze({\n appRoot: \"SPOTPATCH_NEXT_APP_ROOT\",\n bundler: \"SPOTPATCH_NEXT_BUNDLER\",\n configurationSecret: \"SPOTPATCH_NEXT_CONFIGURATION_SECRET\",\n internalOrigin: \"SPOTPATCH_NEXT_INTERNAL_ORIGIN\",\n internalSecret: \"SPOTPATCH_NEXT_INTERNAL_SECRET\",\n launchNonce: \"SPOTPATCH_NEXT_LAUNCH_NONCE\",\n registryEpoch: \"SPOTPATCH_NEXT_REGISTRY_EPOCH\",\n sidecarOrigin: \"SPOTPATCH_NEXT_SIDECAR_ORIGIN\",\n} as const);\n\nexport const NEXT_SOURCE_RULE_KEYS = Object.freeze([\"*.jsx\", \"*.tsx\"] as const);\nexport const NEXT_CLIENT_MODULE_ID = \"@spotpatch/next/client\" as const;\n\nexport const NEXT_DEFAULT_INCLUDE = Object.freeze([/\\.(?:jsx|tsx)$/u]);\n","import { randomBytes } from \"node:crypto\";\n\nimport {\n serializeResolvedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_IPC_PROTOCOL_VERSION,\n NEXT_IPC_TIMEOUT_MS,\n} from \"../internal/constants.js\";\nimport {\n assertIpcMessageSize,\n parseNextConfigureAck,\n type NextConfigureMessage,\n} from \"../internal/ipc.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\nconst ACKNOWLEDGEMENT_LIMIT_BYTES = 4_096;\n\nexport interface NextRuntimeCarrier {\n readonly registryEpoch: string;\n readonly sidecarOrigin: string;\n}\n\ninterface ConfigureInput {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly options: ResolvedSpotPatchOptions;\n}\n\nlet activeSignature: string | undefined;\nlet activeConfiguration: Promise<NextRuntimeCarrier> | undefined;\n\nfunction readRequiredEnvironment(name: string): string {\n const value = process.env[name];\n\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(\n \"SpotPatch Next development must be started with `spotpatch-next dev`.\",\n );\n }\n\n return value;\n}\n\nfunction readLoopbackOrigin(name: string): string {\n const value = readRequiredEnvironment(name);\n let url: URL;\n\n try {\n url = new URL(value);\n } catch {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n if (\n url.origin !== value ||\n url.protocol !== \"http:\" ||\n url.hostname !== \"127.0.0.1\"\n ) {\n throw new Error(\"SpotPatch received an invalid CLI transport origin.\");\n }\n\n return url.origin;\n}\n\nfunction configurationSignature(input: ConfigureInput): string {\n return JSON.stringify({\n appRoot: input.appRoot,\n credentials: input.credentials,\n options: serializeResolvedSpotPatchOptions(input.options),\n });\n}\n\nasync function sendConfiguration(input: ConfigureInput): Promise<NextRuntimeCarrier> {\n const nonce = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.launchNonce);\n const expectedAppRoot = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.appRoot);\n const registryEpoch = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.registryEpoch);\n const sidecarOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.sidecarOrigin);\n const internalOrigin = readLoopbackOrigin(NEXT_ENVIRONMENT_KEYS.internalOrigin);\n readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.internalSecret);\n const configurationSecret = readRequiredEnvironment(\n NEXT_ENVIRONMENT_KEYS.configurationSecret,\n );\n const bundler = readRequiredEnvironment(NEXT_ENVIRONMENT_KEYS.bundler);\n\n if (\n input.appRoot !== expectedAppRoot ||\n internalOrigin !== sidecarOrigin ||\n (bundler !== \"turbopack\" && bundler !== \"webpack\") ||\n !CONFIGURATION_SECRET_PATTERN.test(configurationSecret) ||\n !ID_PATTERN.test(nonce) ||\n !ID_PATTERN.test(registryEpoch)\n ) {\n throw new Error(\"SpotPatch received an invalid CLI launch identity.\");\n }\n\n const requestId = randomBytes(18).toString(\"base64url\");\n const message = Object.freeze({\n appRoot: input.appRoot,\n credentials: input.credentials,\n nonce,\n options: serializeResolvedSpotPatchOptions(input.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId,\n type: \"spotpatch:next:configure\",\n }) satisfies NextConfigureMessage;\n assertIpcMessageSize(message);\n let response: Response;\n\n try {\n response = await fetch(new URL(NEXT_INTERNAL_CONFIGURATION_PATH, internalOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"X-SpotPatch-Configuration\": configurationSecret,\n },\n body: JSON.stringify(message),\n signal: AbortSignal.timeout(NEXT_IPC_TIMEOUT_MS),\n });\n } catch {\n throw new Error(\"SpotPatch Next configuration transport failed.\");\n }\n\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (Number.isFinite(declaredLength) && declaredLength > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const text = await response.text();\n\n if (Buffer.byteLength(text, \"utf8\") > ACKNOWLEDGEMENT_LIMIT_BYTES) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n let acknowledgementValue: unknown;\n\n try {\n acknowledgementValue = JSON.parse(text) as unknown;\n } catch {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n const acknowledgement = parseNextConfigureAck(acknowledgementValue);\n\n if (\n !response.ok ||\n acknowledgement.nonce !== nonce ||\n acknowledgement.requestId !== requestId\n ) {\n throw new Error(\"SpotPatch Next configuration response is invalid.\");\n }\n\n if (!acknowledgement.ok) {\n throw new Error(`SpotPatch Next configuration failed (${acknowledgement.code}).`);\n }\n\n return Object.freeze({ registryEpoch, sidecarOrigin });\n}\n\nexport function configureNextRuntime(\n input: ConfigureInput,\n): Promise<NextRuntimeCarrier> {\n const signature = configurationSignature(input);\n\n if (activeConfiguration !== undefined) {\n if (activeSignature !== signature) {\n return Promise.reject(\n new Error(\"SpotPatch Next received inconsistent repeated configuration.\"),\n );\n }\n\n return activeConfiguration;\n }\n\n activeSignature = signature;\n activeConfiguration = sendConfiguration(input).catch((error: unknown) => {\n activeConfiguration = undefined;\n activeSignature = undefined;\n throw error;\n });\n return activeConfiguration;\n}\n","import path from \"node:path\";\n\nimport {\n parseSerializedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n type SerializedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_IPC_MESSAGE_LIMIT_BYTES,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./constants.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst ENVIRONMENT_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/u;\n\nexport interface NextConfigureMessage {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly nonce: string;\n readonly options: SerializedSpotPatchOptions;\n readonly protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n readonly requestId: string;\n readonly type: \"spotpatch:next:configure\";\n}\n\nexport type NextConfigureAck =\n | Readonly<{\n nonce: string;\n ok: true;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n nonce: string;\n ok: false;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>;\n\nexport interface ParsedNextConfigureMessage extends Omit<\n NextConfigureMessage,\n \"options\"\n> {\n readonly options: ResolvedSpotPatchOptions;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n expectedKeys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...expectedKeys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function assertIpcMessageSize(value: unknown): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch IPC message is not serializable.\", {\n cause: error,\n });\n }\n\n if (Buffer.byteLength(serialized, \"utf8\") > NEXT_IPC_MESSAGE_LIMIT_BYTES) {\n throw new RangeError(\"The SpotPatch IPC message exceeds the size limit.\");\n }\n}\n\nfunction parseCredentials(value: unknown): Readonly<Record<string, string>> {\n if (!isRecord(value) || Object.keys(value).length > 32) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n const entries = Object.entries(value);\n const credentials: Record<string, string> = {};\n\n for (const [name, credential] of entries) {\n if (\n !ENVIRONMENT_NAME_PATTERN.test(name) ||\n typeof credential !== \"string\" ||\n credential.length === 0 ||\n credential.length > 16_384 ||\n credential.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n credentials[name] = credential;\n }\n\n return Object.freeze(credentials);\n}\n\nexport function parseNextConfigureMessage(value: unknown): ParsedNextConfigureMessage {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\n \"appRoot\",\n \"credentials\",\n \"nonce\",\n \"options\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n value.type !== \"spotpatch:next:configure\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId) ||\n typeof value.appRoot !== \"string\" ||\n !path.isAbsolute(value.appRoot) ||\n value.appRoot.length > 4_096 ||\n value.appRoot.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC message is invalid.\");\n }\n\n return Object.freeze({\n appRoot: value.appRoot,\n credentials: parseCredentials(value.credentials),\n nonce: value.nonce,\n options: parseSerializedSpotPatchOptions(value.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure\",\n });\n}\n\nexport function parseNextConfigureAck(value: unknown): NextConfigureAck {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n value.type !== \"spotpatch:next:configure-ack\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.ok !== \"boolean\" ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n if (value.ok) {\n if (!hasExactKeys(value, [\"nonce\", \"ok\", \"protocolVersion\", \"requestId\", \"type\"])) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n nonce: value.nonce,\n ok: true,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n }\n\n if (\n !hasExactKeys(value, [\n \"code\",\n \"nonce\",\n \"ok\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n (value.code !== \"CONFIGURATION_CONFLICT\" &&\n value.code !== \"CONFIGURATION_FAILED\" &&\n value.code !== \"INVALID_IPC\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n code: value.code,\n nonce: value.nonce,\n ok: false,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n"],"mappings":"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","names":["import_node_path","import_dev_server","import_constants","import_dev_server","ID_PATTERN","isRecord","path","module"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/config/with-spotpatch.ts","../src/internal/constants.ts","../src/config/handshake.ts","../src/internal/ipc.ts"],"sourcesContent":["export {\n withSpotPatch,\n type NextConfigContext,\n type NextConfigEnhancer,\n type NextConfigFactory,\n type NextConfigInput,\n type NextSpotPatchOptions,\n} from \"./config/with-spotpatch.js\";\n","import { createRequire } from \"node:module\";\nimport { realpath } from \"node:fs/promises\";\nimport { existsSync, realpathSync } from \"node:fs\";\nimport path from \"node:path\";\n\nimport {\n resolveCredentialEnvironment,\n resolveEnvironmentAiConfiguration,\n resolveProjectOptions,\n type SpotPatchOptions,\n} from \"@spotpatch/dev-server\";\nimport { SPOTPATCH_API_BASE } from \"@spotpatch/shared\";\nimport type { NextConfig } from \"next\";\nimport { PHASE_DEVELOPMENT_SERVER } from \"next/constants\";\n\nimport {\n NEXT_CLIENT_MODULE_ID,\n NEXT_DEFAULT_INCLUDE,\n NEXT_SOURCE_RULE_KEYS,\n} from \"../internal/constants.js\";\nimport { configureNextRuntime } from \"./handshake.js\";\n\nexport type NextSpotPatchOptions = Omit<SpotPatchOptions, \"allowLan\" | \"dataFlow\"> &\n Readonly<{\n allowLan?: false;\n dataFlow?: false;\n }>;\n\nexport interface NextConfigContext<\n Config extends object = Readonly<Record<string, unknown>>,\n> {\n readonly defaultConfig: Config;\n}\n\nexport type NextConfigFactory<\n Config extends object = Readonly<Record<string, unknown>>,\n> = (phase: string, context: NextConfigContext<Config>) => Config | Promise<Config>;\n\nexport type NextConfigInput<Config extends object = Readonly<Record<string, unknown>>> =\n Config | NextConfigFactory<Config>;\n\nexport type NextConfigEnhancer = <\n Config extends object = Readonly<Record<string, unknown>>,\n>(\n input?: NextConfigInput<Config>,\n) => NextConfigFactory<Config>;\n\ninterface AdapterModulePaths {\n readonly loader: string;\n readonly noop: string;\n readonly turbopackLoader: string;\n readonly turbopackNoop: string;\n}\n\ntype WebpackConfig = Record<string, unknown>;\ntype WebpackHandler = (config: unknown, context: unknown) => unknown;\n\ninterface WebpackContext extends Readonly<Record<string, unknown>> {\n readonly dev: boolean;\n}\n\ntype TurbopackRules = NonNullable<NonNullable<NextConfig[\"turbopack\"]>[\"rules\"]>;\n\nconst configuredWebpackConfigs = new WeakSet();\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction readWebpackHandler(config: NextConfig): WebpackHandler | undefined {\n const value = (config as unknown as Readonly<Record<string, unknown>>).webpack;\n\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"function\") {\n throw new TypeError(\"SpotPatch requires nextConfig.webpack to be a function.\");\n }\n\n return value as WebpackHandler;\n}\n\nfunction requireWebpackConfig(value: unknown): WebpackConfig {\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch received an invalid webpack configuration.\");\n }\n\n return value;\n}\n\nfunction requireWebpackContext(value: unknown): WebpackContext {\n if (!isRecord(value) || typeof value.dev !== \"boolean\") {\n throw new TypeError(\"SpotPatch received an invalid webpack context.\");\n }\n\n return value as WebpackContext;\n}\n\nfunction isWithinRoot(root: string, candidate: string): boolean {\n const relative = path.relative(root, candidate);\n return (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n );\n}\n\nfunction findCommonFilesystemRoot(paths: readonly string[]): string {\n const normalized = paths.map((value) => path.resolve(value));\n const firstPath = normalized[0];\n\n if (firstPath === undefined) {\n throw new Error(\"SpotPatch requires at least one filesystem path.\");\n }\n\n let candidate = firstPath;\n\n while (!normalized.every((value) => isWithinRoot(candidate, value))) {\n const parent = path.dirname(candidate);\n\n if (parent === candidate) {\n throw new Error(\"SpotPatch paths do not share a safe filesystem root.\");\n }\n\n candidate = parent;\n }\n\n if (candidate === path.parse(candidate).root) {\n throw new Error(\"SpotPatch refuses to configure the filesystem root.\");\n }\n\n return candidate;\n}\n\nfunction findLogicalAdapterRoot(\n appRoot: string,\n resolvedAdapterRoot: string,\n): string | undefined {\n let directory = appRoot;\n\n while (directory !== path.dirname(directory)) {\n const candidate = path.join(directory, \"node_modules\", \"@spotpatch\", \"next\");\n\n if (existsSync(candidate) && realpathSync(candidate) === resolvedAdapterRoot) {\n return candidate;\n }\n\n directory = path.dirname(directory);\n }\n\n return undefined;\n}\n\nfunction resolveAdapterModulePaths(appRoot: string): AdapterModulePaths {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n const loader = resolveFromApplication.resolve(\"@spotpatch/next/loader\");\n const resolvedAdapterRoot = path.dirname(loader);\n const noop = path.join(resolvedAdapterRoot, \"dist\", \"noop.cjs\");\n const logicalAdapterRoot = findLogicalAdapterRoot(appRoot, resolvedAdapterRoot);\n const logicalNoop =\n logicalAdapterRoot === undefined\n ? undefined\n : path.join(logicalAdapterRoot, \"dist\", \"noop.js\");\n const relativeNoop =\n logicalNoop === undefined\n ? undefined\n : path.relative(appRoot, logicalNoop).split(path.sep).join(\"/\");\n\n return Object.freeze({\n loader,\n noop,\n turbopackLoader:\n logicalAdapterRoot === undefined\n ? loader\n : path.join(logicalAdapterRoot, \"loader.cjs\"),\n turbopackNoop:\n relativeNoop === undefined\n ? noop\n : relativeNoop.startsWith(\".\")\n ? relativeNoop\n : `./${relativeNoop}`,\n });\n}\n\nfunction mergeTurbopackRoot(\n config: NextConfig,\n requiredPaths: readonly string[],\n): string {\n const commonRoot = findCommonFilesystemRoot(requiredPaths);\n const existingRoot = config.turbopack?.root;\n\n if (\n existingRoot !== undefined &&\n !requiredPaths.every((value) => isWithinRoot(existingRoot, value))\n ) {\n throw new Error(\n \"SpotPatch cannot use the existing turbopack.root because it excludes an adapter module.\",\n );\n }\n\n return existingRoot ?? commonRoot;\n}\n\nfunction mergeTurbopackAlias(\n config: NextConfig,\n noopPath: string,\n): NonNullable<NextConfig[\"turbopack\"]> {\n const aliases = config.turbopack?.resolveAlias ?? {};\n const existing = aliases[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace turbopack.resolveAlias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n return {\n ...config.turbopack,\n resolveAlias: {\n ...aliases,\n [NEXT_CLIENT_MODULE_ID]: noopPath,\n },\n };\n}\n\nfunction mergeWebpackAlias(config: WebpackConfig, noopPath: string): void {\n const resolveValue = config.resolve;\n\n if (resolveValue !== undefined && !isRecord(resolveValue)) {\n throw new Error(\"SpotPatch requires webpack resolve to be an object.\");\n }\n\n const resolve = resolveValue ?? {};\n const alias = resolve.alias ?? {};\n\n if (!isRecord(alias)) {\n throw new Error(\"SpotPatch requires webpack resolve.alias to be an object.\");\n }\n\n const existing = alias[NEXT_CLIENT_MODULE_ID];\n\n if (existing !== undefined && existing !== noopPath) {\n throw new Error(\n `SpotPatch cannot replace webpack resolve.alias[${NEXT_CLIENT_MODULE_ID}].`,\n );\n }\n\n resolve.alias = { ...alias, [NEXT_CLIENT_MODULE_ID]: noopPath };\n config.resolve = resolve;\n}\n\nfunction scopeWebpackFilesystemCache(\n config: WebpackConfig,\n registryEpoch: string,\n): void {\n const cache = config.cache;\n\n if (isRecord(cache) && cache.type === \"filesystem\") {\n const currentVersion = typeof cache.version === \"string\" ? cache.version : \"\";\n cache.version = [currentVersion, `spotpatch:${registryEpoch}`]\n .filter(Boolean)\n .join(\"|\");\n }\n}\n\nfunction appendWebpackLoader(\n config: WebpackConfig,\n context: WebpackContext,\n loaderPath: string,\n registryEpoch: string,\n appRoot: string,\n): void {\n if (!context.dev) {\n return;\n }\n\n const module = config.module;\n\n if (!isRecord(module) || !Array.isArray(module.rules)) {\n throw new Error(\"SpotPatch requires webpack module.rules to be an array.\");\n }\n\n if (configuredWebpackConfigs.has(config)) {\n return;\n }\n\n scopeWebpackFilesystemCache(config, registryEpoch);\n const rule = {\n enforce: \"pre\" as const,\n include: appRoot,\n test: /\\.(?:jsx|tsx)$/u,\n use: [\n {\n loader: loaderPath,\n options: { registryEpoch },\n },\n ],\n };\n module.rules.push(rule);\n configuredWebpackConfigs.add(config);\n}\n\nfunction rewriteCanClaimPrivateApi(source: string): boolean {\n return (\n source === SPOTPATCH_API_BASE ||\n source.startsWith(`${SPOTPATCH_API_BASE}/`) ||\n source.startsWith(\"/:path\") ||\n source.startsWith(\"/:slug\") ||\n source.includes(\"(.*)\")\n );\n}\n\nfunction assertRewriteCompatibility(\n rewrites: readonly Readonly<{ source: string }>[] | undefined,\n): void {\n const conflict = rewrites?.find(({ source }) => rewriteCanClaimPrivateApi(source));\n\n if (conflict !== undefined) {\n throw new Error(\n `SpotPatch API prefix conflicts with the host rewrite ${conflict.source}.`,\n );\n }\n}\n\nfunction createRewrites(\n config: NextConfig,\n sidecarOrigin: string,\n): NonNullable<NextConfig[\"rewrites\"]> {\n return async () => {\n const spotPatchRewrite = {\n basePath: false as const,\n destination: `${sidecarOrigin}${SPOTPATCH_API_BASE}/:path*`,\n source: `${SPOTPATCH_API_BASE}/:path*`,\n };\n const original = await config.rewrites?.();\n\n if (original === undefined) {\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: [],\n fallback: [],\n };\n }\n\n if (Array.isArray(original)) {\n assertRewriteCompatibility(original);\n return {\n beforeFiles: [spotPatchRewrite],\n afterFiles: original,\n fallback: [],\n };\n }\n\n const beforeFiles = original.beforeFiles ?? [];\n const afterFiles = original.afterFiles ?? [];\n const fallback = original.fallback ?? [];\n assertRewriteCompatibility([...beforeFiles, ...afterFiles, ...fallback]);\n return {\n beforeFiles: [spotPatchRewrite, ...beforeFiles],\n afterFiles,\n fallback,\n };\n };\n}\n\nfunction createWebpackWrapper(input: {\n readonly appRoot: string;\n readonly development: boolean;\n readonly loaderPath: string;\n readonly noopPath: string;\n readonly original: WebpackHandler | undefined;\n readonly registryEpoch?: string;\n}): WebpackHandler {\n return (configValue, contextValue) => {\n const config = requireWebpackConfig(configValue);\n const context = requireWebpackContext(contextValue);\n const configuredValue = input.original?.(configValue, contextValue);\n const configured =\n configuredValue === undefined ? config : requireWebpackConfig(configuredValue);\n\n if (input.development) {\n if (input.registryEpoch === undefined) {\n throw new Error(\"SpotPatch is missing the development registry epoch.\");\n }\n\n appendWebpackLoader(\n configured,\n context,\n input.loaderPath,\n input.registryEpoch,\n input.appRoot,\n );\n } else {\n mergeWebpackAlias(configured, input.noopPath);\n }\n\n return configured;\n };\n}\n\nfunction mergeProductionConfig(\n config: NextConfig,\n appRoot: string,\n paths: AdapterModulePaths,\n): NextConfig {\n 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"]}
package/dist/index.d.cts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { SpotPatchOptions } from '@spotpatch/dev-server';
2
2
 
3
- type NextSpotPatchOptions = Omit<SpotPatchOptions, "allowLan"> & Readonly<{
3
+ type NextSpotPatchOptions = Omit<SpotPatchOptions, "allowLan" | "dataFlow"> & Readonly<{
4
4
  allowLan?: false;
5
+ dataFlow?: false;
5
6
  }>;
6
7
  interface NextConfigContext<Config extends object = Readonly<Record<string, unknown>>> {
7
8
  readonly defaultConfig: Config;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,8 @@
1
1
  import { SpotPatchOptions } from '@spotpatch/dev-server';
2
2
 
3
- type NextSpotPatchOptions = Omit<SpotPatchOptions, "allowLan"> & Readonly<{
3
+ type NextSpotPatchOptions = Omit<SpotPatchOptions, "allowLan" | "dataFlow"> & Readonly<{
4
4
  allowLan?: false;
5
+ dataFlow?: false;
5
6
  }>;
6
7
  interface NextConfigContext<Config extends object = Readonly<Record<string, unknown>>> {
7
8
  readonly defaultConfig: Config;
package/dist/index.js CHANGED
@@ -497,6 +497,12 @@ async function resolveInputConfig(input, phase, context) {
497
497
  return input ?? {};
498
498
  }
499
499
  function withSpotPatch(userOptions = {}) {
500
+ const requestedDataFlow = userOptions.dataFlow;
501
+ if (requestedDataFlow !== void 0 && requestedDataFlow !== false) {
502
+ throw new RangeError(
503
+ "SpotPatch Next does not support component dataFlow yet; use dataFlow only with @spotpatch/vite."
504
+ );
505
+ }
500
506
  return (input) => async (phase, context) => {
501
507
  const inputConfig = await resolveInputConfig(input, phase, context);
502
508
  const config = inputConfig;
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/config/with-spotpatch.ts","../src/internal/constants.ts","../src/config/handshake.ts","../src/internal/ipc.ts"],"sourcesContent":["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\"> &\n Readonly<{ allowLan?: false }>;\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 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":["path","ID_PATTERN","isRecord","path"]}
1
+ {"version":3,"sources":["../src/config/with-spotpatch.ts","../src/internal/constants.ts","../src/config/handshake.ts","../src/internal/ipc.ts"],"sourcesContent":["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":["path","ID_PATTERN","isRecord","path"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spotpatch/next",
3
- "version": "0.4.0",
3
+ "version": "0.5.0",
4
4
  "description": "Development-only Next.js adapter and CLI for SpotPatch.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -90,10 +90,10 @@
90
90
  "bippy": "0.6.1",
91
91
  "magic-string": "1.1.0",
92
92
  "oxc-parser": "0.143.0",
93
- "@spotpatch/compiler": "^0.1.1",
94
- "@spotpatch/dev-server": "^0.4.0",
95
- "@spotpatch/runtime": "^1.8.0",
96
- "@spotpatch/shared": "^1.8.0"
93
+ "@spotpatch/compiler": "^0.2.0",
94
+ "@spotpatch/dev-server": "^0.5.0",
95
+ "@spotpatch/runtime": "^1.9.0",
96
+ "@spotpatch/shared": "^1.9.0"
97
97
  },
98
98
  "peerDependencies": {
99
99
  "next": ">=15.3.0 <17.0.0",