@spotpatch/next 0.2.0 → 0.3.1

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/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\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 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 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 process.stdout.write(\n `[spotpatch:next] integration verified for Next.js ${project.nextVersion}.\\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.2.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 { randomBytes } from \"node:crypto\";\nimport {\n access,\n lstat,\n mkdir,\n readFile,\n rename,\n stat,\n unlink,\n writeFile,\n} from \"node:fs/promises\";\nimport path from \"node:path\";\n\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 IntegrationFileChange {\n readonly absolutePath: string;\n readonly nextContent: string;\n readonly previousContent?: string;\n readonly relativePath: string;\n}\n\nexport interface NextIntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n}\n\nexport interface NextIntegrationCheck {\n readonly appRoot: string;\n readonly issues: readonly string[];\n readonly ok: 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\nasync function pathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nasync function readRegularFile(absolutePath: string): Promise<string> {\n const metadata = await lstat(absolutePath);\n\n if (!metadata.isFile() || metadata.isSymbolicLink()) {\n throw new Error(\n `SpotPatch refuses to modify the non-regular file ${path.basename(absolutePath)}.`,\n );\n }\n\n return readFile(absolutePath, \"utf8\");\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 isWrappedDefaultExport(\n declaration: ExportDefaultDeclaration[\"declaration\"],\n wrapperName: string,\n): boolean {\n if (declaration.type !== \"CallExpression\" || declaration.arguments.length !== 1) {\n return false;\n }\n\n const factoryCall = unwrapParentheses(declaration.callee);\n\n if (factoryCall.type !== \"CallExpression\") {\n return false;\n }\n\n const callee = unwrapParentheses(factoryCall.callee);\n return callee.type === \"Identifier\" && callee.name === wrapperName;\n}\n\nfunction transformNextConfig(absolutePath: string, source: string): 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 existingWrapperName !== undefined &&\n isWrappedDefaultExport(defaultExport.declaration, existingWrapperName)\n ) {\n return source;\n }\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\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}()(${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 pathExists(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 pathExists(path.join(appRoot, \"app\")),\n pathExists(path.join(appRoot, \"pages\")),\n ]);\n const sourceRouters = await Promise.all([\n pathExists(path.join(appRoot, \"src\", \"app\")),\n pathExists(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 pathExists(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 pathExists(path.join(appRoot, \"tsconfig.json\")));\n return path.join(directory, `instrumentation-client.${useTypeScript ? \"ts\" : \"js\"}`);\n}\n\nfunction createChange(\n appRoot: string,\n absolutePath: string,\n nextContent: string,\n previousContent: string | undefined,\n): IntegrationFileChange | undefined {\n if (previousContent === nextContent) {\n return undefined;\n }\n\n return Object.freeze({\n absolutePath,\n nextContent,\n ...(previousContent === undefined ? {} : { previousContent }),\n relativePath: path.relative(appRoot, absolutePath).split(path.sep).join(\"/\"),\n });\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 readRegularFile(packagePath),\n findNextConfig(appRoot),\n ]);\n const configSource = await readRegularFile(configPath);\n const instrumentationPath = await resolveInstrumentationPath(appRoot, configPath);\n const instrumentationSource = (await pathExists(instrumentationPath))\n ? await readRegularFile(instrumentationPath)\n : undefined;\n const changes = [\n createChange(\n appRoot,\n configPath,\n transformNextConfig(configPath, configSource),\n configSource,\n ),\n createChange(\n appRoot,\n instrumentationPath,\n transformInstrumentationClient(instrumentationPath, instrumentationSource ?? \"\"),\n instrumentationSource,\n ),\n createChange(\n appRoot,\n packagePath,\n transformPackageJson(packageSource),\n packageSource,\n ),\n ].filter((change): change is IntegrationFileChange => change !== undefined);\n\n return Object.freeze({ appRoot, changes: Object.freeze(changes) });\n}\n\nfunction temporaryPath(absolutePath: string, label: string): string {\n return path.join(\n path.dirname(absolutePath),\n `.${path.basename(absolutePath)}.spotpatch-${label}-${String(process.pid)}-${randomBytes(8).toString(\"hex\")}`,\n );\n}\n\nasync function writeAtomic(\n absolutePath: string,\n content: string,\n mode: number,\n): Promise<void> {\n await mkdir(path.dirname(absolutePath), { recursive: true });\n const stagedPath = temporaryPath(absolutePath, \"stage\");\n\n try {\n await writeFile(stagedPath, content, { encoding: \"utf8\", flag: \"wx\", mode });\n await rename(stagedPath, absolutePath);\n } catch (error: unknown) {\n await unlink(stagedPath).catch(() => undefined);\n throw error;\n }\n}\n\nasync function rollbackChange(change: IntegrationFileChange): Promise<void> {\n if (change.previousContent === undefined) {\n await unlink(change.absolutePath).catch(() => undefined);\n return;\n }\n\n const mode = (await stat(change.absolutePath)).mode;\n await writeAtomic(change.absolutePath, change.previousContent, mode);\n}\n\nexport async function applyNextIntegrationPlan(\n plan: NextIntegrationPlan,\n): Promise<void> {\n const applied: IntegrationFileChange[] = [];\n\n try {\n for (const change of plan.changes) {\n const mode =\n change.previousContent === undefined\n ? 0o600\n : (await stat(change.absolutePath)).mode;\n await writeAtomic(change.absolutePath, change.nextContent, mode);\n applied.push(change);\n }\n } catch (error: unknown) {\n const rollbackResults = await Promise.allSettled(\n applied.reverse().map(rollbackChange),\n );\n\n if (rollbackResults.some((result) => result.status === \"rejected\")) {\n throw new Error(\n \"SpotPatch init failed and could not completely restore the previous files.\",\n { cause: error },\n );\n }\n\n throw new Error(\"SpotPatch init failed; all written files were restored.\", {\n cause: error,\n });\n }\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 });\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 });\n }\n}\n"],"mappings":"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","names":["createRequire","path","defaultBundler","path","isLoopbackHostname","isLoopbackHostname","ID_PATTERN","isRecord","sidecar","result","randomBytes","access","readFile","path","isRecord","pathExists","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 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.3.1\",\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"]}
package/dist/index.cjs CHANGED
@@ -534,13 +534,14 @@ function withSpotPatch(userOptions = {}) {
534
534
  return mergeProductionConfig(config, appRoot, paths);
535
535
  }
536
536
  const environmentAi = userOptions.ai === void 0 ? (0, import_dev_server3.resolveEnvironmentAiConfiguration)(process.env).ai : false;
537
- const options = (0, import_dev_server3.resolveOptions)(
538
- {
537
+ const options = await (0, import_dev_server3.resolveProjectOptions)({
538
+ appRoot,
539
+ environmentAi,
540
+ options: {
539
541
  ...userOptions,
540
542
  include: userOptions.include ?? NEXT_DEFAULT_INCLUDE
541
- },
542
- environmentAi
543
- );
543
+ }
544
+ });
544
545
  if (options.allowLan) {
545
546
  throw new RangeError(
546
547
  "SpotPatch Next does not support allowLan; use a loopback development host."