@spotpatch/next 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/dist/cli.js +1 -1
- package/dist/cli.js.map +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ pnpm exec spotpatch-next check
|
|
|
40
40
|
pnpm dev
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
The supported initializer result has three parts. The TypeScript example below enables the in-page Review / Trusted
|
|
43
|
+
The supported initializer result has three parts. The TypeScript example below enables the in-page Review / Trusted direct selector and preserves the discovered TypeScript check for Review; a JavaScript-only project remains on `withSpotPatch()` and review mode. Trusted direct itself does not expose `run_check` or run project checks.
|
|
44
44
|
|
|
45
45
|
```ts
|
|
46
46
|
// next.config.ts
|
|
@@ -141,7 +141,7 @@ pnpm exec spotpatch-next check
|
|
|
141
141
|
pnpm dev
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
-
受支持的初始化结果包含三部分。下面的 TypeScript
|
|
144
|
+
受支持的初始化结果包含三部分。下面的 TypeScript 示例会开放页面内“审阅 / 可信极速”选择,并保留自动发现的 TypeScript 校验供审阅模式使用;纯 JavaScript 项目保持 `withSpotPatch()` 和审阅模式。可信极速模式本身不向模型暴露 `run_check`,也不执行项目检查。
|
|
145
145
|
|
|
146
146
|
```ts
|
|
147
147
|
// next.config.ts
|
package/dist/cli.js
CHANGED
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/cli-owner.ts","../src/cli-args.ts","../src/internal/constants.ts","../src/internal/ipc.ts","../src/project.ts","../src/sidecar.ts","../package.json","../src/internal/configuration-server.ts","../src/initializer.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { runNextDevelopment } from \"./cli-owner.js\";\nimport {\n applyNextIntegrationPlan,\n checkNextIntegration,\n planNextIntegration,\n} from \"./initializer.js\";\nimport { inspectNextProject } from \"./project.js\";\n\nfunction writeUsage(): void {\n process.stderr.write(\n \"Usage: spotpatch-next <dev|init|check>\\n\" +\n \" dev [next dev options] Start the local Next.js development server.\\n\" +\n \" init Preview and apply safe integration changes.\\n\" +\n \" check Verify the integration without writing files.\\n\",\n );\n}\n\nfunction verifyAdapterExports(appRoot: string): void {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n for (const moduleId of [\n \"@spotpatch/next\",\n \"@spotpatch/next/client\",\n \"@spotpatch/next/loader\",\n \"@spotpatch/next/noop\",\n ]) {\n try {\n resolveFromApplication.resolve(moduleId);\n } catch (error: unknown) {\n throw new Error(`SpotPatch could not resolve the required export ${moduleId}.`, {\n cause: error,\n });\n }\n }\n}\n\nfunction writeTrustedModeStatus(available: boolean): void {\n process.stdout.write(\n available\n ? \"[spotpatch:next] trusted fast mode is available in the page selector.\\n\"\n : \"[spotpatch:next] review mode is ready; trusted fast mode needs a local TypeScript project check.\\n\",\n );\n}\n\nasync function runInit(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch init does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const plan = await planNextIntegration(project.appRoot);\n\n if (plan.changes.length === 0) {\n process.stdout.write(\"[spotpatch:next] integration is already up to date.\\n\");\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n }\n\n process.stdout.write(\"[spotpatch:next] integration preview (resulting files):\\n\");\n\n for (const change of plan.changes) {\n process.stdout.write(`\\n--- ${change.relativePath}\\n${change.nextContent}`);\n\n if (!change.nextContent.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n await applyNextIntegrationPlan(plan);\n process.stdout.write(\n `[spotpatch:next] updated ${String(plan.changes.length)} integration file(s).\\n`,\n );\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n}\n\nasync function runCheck(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch check does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const result = await checkNextIntegration(project.appRoot);\n\n if (!result.ok) {\n for (const issue of result.issues) {\n process.stderr.write(`[spotpatch:next] ${issue}\\n`);\n }\n\n return 1;\n }\n\n const mode = result.trustedFastModeAvailable\n ? \"trusted fast mode available\"\n : \"review mode\";\n process.stdout.write(\n `[spotpatch:next] integration verified for Next.js ${project.nextVersion} · ${mode}.\\n`,\n );\n return 0;\n}\n\nasync function main(arguments_: readonly string[]): Promise<number> {\n const [command, ...rest] = arguments_;\n\n if (command === \"dev\") {\n const integration = await checkNextIntegration();\n\n if (!integration.ok) {\n throw new Error(\n \"SpotPatch Next integration is incomplete; run `spotpatch-next init` first.\",\n );\n }\n\n return runNextDevelopment(rest);\n }\n\n if (command === \"init\") {\n return runInit(rest);\n }\n\n if (command === \"check\") {\n return runCheck(rest);\n }\n\n writeUsage();\n return 1;\n}\n\ntry {\n process.exitCode = await main(process.argv.slice(2));\n} catch (error: unknown) {\n process.stderr.write(\n `[spotpatch:next] ${\n error instanceof Error ? error.message : \"The command failed.\"\n }\\n`,\n );\n process.exitCode = 1;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\n\nimport { serializeResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nimport { parseNextDevArguments } from \"./cli-args.js\";\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./internal/constants.js\";\nimport {\n parseNextConfigureMessage,\n type NextConfigureAck,\n type ParsedNextConfigureMessage,\n} from \"./internal/ipc.js\";\nimport { inspectNextProject } from \"./project.js\";\nimport { createNextSidecar, type NextSidecar } from \"./sidecar.js\";\n\nconst CONFIGURATION_STARTUP_TIMEOUT_MS = 60_000;\nconst FORCED_TERMINATION_TIMEOUT_MS = 5_000;\nconst MAX_CONFIGURATION_REQUESTS = 32;\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\n\ninterface ChildResult {\n readonly code: number | null;\n readonly error: boolean;\n readonly signal: NodeJS.Signals | null;\n}\n\ninterface Correlation {\n readonly nonce: string;\n readonly requestId: string;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction defaultBundler(nextVersion: string): SpotPatchNextBundler {\n return Number(nextVersion.split(\".\", 1)[0]) >= 16 ? \"turbopack\" : \"webpack\";\n}\n\nfunction signalExitCode(signal: NodeJS.Signals | null): number {\n return signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 1;\n}\n\nfunction sortedRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).sort(([left], [right]) => left.localeCompare(right)),\n ),\n );\n}\n\nfunction configurationSignature(message: ParsedNextConfigureMessage): string {\n return JSON.stringify({\n appRoot: message.appRoot,\n credentials: sortedRecord(message.credentials),\n options: serializeResolvedSpotPatchOptions(message.options),\n });\n}\n\nfunction readCorrelation(value: unknown, nonce: string): Correlation | undefined {\n if (\n !isRecord(value) ||\n typeof value.nonce !== \"string\" ||\n value.nonce !== nonce ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n return undefined;\n }\n\n return Object.freeze({ nonce, requestId: value.requestId });\n}\n\nfunction createAck(\n correlation: Correlation,\n result:\n | Readonly<{ ok: true }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n ok: false;\n }>,\n): NextConfigureAck {\n return Object.freeze({\n ...result,\n nonce: correlation.nonce,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: correlation.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n\nfunction waitForChild(child: ChildProcess): Promise<ChildResult> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ChildResult): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(Object.freeze(result));\n };\n\n child.once(\"error\", () => {\n finish({ code: null, error: true, signal: null });\n });\n child.once(\"exit\", (code, signal) => {\n finish({ code, error: false, signal });\n });\n });\n}\n\nasync function closeSidecar(sidecar: NextSidecar): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n await Promise.race([\n sidecar.close(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(\"SpotPatch Sidecar shutdown timed out.\"));\n }, FORCED_TERMINATION_TIMEOUT_MS);\n timer.unref();\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function runNextDevelopment(\n arguments_: readonly string[],\n): Promise<number> {\n const project = await inspectNextProject();\n const dev = parseNextDevArguments(\n arguments_,\n process.env,\n defaultBundler(project.nextVersion),\n );\n const launchNonce = randomBytes(24).toString(\"base64url\");\n const configurationSecret = randomBytes(32).toString(\"base64url\");\n const internalSecret = randomBytes(32).toString(\"base64url\");\n const registryEpoch = randomBytes(24).toString(\"base64url\");\n const lifecycle: {\n child?: ChildProcess;\n sidecar?: NextSidecar;\n sidecarFailed: boolean;\n } = {\n sidecarFailed: false,\n };\n const seenRequestIds = new Set<string>();\n let acceptedSignature: string | undefined;\n let activationFailed = false;\n let configured = false;\n let failureCode: string | undefined;\n let configurationQueue: Promise<void> = Promise.resolve();\n\n const handleConfiguration = async (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const correlation = readCorrelation(value, launchNonce);\n let message: ParsedNextConfigureMessage;\n\n try {\n message = parseNextConfigureMessage(value);\n } catch {\n failureCode = \"INVALID_IPC\";\n\n if (correlation !== undefined) {\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(correlation, { code: \"INVALID_IPC\", ok: false });\n }\n\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n }\n\n if (\n message.nonce !== launchNonce ||\n message.appRoot !== project.appRoot ||\n message.options.allowLan ||\n seenRequestIds.has(message.requestId) ||\n seenRequestIds.size >= MAX_CONFIGURATION_REQUESTS\n ) {\n failureCode = \"INVALID_IPC\";\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(message, { code: \"INVALID_IPC\", ok: false });\n }\n\n seenRequestIds.add(message.requestId);\n const signature = configurationSignature(message);\n\n if (acceptedSignature !== undefined && acceptedSignature !== signature) {\n failureCode = \"CONFIGURATION_CONFLICT\";\n return createAck(message, {\n code: \"CONFIGURATION_CONFLICT\",\n ok: false,\n });\n }\n\n if (activationFailed) {\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n if (acceptedSignature === undefined) {\n acceptedSignature = signature;\n const sidecar = lifecycle.sidecar;\n\n if (sidecar === undefined) {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n try {\n await sidecar.activate({\n appRoot: project.appRoot,\n bundler: dev.bundler,\n credentials: message.credentials,\n internalSecret,\n nextVersion: project.nextVersion,\n options: message.options,\n projectRoot: project.projectRoot,\n publicOrigin: dev.publicOrigin,\n registryEpoch,\n routerKind: project.routerKind,\n });\n } catch {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n }\n\n if (!configured) {\n configured = true;\n clearTimeout(startupTimer);\n\n process.stdout.write(\n `[spotpatch:next] ready for Next.js ${project.nextVersion} (${dev.bundler}) at ${dev.publicOrigin}\\n`,\n );\n }\n\n return createAck(message, { ok: true });\n };\n const enqueueConfiguration = (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const result = configurationQueue.then(() => handleConfiguration(value));\n configurationQueue = result.then(\n () => undefined,\n () => undefined,\n );\n\n return result.catch(() => {\n failureCode = \"CONFIGURATION_FAILURE\";\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n });\n };\n const sidecar = await createNextSidecar({\n configuration: {\n configurationSecret,\n onConfiguration: enqueueConfiguration,\n },\n onFatalError() {\n lifecycle.sidecarFailed = true;\n lifecycle.child?.kill(\"SIGTERM\");\n },\n });\n lifecycle.sidecar = sidecar;\n const childEnvironment: NodeJS.ProcessEnv = {\n ...process.env,\n [NEXT_ENVIRONMENT_KEYS.appRoot]: project.appRoot,\n [NEXT_ENVIRONMENT_KEYS.bundler]: dev.bundler,\n [NEXT_ENVIRONMENT_KEYS.configurationSecret]: configurationSecret,\n [NEXT_ENVIRONMENT_KEYS.internalOrigin]: sidecar.origin,\n [NEXT_ENVIRONMENT_KEYS.internalSecret]: internalSecret,\n [NEXT_ENVIRONMENT_KEYS.launchNonce]: launchNonce,\n [NEXT_ENVIRONMENT_KEYS.registryEpoch]: registryEpoch,\n [NEXT_ENVIRONMENT_KEYS.sidecarOrigin]: sidecar.origin,\n };\n const child = spawn(\n process.execPath,\n [project.nextEntry, \"dev\", ...dev.nextArguments],\n {\n cwd: project.appRoot,\n env: childEnvironment,\n shell: false,\n stdio: \"inherit\",\n windowsHide: true,\n },\n );\n lifecycle.child = child;\n const startupTimer = setTimeout(() => {\n failureCode = \"CONFIGURATION_TIMEOUT\";\n child.kill(\"SIGTERM\");\n }, CONFIGURATION_STARTUP_TIMEOUT_MS);\n startupTimer.unref();\n\n let requestedSignal: NodeJS.Signals | undefined;\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n const forwardSignal = (signal: NodeJS.Signals): void => {\n if (requestedSignal !== undefined) {\n return;\n }\n\n requestedSignal = signal;\n child.kill(signal);\n forceTimer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, FORCED_TERMINATION_TIMEOUT_MS);\n forceTimer.unref();\n };\n const onSigint = (): void => {\n forwardSignal(\"SIGINT\");\n };\n const onSigterm = (): void => {\n forwardSignal(\"SIGTERM\");\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n\n const result = await waitForChild(child);\n clearTimeout(startupTimer);\n\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n\n if (forceTimer !== undefined) {\n clearTimeout(forceTimer);\n }\n\n await configurationQueue;\n\n try {\n await closeSidecar(sidecar);\n } catch {\n failureCode ??= \"SHUTDOWN_FAILED\";\n }\n\n if (failureCode !== undefined) {\n process.stderr.write(`[spotpatch:next] stopped (${failureCode}).\\n`);\n return 1;\n }\n\n if (lifecycle.sidecarFailed || result.error) {\n process.stderr.write(\"[spotpatch:next] stopped (PROCESS_FAILURE).\\n\");\n return 1;\n }\n\n if (result.signal !== null || requestedSignal !== undefined) {\n return signalExitCode(result.signal ?? requestedSignal ?? null);\n }\n\n return result.code ?? 1;\n}\n","import { isLoopbackHostname } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nexport interface NextDevArguments {\n readonly bundler: SpotPatchNextBundler;\n readonly hostname: string;\n readonly nextArguments: readonly string[];\n readonly port: number;\n readonly publicOrigin: string;\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n\n if (\n !/^\\d+$/u.test(value) ||\n !Number.isSafeInteger(port) ||\n port < 1 ||\n port > 65_535\n ) {\n throw new RangeError(\"SpotPatch Next requires a valid development port.\");\n }\n\n return port;\n}\n\nfunction parseOptionValue(\n arguments_: readonly string[],\n index: number,\n longName: string,\n shortName: string,\n): Readonly<{ consumed: number; value?: string }> {\n const argument = arguments_[index];\n\n if (argument === longName || argument === shortName) {\n const value = arguments_[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`SpotPatch Next requires a value after ${argument}.`);\n }\n\n return Object.freeze({ consumed: 1, value });\n }\n\n const longPrefix = `${longName}=`;\n const shortPrefix = `${shortName}=`;\n\n if (argument?.startsWith(longPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(longPrefix.length) });\n }\n\n if (argument?.startsWith(shortPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(shortPrefix.length) });\n }\n\n return Object.freeze({ consumed: 0 });\n}\n\nexport function parseNextDevArguments(\n arguments_: readonly string[],\n environment: Readonly<Record<string, string | undefined>> = process.env,\n defaultBundler: SpotPatchNextBundler = \"turbopack\",\n): NextDevArguments {\n let hostname: string | undefined;\n let port: number | undefined;\n let webpack = false;\n let turbopack = false;\n\n for (let index = 0; index < arguments_.length; index += 1) {\n const argument = arguments_[index];\n const hostOption = parseOptionValue(arguments_, index, \"--hostname\", \"-H\");\n\n if (hostOption.value !== undefined) {\n if (hostname !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate hostname options.\");\n }\n\n hostname = hostOption.value;\n index += hostOption.consumed;\n continue;\n }\n\n const portOption = parseOptionValue(arguments_, index, \"--port\", \"-p\");\n\n if (portOption.value !== undefined) {\n if (port !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate port options.\");\n }\n\n port = parsePort(portOption.value);\n index += portOption.consumed;\n continue;\n }\n\n if (argument === \"--webpack\") {\n webpack = true;\n } else if (argument === \"--turbopack\" || argument === \"--turbo\") {\n turbopack = true;\n }\n }\n\n const resolvedHostname = hostname ?? \"localhost\";\n\n if (!isLoopbackHostname(resolvedHostname)) {\n throw new Error(\n \"SpotPatch Next only supports a loopback --hostname in its first release.\",\n );\n }\n\n if (webpack && turbopack) {\n throw new Error(\"SpotPatch Next cannot enable webpack and Turbopack together.\");\n }\n\n const resolvedPort =\n port ?? (environment.PORT === undefined ? 3_000 : parsePort(environment.PORT));\n const hostForUrl = resolvedHostname.includes(\":\")\n ? `[${resolvedHostname}]`\n : resolvedHostname;\n const nextArguments = [...arguments_];\n\n if (hostname === undefined) {\n nextArguments.push(\"--hostname\", resolvedHostname);\n }\n\n if (port === undefined) {\n nextArguments.push(\"--port\", String(resolvedPort));\n }\n\n return Object.freeze({\n bundler: webpack ? \"webpack\" : turbopack ? \"turbopack\" : defaultBundler,\n hostname: resolvedHostname,\n nextArguments: Object.freeze(nextArguments),\n port: resolvedPort,\n publicOrigin: `http://${hostForUrl}:${String(resolvedPort)}`,\n });\n}\n","export const NEXT_IPC_PROTOCOL_VERSION = 1 as const;\nexport const NEXT_IPC_MESSAGE_LIMIT_BYTES = 256 * 1024;\nexport const NEXT_IPC_TIMEOUT_MS = 15_000;\nexport const NEXT_INTERNAL_REGISTRATION_PATH =\n \"/__spotpatch-internal/register\" as const;\nexport const NEXT_INTERNAL_CONFIGURATION_PATH =\n \"/__spotpatch-internal/configure\" as const;\n\nexport const NEXT_ENVIRONMENT_KEYS = Object.freeze({\n appRoot: \"SPOTPATCH_NEXT_APP_ROOT\",\n bundler: \"SPOTPATCH_NEXT_BUNDLER\",\n configurationSecret: \"SPOTPATCH_NEXT_CONFIGURATION_SECRET\",\n internalOrigin: \"SPOTPATCH_NEXT_INTERNAL_ORIGIN\",\n internalSecret: \"SPOTPATCH_NEXT_INTERNAL_SECRET\",\n launchNonce: \"SPOTPATCH_NEXT_LAUNCH_NONCE\",\n registryEpoch: \"SPOTPATCH_NEXT_REGISTRY_EPOCH\",\n sidecarOrigin: \"SPOTPATCH_NEXT_SIDECAR_ORIGIN\",\n} as const);\n\nexport const NEXT_SOURCE_RULE_KEYS = Object.freeze([\"*.jsx\", \"*.tsx\"] as const);\nexport const NEXT_CLIENT_MODULE_ID = \"@spotpatch/next/client\" as const;\n\nexport const NEXT_DEFAULT_INCLUDE = Object.freeze([/\\.(?:jsx|tsx)$/u]);\n","import path from \"node:path\";\n\nimport {\n parseSerializedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n type SerializedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_IPC_MESSAGE_LIMIT_BYTES,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./constants.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst ENVIRONMENT_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/u;\n\nexport interface NextConfigureMessage {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly nonce: string;\n readonly options: SerializedSpotPatchOptions;\n readonly protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n readonly requestId: string;\n readonly type: \"spotpatch:next:configure\";\n}\n\nexport type NextConfigureAck =\n | Readonly<{\n nonce: string;\n ok: true;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n nonce: string;\n ok: false;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>;\n\nexport interface ParsedNextConfigureMessage extends Omit<\n NextConfigureMessage,\n \"options\"\n> {\n readonly options: ResolvedSpotPatchOptions;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n expectedKeys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...expectedKeys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function assertIpcMessageSize(value: unknown): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch IPC message is not serializable.\", {\n cause: error,\n });\n }\n\n if (Buffer.byteLength(serialized, \"utf8\") > NEXT_IPC_MESSAGE_LIMIT_BYTES) {\n throw new RangeError(\"The SpotPatch IPC message exceeds the size limit.\");\n }\n}\n\nfunction parseCredentials(value: unknown): Readonly<Record<string, string>> {\n if (!isRecord(value) || Object.keys(value).length > 32) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n const entries = Object.entries(value);\n const credentials: Record<string, string> = {};\n\n for (const [name, credential] of entries) {\n if (\n !ENVIRONMENT_NAME_PATTERN.test(name) ||\n typeof credential !== \"string\" ||\n credential.length === 0 ||\n credential.length > 16_384 ||\n credential.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n credentials[name] = credential;\n }\n\n return Object.freeze(credentials);\n}\n\nexport function parseNextConfigureMessage(value: unknown): ParsedNextConfigureMessage {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\n \"appRoot\",\n \"credentials\",\n \"nonce\",\n \"options\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n value.type !== \"spotpatch:next:configure\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId) ||\n typeof value.appRoot !== \"string\" ||\n !path.isAbsolute(value.appRoot) ||\n value.appRoot.length > 4_096 ||\n value.appRoot.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC message is invalid.\");\n }\n\n return Object.freeze({\n appRoot: value.appRoot,\n credentials: parseCredentials(value.credentials),\n nonce: value.nonce,\n options: parseSerializedSpotPatchOptions(value.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure\",\n });\n}\n\nexport function parseNextConfigureAck(value: unknown): NextConfigureAck {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n value.type !== \"spotpatch:next:configure-ack\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.ok !== \"boolean\" ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n if (value.ok) {\n if (!hasExactKeys(value, [\"nonce\", \"ok\", \"protocolVersion\", \"requestId\", \"type\"])) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n nonce: value.nonce,\n ok: true,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n }\n\n if (\n !hasExactKeys(value, [\n \"code\",\n \"nonce\",\n \"ok\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n (value.code !== \"CONFIGURATION_CONFLICT\" &&\n value.code !== \"CONFIGURATION_FAILED\" &&\n value.code !== \"INVALID_IPC\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n code: value.code,\n nonce: value.nonce,\n ok: false,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { access, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { SpotPatchNextRouterKind } from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst VERSION_PATTERN = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z.-]+)?$/u;\n\nexport interface NextProject {\n readonly appRoot: string;\n readonly nextEntry: string;\n readonly nextVersion: string;\n readonly projectRoot: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\nasync function pathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertSupportedNextVersion(version: string): void {\n const match = VERSION_PATTERN.exec(version);\n const major = Number(match?.[1]);\n const minor = Number(match?.[2]);\n\n if (\n match === null ||\n !Number.isSafeInteger(major) ||\n !Number.isSafeInteger(minor) ||\n major < 15 ||\n major >= 17 ||\n (major === 15 && minor < 3)\n ) {\n throw new Error(\n `SpotPatch Next requires Next.js >=15.3.0 <17.0.0; found ${version}.`,\n );\n }\n}\n\nasync function detectRouterKind(appRoot: string): Promise<SpotPatchNextRouterKind> {\n const [appCandidates, pagesCandidates] = await Promise.all([\n Promise.all([\n pathExists(path.join(appRoot, \"app\")),\n pathExists(path.join(appRoot, \"src\", \"app\")),\n ]),\n Promise.all([\n pathExists(path.join(appRoot, \"pages\")),\n pathExists(path.join(appRoot, \"src\", \"pages\")),\n ]),\n ]);\n const hasApp = appCandidates.some(Boolean);\n const hasPages = pagesCandidates.some(Boolean);\n\n if (hasApp && hasPages) {\n return \"hybrid\";\n }\n\n if (hasApp) {\n return \"app\";\n }\n\n if (hasPages) {\n return \"pages\";\n }\n\n throw new Error(\"SpotPatch could not find an App or Pages Router directory.\");\n}\n\nasync function findProjectRoot(appRoot: string): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n });\n const candidate = await realpath(result.stdout.trim());\n const relative = path.relative(candidate, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return candidate;\n }\n } catch {\n // A non-Git application can still use picker/editor features with AI disabled.\n }\n\n return appRoot;\n}\n\nexport async function inspectNextProject(\n directory = process.cwd(),\n): Promise<NextProject> {\n const appRoot = await realpath(directory);\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n let nextEntry: string;\n let manifestPath: string;\n\n try {\n nextEntry = resolveFromApplication.resolve(\"next/dist/bin/next\");\n manifestPath = resolveFromApplication.resolve(\"next/package.json\");\n } catch (error: unknown) {\n throw new Error(\"SpotPatch could not resolve the application's local Next.js.\", {\n cause: error,\n });\n }\n\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest !== \"object\" ||\n manifest === null ||\n !(\"version\" in manifest) ||\n typeof manifest.version !== \"string\"\n ) {\n throw new Error(\"SpotPatch could not read the local Next.js version.\");\n }\n\n assertSupportedNextVersion(manifest.version);\n const [projectRoot, routerKind] = await Promise.all([\n findProjectRoot(appRoot),\n detectRouterKind(appRoot),\n ]);\n\n return Object.freeze({\n appRoot,\n nextEntry,\n nextVersion: manifest.version,\n projectRoot,\n routerKind,\n });\n}\n","import {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\n\nimport {\n createAgentJobManager,\n createRuntimeAiConfig,\n createSession,\n createSourceRegistrationService,\n createSourceRegistry,\n createSpotPatchMiddleware,\n type AgentJobManager,\n type ResolvedSpotPatchOptions,\n type SourceRegistry,\n} from \"@spotpatch/dev-server\";\nimport {\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchNextBundler,\n type SpotPatchNextRouterKind,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport {\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_INTERNAL_REGISTRATION_PATH,\n} from \"./internal/constants.js\";\nimport {\n createConfigurationRequestHandler,\n type ConfigurationServerOptions,\n} from \"./internal/configuration-server.js\";\n\nconst SIDECAR_SELF_CHECK_LIMIT_BYTES = 16_384;\nconst SIDECAR_SELF_CHECK_TIMEOUT_MS = 3_000;\n\ninterface ActivateSidecarInput {\n readonly appRoot: string;\n readonly bundler: SpotPatchNextBundler;\n readonly credentials: Readonly<Record<string, string>>;\n readonly internalSecret: string;\n readonly nextVersion: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly projectRoot: string;\n readonly publicOrigin: string;\n readonly registryEpoch: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\ntype RequestHandler = (request: IncomingMessage, response: ServerResponse) => void;\n\nexport interface NextSidecar {\n readonly origin: string;\n activate(input: ActivateSidecarInput): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface NextSidecarOptions {\n readonly configuration: ConfigurationServerOptions;\n readonly onFatalError?: () => void;\n}\n\nfunction requestPath(url: string | undefined): string {\n try {\n return new URL(url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nfunction writeUnavailable(response: ServerResponse, statusCode: number): void {\n const body = JSON.stringify({ ok: false });\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction validateCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n credentials: Readonly<Record<string, string>>,\n): void {\n const expected =\n options.ai === false\n ? []\n : [\n ...new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n ),\n ].sort();\n const actual = Object.keys(credentials).sort();\n\n if (\n actual.length !== expected.length ||\n actual.some((name, index) => name !== expected[index])\n ) {\n throw new TypeError(\"The SpotPatch credential environment is inconsistent.\");\n }\n}\n\nasync function selfCheckSidecar(\n sidecarOrigin: string,\n publicOrigin: string,\n expectedConfig: SpotPatchRuntimeConfig,\n): Promise<void> {\n const response = await fetch(new URL(SPOTPATCH_ENDPOINTS.bootstrap, sidecarOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: publicOrigin,\n \"Sec-Fetch-Site\": \"same-origin\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(SIDECAR_SELF_CHECK_TIMEOUT_MS),\n });\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const text = await response.text();\n\n if (\n !response.ok ||\n !response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\") ||\n Buffer.byteLength(text, \"utf8\") > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n let value: unknown;\n\n try {\n value = JSON.parse(text) as unknown;\n } catch (error: unknown) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\", { cause: error });\n }\n\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n const parsedExpected = runtimeConfigSchema.safeParse(expectedConfig);\n\n if (\n !parsed.success ||\n !parsedExpected.success ||\n JSON.stringify(parsed.data) !== JSON.stringify(parsedExpected.data)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((error) => {\n if (\n error === undefined ||\n (\"code\" in error && error.code === \"ERR_SERVER_NOT_RUNNING\")\n ) {\n resolve();\n return;\n }\n\n reject(error);\n });\n });\n}\n\nexport async function createNextSidecar(\n sidecarOptions: NextSidecarOptions,\n): Promise<NextSidecar> {\n let active = false;\n let closed = false;\n let registry: SourceRegistry | undefined;\n let agentManager: AgentJobManager | undefined;\n let handler: RequestHandler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n const configurationHandler = createConfigurationRequestHandler(\n sidecarOptions.configuration,\n );\n const server = createServer((request, response) => {\n try {\n if (requestPath(request.url) === NEXT_INTERNAL_CONFIGURATION_PATH) {\n configurationHandler(request, response);\n return;\n }\n\n handler(request, response);\n } catch {\n writeUnavailable(response, 500);\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error): void => {\n reject(error);\n };\n server.once(\"error\", onError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n server.on(\"error\", () => {\n if (!closed) {\n sidecarOptions.onFatalError?.();\n }\n });\n const address = server.address();\n\n if (address === null || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"SpotPatch Sidecar did not bind a loopback address.\");\n }\n const sidecarOrigin = `http://127.0.0.1:${String(address.port)}`;\n\n return Object.freeze({\n origin: sidecarOrigin,\n async activate(input: ActivateSidecarInput): Promise<void> {\n if (closed || active) {\n throw new Error(\"SpotPatch Sidecar activation is not available.\");\n }\n\n validateCredentialEnvironment(input.options, input.credentials);\n\n if (!input.options.enabled) {\n handler = (_request, response) => {\n writeUnavailable(response, 404);\n };\n active = true;\n return;\n }\n\n const sourceRegistry = createSourceRegistry();\n const session = createSession();\n const runtimeConfig = Object.freeze({\n apiBase: SPOTPATCH_API_BASE,\n ai: createRuntimeAiConfig(input.options.ai),\n budget: input.options.budget,\n bundler: input.bundler,\n debug: input.options.debug,\n editor: input.options.editor,\n framework: \"next\",\n frameworkVersion: input.nextVersion,\n locale: input.options.locale,\n maxTargets: input.options.maxTargets,\n redact: input.options.redact,\n sessionId: session.id,\n routerKind: input.routerKind,\n sessionToken: session.token,\n shortcut: input.options.shortcut,\n spotPatchVersion: packageMetadata.version,\n }) satisfies SpotPatchRuntimeConfig;\n const manager =\n input.options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: input.options.ai,\n environment: input.credentials,\n root: input.projectRoot,\n });\n const middleware = createSpotPatchMiddleware({\n ...(manager === undefined ? {} : { agentManager: manager }),\n bootstrap: {\n expectedOrigin: input.publicOrigin,\n runtimeConfig,\n },\n logger: {\n warn(message) {\n process.stderr.write(`${message}\\n`);\n },\n },\n options: input.options,\n registry: sourceRegistry,\n root: input.appRoot,\n session,\n });\n const registration = await createSourceRegistrationService({\n internalSecret: input.internalSecret,\n options: input.options,\n registry: sourceRegistry,\n registryEpoch: input.registryEpoch,\n root: input.appRoot,\n });\n\n registry = sourceRegistry;\n agentManager = manager;\n handler = (request, response) => {\n if (requestPath(request.url) === NEXT_INTERNAL_REGISTRATION_PATH) {\n registration.handler(request, response);\n return;\n }\n\n middleware(request, response, () => {\n writeUnavailable(response, 404);\n });\n };\n await selfCheckSidecar(sidecarOrigin, input.publicOrigin, runtimeConfig);\n active = true;\n },\n async close(): Promise<void> {\n if (closed) {\n return;\n }\n\n closed = true;\n handler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n registry?.clear();\n await agentManager?.close();\n server.closeIdleConnections();\n const closing = closeServer(server);\n server.closeAllConnections();\n await closing;\n },\n });\n}\n","{\n \"name\": \"@spotpatch/next\",\n \"version\": \"0.3.0\",\n \"description\": \"Development-only Next.js adapter and CLI for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/next\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"nextjs\",\n \"react\",\n \"developer-tools\"\n ],\n \"type\": \"module\",\n \"sideEffects\": [\n \"./dist/client.cjs\",\n \"./dist/client.js\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"loader.cjs\",\n \"loader.d.cts\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-next\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/client.d.ts\",\n \"default\": \"./dist/client.js\"\n },\n \"require\": {\n \"types\": \"./dist/client.d.cts\",\n \"default\": \"./dist/client.cjs\"\n }\n },\n \"./loader\": {\n \"types\": \"./loader.d.cts\",\n \"default\": \"./loader.cjs\"\n },\n \"./noop\": {\n \"import\": {\n \"types\": \"./dist/noop.d.ts\",\n \"default\": \"./dist/noop.js\"\n },\n \"require\": {\n \"types\": \"./dist/noop.d.cts\",\n \"default\": \"./dist/noop.cjs\"\n }\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"client\": [\n \"dist/client.d.ts\"\n ],\n \"loader\": [\n \"loader.d.cts\"\n ],\n \"noop\": [\n \"dist/noop.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.loader.config.ts && tsup --config tsup.client.config.ts && pnpm verify:loader\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\",\n \"verify:loader\": \"node scripts/verify-loader.cjs\"\n },\n \"dependencies\": {\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"bippy\": \"0.6.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.3.0 <17.0.0\",\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"devDependencies\": {\n \"next\": \"16.3.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { isLoopbackHostname, readJsonRequestBody } from \"@spotpatch/dev-server\";\n\nimport { NEXT_IPC_MESSAGE_LIMIT_BYTES } from \"./constants.js\";\nimport { assertIpcMessageSize, type NextConfigureAck } from \"./ipc.js\";\n\nconst CONFIGURATION_SECRET_HEADER = \"x-spotpatch-configuration\";\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\n\nexport interface ConfigurationServerOptions {\n readonly configurationSecret: string;\n readonly onConfiguration: (value: unknown) => Promise<NextConfigureAck | undefined>;\n}\n\nexport type ConfigurationRequestHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction secretsMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction hasLoopbackHost(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nexport function createConfigurationRequestHandler(\n options: ConfigurationServerOptions,\n): ConfigurationRequestHandler {\n if (!CONFIGURATION_SECRET_PATTERN.test(options.configurationSecret)) {\n throw new TypeError(\"The SpotPatch configuration secret is invalid.\");\n }\n\n return (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !hasLoopbackHost(request) ||\n getSingleHeader(request, \"origin\") !== undefined ||\n !secretsMatch(\n getSingleHeader(request, CONFIGURATION_SECRET_HEADER),\n options.configurationSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const value = await readJsonRequestBody(request, NEXT_IPC_MESSAGE_LIMIT_BYTES);\n const acknowledgement = await options.onConfiguration(value);\n\n if (acknowledgement === undefined) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n assertIpcMessageSize(acknowledgement);\n writeJson(response, 200, acknowledgement);\n };\n\n void handle().catch(() => {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n writeJson(response, 400, { ok: false });\n });\n };\n}\n","import path from \"node:path\";\n\nimport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n discoverProjectValidationCheck,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n} from \"@spotpatch/dev-server\";\nimport { DEFAULT_AGENT_LIMITS } from \"@spotpatch/shared\";\nimport { MagicString } from \"magic-string\";\nimport {\n parseSync,\n Visitor,\n type CallExpression,\n type ExportDefaultDeclaration,\n type ImportDeclaration,\n type Program,\n} from \"oxc-parser\";\n\nconst ADAPTER_PACKAGE_NAME = \"@spotpatch/next\";\nconst CLIENT_MODULE_ID = \"@spotpatch/next/client\";\nconst CONFIG_FILE_NAMES = Object.freeze([\n \"next.config.ts\",\n \"next.config.mts\",\n \"next.config.js\",\n \"next.config.mjs\",\n \"next.config.cts\",\n \"next.config.cjs\",\n] as const);\nconst INSTRUMENTATION_EXTENSIONS = Object.freeze([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n] as const);\nconst SIMPLE_SCRIPT_ARGUMENT_PATTERN = /^[A-Za-z0-9._:/=@%+,-]+$/u;\n\nexport interface NextIntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n readonly trustedFastModeAvailable: boolean;\n}\n\nexport interface NextIntegrationCheck {\n readonly appRoot: string;\n readonly issues: readonly string[];\n readonly ok: boolean;\n readonly trustedFastModeAvailable: boolean;\n}\n\ninterface PackageManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly optionalDependencies?: Readonly<Record<string, unknown>>;\n readonly scripts?: Readonly<Record<string, unknown>>;\n readonly [key: string]: unknown;\n}\n\ninterface ParsedModule {\n readonly program: Program;\n readonly source: string;\n}\n\nfunction isParserErrorSeverity(value: unknown): boolean {\n return value === \"Error\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseModule(absolutePath: string, source: string): ParsedModule {\n const result = parseSync(absolutePath, source, {\n sourceType: \"module\",\n showSemanticErrors: true,\n });\n const error = result.errors.find((entry) => isParserErrorSeverity(entry.severity));\n\n if (error !== undefined) {\n throw new SyntaxError(\n `SpotPatch could not safely parse ${path.basename(absolutePath)} (${error.message}).`,\n );\n }\n\n return Object.freeze({ program: result.program, source });\n}\n\nfunction importsOf(program: Program): readonly ImportDeclaration[] {\n return program.body.filter(\n (statement): statement is ImportDeclaration =>\n statement.type === \"ImportDeclaration\",\n );\n}\n\nfunction importInsertionOffset(program: Program): number {\n const imports = importsOf(program);\n const lastImport = imports.at(-1);\n\n if (lastImport !== undefined) {\n return lastImport.end;\n }\n\n const directives = program.body.filter(\n (statement) =>\n statement.type === \"ExpressionStatement\" &&\n \"directive\" in statement &&\n typeof statement.directive === \"string\",\n );\n return directives.at(-1)?.end ?? program.hashbang?.end ?? 0;\n}\n\nfunction insertStaticImport(\n magicString: MagicString,\n program: Program,\n statement: string,\n): void {\n const offset = importInsertionOffset(program);\n\n if (offset === 0) {\n magicString.prepend(`${statement}\\n\\n`);\n return;\n }\n\n magicString.appendRight(offset, `\\n${statement}`);\n}\n\nfunction findDefaultExport(program: Program): ExportDefaultDeclaration {\n const exports = program.body.filter(\n (statement): statement is ExportDefaultDeclaration =>\n statement.type === \"ExportDefaultDeclaration\",\n );\n\n if (exports.length !== 1) {\n throw new Error(\n \"SpotPatch init requires exactly one ESM default export in next.config.\",\n );\n }\n\n const defaultExport = exports[0];\n\n if (defaultExport === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config default export.\");\n }\n\n return defaultExport;\n}\n\nfunction importedWrapperName(program: Program): string | undefined {\n const adapterImports = importsOf(program).filter(\n (statement) => statement.source.value === ADAPTER_PACKAGE_NAME,\n );\n\n if (adapterImports.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple @spotpatch/next imports in next.config.\",\n );\n }\n\n const adapterImport = adapterImports[0];\n\n if (adapterImport === undefined) {\n return undefined;\n }\n\n const wrapper = adapterImport.specifiers.find(\n (specifier) =>\n specifier.type === \"ImportSpecifier\" &&\n specifier.imported.type === \"Identifier\" &&\n specifier.imported.name === \"withSpotPatch\" &&\n specifier.importKind !== \"type\",\n );\n\n if (wrapper === undefined) {\n throw new Error(\n \"SpotPatch init cannot safely merge the existing @spotpatch/next import.\",\n );\n }\n\n return wrapper.local.name;\n}\n\nfunction collectIdentifierNames(program: Program): ReadonlySet<string> {\n const names = new Set<string>();\n new Visitor({\n Identifier(node) {\n names.add(node.name);\n },\n }).visit(program);\n return names;\n}\n\nfunction chooseWrapperName(program: Program): string {\n const names = collectIdentifierNames(program);\n let suffix = 0;\n let candidate = \"withSpotPatch\";\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `withSpotPatch${String(suffix)}`;\n }\n\n return candidate;\n}\n\nfunction unwrapParentheses(\n expression: CallExpression[\"callee\"],\n): CallExpression[\"callee\"] {\n let current = expression;\n\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction wrappedFactoryCall(\n declaration: ExportDefaultDeclaration[\"declaration\"],\n wrapperName: string,\n): CallExpression | undefined {\n if (declaration.type !== \"CallExpression\" || declaration.arguments.length !== 1) {\n return undefined;\n }\n\n const factoryCall = unwrapParentheses(declaration.callee);\n\n if (factoryCall.type !== \"CallExpression\") {\n return undefined;\n }\n\n const callee = unwrapParentheses(factoryCall.callee);\n return callee.type === \"Identifier\" && callee.name === wrapperName\n ? factoryCall\n : undefined;\n}\n\nfunction transformNextConfig(\n absolutePath: string,\n source: string,\n trustedFastModeAvailable: boolean,\n): string {\n if (absolutePath.endsWith(\".cjs\") || absolutePath.endsWith(\".cts\")) {\n throw new Error(\n \"SpotPatch init does not rewrite CommonJS next.config files; add withSpotPatch manually.\",\n );\n }\n\n const { program } = parseModule(absolutePath, source);\n const defaultExport = findDefaultExport(program);\n const existingWrapperName = importedWrapperName(program);\n\n if (\n defaultExport.declaration.type === \"FunctionDeclaration\" ||\n defaultExport.declaration.type === \"TSDeclareFunction\" ||\n defaultExport.declaration.type === \"ClassDeclaration\" ||\n defaultExport.declaration.type === \"TSInterfaceDeclaration\"\n ) {\n throw new Error(\n \"SpotPatch init cannot safely wrap this next.config default declaration; use an exported config expression.\",\n );\n }\n\n const magicString = new MagicString(source);\n const wrapperName = existingWrapperName ?? chooseWrapperName(program);\n const existingFactory =\n existingWrapperName === undefined\n ? undefined\n : wrappedFactoryCall(defaultExport.declaration, existingWrapperName);\n\n if (existingFactory !== undefined) {\n if (trustedFastModeAvailable && existingFactory.arguments.length === 0) {\n magicString.overwrite(\n existingFactory.start,\n existingFactory.end,\n `${wrapperName}({ trustedFastMode: true })`,\n );\n return magicString.toString();\n }\n\n return source;\n }\n\n if (existingWrapperName === undefined) {\n const specifier =\n wrapperName === \"withSpotPatch\"\n ? \"withSpotPatch\"\n : `withSpotPatch as ${wrapperName}`;\n insertStaticImport(\n magicString,\n program,\n `import { ${specifier} } from ${JSON.stringify(ADAPTER_PACKAGE_NAME)};`,\n );\n }\n\n const expression = source.slice(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n );\n magicString.overwrite(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n `${wrapperName}(${trustedFastModeAvailable ? \"{ trustedFastMode: true }\" : \"\"})(${expression})`,\n );\n return magicString.toString();\n}\n\nfunction transformInstrumentationClient(absolutePath: string, source: string): string {\n const { program } = parseModule(absolutePath, source);\n const clientImports = importsOf(program).filter(\n (statement) =>\n statement.source.value === CLIENT_MODULE_ID &&\n statement.importKind !== \"type\" &&\n (statement.specifiers.length === 0 ||\n statement.specifiers.some(\n (specifier) =>\n specifier.type !== \"ImportSpecifier\" || specifier.importKind !== \"type\",\n )),\n );\n\n if (clientImports.length > 1) {\n throw new Error(\"SpotPatch init found duplicate @spotpatch/next/client imports.\");\n }\n\n if (clientImports.length === 1) {\n return source;\n }\n\n const magicString = new MagicString(source);\n insertStaticImport(\n magicString,\n program,\n `import ${JSON.stringify(CLIENT_MODULE_ID)};`,\n );\n return magicString.toString();\n}\n\nfunction parsePackageManifest(source: string): PackageManifest {\n let value: unknown;\n\n try {\n value = JSON.parse(source) as unknown;\n } catch (error: unknown) {\n throw new SyntaxError(\"SpotPatch could not parse package.json.\", {\n cause: error,\n });\n }\n\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch requires package.json to contain an object.\");\n }\n\n return value;\n}\n\nfunction hasAdapterDependency(manifest: PackageManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.optionalDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies[ADAPTER_PACKAGE_NAME] === \"string\",\n );\n}\n\nfunction transformDevScript(script: string): string {\n const tokens = script.trim().split(/\\s+/u);\n\n if (tokens[0] === \"spotpatch-next\" && tokens[1] === \"dev\") {\n if (tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))) {\n return script;\n }\n\n throw new Error(\"SpotPatch init cannot verify the existing dev script safely.\");\n }\n\n if (\n tokens[0] !== \"next\" ||\n tokens[1] !== \"dev\" ||\n !tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))\n ) {\n throw new Error(\"SpotPatch init only rewrites a simple `next dev` package script.\");\n }\n\n return [\"spotpatch-next\", ...tokens.slice(1)].join(\" \");\n}\n\nfunction detectIndent(source: string): string {\n return /^([\\t ]+)\"/mu.exec(source)?.[1] ?? \" \";\n}\n\nfunction transformPackageJson(source: string): string {\n const manifest = parsePackageManifest(source);\n\n if (!hasAdapterDependency(manifest)) {\n throw new Error(\n \"SpotPatch init requires @spotpatch/next in package dependencies first.\",\n );\n }\n\n if (!isRecord(manifest.scripts) || typeof manifest.scripts.dev !== \"string\") {\n throw new Error(\"SpotPatch init requires a string package script named dev.\");\n }\n\n const dev = transformDevScript(manifest.scripts.dev);\n\n if (dev === manifest.scripts.dev) {\n return source;\n }\n\n const nextManifest = {\n ...manifest,\n scripts: { ...manifest.scripts, dev },\n };\n const lineEnding = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const serialized = JSON.stringify(nextManifest, undefined, detectIndent(source));\n return `${serialized.replaceAll(\"\\n\", lineEnding)}${lineEnding}`;\n}\n\nasync function findNextConfig(appRoot: string): Promise<string> {\n const candidates = (\n await Promise.all(\n CONFIG_FILE_NAMES.map(async (name) => {\n const absolutePath = path.join(appRoot, name);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (candidates.length !== 1) {\n throw new Error(\"SpotPatch init requires exactly one supported next.config file.\");\n }\n\n const configPath = candidates[0];\n\n if (configPath === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config path.\");\n }\n\n return configPath;\n}\n\nasync function resolveInstrumentationPath(\n appRoot: string,\n configPath: string,\n): Promise<string> {\n const rootRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"app\")),\n integrationPathExists(path.join(appRoot, \"pages\")),\n ]);\n const sourceRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"src\", \"app\")),\n integrationPathExists(path.join(appRoot, \"src\", \"pages\")),\n ]);\n const hasRootRouter = rootRouters.some(Boolean);\n const hasSourceRouter = sourceRouters.some(Boolean);\n\n if (hasRootRouter && hasSourceRouter) {\n throw new Error(\n \"SpotPatch init cannot choose an instrumentation location for mixed root/src routers.\",\n );\n }\n\n if (!hasRootRouter && !hasSourceRouter) {\n throw new Error(\"SpotPatch init could not find an App or Pages Router.\");\n }\n\n const directory = hasSourceRouter ? path.join(appRoot, \"src\") : appRoot;\n const existing = (\n await Promise.all(\n INSTRUMENTATION_EXTENSIONS.map(async (extension) => {\n const absolutePath = path.join(directory, `instrumentation-client${extension}`);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (existing.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple instrumentation-client entry files.\",\n );\n }\n\n if (existing[0] !== undefined) {\n return existing[0];\n }\n\n const useTypeScript =\n configPath.endsWith(\".ts\") ||\n configPath.endsWith(\".mts\") ||\n configPath.endsWith(\".cts\") ||\n (await integrationPathExists(path.join(appRoot, \"tsconfig.json\")));\n return path.join(directory, `instrumentation-client.${useTypeScript ? \"ts\" : \"js\"}`);\n}\n\nexport async function planNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationPlan> {\n const appRoot = path.resolve(directory);\n const packagePath = path.join(appRoot, \"package.json\");\n const [packageSource, configPath] = await Promise.all([\n readIntegrationFile(packagePath),\n findNextConfig(appRoot),\n ]);\n const [configSource, discoveredCheck] = await Promise.all([\n readIntegrationFile(configPath),\n discoverProjectValidationCheck({\n appRoot,\n timeoutMs: DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n }),\n ]);\n const trustedFastModeAvailable = discoveredCheck !== undefined;\n const instrumentationPath = await resolveInstrumentationPath(appRoot, configPath);\n const instrumentationSource = (await integrationPathExists(instrumentationPath))\n ? await readIntegrationFile(instrumentationPath)\n : undefined;\n const changes = [\n createIntegrationFileChange(\n appRoot,\n configPath,\n transformNextConfig(configPath, configSource, trustedFastModeAvailable),\n configSource,\n ),\n createIntegrationFileChange(\n appRoot,\n instrumentationPath,\n transformInstrumentationClient(instrumentationPath, instrumentationSource ?? \"\"),\n instrumentationSource,\n ),\n createIntegrationFileChange(\n appRoot,\n packagePath,\n transformPackageJson(packageSource),\n packageSource,\n ),\n ].filter((change): change is IntegrationFileChange => change !== undefined);\n\n return Object.freeze({\n appRoot,\n changes: Object.freeze(changes),\n trustedFastModeAvailable,\n });\n}\n\nexport async function applyNextIntegrationPlan(\n plan: NextIntegrationPlan,\n): Promise<void> {\n await applyIntegrationPlan(plan);\n}\n\nexport async function checkNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationCheck> {\n try {\n const plan = await planNextIntegration(directory);\n const issues = plan.changes.map(\n (change) => `INTEGRATION_REQUIRED:${change.relativePath}`,\n );\n return Object.freeze({\n appRoot: plan.appRoot,\n issues: Object.freeze(issues),\n ok: issues.length === 0,\n trustedFastModeAvailable: plan.trustedFastModeAvailable,\n });\n } catch (error: unknown) {\n return Object.freeze({\n appRoot: path.resolve(directory),\n issues: Object.freeze([\n error instanceof Error ? error.message : \"SpotPatch integration check failed.\",\n ]),\n ok: false,\n trustedFastModeAvailable: false,\n });\n }\n}\n"],"mappings":"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","names":["createRequire","path","defaultBundler","path","isLoopbackHostname","isLoopbackHostname","ID_PATTERN","isRecord","sidecar","result","path","isRecord","createRequire","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/cli-owner.ts","../src/cli-args.ts","../src/internal/constants.ts","../src/internal/ipc.ts","../src/project.ts","../src/sidecar.ts","../package.json","../src/internal/configuration-server.ts","../src/initializer.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport path from \"node:path\";\n\nimport { runNextDevelopment } from \"./cli-owner.js\";\nimport {\n applyNextIntegrationPlan,\n checkNextIntegration,\n planNextIntegration,\n} from \"./initializer.js\";\nimport { inspectNextProject } from \"./project.js\";\n\nfunction writeUsage(): void {\n process.stderr.write(\n \"Usage: spotpatch-next <dev|init|check>\\n\" +\n \" dev [next dev options] Start the local Next.js development server.\\n\" +\n \" init Preview and apply safe integration changes.\\n\" +\n \" check Verify the integration without writing files.\\n\",\n );\n}\n\nfunction verifyAdapterExports(appRoot: string): void {\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n\n for (const moduleId of [\n \"@spotpatch/next\",\n \"@spotpatch/next/client\",\n \"@spotpatch/next/loader\",\n \"@spotpatch/next/noop\",\n ]) {\n try {\n resolveFromApplication.resolve(moduleId);\n } catch (error: unknown) {\n throw new Error(`SpotPatch could not resolve the required export ${moduleId}.`, {\n cause: error,\n });\n }\n }\n}\n\nfunction writeTrustedModeStatus(available: boolean): void {\n process.stdout.write(\n available\n ? \"[spotpatch:next] trusted fast mode is available in the page selector.\\n\"\n : \"[spotpatch:next] review mode is ready; trusted fast mode needs a local TypeScript project check.\\n\",\n );\n}\n\nasync function runInit(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch init does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const plan = await planNextIntegration(project.appRoot);\n\n if (plan.changes.length === 0) {\n process.stdout.write(\"[spotpatch:next] integration is already up to date.\\n\");\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n }\n\n process.stdout.write(\"[spotpatch:next] integration preview (resulting files):\\n\");\n\n for (const change of plan.changes) {\n process.stdout.write(`\\n--- ${change.relativePath}\\n${change.nextContent}`);\n\n if (!change.nextContent.endsWith(\"\\n\")) {\n process.stdout.write(\"\\n\");\n }\n }\n\n await applyNextIntegrationPlan(plan);\n process.stdout.write(\n `[spotpatch:next] updated ${String(plan.changes.length)} integration file(s).\\n`,\n );\n writeTrustedModeStatus(plan.trustedFastModeAvailable);\n return 0;\n}\n\nasync function runCheck(arguments_: readonly string[]): Promise<number> {\n if (arguments_.length !== 0) {\n throw new Error(\"SpotPatch check does not accept positional arguments.\");\n }\n\n const project = await inspectNextProject();\n verifyAdapterExports(project.appRoot);\n const result = await checkNextIntegration(project.appRoot);\n\n if (!result.ok) {\n for (const issue of result.issues) {\n process.stderr.write(`[spotpatch:next] ${issue}\\n`);\n }\n\n return 1;\n }\n\n const mode = result.trustedFastModeAvailable\n ? \"trusted fast mode available\"\n : \"review mode\";\n process.stdout.write(\n `[spotpatch:next] integration verified for Next.js ${project.nextVersion} · ${mode}.\\n`,\n );\n return 0;\n}\n\nasync function main(arguments_: readonly string[]): Promise<number> {\n const [command, ...rest] = arguments_;\n\n if (command === \"dev\") {\n const integration = await checkNextIntegration();\n\n if (!integration.ok) {\n throw new Error(\n \"SpotPatch Next integration is incomplete; run `spotpatch-next init` first.\",\n );\n }\n\n return runNextDevelopment(rest);\n }\n\n if (command === \"init\") {\n return runInit(rest);\n }\n\n if (command === \"check\") {\n return runCheck(rest);\n }\n\n writeUsage();\n return 1;\n}\n\ntry {\n process.exitCode = await main(process.argv.slice(2));\n} catch (error: unknown) {\n process.stderr.write(\n `[spotpatch:next] ${\n error instanceof Error ? error.message : \"The command failed.\"\n }\\n`,\n );\n process.exitCode = 1;\n}\n","import { spawn, type ChildProcess } from \"node:child_process\";\nimport { randomBytes } from \"node:crypto\";\n\nimport { serializeResolvedSpotPatchOptions } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nimport { parseNextDevArguments } from \"./cli-args.js\";\nimport {\n NEXT_ENVIRONMENT_KEYS,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./internal/constants.js\";\nimport {\n parseNextConfigureMessage,\n type NextConfigureAck,\n type ParsedNextConfigureMessage,\n} from \"./internal/ipc.js\";\nimport { inspectNextProject } from \"./project.js\";\nimport { createNextSidecar, type NextSidecar } from \"./sidecar.js\";\n\nconst CONFIGURATION_STARTUP_TIMEOUT_MS = 60_000;\nconst FORCED_TERMINATION_TIMEOUT_MS = 5_000;\nconst MAX_CONFIGURATION_REQUESTS = 32;\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\n\ninterface ChildResult {\n readonly code: number | null;\n readonly error: boolean;\n readonly signal: NodeJS.Signals | null;\n}\n\ninterface Correlation {\n readonly nonce: string;\n readonly requestId: string;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction defaultBundler(nextVersion: string): SpotPatchNextBundler {\n return Number(nextVersion.split(\".\", 1)[0]) >= 16 ? \"turbopack\" : \"webpack\";\n}\n\nfunction signalExitCode(signal: NodeJS.Signals | null): number {\n return signal === \"SIGINT\" ? 130 : signal === \"SIGTERM\" ? 143 : 1;\n}\n\nfunction sortedRecord(\n value: Readonly<Record<string, string>>,\n): Readonly<Record<string, string>> {\n return Object.freeze(\n Object.fromEntries(\n Object.entries(value).sort(([left], [right]) => left.localeCompare(right)),\n ),\n );\n}\n\nfunction configurationSignature(message: ParsedNextConfigureMessage): string {\n return JSON.stringify({\n appRoot: message.appRoot,\n credentials: sortedRecord(message.credentials),\n options: serializeResolvedSpotPatchOptions(message.options),\n });\n}\n\nfunction readCorrelation(value: unknown, nonce: string): Correlation | undefined {\n if (\n !isRecord(value) ||\n typeof value.nonce !== \"string\" ||\n value.nonce !== nonce ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n return undefined;\n }\n\n return Object.freeze({ nonce, requestId: value.requestId });\n}\n\nfunction createAck(\n correlation: Correlation,\n result:\n | Readonly<{ ok: true }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n ok: false;\n }>,\n): NextConfigureAck {\n return Object.freeze({\n ...result,\n nonce: correlation.nonce,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: correlation.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n\nfunction waitForChild(child: ChildProcess): Promise<ChildResult> {\n return new Promise((resolve) => {\n let settled = false;\n const finish = (result: ChildResult): void => {\n if (settled) {\n return;\n }\n\n settled = true;\n resolve(Object.freeze(result));\n };\n\n child.once(\"error\", () => {\n finish({ code: null, error: true, signal: null });\n });\n child.once(\"exit\", (code, signal) => {\n finish({ code, error: false, signal });\n });\n });\n}\n\nasync function closeSidecar(sidecar: NextSidecar): Promise<void> {\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n try {\n await Promise.race([\n sidecar.close(),\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n reject(new Error(\"SpotPatch Sidecar shutdown timed out.\"));\n }, FORCED_TERMINATION_TIMEOUT_MS);\n timer.unref();\n }),\n ]);\n } finally {\n if (timer !== undefined) {\n clearTimeout(timer);\n }\n }\n}\n\nexport async function runNextDevelopment(\n arguments_: readonly string[],\n): Promise<number> {\n const project = await inspectNextProject();\n const dev = parseNextDevArguments(\n arguments_,\n process.env,\n defaultBundler(project.nextVersion),\n );\n const launchNonce = randomBytes(24).toString(\"base64url\");\n const configurationSecret = randomBytes(32).toString(\"base64url\");\n const internalSecret = randomBytes(32).toString(\"base64url\");\n const registryEpoch = randomBytes(24).toString(\"base64url\");\n const lifecycle: {\n child?: ChildProcess;\n sidecar?: NextSidecar;\n sidecarFailed: boolean;\n } = {\n sidecarFailed: false,\n };\n const seenRequestIds = new Set<string>();\n let acceptedSignature: string | undefined;\n let activationFailed = false;\n let configured = false;\n let failureCode: string | undefined;\n let configurationQueue: Promise<void> = Promise.resolve();\n\n const handleConfiguration = async (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const correlation = readCorrelation(value, launchNonce);\n let message: ParsedNextConfigureMessage;\n\n try {\n message = parseNextConfigureMessage(value);\n } catch {\n failureCode = \"INVALID_IPC\";\n\n if (correlation !== undefined) {\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(correlation, { code: \"INVALID_IPC\", ok: false });\n }\n\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n }\n\n if (\n message.nonce !== launchNonce ||\n message.appRoot !== project.appRoot ||\n message.options.allowLan ||\n seenRequestIds.has(message.requestId) ||\n seenRequestIds.size >= MAX_CONFIGURATION_REQUESTS\n ) {\n failureCode = \"INVALID_IPC\";\n lifecycle.child?.kill(\"SIGTERM\");\n return createAck(message, { code: \"INVALID_IPC\", ok: false });\n }\n\n seenRequestIds.add(message.requestId);\n const signature = configurationSignature(message);\n\n if (acceptedSignature !== undefined && acceptedSignature !== signature) {\n failureCode = \"CONFIGURATION_CONFLICT\";\n return createAck(message, {\n code: \"CONFIGURATION_CONFLICT\",\n ok: false,\n });\n }\n\n if (activationFailed) {\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n if (acceptedSignature === undefined) {\n acceptedSignature = signature;\n const sidecar = lifecycle.sidecar;\n\n if (sidecar === undefined) {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n\n try {\n await sidecar.activate({\n appRoot: project.appRoot,\n bundler: dev.bundler,\n credentials: message.credentials,\n internalSecret,\n nextVersion: project.nextVersion,\n options: message.options,\n projectRoot: project.projectRoot,\n publicOrigin: dev.publicOrigin,\n registryEpoch,\n routerKind: project.routerKind,\n });\n } catch {\n activationFailed = true;\n failureCode = \"CONFIGURATION_FAILED\";\n return createAck(message, { code: \"CONFIGURATION_FAILED\", ok: false });\n }\n }\n\n if (!configured) {\n configured = true;\n clearTimeout(startupTimer);\n\n process.stdout.write(\n `[spotpatch:next] ready for Next.js ${project.nextVersion} (${dev.bundler}) at ${dev.publicOrigin}\\n`,\n );\n }\n\n return createAck(message, { ok: true });\n };\n const enqueueConfiguration = (\n value: unknown,\n ): Promise<NextConfigureAck | undefined> => {\n const result = configurationQueue.then(() => handleConfiguration(value));\n configurationQueue = result.then(\n () => undefined,\n () => undefined,\n );\n\n return result.catch(() => {\n failureCode = \"CONFIGURATION_FAILURE\";\n lifecycle.child?.kill(\"SIGTERM\");\n return undefined;\n });\n };\n const sidecar = await createNextSidecar({\n configuration: {\n configurationSecret,\n onConfiguration: enqueueConfiguration,\n },\n onFatalError() {\n lifecycle.sidecarFailed = true;\n lifecycle.child?.kill(\"SIGTERM\");\n },\n });\n lifecycle.sidecar = sidecar;\n const childEnvironment: NodeJS.ProcessEnv = {\n ...process.env,\n [NEXT_ENVIRONMENT_KEYS.appRoot]: project.appRoot,\n [NEXT_ENVIRONMENT_KEYS.bundler]: dev.bundler,\n [NEXT_ENVIRONMENT_KEYS.configurationSecret]: configurationSecret,\n [NEXT_ENVIRONMENT_KEYS.internalOrigin]: sidecar.origin,\n [NEXT_ENVIRONMENT_KEYS.internalSecret]: internalSecret,\n [NEXT_ENVIRONMENT_KEYS.launchNonce]: launchNonce,\n [NEXT_ENVIRONMENT_KEYS.registryEpoch]: registryEpoch,\n [NEXT_ENVIRONMENT_KEYS.sidecarOrigin]: sidecar.origin,\n };\n const child = spawn(\n process.execPath,\n [project.nextEntry, \"dev\", ...dev.nextArguments],\n {\n cwd: project.appRoot,\n env: childEnvironment,\n shell: false,\n stdio: \"inherit\",\n windowsHide: true,\n },\n );\n lifecycle.child = child;\n const startupTimer = setTimeout(() => {\n failureCode = \"CONFIGURATION_TIMEOUT\";\n child.kill(\"SIGTERM\");\n }, CONFIGURATION_STARTUP_TIMEOUT_MS);\n startupTimer.unref();\n\n let requestedSignal: NodeJS.Signals | undefined;\n let forceTimer: ReturnType<typeof setTimeout> | undefined;\n const forwardSignal = (signal: NodeJS.Signals): void => {\n if (requestedSignal !== undefined) {\n return;\n }\n\n requestedSignal = signal;\n child.kill(signal);\n forceTimer = setTimeout(() => {\n child.kill(\"SIGKILL\");\n }, FORCED_TERMINATION_TIMEOUT_MS);\n forceTimer.unref();\n };\n const onSigint = (): void => {\n forwardSignal(\"SIGINT\");\n };\n const onSigterm = (): void => {\n forwardSignal(\"SIGTERM\");\n };\n process.once(\"SIGINT\", onSigint);\n process.once(\"SIGTERM\", onSigterm);\n\n const result = await waitForChild(child);\n clearTimeout(startupTimer);\n\n process.off(\"SIGINT\", onSigint);\n process.off(\"SIGTERM\", onSigterm);\n\n if (forceTimer !== undefined) {\n clearTimeout(forceTimer);\n }\n\n await configurationQueue;\n\n try {\n await closeSidecar(sidecar);\n } catch {\n failureCode ??= \"SHUTDOWN_FAILED\";\n }\n\n if (failureCode !== undefined) {\n process.stderr.write(`[spotpatch:next] stopped (${failureCode}).\\n`);\n return 1;\n }\n\n if (lifecycle.sidecarFailed || result.error) {\n process.stderr.write(\"[spotpatch:next] stopped (PROCESS_FAILURE).\\n\");\n return 1;\n }\n\n if (result.signal !== null || requestedSignal !== undefined) {\n return signalExitCode(result.signal ?? requestedSignal ?? null);\n }\n\n return result.code ?? 1;\n}\n","import { isLoopbackHostname } from \"@spotpatch/dev-server\";\nimport type { SpotPatchNextBundler } from \"@spotpatch/shared\";\n\nexport interface NextDevArguments {\n readonly bundler: SpotPatchNextBundler;\n readonly hostname: string;\n readonly nextArguments: readonly string[];\n readonly port: number;\n readonly publicOrigin: string;\n}\n\nfunction parsePort(value: string): number {\n const port = Number(value);\n\n if (\n !/^\\d+$/u.test(value) ||\n !Number.isSafeInteger(port) ||\n port < 1 ||\n port > 65_535\n ) {\n throw new RangeError(\"SpotPatch Next requires a valid development port.\");\n }\n\n return port;\n}\n\nfunction parseOptionValue(\n arguments_: readonly string[],\n index: number,\n longName: string,\n shortName: string,\n): Readonly<{ consumed: number; value?: string }> {\n const argument = arguments_[index];\n\n if (argument === longName || argument === shortName) {\n const value = arguments_[index + 1];\n\n if (value === undefined || value.startsWith(\"-\")) {\n throw new Error(`SpotPatch Next requires a value after ${argument}.`);\n }\n\n return Object.freeze({ consumed: 1, value });\n }\n\n const longPrefix = `${longName}=`;\n const shortPrefix = `${shortName}=`;\n\n if (argument?.startsWith(longPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(longPrefix.length) });\n }\n\n if (argument?.startsWith(shortPrefix)) {\n return Object.freeze({ consumed: 0, value: argument.slice(shortPrefix.length) });\n }\n\n return Object.freeze({ consumed: 0 });\n}\n\nexport function parseNextDevArguments(\n arguments_: readonly string[],\n environment: Readonly<Record<string, string | undefined>> = process.env,\n defaultBundler: SpotPatchNextBundler = \"turbopack\",\n): NextDevArguments {\n let hostname: string | undefined;\n let port: number | undefined;\n let webpack = false;\n let turbopack = false;\n\n for (let index = 0; index < arguments_.length; index += 1) {\n const argument = arguments_[index];\n const hostOption = parseOptionValue(arguments_, index, \"--hostname\", \"-H\");\n\n if (hostOption.value !== undefined) {\n if (hostname !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate hostname options.\");\n }\n\n hostname = hostOption.value;\n index += hostOption.consumed;\n continue;\n }\n\n const portOption = parseOptionValue(arguments_, index, \"--port\", \"-p\");\n\n if (portOption.value !== undefined) {\n if (port !== undefined) {\n throw new Error(\"SpotPatch Next received duplicate port options.\");\n }\n\n port = parsePort(portOption.value);\n index += portOption.consumed;\n continue;\n }\n\n if (argument === \"--webpack\") {\n webpack = true;\n } else if (argument === \"--turbopack\" || argument === \"--turbo\") {\n turbopack = true;\n }\n }\n\n const resolvedHostname = hostname ?? \"localhost\";\n\n if (!isLoopbackHostname(resolvedHostname)) {\n throw new Error(\n \"SpotPatch Next only supports a loopback --hostname in its first release.\",\n );\n }\n\n if (webpack && turbopack) {\n throw new Error(\"SpotPatch Next cannot enable webpack and Turbopack together.\");\n }\n\n const resolvedPort =\n port ?? (environment.PORT === undefined ? 3_000 : parsePort(environment.PORT));\n const hostForUrl = resolvedHostname.includes(\":\")\n ? `[${resolvedHostname}]`\n : resolvedHostname;\n const nextArguments = [...arguments_];\n\n if (hostname === undefined) {\n nextArguments.push(\"--hostname\", resolvedHostname);\n }\n\n if (port === undefined) {\n nextArguments.push(\"--port\", String(resolvedPort));\n }\n\n return Object.freeze({\n bundler: webpack ? \"webpack\" : turbopack ? \"turbopack\" : defaultBundler,\n hostname: resolvedHostname,\n nextArguments: Object.freeze(nextArguments),\n port: resolvedPort,\n publicOrigin: `http://${hostForUrl}:${String(resolvedPort)}`,\n });\n}\n","export const NEXT_IPC_PROTOCOL_VERSION = 1 as const;\nexport const NEXT_IPC_MESSAGE_LIMIT_BYTES = 256 * 1024;\nexport const NEXT_IPC_TIMEOUT_MS = 15_000;\nexport const NEXT_INTERNAL_REGISTRATION_PATH =\n \"/__spotpatch-internal/register\" as const;\nexport const NEXT_INTERNAL_CONFIGURATION_PATH =\n \"/__spotpatch-internal/configure\" as const;\n\nexport const NEXT_ENVIRONMENT_KEYS = Object.freeze({\n appRoot: \"SPOTPATCH_NEXT_APP_ROOT\",\n bundler: \"SPOTPATCH_NEXT_BUNDLER\",\n configurationSecret: \"SPOTPATCH_NEXT_CONFIGURATION_SECRET\",\n internalOrigin: \"SPOTPATCH_NEXT_INTERNAL_ORIGIN\",\n internalSecret: \"SPOTPATCH_NEXT_INTERNAL_SECRET\",\n launchNonce: \"SPOTPATCH_NEXT_LAUNCH_NONCE\",\n registryEpoch: \"SPOTPATCH_NEXT_REGISTRY_EPOCH\",\n sidecarOrigin: \"SPOTPATCH_NEXT_SIDECAR_ORIGIN\",\n} as const);\n\nexport const NEXT_SOURCE_RULE_KEYS = Object.freeze([\"*.jsx\", \"*.tsx\"] as const);\nexport const NEXT_CLIENT_MODULE_ID = \"@spotpatch/next/client\" as const;\n\nexport const NEXT_DEFAULT_INCLUDE = Object.freeze([/\\.(?:jsx|tsx)$/u]);\n","import path from \"node:path\";\n\nimport {\n parseSerializedSpotPatchOptions,\n type ResolvedSpotPatchOptions,\n type SerializedSpotPatchOptions,\n} from \"@spotpatch/dev-server\";\n\nimport {\n NEXT_IPC_MESSAGE_LIMIT_BYTES,\n NEXT_IPC_PROTOCOL_VERSION,\n} from \"./constants.js\";\n\nconst ID_PATTERN = /^[A-Za-z0-9_-]{16,128}$/u;\nconst ENVIRONMENT_NAME_PATTERN = /^[A-Z][A-Z0-9_]{1,127}$/u;\n\nexport interface NextConfigureMessage {\n readonly appRoot: string;\n readonly credentials: Readonly<Record<string, string>>;\n readonly nonce: string;\n readonly options: SerializedSpotPatchOptions;\n readonly protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n readonly requestId: string;\n readonly type: \"spotpatch:next:configure\";\n}\n\nexport type NextConfigureAck =\n | Readonly<{\n nonce: string;\n ok: true;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>\n | Readonly<{\n code: \"CONFIGURATION_CONFLICT\" | \"CONFIGURATION_FAILED\" | \"INVALID_IPC\";\n nonce: string;\n ok: false;\n protocolVersion: typeof NEXT_IPC_PROTOCOL_VERSION;\n requestId: string;\n type: \"spotpatch:next:configure-ack\";\n }>;\n\nexport interface ParsedNextConfigureMessage extends Omit<\n NextConfigureMessage,\n \"options\"\n> {\n readonly options: ResolvedSpotPatchOptions;\n}\n\nfunction isRecord(value: unknown): value is Readonly<Record<string, unknown>> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction hasExactKeys(\n value: Readonly<Record<string, unknown>>,\n expectedKeys: readonly string[],\n): boolean {\n const actual = Object.keys(value).sort();\n const expected = [...expectedKeys].sort();\n return (\n actual.length === expected.length &&\n actual.every((key, index) => key === expected[index])\n );\n}\n\nexport function assertIpcMessageSize(value: unknown): void {\n let serialized: string;\n\n try {\n serialized = JSON.stringify(value);\n } catch (error: unknown) {\n throw new TypeError(\"The SpotPatch IPC message is not serializable.\", {\n cause: error,\n });\n }\n\n if (Buffer.byteLength(serialized, \"utf8\") > NEXT_IPC_MESSAGE_LIMIT_BYTES) {\n throw new RangeError(\"The SpotPatch IPC message exceeds the size limit.\");\n }\n}\n\nfunction parseCredentials(value: unknown): Readonly<Record<string, string>> {\n if (!isRecord(value) || Object.keys(value).length > 32) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n const entries = Object.entries(value);\n const credentials: Record<string, string> = {};\n\n for (const [name, credential] of entries) {\n if (\n !ENVIRONMENT_NAME_PATTERN.test(name) ||\n typeof credential !== \"string\" ||\n credential.length === 0 ||\n credential.length > 16_384 ||\n credential.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch IPC credentials are invalid.\");\n }\n\n credentials[name] = credential;\n }\n\n return Object.freeze(credentials);\n}\n\nexport function parseNextConfigureMessage(value: unknown): ParsedNextConfigureMessage {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n !hasExactKeys(value, [\n \"appRoot\",\n \"credentials\",\n \"nonce\",\n \"options\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n value.type !== \"spotpatch:next:configure\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId) ||\n typeof value.appRoot !== \"string\" ||\n !path.isAbsolute(value.appRoot) ||\n value.appRoot.length > 4_096 ||\n value.appRoot.includes(\"\\0\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC message is invalid.\");\n }\n\n return Object.freeze({\n appRoot: value.appRoot,\n credentials: parseCredentials(value.credentials),\n nonce: value.nonce,\n options: parseSerializedSpotPatchOptions(value.options),\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure\",\n });\n}\n\nexport function parseNextConfigureAck(value: unknown): NextConfigureAck {\n assertIpcMessageSize(value);\n\n if (\n !isRecord(value) ||\n value.type !== \"spotpatch:next:configure-ack\" ||\n value.protocolVersion !== NEXT_IPC_PROTOCOL_VERSION ||\n typeof value.ok !== \"boolean\" ||\n typeof value.nonce !== \"string\" ||\n !ID_PATTERN.test(value.nonce) ||\n typeof value.requestId !== \"string\" ||\n !ID_PATTERN.test(value.requestId)\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n if (value.ok) {\n if (!hasExactKeys(value, [\"nonce\", \"ok\", \"protocolVersion\", \"requestId\", \"type\"])) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n nonce: value.nonce,\n ok: true,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n }\n\n if (\n !hasExactKeys(value, [\n \"code\",\n \"nonce\",\n \"ok\",\n \"protocolVersion\",\n \"requestId\",\n \"type\",\n ]) ||\n (value.code !== \"CONFIGURATION_CONFLICT\" &&\n value.code !== \"CONFIGURATION_FAILED\" &&\n value.code !== \"INVALID_IPC\")\n ) {\n throw new TypeError(\"The SpotPatch configure IPC acknowledgement is invalid.\");\n }\n\n return Object.freeze({\n code: value.code,\n nonce: value.nonce,\n ok: false,\n protocolVersion: NEXT_IPC_PROTOCOL_VERSION,\n requestId: value.requestId,\n type: \"spotpatch:next:configure-ack\",\n });\n}\n","import { execFile } from \"node:child_process\";\nimport { access, readFile, realpath } from \"node:fs/promises\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { SpotPatchNextRouterKind } from \"@spotpatch/shared\";\n\nconst execFileAsync = promisify(execFile);\nconst VERSION_PATTERN = /^(\\d+)\\.(\\d+)\\.(\\d+)(?:-[0-9A-Za-z.-]+)?$/u;\n\nexport interface NextProject {\n readonly appRoot: string;\n readonly nextEntry: string;\n readonly nextVersion: string;\n readonly projectRoot: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\nasync function pathExists(absolutePath: string): Promise<boolean> {\n try {\n await access(absolutePath);\n return true;\n } catch {\n return false;\n }\n}\n\nfunction assertSupportedNextVersion(version: string): void {\n const match = VERSION_PATTERN.exec(version);\n const major = Number(match?.[1]);\n const minor = Number(match?.[2]);\n\n if (\n match === null ||\n !Number.isSafeInteger(major) ||\n !Number.isSafeInteger(minor) ||\n major < 15 ||\n major >= 17 ||\n (major === 15 && minor < 3)\n ) {\n throw new Error(\n `SpotPatch Next requires Next.js >=15.3.0 <17.0.0; found ${version}.`,\n );\n }\n}\n\nasync function detectRouterKind(appRoot: string): Promise<SpotPatchNextRouterKind> {\n const [appCandidates, pagesCandidates] = await Promise.all([\n Promise.all([\n pathExists(path.join(appRoot, \"app\")),\n pathExists(path.join(appRoot, \"src\", \"app\")),\n ]),\n Promise.all([\n pathExists(path.join(appRoot, \"pages\")),\n pathExists(path.join(appRoot, \"src\", \"pages\")),\n ]),\n ]);\n const hasApp = appCandidates.some(Boolean);\n const hasPages = pagesCandidates.some(Boolean);\n\n if (hasApp && hasPages) {\n return \"hybrid\";\n }\n\n if (hasApp) {\n return \"app\";\n }\n\n if (hasPages) {\n return \"pages\";\n }\n\n throw new Error(\"SpotPatch could not find an App or Pages Router directory.\");\n}\n\nasync function findProjectRoot(appRoot: string): Promise<string> {\n try {\n const result = await execFileAsync(\"git\", [\"rev-parse\", \"--show-toplevel\"], {\n cwd: appRoot,\n encoding: \"utf8\",\n timeout: 5_000,\n });\n const candidate = await realpath(result.stdout.trim());\n const relative = path.relative(candidate, appRoot);\n\n if (\n relative === \"\" ||\n (!relative.startsWith(`..${path.sep}`) &&\n relative !== \"..\" &&\n !path.isAbsolute(relative))\n ) {\n return candidate;\n }\n } catch {\n // A non-Git application can still use picker/editor features with AI disabled.\n }\n\n return appRoot;\n}\n\nexport async function inspectNextProject(\n directory = process.cwd(),\n): Promise<NextProject> {\n const appRoot = await realpath(directory);\n const resolveFromApplication = createRequire(path.join(appRoot, \"package.json\"));\n let nextEntry: string;\n let manifestPath: string;\n\n try {\n nextEntry = resolveFromApplication.resolve(\"next/dist/bin/next\");\n manifestPath = resolveFromApplication.resolve(\"next/package.json\");\n } catch (error: unknown) {\n throw new Error(\"SpotPatch could not resolve the application's local Next.js.\", {\n cause: error,\n });\n }\n\n const manifest = JSON.parse(await readFile(manifestPath, \"utf8\")) as unknown;\n\n if (\n typeof manifest !== \"object\" ||\n manifest === null ||\n !(\"version\" in manifest) ||\n typeof manifest.version !== \"string\"\n ) {\n throw new Error(\"SpotPatch could not read the local Next.js version.\");\n }\n\n assertSupportedNextVersion(manifest.version);\n const [projectRoot, routerKind] = await Promise.all([\n findProjectRoot(appRoot),\n detectRouterKind(appRoot),\n ]);\n\n return Object.freeze({\n appRoot,\n nextEntry,\n nextVersion: manifest.version,\n projectRoot,\n routerKind,\n });\n}\n","import {\n createServer,\n type IncomingMessage,\n type Server,\n type ServerResponse,\n} from \"node:http\";\n\nimport {\n createAgentJobManager,\n createRuntimeAiConfig,\n createSession,\n createSourceRegistrationService,\n createSourceRegistry,\n createSpotPatchMiddleware,\n type AgentJobManager,\n type ResolvedSpotPatchOptions,\n type SourceRegistry,\n} from \"@spotpatch/dev-server\";\nimport {\n SPOTPATCH_API_BASE,\n SPOTPATCH_ENDPOINTS,\n runtimeConfigSchema,\n type SpotPatchNextBundler,\n type SpotPatchNextRouterKind,\n type SpotPatchRuntimeConfig,\n} from \"@spotpatch/shared\";\n\nimport packageMetadata from \"../package.json\" with { type: \"json\" };\nimport {\n NEXT_INTERNAL_CONFIGURATION_PATH,\n NEXT_INTERNAL_REGISTRATION_PATH,\n} from \"./internal/constants.js\";\nimport {\n createConfigurationRequestHandler,\n type ConfigurationServerOptions,\n} from \"./internal/configuration-server.js\";\n\nconst SIDECAR_SELF_CHECK_LIMIT_BYTES = 16_384;\nconst SIDECAR_SELF_CHECK_TIMEOUT_MS = 3_000;\n\ninterface ActivateSidecarInput {\n readonly appRoot: string;\n readonly bundler: SpotPatchNextBundler;\n readonly credentials: Readonly<Record<string, string>>;\n readonly internalSecret: string;\n readonly nextVersion: string;\n readonly options: ResolvedSpotPatchOptions;\n readonly projectRoot: string;\n readonly publicOrigin: string;\n readonly registryEpoch: string;\n readonly routerKind: SpotPatchNextRouterKind;\n}\n\ntype RequestHandler = (request: IncomingMessage, response: ServerResponse) => void;\n\nexport interface NextSidecar {\n readonly origin: string;\n activate(input: ActivateSidecarInput): Promise<void>;\n close(): Promise<void>;\n}\n\nexport interface NextSidecarOptions {\n readonly configuration: ConfigurationServerOptions;\n readonly onFatalError?: () => void;\n}\n\nfunction requestPath(url: string | undefined): string {\n try {\n return new URL(url ?? \"/\", \"http://spotpatch.invalid\").pathname;\n } catch {\n return \"\";\n }\n}\n\nfunction writeUnavailable(response: ServerResponse, statusCode: number): void {\n const body = JSON.stringify({ ok: false });\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nfunction validateCredentialEnvironment(\n options: ResolvedSpotPatchOptions,\n credentials: Readonly<Record<string, string>>,\n): void {\n const expected =\n options.ai === false\n ? []\n : [\n ...new Set(\n Object.values(options.ai.providers).map((provider) => provider.apiKeyEnv),\n ),\n ].sort();\n const actual = Object.keys(credentials).sort();\n\n if (\n actual.length !== expected.length ||\n actual.some((name, index) => name !== expected[index])\n ) {\n throw new TypeError(\"The SpotPatch credential environment is inconsistent.\");\n }\n}\n\nasync function selfCheckSidecar(\n sidecarOrigin: string,\n publicOrigin: string,\n expectedConfig: SpotPatchRuntimeConfig,\n): Promise<void> {\n const response = await fetch(new URL(SPOTPATCH_ENDPOINTS.bootstrap, sidecarOrigin), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Origin: publicOrigin,\n \"Sec-Fetch-Site\": \"same-origin\",\n },\n body: \"{}\",\n signal: AbortSignal.timeout(SIDECAR_SELF_CHECK_TIMEOUT_MS),\n });\n const declaredLength = Number(response.headers.get(\"content-length\"));\n\n if (\n Number.isFinite(declaredLength) &&\n declaredLength > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n await response.body?.cancel();\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const text = await response.text();\n\n if (\n !response.ok ||\n !response.headers.get(\"cache-control\")?.toLowerCase().includes(\"no-store\") ||\n Buffer.byteLength(text, \"utf8\") > SIDECAR_SELF_CHECK_LIMIT_BYTES\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n let value: unknown;\n\n try {\n value = JSON.parse(text) as unknown;\n } catch (error: unknown) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\", { cause: error });\n }\n\n if (\n typeof value !== \"object\" ||\n value === null ||\n Array.isArray(value) ||\n Object.keys(value).length !== 2 ||\n !(\"ok\" in value) ||\n value.ok !== true ||\n !(\"data\" in value)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n\n const parsed = runtimeConfigSchema.safeParse(value.data);\n const parsedExpected = runtimeConfigSchema.safeParse(expectedConfig);\n\n if (\n !parsed.success ||\n !parsedExpected.success ||\n JSON.stringify(parsed.data) !== JSON.stringify(parsedExpected.data)\n ) {\n throw new Error(\"SpotPatch Sidecar self-check failed.\");\n }\n}\n\nfunction closeServer(server: Server): Promise<void> {\n return new Promise((resolve, reject) => {\n server.close((error) => {\n if (\n error === undefined ||\n (\"code\" in error && error.code === \"ERR_SERVER_NOT_RUNNING\")\n ) {\n resolve();\n return;\n }\n\n reject(error);\n });\n });\n}\n\nexport async function createNextSidecar(\n sidecarOptions: NextSidecarOptions,\n): Promise<NextSidecar> {\n let active = false;\n let closed = false;\n let registry: SourceRegistry | undefined;\n let agentManager: AgentJobManager | undefined;\n let handler: RequestHandler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n const configurationHandler = createConfigurationRequestHandler(\n sidecarOptions.configuration,\n );\n const server = createServer((request, response) => {\n try {\n if (requestPath(request.url) === NEXT_INTERNAL_CONFIGURATION_PATH) {\n configurationHandler(request, response);\n return;\n }\n\n handler(request, response);\n } catch {\n writeUnavailable(response, 500);\n }\n });\n\n await new Promise<void>((resolve, reject) => {\n const onError = (error: Error): void => {\n reject(error);\n };\n server.once(\"error\", onError);\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", onError);\n resolve();\n });\n });\n server.on(\"error\", () => {\n if (!closed) {\n sidecarOptions.onFatalError?.();\n }\n });\n const address = server.address();\n\n if (address === null || typeof address === \"string\") {\n await closeServer(server);\n throw new Error(\"SpotPatch Sidecar did not bind a loopback address.\");\n }\n const sidecarOrigin = `http://127.0.0.1:${String(address.port)}`;\n\n return Object.freeze({\n origin: sidecarOrigin,\n async activate(input: ActivateSidecarInput): Promise<void> {\n if (closed || active) {\n throw new Error(\"SpotPatch Sidecar activation is not available.\");\n }\n\n validateCredentialEnvironment(input.options, input.credentials);\n\n if (!input.options.enabled) {\n handler = (_request, response) => {\n writeUnavailable(response, 404);\n };\n active = true;\n return;\n }\n\n const sourceRegistry = createSourceRegistry();\n const session = createSession();\n const runtimeConfig = Object.freeze({\n apiBase: SPOTPATCH_API_BASE,\n ai: createRuntimeAiConfig(input.options.ai),\n budget: input.options.budget,\n bundler: input.bundler,\n debug: input.options.debug,\n editor: input.options.editor,\n framework: \"next\",\n frameworkVersion: input.nextVersion,\n locale: input.options.locale,\n maxTargets: input.options.maxTargets,\n redact: input.options.redact,\n sessionId: session.id,\n routerKind: input.routerKind,\n sessionToken: session.token,\n shortcut: input.options.shortcut,\n spotPatchVersion: packageMetadata.version,\n }) satisfies SpotPatchRuntimeConfig;\n const manager =\n input.options.ai === false\n ? undefined\n : createAgentJobManager({\n ai: input.options.ai,\n environment: input.credentials,\n root: input.projectRoot,\n });\n const middleware = createSpotPatchMiddleware({\n ...(manager === undefined ? {} : { agentManager: manager }),\n bootstrap: {\n expectedOrigin: input.publicOrigin,\n runtimeConfig,\n },\n logger: {\n warn(message) {\n process.stderr.write(`${message}\\n`);\n },\n },\n options: input.options,\n registry: sourceRegistry,\n root: input.appRoot,\n session,\n });\n const registration = await createSourceRegistrationService({\n internalSecret: input.internalSecret,\n options: input.options,\n registry: sourceRegistry,\n registryEpoch: input.registryEpoch,\n root: input.appRoot,\n });\n\n registry = sourceRegistry;\n agentManager = manager;\n handler = (request, response) => {\n if (requestPath(request.url) === NEXT_INTERNAL_REGISTRATION_PATH) {\n registration.handler(request, response);\n return;\n }\n\n middleware(request, response, () => {\n writeUnavailable(response, 404);\n });\n };\n await selfCheckSidecar(sidecarOrigin, input.publicOrigin, runtimeConfig);\n active = true;\n },\n async close(): Promise<void> {\n if (closed) {\n return;\n }\n\n closed = true;\n handler = (_request, response) => {\n writeUnavailable(response, 503);\n };\n registry?.clear();\n await agentManager?.close();\n server.closeIdleConnections();\n const closing = closeServer(server);\n server.closeAllConnections();\n await closing;\n },\n });\n}\n","{\n \"name\": \"@spotpatch/next\",\n \"version\": \"0.4.0\",\n \"description\": \"Development-only Next.js adapter and CLI for SpotPatch.\",\n \"license\": \"MIT\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/huanglvjing/spotpatch.git\",\n \"directory\": \"packages/next\"\n },\n \"homepage\": \"https://github.com/huanglvjing/spotpatch#readme\",\n \"bugs\": {\n \"url\": \"https://github.com/huanglvjing/spotpatch/issues\"\n },\n \"keywords\": [\n \"spotpatch\",\n \"nextjs\",\n \"react\",\n \"developer-tools\"\n ],\n \"type\": \"module\",\n \"sideEffects\": [\n \"./dist/client.cjs\",\n \"./dist/client.js\"\n ],\n \"engines\": {\n \"node\": \">=20.19.0\"\n },\n \"files\": [\n \"dist\",\n \"loader.cjs\",\n \"loader.d.cts\"\n ],\n \"main\": \"./dist/index.cjs\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"bin\": {\n \"spotpatch-next\": \"./dist/cli.js\"\n },\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n },\n \"./client\": {\n \"import\": {\n \"types\": \"./dist/client.d.ts\",\n \"default\": \"./dist/client.js\"\n },\n \"require\": {\n \"types\": \"./dist/client.d.cts\",\n \"default\": \"./dist/client.cjs\"\n }\n },\n \"./loader\": {\n \"types\": \"./loader.d.cts\",\n \"default\": \"./loader.cjs\"\n },\n \"./noop\": {\n \"import\": {\n \"types\": \"./dist/noop.d.ts\",\n \"default\": \"./dist/noop.js\"\n },\n \"require\": {\n \"types\": \"./dist/noop.d.cts\",\n \"default\": \"./dist/noop.cjs\"\n }\n }\n },\n \"typesVersions\": {\n \"*\": {\n \"client\": [\n \"dist/client.d.ts\"\n ],\n \"loader\": [\n \"loader.d.cts\"\n ],\n \"noop\": [\n \"dist/noop.d.ts\"\n ]\n }\n },\n \"scripts\": {\n \"build\": \"tsup src/index.ts --format esm,cjs --dts --sourcemap --clean && tsup --config tsup.cli.config.ts && tsup --config tsup.loader.config.ts && tsup --config tsup.client.config.ts && pnpm verify:loader\",\n \"clean\": \"node --input-type=module -e \\\"import { rmSync } from 'node:fs'; rmSync('dist', { recursive: true, force: true })\\\"\",\n \"typecheck\": \"tsc --noEmit -p tsconfig.json\",\n \"verify:loader\": \"node scripts/verify-loader.cjs\"\n },\n \"dependencies\": {\n \"@spotpatch/compiler\": \"workspace:^\",\n \"@spotpatch/dev-server\": \"workspace:^\",\n \"@spotpatch/runtime\": \"workspace:^\",\n \"@spotpatch/shared\": \"workspace:^\",\n \"bippy\": \"0.6.1\",\n \"magic-string\": \"1.1.0\",\n \"oxc-parser\": \"0.143.0\"\n },\n \"peerDependencies\": {\n \"next\": \">=15.3.0 <17.0.0\",\n \"react\": \"^18.2.0 || ^19.0.0\",\n \"react-dom\": \"^18.2.0 || ^19.0.0\"\n },\n \"devDependencies\": {\n \"next\": \"16.3.0\",\n \"react\": \"19.2.8\",\n \"react-dom\": \"19.2.8\"\n },\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n }\n}\n","import { timingSafeEqual } from \"node:crypto\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport { isLoopbackHostname, readJsonRequestBody } from \"@spotpatch/dev-server\";\n\nimport { NEXT_IPC_MESSAGE_LIMIT_BYTES } from \"./constants.js\";\nimport { assertIpcMessageSize, type NextConfigureAck } from \"./ipc.js\";\n\nconst CONFIGURATION_SECRET_HEADER = \"x-spotpatch-configuration\";\nconst CONFIGURATION_SECRET_PATTERN = /^[A-Za-z0-9_-]{32,128}$/u;\n\nexport interface ConfigurationServerOptions {\n readonly configurationSecret: string;\n readonly onConfiguration: (value: unknown) => Promise<NextConfigureAck | undefined>;\n}\n\nexport type ConfigurationRequestHandler = (\n request: IncomingMessage,\n response: ServerResponse,\n) => void;\n\nfunction getSingleHeader(request: IncomingMessage, name: string): string | undefined {\n const value = request.headers[name.toLowerCase()];\n return Array.isArray(value) ? value[0] : value;\n}\n\nfunction secretsMatch(actual: string | undefined, expected: string): boolean {\n if (actual === undefined) {\n return false;\n }\n\n const actualBytes = Buffer.from(actual);\n const expectedBytes = Buffer.from(expected);\n return (\n actualBytes.byteLength === expectedBytes.byteLength &&\n timingSafeEqual(actualBytes, expectedBytes)\n );\n}\n\nfunction hasLoopbackHost(request: IncomingMessage): boolean {\n const host = getSingleHeader(request, \"host\");\n\n if (host === undefined) {\n return false;\n }\n\n try {\n return isLoopbackHostname(new URL(`http://${host}`).hostname);\n } catch {\n return false;\n }\n}\n\nfunction writeJson(\n response: ServerResponse,\n statusCode: number,\n payload: unknown,\n): void {\n const body = JSON.stringify(payload);\n response.statusCode = statusCode;\n response.setHeader(\"Cache-Control\", \"no-store\");\n response.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\n response.setHeader(\"Content-Length\", Buffer.byteLength(body));\n response.end(body);\n}\n\nexport function createConfigurationRequestHandler(\n options: ConfigurationServerOptions,\n): ConfigurationRequestHandler {\n if (!CONFIGURATION_SECRET_PATTERN.test(options.configurationSecret)) {\n throw new TypeError(\"The SpotPatch configuration secret is invalid.\");\n }\n\n return (request, response) => {\n const handle = async (): Promise<void> => {\n const contentType = getSingleHeader(request, \"content-type\")\n ?.split(\";\", 1)[0]\n ?.trim()\n .toLowerCase();\n\n if (\n request.method !== \"POST\" ||\n contentType !== \"application/json\" ||\n !hasLoopbackHost(request) ||\n getSingleHeader(request, \"origin\") !== undefined ||\n !secretsMatch(\n getSingleHeader(request, CONFIGURATION_SECRET_HEADER),\n options.configurationSecret,\n )\n ) {\n writeJson(response, 403, { ok: false });\n return;\n }\n\n const value = await readJsonRequestBody(request, NEXT_IPC_MESSAGE_LIMIT_BYTES);\n const acknowledgement = await options.onConfiguration(value);\n\n if (acknowledgement === undefined) {\n writeJson(response, 400, { ok: false });\n return;\n }\n\n assertIpcMessageSize(acknowledgement);\n writeJson(response, 200, acknowledgement);\n };\n\n void handle().catch(() => {\n if (response.headersSent) {\n response.destroy();\n return;\n }\n\n writeJson(response, 400, { ok: false });\n });\n };\n}\n","import path from \"node:path\";\n\nimport {\n applyIntegrationPlan,\n createIntegrationFileChange,\n discoverProjectValidationCheck,\n integrationPathExists,\n readIntegrationFile,\n type IntegrationFileChange,\n} from \"@spotpatch/dev-server\";\nimport { DEFAULT_AGENT_LIMITS } from \"@spotpatch/shared\";\nimport { MagicString } from \"magic-string\";\nimport {\n parseSync,\n Visitor,\n type CallExpression,\n type ExportDefaultDeclaration,\n type ImportDeclaration,\n type Program,\n} from \"oxc-parser\";\n\nconst ADAPTER_PACKAGE_NAME = \"@spotpatch/next\";\nconst CLIENT_MODULE_ID = \"@spotpatch/next/client\";\nconst CONFIG_FILE_NAMES = Object.freeze([\n \"next.config.ts\",\n \"next.config.mts\",\n \"next.config.js\",\n \"next.config.mjs\",\n \"next.config.cts\",\n \"next.config.cjs\",\n] as const);\nconst INSTRUMENTATION_EXTENSIONS = Object.freeze([\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".mts\",\n \".mjs\",\n \".cts\",\n \".cjs\",\n] as const);\nconst SIMPLE_SCRIPT_ARGUMENT_PATTERN = /^[A-Za-z0-9._:/=@%+,-]+$/u;\n\nexport interface NextIntegrationPlan {\n readonly appRoot: string;\n readonly changes: readonly IntegrationFileChange[];\n readonly trustedFastModeAvailable: boolean;\n}\n\nexport interface NextIntegrationCheck {\n readonly appRoot: string;\n readonly issues: readonly string[];\n readonly ok: boolean;\n readonly trustedFastModeAvailable: boolean;\n}\n\ninterface PackageManifest {\n readonly dependencies?: Readonly<Record<string, unknown>>;\n readonly devDependencies?: Readonly<Record<string, unknown>>;\n readonly optionalDependencies?: Readonly<Record<string, unknown>>;\n readonly scripts?: Readonly<Record<string, unknown>>;\n readonly [key: string]: unknown;\n}\n\ninterface ParsedModule {\n readonly program: Program;\n readonly source: string;\n}\n\nfunction isParserErrorSeverity(value: unknown): boolean {\n return value === \"Error\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseModule(absolutePath: string, source: string): ParsedModule {\n const result = parseSync(absolutePath, source, {\n sourceType: \"module\",\n showSemanticErrors: true,\n });\n const error = result.errors.find((entry) => isParserErrorSeverity(entry.severity));\n\n if (error !== undefined) {\n throw new SyntaxError(\n `SpotPatch could not safely parse ${path.basename(absolutePath)} (${error.message}).`,\n );\n }\n\n return Object.freeze({ program: result.program, source });\n}\n\nfunction importsOf(program: Program): readonly ImportDeclaration[] {\n return program.body.filter(\n (statement): statement is ImportDeclaration =>\n statement.type === \"ImportDeclaration\",\n );\n}\n\nfunction importInsertionOffset(program: Program): number {\n const imports = importsOf(program);\n const lastImport = imports.at(-1);\n\n if (lastImport !== undefined) {\n return lastImport.end;\n }\n\n const directives = program.body.filter(\n (statement) =>\n statement.type === \"ExpressionStatement\" &&\n \"directive\" in statement &&\n typeof statement.directive === \"string\",\n );\n return directives.at(-1)?.end ?? program.hashbang?.end ?? 0;\n}\n\nfunction insertStaticImport(\n magicString: MagicString,\n program: Program,\n statement: string,\n): void {\n const offset = importInsertionOffset(program);\n\n if (offset === 0) {\n magicString.prepend(`${statement}\\n\\n`);\n return;\n }\n\n magicString.appendRight(offset, `\\n${statement}`);\n}\n\nfunction findDefaultExport(program: Program): ExportDefaultDeclaration {\n const exports = program.body.filter(\n (statement): statement is ExportDefaultDeclaration =>\n statement.type === \"ExportDefaultDeclaration\",\n );\n\n if (exports.length !== 1) {\n throw new Error(\n \"SpotPatch init requires exactly one ESM default export in next.config.\",\n );\n }\n\n const defaultExport = exports[0];\n\n if (defaultExport === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config default export.\");\n }\n\n return defaultExport;\n}\n\nfunction importedWrapperName(program: Program): string | undefined {\n const adapterImports = importsOf(program).filter(\n (statement) => statement.source.value === ADAPTER_PACKAGE_NAME,\n );\n\n if (adapterImports.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple @spotpatch/next imports in next.config.\",\n );\n }\n\n const adapterImport = adapterImports[0];\n\n if (adapterImport === undefined) {\n return undefined;\n }\n\n const wrapper = adapterImport.specifiers.find(\n (specifier) =>\n specifier.type === \"ImportSpecifier\" &&\n specifier.imported.type === \"Identifier\" &&\n specifier.imported.name === \"withSpotPatch\" &&\n specifier.importKind !== \"type\",\n );\n\n if (wrapper === undefined) {\n throw new Error(\n \"SpotPatch init cannot safely merge the existing @spotpatch/next import.\",\n );\n }\n\n return wrapper.local.name;\n}\n\nfunction collectIdentifierNames(program: Program): ReadonlySet<string> {\n const names = new Set<string>();\n new Visitor({\n Identifier(node) {\n names.add(node.name);\n },\n }).visit(program);\n return names;\n}\n\nfunction chooseWrapperName(program: Program): string {\n const names = collectIdentifierNames(program);\n let suffix = 0;\n let candidate = \"withSpotPatch\";\n\n while (names.has(candidate)) {\n suffix += 1;\n candidate = `withSpotPatch${String(suffix)}`;\n }\n\n return candidate;\n}\n\nfunction unwrapParentheses(\n expression: CallExpression[\"callee\"],\n): CallExpression[\"callee\"] {\n let current = expression;\n\n while (current.type === \"ParenthesizedExpression\") {\n current = current.expression;\n }\n\n return current;\n}\n\nfunction wrappedFactoryCall(\n declaration: ExportDefaultDeclaration[\"declaration\"],\n wrapperName: string,\n): CallExpression | undefined {\n if (declaration.type !== \"CallExpression\" || declaration.arguments.length !== 1) {\n return undefined;\n }\n\n const factoryCall = unwrapParentheses(declaration.callee);\n\n if (factoryCall.type !== \"CallExpression\") {\n return undefined;\n }\n\n const callee = unwrapParentheses(factoryCall.callee);\n return callee.type === \"Identifier\" && callee.name === wrapperName\n ? factoryCall\n : undefined;\n}\n\nfunction transformNextConfig(\n absolutePath: string,\n source: string,\n trustedFastModeAvailable: boolean,\n): string {\n if (absolutePath.endsWith(\".cjs\") || absolutePath.endsWith(\".cts\")) {\n throw new Error(\n \"SpotPatch init does not rewrite CommonJS next.config files; add withSpotPatch manually.\",\n );\n }\n\n const { program } = parseModule(absolutePath, source);\n const defaultExport = findDefaultExport(program);\n const existingWrapperName = importedWrapperName(program);\n\n if (\n defaultExport.declaration.type === \"FunctionDeclaration\" ||\n defaultExport.declaration.type === \"TSDeclareFunction\" ||\n defaultExport.declaration.type === \"ClassDeclaration\" ||\n defaultExport.declaration.type === \"TSInterfaceDeclaration\"\n ) {\n throw new Error(\n \"SpotPatch init cannot safely wrap this next.config default declaration; use an exported config expression.\",\n );\n }\n\n const magicString = new MagicString(source);\n const wrapperName = existingWrapperName ?? chooseWrapperName(program);\n const existingFactory =\n existingWrapperName === undefined\n ? undefined\n : wrappedFactoryCall(defaultExport.declaration, existingWrapperName);\n\n if (existingFactory !== undefined) {\n if (trustedFastModeAvailable && existingFactory.arguments.length === 0) {\n magicString.overwrite(\n existingFactory.start,\n existingFactory.end,\n `${wrapperName}({ trustedFastMode: true })`,\n );\n return magicString.toString();\n }\n\n return source;\n }\n\n if (existingWrapperName === undefined) {\n const specifier =\n wrapperName === \"withSpotPatch\"\n ? \"withSpotPatch\"\n : `withSpotPatch as ${wrapperName}`;\n insertStaticImport(\n magicString,\n program,\n `import { ${specifier} } from ${JSON.stringify(ADAPTER_PACKAGE_NAME)};`,\n );\n }\n\n const expression = source.slice(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n );\n magicString.overwrite(\n defaultExport.declaration.start,\n defaultExport.declaration.end,\n `${wrapperName}(${trustedFastModeAvailable ? \"{ trustedFastMode: true }\" : \"\"})(${expression})`,\n );\n return magicString.toString();\n}\n\nfunction transformInstrumentationClient(absolutePath: string, source: string): string {\n const { program } = parseModule(absolutePath, source);\n const clientImports = importsOf(program).filter(\n (statement) =>\n statement.source.value === CLIENT_MODULE_ID &&\n statement.importKind !== \"type\" &&\n (statement.specifiers.length === 0 ||\n statement.specifiers.some(\n (specifier) =>\n specifier.type !== \"ImportSpecifier\" || specifier.importKind !== \"type\",\n )),\n );\n\n if (clientImports.length > 1) {\n throw new Error(\"SpotPatch init found duplicate @spotpatch/next/client imports.\");\n }\n\n if (clientImports.length === 1) {\n return source;\n }\n\n const magicString = new MagicString(source);\n insertStaticImport(\n magicString,\n program,\n `import ${JSON.stringify(CLIENT_MODULE_ID)};`,\n );\n return magicString.toString();\n}\n\nfunction parsePackageManifest(source: string): PackageManifest {\n let value: unknown;\n\n try {\n value = JSON.parse(source) as unknown;\n } catch (error: unknown) {\n throw new SyntaxError(\"SpotPatch could not parse package.json.\", {\n cause: error,\n });\n }\n\n if (!isRecord(value)) {\n throw new TypeError(\"SpotPatch requires package.json to contain an object.\");\n }\n\n return value;\n}\n\nfunction hasAdapterDependency(manifest: PackageManifest): boolean {\n return [\n manifest.dependencies,\n manifest.devDependencies,\n manifest.optionalDependencies,\n ].some(\n (dependencies) =>\n isRecord(dependencies) && typeof dependencies[ADAPTER_PACKAGE_NAME] === \"string\",\n );\n}\n\nfunction transformDevScript(script: string): string {\n const tokens = script.trim().split(/\\s+/u);\n\n if (tokens[0] === \"spotpatch-next\" && tokens[1] === \"dev\") {\n if (tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))) {\n return script;\n }\n\n throw new Error(\"SpotPatch init cannot verify the existing dev script safely.\");\n }\n\n if (\n tokens[0] !== \"next\" ||\n tokens[1] !== \"dev\" ||\n !tokens.every((token) => SIMPLE_SCRIPT_ARGUMENT_PATTERN.test(token))\n ) {\n throw new Error(\"SpotPatch init only rewrites a simple `next dev` package script.\");\n }\n\n return [\"spotpatch-next\", ...tokens.slice(1)].join(\" \");\n}\n\nfunction detectIndent(source: string): string {\n return /^([\\t ]+)\"/mu.exec(source)?.[1] ?? \" \";\n}\n\nfunction transformPackageJson(source: string): string {\n const manifest = parsePackageManifest(source);\n\n if (!hasAdapterDependency(manifest)) {\n throw new Error(\n \"SpotPatch init requires @spotpatch/next in package dependencies first.\",\n );\n }\n\n if (!isRecord(manifest.scripts) || typeof manifest.scripts.dev !== \"string\") {\n throw new Error(\"SpotPatch init requires a string package script named dev.\");\n }\n\n const dev = transformDevScript(manifest.scripts.dev);\n\n if (dev === manifest.scripts.dev) {\n return source;\n }\n\n const nextManifest = {\n ...manifest,\n scripts: { ...manifest.scripts, dev },\n };\n const lineEnding = source.includes(\"\\r\\n\") ? \"\\r\\n\" : \"\\n\";\n const serialized = JSON.stringify(nextManifest, undefined, detectIndent(source));\n return `${serialized.replaceAll(\"\\n\", lineEnding)}${lineEnding}`;\n}\n\nasync function findNextConfig(appRoot: string): Promise<string> {\n const candidates = (\n await Promise.all(\n CONFIG_FILE_NAMES.map(async (name) => {\n const absolutePath = path.join(appRoot, name);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (candidates.length !== 1) {\n throw new Error(\"SpotPatch init requires exactly one supported next.config file.\");\n }\n\n const configPath = candidates[0];\n\n if (configPath === undefined) {\n throw new Error(\"SpotPatch init could not read the next.config path.\");\n }\n\n return configPath;\n}\n\nasync function resolveInstrumentationPath(\n appRoot: string,\n configPath: string,\n): Promise<string> {\n const rootRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"app\")),\n integrationPathExists(path.join(appRoot, \"pages\")),\n ]);\n const sourceRouters = await Promise.all([\n integrationPathExists(path.join(appRoot, \"src\", \"app\")),\n integrationPathExists(path.join(appRoot, \"src\", \"pages\")),\n ]);\n const hasRootRouter = rootRouters.some(Boolean);\n const hasSourceRouter = sourceRouters.some(Boolean);\n\n if (hasRootRouter && hasSourceRouter) {\n throw new Error(\n \"SpotPatch init cannot choose an instrumentation location for mixed root/src routers.\",\n );\n }\n\n if (!hasRootRouter && !hasSourceRouter) {\n throw new Error(\"SpotPatch init could not find an App or Pages Router.\");\n }\n\n const directory = hasSourceRouter ? path.join(appRoot, \"src\") : appRoot;\n const existing = (\n await Promise.all(\n INSTRUMENTATION_EXTENSIONS.map(async (extension) => {\n const absolutePath = path.join(directory, `instrumentation-client${extension}`);\n return (await integrationPathExists(absolutePath)) ? absolutePath : undefined;\n }),\n )\n ).filter((value): value is string => value !== undefined);\n\n if (existing.length > 1) {\n throw new Error(\n \"SpotPatch init found multiple instrumentation-client entry files.\",\n );\n }\n\n if (existing[0] !== undefined) {\n return existing[0];\n }\n\n const useTypeScript =\n configPath.endsWith(\".ts\") ||\n configPath.endsWith(\".mts\") ||\n configPath.endsWith(\".cts\") ||\n (await integrationPathExists(path.join(appRoot, \"tsconfig.json\")));\n return path.join(directory, `instrumentation-client.${useTypeScript ? \"ts\" : \"js\"}`);\n}\n\nexport async function planNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationPlan> {\n const appRoot = path.resolve(directory);\n const packagePath = path.join(appRoot, \"package.json\");\n const [packageSource, configPath] = await Promise.all([\n readIntegrationFile(packagePath),\n findNextConfig(appRoot),\n ]);\n const [configSource, discoveredCheck] = await Promise.all([\n readIntegrationFile(configPath),\n discoverProjectValidationCheck({\n appRoot,\n timeoutMs: DEFAULT_AGENT_LIMITS.checkTimeoutMs,\n }),\n ]);\n const trustedFastModeAvailable = discoveredCheck !== undefined;\n const instrumentationPath = await resolveInstrumentationPath(appRoot, configPath);\n const instrumentationSource = (await integrationPathExists(instrumentationPath))\n ? await readIntegrationFile(instrumentationPath)\n : undefined;\n const changes = [\n createIntegrationFileChange(\n appRoot,\n configPath,\n transformNextConfig(configPath, configSource, trustedFastModeAvailable),\n configSource,\n ),\n createIntegrationFileChange(\n appRoot,\n instrumentationPath,\n transformInstrumentationClient(instrumentationPath, instrumentationSource ?? \"\"),\n instrumentationSource,\n ),\n createIntegrationFileChange(\n appRoot,\n packagePath,\n transformPackageJson(packageSource),\n packageSource,\n ),\n ].filter((change): change is IntegrationFileChange => change !== undefined);\n\n return Object.freeze({\n appRoot,\n changes: Object.freeze(changes),\n trustedFastModeAvailable,\n });\n}\n\nexport async function applyNextIntegrationPlan(\n plan: NextIntegrationPlan,\n): Promise<void> {\n await applyIntegrationPlan(plan);\n}\n\nexport async function checkNextIntegration(\n directory = process.cwd(),\n): Promise<NextIntegrationCheck> {\n try {\n const plan = await planNextIntegration(directory);\n const issues = plan.changes.map(\n (change) => `INTEGRATION_REQUIRED:${change.relativePath}`,\n );\n return Object.freeze({\n appRoot: plan.appRoot,\n issues: Object.freeze(issues),\n ok: issues.length === 0,\n trustedFastModeAvailable: plan.trustedFastModeAvailable,\n });\n } catch (error: unknown) {\n return Object.freeze({\n appRoot: path.resolve(directory),\n issues: Object.freeze([\n error instanceof Error ? error.message : \"SpotPatch integration check failed.\",\n ]),\n ok: false,\n trustedFastModeAvailable: false,\n });\n }\n}\n"],"mappings":"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","names":["createRequire","path","defaultBundler","path","isLoopbackHostname","isLoopbackHostname","ID_PATTERN","isRecord","sidecar","result","path","isRecord","createRequire","path"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spotpatch/next",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.4.0",
|
|
4
4
|
"description": "Development-only Next.js adapter and CLI for SpotPatch.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -90,10 +90,10 @@
|
|
|
90
90
|
"bippy": "0.6.1",
|
|
91
91
|
"magic-string": "1.1.0",
|
|
92
92
|
"oxc-parser": "0.143.0",
|
|
93
|
-
"@spotpatch/dev-server": "^0.3.0",
|
|
94
93
|
"@spotpatch/compiler": "^0.1.1",
|
|
95
|
-
"@spotpatch/
|
|
96
|
-
"@spotpatch/runtime": "^1.
|
|
94
|
+
"@spotpatch/dev-server": "^0.4.0",
|
|
95
|
+
"@spotpatch/runtime": "^1.8.0",
|
|
96
|
+
"@spotpatch/shared": "^1.8.0"
|
|
97
97
|
},
|
|
98
98
|
"peerDependencies": {
|
|
99
99
|
"next": ">=15.3.0 <17.0.0",
|