@patchstack/connect 0.3.16 → 0.3.17
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/AGENT-INSTALL.md +1 -1
- package/dist/cli.js +674 -90
- package/dist/cli.js.map +1 -1
- package/dist/protect/templates/astro-middleware.ts +35 -0
- package/dist/protect/templates/demo-rules.json +238 -0
- package/dist/protect/templates/fastify-plugin.ts +48 -0
- package/dist/protect/templates/generic-guard.ts +51 -0
- package/dist/protect/templates/guard.ts +14 -0
- package/dist/protect/templates/next-middleware.ts +37 -0
- package/dist/protect/templates/sveltekit-hooks.ts +35 -0
- package/dist/protect.cjs +451 -78
- package/dist/protect.cjs.map +1 -1
- package/dist/protect.d.ts +9 -1
- package/dist/protect.js +451 -78
- package/dist/protect.js.map +1 -1
- package/package.json +3 -2
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli.ts","../src/parsers/index.ts","../src/types.ts","../src/parsers/consistency.ts","../src/parsers/npm.ts","../src/parsers/node_modules.ts","../src/parsers/pnpm.ts","../src/parsers/yarn.ts","../src/normalize.ts","../src/checksum.ts","../src/client.ts","../src/config.ts","../src/mark-build.ts","../src/stack.ts","../src/guide.ts","../src/widget.ts","../src/protect/install.ts","../src/setup.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\n\nimport { scanLockfile } from './parsers/index.js';\nimport { buildWirePayload } from './normalize.js';\nimport { computeManifestChecksum } from './checksum.js';\nimport { DEFAULT_ENDPOINT, buildClaimUrl, postManifest } from './client.js';\nimport { persistSiteUuid, resolveConfig, writeConfigFile } from './config.js';\nimport {\n buildInjectionSnippet,\n findHtmlFiles,\n injectMarker,\n resolveBuildDir,\n} from './mark-build.js';\nimport {\n collectGuideState,\n countRemainingSteps,\n installCommand,\n renderGuideChecklist,\n} from './guide.js';\nimport { runProtect } from './protect/install.js';\nimport { wireBuildScripts } from './setup.js';\nimport { detectStack, type StackDescriptor } from './stack.js';\nimport { PatchstackError } from './types.js';\nimport { buildWidgetTag, ensureSourceWidget, ensureWidgetInHtml } from './widget.js';\n\nconst HELP = `@patchstack/connect — scan your lockfile and report packages to Patchstack.\n\nUsage:\n patchstack-connect scan [options] Scan lockfile and POST to Patchstack.\n If no UUID is configured, the server\n provisions one and we persist it. After a\n successful post it also adds/updates the\n disclosure-widget <script> tag in the root\n HTML shell (index.html, public/index.html,\n or src/app.html) — opt out with\n \"widget\": false in .patchstackrc.json\n patchstack-connect setup [options] Finish the bounded project setup: run scan,\n manage the widget, and wire package.json build\n scripts. Never runs a build or protect\n patchstack-connect init <site-uuid> Optional: pre-seed .patchstackrc.json\n with an existing site UUID\n patchstack-connect status [options] Show current configuration\n patchstack-connect mark-build [options] Stamp built HTML with a production flag +\n build fingerprint, and ensure the widget\n tag in built pages (run as a postbuild step)\n patchstack-connect protect Install always-on runtime protection (the\n guard) into a TanStack Start + Supabase app.\n Covers the browser + server-function paths.\n patchstack-connect guide [--full] Show this project's setup status (what's done,\n what's missing, with tailored commands), then\n print the full setup guide. --full prints the\n guide even when setup is complete\n patchstack-connect help Print this message\n\nOptions (for scan, setup, and status):\n --site-uuid <uuid> Override the configured site UUID\n --endpoint <url> Override the API endpoint\n --dry-run (scan only) Show the payload without posting\n\nOptions (for mark-build):\n --dir <path> Build output directory (default: auto-detect\n dist/ build/ out/ .output/public)\n\nEnvironment:\n PATCHSTACK_SITE_UUID Site UUID\n PATCHSTACK_ENDPOINT API endpoint (default: https://api.patchstack.com/monitor/pulse/manifest)\n PATCHSTACK_TIMEOUT_MS Request timeout in ms (default: 30000)\n PATCHSTACK_ENVIRONMENT Manifest environment: production | sandbox (default: production)\n\nPrecedence: CLI flag > environment variable > .patchstackrc.json.\n\nExamples:\n npx @patchstack/connect setup\n npx @patchstack/connect scan\n npx @patchstack/connect scan --dry-run\n npx @patchstack/connect init 550e8400-e29b-41d4-a716-446655440000\n npx @patchstack/connect scan --site-uuid 550e8400-...-446655440000\n`;\n\nconst VALUE_FLAGS = new Set(['site-uuid', 'endpoint', 'dir']);\n\ninterface ParsedArgs {\n command: string | null;\n positional: string[];\n flags: Map<string, string | true>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags = new Map<string, string | true>();\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (!arg.startsWith('--')) {\n positional.push(arg);\n continue;\n }\n const stripped = arg.slice(2);\n const eqIdx = stripped.indexOf('=');\n if (eqIdx !== -1) {\n flags.set(stripped.slice(0, eqIdx), stripped.slice(eqIdx + 1));\n continue;\n }\n const next = args[i + 1];\n if (VALUE_FLAGS.has(stripped) && next !== undefined && !next.startsWith('--')) {\n flags.set(stripped, next);\n i++;\n } else {\n flags.set(stripped, true);\n }\n }\n\n return {\n command: positional.shift() ?? null,\n positional,\n flags,\n };\n}\n\nfunction getStringFlag(flags: Map<string, string | true>, name: string): string | undefined {\n const value = flags.get(name);\n return typeof value === 'string' ? value : undefined;\n}\n\nasync function runInit(args: ParsedArgs): Promise<number> {\n const uuid = args.positional[0];\n if (!uuid) {\n console.error('Error: site UUID is required.\\n');\n console.error('Usage: patchstack-connect init <site-uuid>');\n return 1;\n }\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(uuid)) {\n console.error(`Error: \"${uuid}\" does not look like a valid UUID.`);\n return 1;\n }\n\n const target = await writeConfigFile(process.cwd(), { siteUuid: uuid });\n console.log(`Wrote ${target}`);\n console.log('');\n console.log('Next: run `npx @patchstack/connect scan` to send your first manifest.');\n return 0;\n}\n\nasync function runScan(\n args: ParsedArgs,\n options: { showRemainingSetup?: boolean } = {},\n): Promise<number> {\n const dryRun = args.flags.get('dry-run') === true;\n const config = await resolveConfig({\n cwd: process.cwd(),\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n cliEndpoint: getStringFlag(args.flags, 'endpoint'),\n });\n const manifest = await scanLockfile(process.cwd());\n for (const warning of manifest.warnings ?? []) {\n console.warn(`patchstack: ${warning}`);\n }\n const { payload, stats } = buildWirePayload(manifest);\n\n console.log(\n `Found ${payload.packages.length} unique package versions across ${stats.uniqueNames} package names (${manifest.ecosystem} ecosystem).`,\n );\n console.log(\n `Reporting under the ${config.environment} environment (override with PATCHSTACK_ENVIRONMENT).`,\n );\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n console.log(\n `Using endpoint override: ${config.endpoint} (set via --endpoint, PATCHSTACK_ENDPOINT, or .patchstackrc.json).`,\n );\n }\n if (stats.duplicateNames.length > 0) {\n const sample = stats.duplicateNames.slice(0, 10).join(', ');\n const more =\n stats.duplicateNames.length > 10 ? `, +${stats.duplicateNames.length - 10} more` : '';\n console.log(\n `${stats.duplicateNames.length} package(s) appear at multiple versions: ${sample}${more}`,\n );\n }\n\n if (dryRun) {\n console.log('');\n if (config.siteUuid === null) {\n console.log('--dry-run: no site UUID configured. A real run would provision one.');\n } else {\n console.log(`--dry-run: not posting to Patchstack (site UUID ${config.siteUuid}).`);\n }\n console.log('Payload preview:');\n const preview = JSON.stringify(payload, null, 2).split('\\n');\n console.log(preview.slice(0, Math.min(preview.length, 30)).join('\\n'));\n if (preview.length > 30) {\n console.log(` ... (${preview.length - 30} more lines)`);\n }\n return 0;\n }\n\n const provisioning = config.siteUuid === null;\n if (provisioning) {\n console.log('No site UUID configured — provisioning a new Patchstack site from this manifest…');\n }\n\n const response = await postManifest(config, payload);\n\n // The server always returns the UUID. If we didn't have one, persist it so\n // every subsequent scan targets the same site.\n if (provisioning && response.uuid !== undefined && response.uuid.length > 0) {\n const target = await persistSiteUuid(process.cwd(), response.uuid);\n console.log(`Provisioned site ${response.uuid}. Saved UUID to ${target}.`);\n }\n\n if (response.stored) {\n console.log(`Stored manifest #${response.manifest_id} (checksum ${response.checksum}).`);\n } else if (response.reason === 'duplicate') {\n console.log('Manifest unchanged since last scan — nothing to store.');\n } else {\n console.log(`Server response: ${response.message ?? JSON.stringify(response)}`);\n }\n\n // With a UUID in hand (existing or freshly provisioned), ensure the\n // disclosure widget's managed tag in the source HTML shell so the very next\n // preview reload shows the \"Report a vulnerability\" button. Best-effort and\n // opt-out-able; a failed post never reaches this point, and --dry-run\n // returned above.\n const effectiveUuid = config.siteUuid ?? response.uuid ?? null;\n if (config.widget && effectiveUuid !== null && effectiveUuid.length > 0) {\n reportSourceWidget(effectiveUuid);\n }\n\n // On the first scan (provisioning), surface the dashboard URL so the user can\n // attach this site to their Patchstack account. `npx @patchstack/connect status`\n // re-displays it any time.\n if (provisioning && response.uuid !== undefined && response.uuid.length > 0) {\n console.log('');\n console.log('Open this dashboard link to view vulnerability reports:');\n console.log(` ${buildClaimUrl(config.endpoint, response.uuid)}`);\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n console.log(' (this URL inherits the endpoint override above)');\n }\n }\n\n // A scan can't wire the build hooks itself — an agent that runs `scan` but not\n // `guide` (a common shortcut) otherwise sees the widget + claim URL and assumes\n // setup is finished. Surface whatever is still missing so the loop actually closes.\n if (options.showRemainingSetup !== false) {\n try {\n const state = await collectGuideState(process.cwd());\n const remaining = countRemainingSteps(state);\n if (remaining > 0) {\n const hooksMissing = !(state.prebuildWired && state.postbuildWired);\n console.log('');\n console.log(\n `Setup not complete — ${remaining} step(s) remaining${hooksMissing ? \", including the package.json build hooks (which scan can't wire)\" : ''}.`,\n );\n console.log('Run `npx @patchstack/connect guide` for the exact steps to finish for this project.');\n }\n } catch {\n // Best-effort: never turn a successful scan into a failure over this nudge.\n }\n }\n\n return 0;\n}\n\n/**\n * Run the source-widget pass for `scan` and narrate the outcome. Never throws:\n * widget management is a convenience layered on top of a successful scan and\n * must not turn one into a failure.\n */\nfunction reportSourceWidget(siteUuid: string): void {\n try {\n const result = ensureSourceWidget(process.cwd(), siteUuid);\n switch (result.action) {\n case 'added':\n console.log(`Widget: added the \"Report a vulnerability\" tag to ${result.shell}. Reload your preview to see it.`);\n break;\n case 'updated':\n console.log(`Widget: updated the managed tag in ${result.shell} to site ${siteUuid}.`);\n break;\n case 'unchanged':\n console.log(`Widget: already installed in ${result.shell}.`);\n break;\n case 'manual':\n console.log(`Widget: found an existing (manual) install in ${result.shell} — left untouched.`);\n break;\n case 'no-body':\n console.log(`Widget: ${result.shell} has no </body> tag to anchor on. Add this tag to your root layout manually:`);\n console.log(` ${buildWidgetTag(siteUuid)}`);\n break;\n case 'no-shell':\n console.log('Widget: no plain HTML shell found (index.html / public/index.html / src/app.html).');\n console.log('Add this tag to your root layout before </body> (run `guide` for framework-specific placement):');\n console.log(` ${buildWidgetTag(siteUuid)}`);\n break;\n }\n if (result.action === 'added' || result.action === 'updated') {\n console.log(' (opt out any time with \"widget\": false in .patchstackrc.json)');\n }\n } catch (err) {\n console.warn(`Widget: skipped (${(err as Error).message}).`);\n }\n}\n\nasync function runProtectCommand(_args: ParsedArgs): Promise<number> {\n // Best-effort: like mark-build, this runs during builds and must never fail one.\n try {\n runProtect(process.cwd());\n } catch (err) {\n console.warn(`patchstack protect: skipped (${(err as Error).message}).`);\n }\n return 0;\n}\n\nasync function runGuide(args: ParsedArgs): Promise<number> {\n // The live checklist first: what this project already has and what's missing,\n // with commands tailored to it. Best-effort — a project we can't inspect\n // still gets the reference doc.\n let allDone = false;\n try {\n const state = await collectGuideState(process.cwd());\n const useColor = process.stdout.isTTY === true && process.env.NO_COLOR === undefined;\n console.log(renderGuideChecklist(state, useColor));\n allDone = countRemainingSteps(state) === 0;\n } catch {\n // fall through to the static guide\n }\n\n // A fully green project doesn't need the ~90-line manual again on every\n // re-run — point at it instead. `--full` always prints it.\n if (allDone && args.flags.get('full') !== true) {\n console.log('');\n console.log(\n 'Full reference guide: `npx @patchstack/connect guide --full` (or read node_modules/@patchstack/connect/AGENT-INSTALL.md).',\n );\n return 0;\n }\n\n console.log('');\n console.log('———— Full reference guide (ships as AGENT-INSTALL.md) ————');\n console.log('');\n\n // AGENT-INSTALL.md ships at the package root, one level above dist/ (and\n // above src/ when running unbundled), so the same relative path works in both.\n const guidePath = new URL('../AGENT-INSTALL.md', import.meta.url);\n console.log(readFileSync(guidePath, 'utf8'));\n return 0;\n}\n\nasync function runSetup(args: ParsedArgs): Promise<number> {\n if (args.flags.get('dry-run') === true) {\n console.error('Error: setup does not support --dry-run. Use `scan --dry-run` to preview the manifest.');\n return 1;\n }\n\n const before = await collectGuideState(process.cwd());\n if (!before.hasPackageJson) {\n console.error('Error: no package.json found. Run setup from the project root.');\n return 1;\n }\n if (before.installed === null) {\n console.error(\n `Error: @patchstack/connect is not declared in package.json.\\nRun: ${installCommand(before.packageManager)}`,\n );\n return 1;\n }\n\n console.log('Patchstack setup — applying bounded project changes');\n console.log(' 1. Scan dependencies, provision/reuse the site, and manage the source widget');\n const scanCode = await runScan(args, { showRemainingSetup: false });\n if (scanCode !== 0) {\n return scanCode;\n }\n\n console.log('');\n console.log(' 2. Wire scan and mark-build into package.json');\n const wired = wireBuildScripts(process.cwd(), before.packageManager);\n console.log(`Build integration: ${wired.detail}`);\n\n console.log('');\n console.log(' 3. Verify setup status');\n const after = await collectGuideState(process.cwd());\n const useColor = process.stdout.isTTY === true && process.env.NO_COLOR === undefined;\n console.log(renderGuideChecklist(after, useColor));\n\n const remaining = countRemainingSteps(after);\n if (remaining > 0) {\n console.log('');\n console.log(`Setup applied its bounded changes; ${remaining} manual step(s) remain above.`);\n }\n return 0;\n}\n\nasync function runStatus(args: ParsedArgs): Promise<number> {\n const config = await resolveConfig({\n cwd: process.cwd(),\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n cliEndpoint: getStringFlag(args.flags, 'endpoint'),\n });\n console.log(`Site UUID: ${config.siteUuid ?? '(none yet — the next `scan` will provision one)'}`);\n console.log(\n `Endpoint: ${config.endpoint}${config.endpoint === DEFAULT_ENDPOINT ? '' : ' (override)'}`,\n );\n console.log(`Timeout: ${config.timeoutMs}ms`);\n console.log(`Environment: ${config.environment}`);\n if (config.siteUuid !== null) {\n console.log(`Dashboard URL: ${buildClaimUrl(config.endpoint, config.siteUuid)}`);\n }\n return 0;\n}\n\n/** One-line, human-readable summary of a detected stack for CLI output. */\nfunction describeStack(stack: StackDescriptor): string | null {\n const parts = [stack.builder, stack.framework, stack.ui, stack.runtime].filter(\n (part): part is string => part !== null,\n );\n if (stack.hostingEnvKeys.length > 0) {\n parts.push(`${stack.hostingEnvKeys.length} hosting env key(s)`);\n }\n return parts.length > 0 ? parts.join(' · ') : null;\n}\n\nasync function runMarkBuild(args: ParsedArgs): Promise<number> {\n const cwd = process.cwd();\n\n // Compute the build fingerprint and stack descriptor from the lockfile.\n // Best-effort: mark-build is a postbuild step and must never fail the build, so\n // a missing/unreadable lockfile just means we stamp the production flag without\n // a fingerprint or stack.\n let checksum: string | null = null;\n let stack: StackDescriptor | null = null;\n try {\n const manifest = await scanLockfile(cwd);\n for (const warning of manifest.warnings ?? []) {\n console.warn(`mark-build: ${warning}`);\n }\n const { payload } = buildWirePayload(manifest);\n checksum = computeManifestChecksum(payload.packages);\n stack = detectStack(payload.packages);\n } catch (err) {\n console.warn(\n `mark-build: could not compute the build fingerprint (${(err as Error).message}). Stamping the production flag only.`,\n );\n }\n\n // The widget pass needs the configured UUID; best-effort for the same reason.\n let widgetUuid: string | null = null;\n try {\n const config = await resolveConfig({\n cwd,\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n });\n if (config.widget) {\n widgetUuid = config.siteUuid;\n }\n } catch (err) {\n console.warn(\n `mark-build: could not resolve the site UUID (${(err as Error).message}). Skipping the widget pass.`,\n );\n }\n\n const dir = resolveBuildDir(cwd, getStringFlag(args.flags, 'dir'));\n if (dir === null) {\n console.warn(\n 'mark-build: no build output directory found (looked for dist/, build/, out/, .output/public). Pass --dir <path> if it is elsewhere. Nothing to mark.',\n );\n return 0;\n }\n\n const files = findHtmlFiles(dir);\n if (files.length === 0) {\n console.warn(`mark-build: no HTML files found under ${dir}. Nothing to mark.`);\n return 0;\n }\n\n const snippet = buildInjectionSnippet(checksum, stack);\n let marked = 0;\n let widgetTouched = 0;\n for (const file of files) {\n const before = readFileSync(file, 'utf8');\n let after = injectMarker(before, snippet);\n // Built HTML that came through a shell scan already edited carries the\n // managed tag; this covers output whose source shell we couldn't edit.\n // Manual installs are adopted (left untouched), same as in scan.\n if (widgetUuid !== null) {\n const ensured = ensureWidgetInHtml(after, widgetUuid);\n if (ensured.action === 'added' || ensured.action === 'updated') {\n widgetTouched += 1;\n }\n after = ensured.html;\n }\n if (after !== before) {\n writeFileSync(file, after);\n marked += 1;\n }\n }\n\n const stackSummary = stack !== null ? describeStack(stack) : null;\n console.log(\n `mark-build: marked ${marked} HTML file(s) in ${dir}` +\n `${checksum !== null ? ` (build ${checksum})` : ''}` +\n `${widgetTouched > 0 ? `, widget tag ensured in ${widgetTouched}` : ''}` +\n `${stackSummary !== null ? ` [${stackSummary}]` : ''}.`,\n );\n return 0;\n}\n\nasync function main(): Promise<number> {\n const args = parseArgs(process.argv);\n\n if (args.flags.has('help') || args.command === 'help' || args.command === null) {\n console.log(HELP);\n return 0;\n }\n\n switch (args.command) {\n case 'init':\n return runInit(args);\n case 'scan':\n return runScan(args);\n case 'status':\n return runStatus(args);\n case 'mark-build':\n return runMarkBuild(args);\n case 'protect':\n return runProtectCommand(args);\n case 'guide':\n return runGuide(args);\n case 'setup':\n return runSetup(args);\n default:\n console.error(`Unknown command: ${args.command}\\n`);\n console.error(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err: unknown) => {\n if (err instanceof PatchstackError) {\n console.error(`Error (${err.code}): ${err.message}`);\n process.exit(1);\n }\n console.error('Unexpected error:', err);\n process.exit(2);\n });\n","import { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type Manifest, type PackageEntry } from '../types.js';\nimport { missingDependencies, readDeclaredDependencyNames } from './consistency.js';\nimport { parseNpmLockfile } from './npm.js';\nimport { walkNodeModules } from './node_modules.js';\nimport { parsePnpmLockfile } from './pnpm.js';\nimport { parseYarnLockfile } from './yarn.js';\n\ntype LockfileFilename =\n | 'package-lock.json'\n | 'bun.lock'\n | 'bun.lockb'\n | 'yarn.lock'\n | 'pnpm-lock.yaml';\n\ntype DetectionStrategy =\n | 'npm-lockfile'\n | 'node-modules-walk'\n | 'pnpm-lockfile'\n | 'yarn-lockfile';\n\ninterface DetectedLockfile {\n ecosystem: 'npm';\n filePath: string;\n filename: LockfileFilename;\n strategy: DetectionStrategy;\n}\n\ninterface LockfileCandidate {\n filename: LockfileFilename;\n strategy: DetectionStrategy;\n}\n\n// Checked in priority order: the first candidate present in `cwd` wins.\nconst LOCKFILE_CANDIDATES: readonly LockfileCandidate[] = [\n { filename: 'package-lock.json', strategy: 'npm-lockfile' },\n { filename: 'bun.lock', strategy: 'node-modules-walk' },\n { filename: 'bun.lockb', strategy: 'node-modules-walk' },\n { filename: 'pnpm-lock.yaml', strategy: 'pnpm-lockfile' },\n { filename: 'yarn.lock', strategy: 'yarn-lockfile' },\n];\n\nexport async function detectLockfile(cwd: string): Promise<DetectedLockfile> {\n // Probe every candidate concurrently, then resolve by declaration order so\n // the result is identical to a sequential first-match scan — but bounded by a\n // single I/O round-trip instead of up to one `stat` per candidate.\n const probed = await Promise.all(\n LOCKFILE_CANDIDATES.map(async (candidate) => {\n const filePath = path.join(cwd, candidate.filename);\n return { ...candidate, filePath, present: await exists(filePath) };\n }),\n );\n\n const match = probed.find((candidate) => candidate.present);\n if (match) {\n return {\n ecosystem: 'npm',\n filePath: match.filePath,\n filename: match.filename,\n strategy: match.strategy,\n };\n }\n\n const expected = LOCKFILE_CANDIDATES.map((candidate) => candidate.filename).join(', ');\n throw new PatchstackError(\n `No lockfile found in ${cwd}. Expected one of: ${expected}.`,\n 'LOCKFILE_NOT_FOUND',\n );\n}\n\nexport async function scanLockfile(cwd: string): Promise<Manifest> {\n const candidates = await presentLockfiles(cwd);\n if (candidates.length === 0) {\n // Preserve the exact historical error for the no-lockfile case.\n await detectLockfile(cwd);\n }\n\n // Validate each source against package.json before trusting it. A lockfile\n // missing declared dependencies is a fossil — e.g. `npm install` planted a\n // package-lock.json once on a bun-managed platform (Lovable), and the native\n // dependency flow never updates it again. Trusting it would freeze the\n // manifest and the build fingerprint while the real dependency set drifts.\n const declared = await readDeclaredDependencyNames(cwd);\n const warnings: string[] = [];\n let firstParsed: { packages: PackageEntry[]; filename: string } | null = null;\n let walkTried = false;\n\n for (const candidate of candidates) {\n let packages: PackageEntry[];\n try {\n packages = await runStrategy(candidate, cwd);\n } catch {\n continue;\n }\n walkTried ||= candidate.strategy === 'node-modules-walk';\n firstParsed ??= { packages, filename: candidate.filename };\n\n const missing = missingDependencies(declared, packages);\n if (missing.length === 0) {\n return manifestWith(packages, warnings);\n }\n warnings.push(staleWarning(candidate.filename, missing));\n }\n\n // Last resort: the installed truth. node_modules reflects what the build\n // actually compiles against, whichever package manager wrote it.\n if (!walkTried) {\n try {\n const packages = await walkNodeModules(cwd);\n const missing = missingDependencies(declared, packages);\n if (missing.length > 0) {\n warnings.push(staleWarning('node_modules/', missing));\n }\n warnings.push('Scanned node_modules/ instead. Delete the stale lockfile to silence this warning.');\n return manifestWith(packages, warnings);\n } catch {\n // fall through to the best lockfile we managed to parse\n }\n }\n\n if (firstParsed === null) {\n const expected = LOCKFILE_CANDIDATES.map((candidate) => candidate.filename).join(', ');\n throw new PatchstackError(\n `No readable lockfile found in ${cwd}. Expected one of: ${expected}.`,\n 'LOCKFILE_NOT_FOUND',\n );\n }\n\n warnings.push(\n `No fully-consistent source found; reporting ${firstParsed.filename}. The manifest may understate the real dependency set.`,\n );\n\n return manifestWith(firstParsed.packages, warnings);\n}\n\nfunction manifestWith(packages: PackageEntry[], warnings: string[]): Manifest {\n return warnings.length > 0\n ? { ecosystem: 'npm', packages, warnings }\n : { ecosystem: 'npm', packages };\n}\n\nfunction staleWarning(source: string, missing: string[]): string {\n const sample = missing.slice(0, 3).join(', ');\n const suffix = missing.length > 3 ? `, +${missing.length - 3} more` : '';\n return `${source} looks stale: package.json declares ${missing.length} dependenc${missing.length === 1 ? 'y' : 'ies'} it does not contain (${sample}${suffix}).`;\n}\n\nasync function presentLockfiles(cwd: string): Promise<DetectedLockfile[]> {\n const probed = await Promise.all(\n LOCKFILE_CANDIDATES.map(async (candidate) => {\n const filePath = path.join(cwd, candidate.filename);\n return { ...candidate, filePath, present: await exists(filePath) };\n }),\n );\n\n return probed\n .filter((candidate) => candidate.present)\n .map(({ filename, strategy, filePath }) => ({ ecosystem: 'npm' as const, filename, strategy, filePath }));\n}\n\nasync function runStrategy(\n detected: DetectedLockfile,\n cwd: string,\n): Promise<PackageEntry[]> {\n switch (detected.strategy) {\n case 'npm-lockfile':\n return parseNpmLockfile(detected.filePath);\n case 'pnpm-lockfile':\n return parsePnpmLockfile(detected.filePath);\n case 'yarn-lockfile':\n return parseYarnLockfile(detected.filePath);\n case 'node-modules-walk':\n return walkNodeModules(cwd);\n }\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","export type Ecosystem = 'npm' | 'composer';\n\n/**\n * Which environment a manifest was captured in. The connector reports from real\n * builds (prebuild scan / build hooks), so it defaults to 'production'. Override\n * with PATCHSTACK_ENVIRONMENT=sandbox (or \"environment\" in .patchstackrc.json)\n * for test manifests.\n */\nexport type Environment = 'production' | 'sandbox';\n\nexport interface PackageEntry {\n name: string;\n version: string;\n path?: string;\n direct?: boolean;\n}\n\nexport interface Manifest {\n ecosystem: Ecosystem;\n packages: PackageEntry[];\n /**\n * Human-readable scan diagnostics — set when the preferred lockfile looked\n * stale (missing dependencies declared in package.json) and another source\n * was used, or when no fully-consistent source existed. Never fatal.\n */\n warnings?: string[];\n}\n\nexport interface Config {\n /**\n * The site UUID. `null` means we don't have one yet — `postManifest` will then\n * post to the bare endpoint, the server will provision a fresh site, and the\n * UUID it returns should be persisted via `persistSiteUuid()`.\n */\n siteUuid: string | null;\n endpoint: string;\n timeoutMs: number;\n /** Environment to report the manifest under. Defaults to 'production'. */\n environment: Environment;\n /**\n * Whether the connector manages the disclosure-widget tag (source shell on\n * `scan`, built HTML on `mark-build`). Defaults to true; persist\n * `\"widget\": false` in .patchstackrc.json for dependency-scanning only.\n */\n widget: boolean;\n}\n\nexport interface StoreManifestResponse {\n /** The UUID of the site the manifest was stored against. Always returned. */\n uuid?: string;\n stored: boolean;\n manifest_id?: number;\n checksum?: string;\n reason?: string;\n message?: string;\n error?: string;\n}\n\nexport class PatchstackError extends Error {\n constructor(\n message: string,\n public readonly code:\n | 'CONFIG_MISSING'\n | 'CONFIG_INVALID'\n | 'LOCKFILE_NOT_FOUND'\n | 'LOCKFILE_UNSUPPORTED'\n | 'LOCKFILE_PARSE_ERROR'\n | 'NETWORK_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'SITE_NOT_FOUND'\n | 'VALIDATION_ERROR'\n | 'SERVER_ERROR',\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'PatchstackError';\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PackageEntry } from '../types.js';\n\n/**\n * Registry-installable dependency names declared in package.json\n * (dependencies + devDependencies). Non-registry specifiers (file:, link:,\n * workspace:, portal:) are excluded — lockfile parsers skip those too, so\n * their absence from a parsed set says nothing about staleness. Returns []\n * when package.json is missing or unreadable (nothing to validate against).\n */\nexport async function readDeclaredDependencyNames(cwd: string): Promise<string[]> {\n let raw: string;\n try {\n raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n } catch {\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (typeof parsed !== 'object' || parsed === null) {\n return [];\n }\n\n const names = new Set<string>();\n for (const group of ['dependencies', 'devDependencies'] as const) {\n const deps = (parsed as Record<string, unknown>)[group];\n if (typeof deps !== 'object' || deps === null) {\n continue;\n }\n for (const [name, spec] of Object.entries(deps as Record<string, unknown>)) {\n if (typeof spec === 'string' && /^(file|link|workspace|portal):/.test(spec)) {\n continue;\n }\n names.add(name);\n }\n }\n\n return [...names];\n}\n\n/**\n * Declared names absent from a parsed package set. A non-empty result means\n * the source predates package.json — the fossil-lockfile failure mode where\n * e.g. `npm install` planted a package-lock.json once and the platform's\n * native package manager (bun on Lovable) never updates it again.\n */\nexport function missingDependencies(declared: string[], packages: PackageEntry[]): string[] {\n const present = new Set(packages.map((entry) => entry.name));\n return declared.filter((name) => !present.has(name));\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\ninterface LockfileV2Package {\n name?: string;\n version?: string;\n link?: boolean;\n resolved?: string;\n}\n\ninterface LockfileV2 {\n lockfileVersion: number;\n packages?: Record<string, LockfileV2Package>;\n dependencies?: Record<string, LockfileV1Dependency>;\n}\n\ninterface LockfileV1Dependency {\n version: string;\n dependencies?: Record<string, LockfileV1Dependency>;\n}\n\nexport async function parseNpmLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(`Could not read lockfile at ${lockfilePath}`, 'LOCKFILE_NOT_FOUND', cause);\n }\n\n let parsed: LockfileV2;\n try {\n parsed = JSON.parse(raw) as LockfileV2;\n } catch (cause) {\n throw new PatchstackError(`Lockfile at ${lockfilePath} is not valid JSON`, 'LOCKFILE_PARSE_ERROR', cause);\n }\n\n if (parsed.packages) {\n return extractFromV2(parsed.packages);\n }\n\n if (parsed.dependencies) {\n return extractFromV1(parsed.dependencies);\n }\n\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} has no \"packages\" or \"dependencies\" key`,\n 'LOCKFILE_PARSE_ERROR',\n );\n}\n\nfunction extractFromV2(packages: Record<string, LockfileV2Package>): PackageEntry[] {\n const entries: PackageEntry[] = [];\n\n for (const [pkgPath, pkg] of Object.entries(packages)) {\n if (pkgPath === '') {\n continue;\n }\n if (pkg.link === true) {\n continue;\n }\n if (typeof pkg.version !== 'string' || pkg.version.length === 0) {\n continue;\n }\n\n const name = pkg.name ?? extractNameFromPath(pkgPath);\n if (name === null) {\n continue;\n }\n\n entries.push({\n name,\n version: pkg.version,\n path: pkgPath,\n direct: isDirectV2(pkgPath),\n });\n }\n\n return entries;\n}\n\nfunction extractFromV1(\n deps: Record<string, LockfileV1Dependency>,\n acc: PackageEntry[] = [],\n depth = 0,\n): PackageEntry[] {\n for (const [name, dep] of Object.entries(deps)) {\n if (typeof dep.version === 'string' && dep.version.length > 0) {\n acc.push({ name, version: dep.version, direct: depth === 0 });\n }\n if (dep.dependencies) {\n extractFromV1(dep.dependencies, acc, depth + 1);\n }\n }\n return acc;\n}\n\nfunction extractNameFromPath(pkgPath: string): string | null {\n const segments = pkgPath.split('node_modules' + path.sep === pkgPath ? path.sep : '/');\n const parts = pkgPath.split('/');\n const nmIndex = parts.lastIndexOf('node_modules');\n if (nmIndex === -1 || nmIndex >= parts.length - 1) {\n return segments[segments.length - 1] ?? null;\n }\n const tail = parts.slice(nmIndex + 1);\n if (tail.length === 0) {\n return null;\n }\n const first = tail[0];\n if (first !== undefined && first.startsWith('@') && tail.length >= 2) {\n return `${first}/${tail[1]}`;\n }\n return first ?? null;\n}\n\nfunction isDirectV2(pkgPath: string): boolean {\n const parts = pkgPath.split('/');\n const nmCount = parts.filter((p) => p === 'node_modules').length;\n return nmCount === 1;\n}\n","import { lstat, readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\nexport async function walkNodeModules(cwd: string): Promise<PackageEntry[]> {\n const root = path.join(cwd, 'node_modules');\n\n try {\n const info = await stat(root);\n if (!info.isDirectory()) {\n throw new PatchstackError(\n `${root} exists but is not a directory.`,\n 'LOCKFILE_NOT_FOUND',\n );\n }\n } catch (cause) {\n if (cause instanceof PatchstackError) {\n throw cause;\n }\n throw new PatchstackError(\n `node_modules/ not found at ${cwd}. Install dependencies first (e.g. \\`bun install\\` or \\`npm install\\`).`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const entries: PackageEntry[] = [];\n await walk(root, entries, 0);\n return entries;\n}\n\nasync function walk(dir: string, acc: PackageEntry[], depth: number): Promise<void> {\n let names: string[];\n try {\n names = await readdir(dir);\n } catch {\n return;\n }\n\n for (const name of names) {\n if (name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, name);\n if (!(await isPlainDirectory(fullPath))) {\n continue;\n }\n\n if (name.startsWith('@')) {\n let subNames: string[];\n try {\n subNames = await readdir(fullPath);\n } catch {\n continue;\n }\n for (const sub of subNames) {\n if (sub.startsWith('.')) {\n continue;\n }\n const scopedDir = path.join(fullPath, sub);\n if (!(await isPlainDirectory(scopedDir))) {\n continue;\n }\n await readPackage(scopedDir, depth, acc);\n await walkNested(scopedDir, acc, depth);\n }\n continue;\n }\n\n await readPackage(fullPath, depth, acc);\n await walkNested(fullPath, acc, depth);\n }\n}\n\nasync function readPackage(\n pkgDir: string,\n depth: number,\n acc: PackageEntry[],\n): Promise<void> {\n let raw: string;\n try {\n raw = await readFile(path.join(pkgDir, 'package.json'), 'utf8');\n } catch {\n return;\n }\n\n let parsed: { name?: unknown; version?: unknown };\n try {\n parsed = JSON.parse(raw) as { name?: unknown; version?: unknown };\n } catch {\n return;\n }\n\n if (typeof parsed.name !== 'string' || parsed.name.length === 0) {\n return;\n }\n if (typeof parsed.version !== 'string' || parsed.version.length === 0) {\n return;\n }\n\n acc.push({\n name: parsed.name,\n version: parsed.version,\n direct: depth === 0,\n });\n}\n\nasync function walkNested(\n pkgDir: string,\n acc: PackageEntry[],\n depth: number,\n): Promise<void> {\n const nested = path.join(pkgDir, 'node_modules');\n if (!(await isPlainDirectory(nested))) {\n return;\n }\n await walk(nested, acc, depth + 1);\n}\n\nasync function isPlainDirectory(dir: string): Promise<boolean> {\n try {\n const info = await lstat(dir);\n return info.isDirectory() && !info.isSymbolicLink();\n } catch {\n return false;\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\n/**\n * Parses pnpm-lock.yaml without pulling in a YAML library. We don't need full\n * YAML semantics — only the `packages:` block (the canonical list of every\n * installed package) and, for direct-dep marking, the dependency sections under\n * `importers:` (v9+) or at the top level (v6-v8 single-project).\n *\n * Supported pnpm-lock key formats:\n * v5: /pkg/1.0.0 /@scope/pkg/1.0.0\n * v6-v8: /pkg@1.0.0 /@scope/pkg@1.0.0 (optional `(peer@x)` suffix)\n * v9: pkg@1.0.0 @scope/pkg@1.0.0 (optional `(peer@x)` suffix, may be quoted)\n */\nexport async function parsePnpmLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(\n `Could not read lockfile at ${lockfilePath}`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const lines = raw.split(/\\r?\\n/);\n const directNames = collectDirectDepNames(lines);\n const packageKeys = collectPackagesBlockKeys(lines);\n\n if (packageKeys.length === 0) {\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} has no \"packages\" entries`,\n 'LOCKFILE_PARSE_ERROR',\n );\n }\n\n const entries: PackageEntry[] = [];\n for (const key of packageKeys) {\n const parsed = parsePackageKey(key);\n if (parsed === null) {\n continue;\n }\n entries.push({\n name: parsed.name,\n version: parsed.version,\n direct: directNames.has(parsed.name),\n });\n }\n\n return entries;\n}\n\ninterface ParsedKey {\n name: string;\n version: string;\n}\n\nexport function parsePackageKey(rawKey: string): ParsedKey | null {\n let k = rawKey.trim();\n if (k.length === 0) {\n return null;\n }\n\n if (\n (k.startsWith(\"'\") && k.endsWith(\"'\")) ||\n (k.startsWith('\"') && k.endsWith('\"'))\n ) {\n k = k.slice(1, -1);\n }\n\n if (k.startsWith('/')) {\n k = k.slice(1);\n }\n\n // Strip peer-dependency suffix used by v6+: `pkg@1.0.0(peer@1.0.0)(other@2)`.\n const parenIdx = k.indexOf('(');\n if (parenIdx >= 0) {\n k = k.slice(0, parenIdx);\n }\n\n // Split off the optional `@scope/` prefix so the remaining \"body\" contains\n // exactly one separator between the bare name and the version. npm forbids\n // both `@` and `/` inside the bare-name portion, so the first occurrence of\n // either character in the body is unambiguously the name/version separator.\n let scopePrefix = '';\n let body = k;\n if (k.startsWith('@')) {\n const firstSlash = k.indexOf('/');\n if (firstSlash <= 0) {\n return null;\n }\n scopePrefix = k.slice(0, firstSlash + 1);\n body = k.slice(firstSlash + 1);\n }\n\n const slashIdx = body.indexOf('/');\n const atIdx = body.indexOf('@');\n\n let sepIdx: number;\n if (slashIdx < 0 && atIdx < 0) {\n return null;\n } else if (slashIdx < 0) {\n sepIdx = atIdx;\n } else if (atIdx < 0) {\n sepIdx = slashIdx;\n } else {\n sepIdx = Math.min(slashIdx, atIdx);\n }\n\n const name = scopePrefix + body.slice(0, sepIdx);\n let version = body.slice(sepIdx + 1);\n\n // v5 peer suffix uses `_`: `1.0.0_react@18.2.0`.\n const underscoreIdx = version.indexOf('_');\n if (underscoreIdx >= 0) {\n version = version.slice(0, underscoreIdx);\n }\n\n if (name.length === 0 || version.length === 0) {\n return null;\n }\n\n return { name, version };\n}\n\nfunction indentOf(line: string): number {\n let i = 0;\n while (i < line.length && line[i] === ' ') {\n i++;\n }\n return i;\n}\n\nfunction isBlankOrComment(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.length === 0 || trimmed.startsWith('#');\n}\n\n/**\n * Collects keys directly nested under the top-level `packages:` block. Stops\n * when another top-level key (e.g. `snapshots:`) appears.\n */\nfunction collectPackagesBlockKeys(lines: string[]): string[] {\n const keys: string[] = [];\n let inBlock = false;\n let childIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n\n const indent = indentOf(line);\n\n if (!inBlock) {\n if (indent === 0 && line.trim() === 'packages:') {\n inBlock = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n if (childIndent === null) {\n childIndent = indent;\n }\n\n if (indent !== childIndent) {\n continue;\n }\n\n const content = line.slice(indent);\n if (!content.endsWith(':')) {\n continue;\n }\n\n keys.push(content.slice(0, -1));\n }\n\n return keys;\n}\n\n/**\n * Collects direct dependency names. Looks in two places, since the format\n * differs across lockfile versions and workspaces:\n *\n * 1. `importers:` > `<importer>:` > `{dependencies,devDependencies,optionalDependencies}:`\n * (v9 always, v6-v8 in workspaces)\n * 2. Top-level `{dependencies,devDependencies,optionalDependencies}:`\n * (v6-v8 single-project lockfiles)\n *\n * Direct-dep marking is best-effort: a name absent from both is simply left as\n * not-direct, matching the npm parser's behaviour for transitive packages.\n */\nfunction collectDirectDepNames(lines: string[]): Set<string> {\n const names = new Set<string>();\n collectFromImporters(lines, names);\n for (const section of ['dependencies', 'devDependencies', 'optionalDependencies']) {\n collectFromTopLevelSection(lines, section, names);\n }\n return names;\n}\n\nconst DEP_SECTIONS = new Set([\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n]);\n\nfunction collectFromImporters(lines: string[], out: Set<string>): void {\n let inImporters = false;\n let importerIndent: number | null = null;\n let inDepSection = false;\n let depSectionIndent: number | null = null;\n let leafIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n const indent = indentOf(line);\n const trimmed = line.trim();\n\n if (!inImporters) {\n if (indent === 0 && trimmed === 'importers:') {\n inImporters = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n // Track the indent at which importer entries (e.g. `.:`, `packages/foo:`) sit.\n if (importerIndent === null) {\n importerIndent = indent;\n }\n\n if (indent === importerIndent) {\n inDepSection = false;\n depSectionIndent = null;\n leafIndent = null;\n continue;\n }\n\n if (!inDepSection) {\n const key = stripTrailingColon(trimmed);\n if (key !== null && DEP_SECTIONS.has(key)) {\n inDepSection = true;\n depSectionIndent = indent;\n }\n continue;\n }\n\n if (depSectionIndent !== null && indent <= depSectionIndent) {\n // Reset — we've exited the dep section. Reconsider this line.\n inDepSection = false;\n depSectionIndent = null;\n leafIndent = null;\n const key = stripTrailingColon(trimmed);\n if (key !== null && DEP_SECTIONS.has(key)) {\n inDepSection = true;\n depSectionIndent = indent;\n }\n continue;\n }\n\n if (leafIndent === null) {\n leafIndent = indent;\n }\n\n if (indent !== leafIndent) {\n continue;\n }\n\n const name = extractLeafName(trimmed);\n if (name !== null) {\n out.add(name);\n }\n }\n}\n\nfunction collectFromTopLevelSection(\n lines: string[],\n section: string,\n out: Set<string>,\n): void {\n let inSection = false;\n let leafIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n const indent = indentOf(line);\n const trimmed = line.trim();\n\n if (!inSection) {\n if (indent === 0 && trimmed === `${section}:`) {\n inSection = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n if (leafIndent === null) {\n leafIndent = indent;\n }\n\n if (indent !== leafIndent) {\n continue;\n }\n\n const name = extractLeafName(trimmed);\n if (name !== null) {\n out.add(name);\n }\n }\n}\n\nfunction stripTrailingColon(s: string): string | null {\n if (!s.endsWith(':')) {\n return null;\n }\n return s.slice(0, -1).trim();\n}\n\n/**\n * Extracts the package name from a dependency-section leaf, handling both the\n * short form (`pkg: 1.0.0`) and the v9 expanded form (`pkg:` followed by\n * `specifier:` / `version:` children). Quoted scoped names like `'@scope/pkg':`\n * are unquoted.\n */\nfunction extractLeafName(trimmed: string): string | null {\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx < 0) {\n return null;\n }\n let name = trimmed.slice(0, colonIdx).trim();\n if (name.length === 0) {\n return null;\n }\n if (\n (name.startsWith(\"'\") && name.endsWith(\"'\")) ||\n (name.startsWith('\"') && name.endsWith('\"'))\n ) {\n name = name.slice(1, -1);\n }\n return name.length > 0 ? name : null;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\n/**\n * Parses yarn.lock (yarn classic v1 and yarn berry v2+) without a YAML\n * dependency. Both generations share the same block structure — a top-level\n * mapping of comma-separated descriptor lists to a block containing a\n * `version` field — so we walk them with the same scanner and only branch on\n * the `version` syntax (`version \"x\"` for v1, `version: x` for berry).\n *\n * Direct vs transitive can't be derived from yarn.lock alone (yarn does not\n * record an importer manifest the way pnpm v9 does), so we cross-reference\n * the sibling `package.json` when present.\n */\nexport async function parseYarnLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(\n `Could not read lockfile at ${lockfilePath}`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const blocks = parseBlocks(raw);\n if (blocks.length === 0) {\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} contains no package entries`,\n 'LOCKFILE_PARSE_ERROR',\n );\n }\n\n const directNames = await readDirectDepNames(path.dirname(lockfilePath));\n\n const entries: PackageEntry[] = [];\n const seen = new Set<string>();\n for (const block of blocks) {\n if (block.version.length === 0 || block.names.size === 0) {\n continue;\n }\n for (const name of block.names) {\n const dedupKey = `${name}@${block.version}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n entries.push({\n name,\n version: block.version,\n direct: directNames.has(name),\n });\n }\n }\n\n return entries;\n}\n\ninterface Block {\n names: Set<string>;\n version: string;\n}\n\nfunction parseBlocks(raw: string): Block[] {\n const lines = raw.split(/\\r?\\n/);\n const blocks: Block[] = [];\n let current: Block | null = null;\n\n const finalize = () => {\n if (current !== null && current.version.length > 0 && current.names.size > 0) {\n blocks.push(current);\n }\n current = null;\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) {\n continue;\n }\n\n const indent = countLeadingSpaces(line);\n\n if (indent === 0) {\n finalize();\n if (!trimmed.endsWith(':')) {\n continue;\n }\n // `__metadata:` (yarn berry header) has no `@` in any descriptor and\n // produces an empty names set, so it's naturally skipped on finalize.\n const keyLine = trimmed.slice(0, -1);\n const names = new Set<string>();\n for (const spec of splitDescriptors(keyLine)) {\n const name = extractName(spec);\n if (name !== null) {\n names.add(name);\n }\n }\n current = { names, version: '' };\n continue;\n }\n\n if (current === null) {\n continue;\n }\n\n const version = parseVersionField(trimmed);\n if (version !== null) {\n current.version = version;\n }\n }\n\n finalize();\n return blocks;\n}\n\nfunction countLeadingSpaces(line: string): number {\n let i = 0;\n while (i < line.length && line[i] === ' ') {\n i++;\n }\n return i;\n}\n\n/**\n * Splits a yarn descriptor key list on top-level commas. yarn quotes any\n * descriptor that contains characters needing escaping, so we respect quotes\n * while splitting to avoid breaking on commas inside (rare in practice but\n * cheap to handle).\n */\nexport function splitDescriptors(keyLine: string): string[] {\n const parts: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let i = 0; i < keyLine.length; i++) {\n const c = keyLine[i];\n if (quote !== null) {\n current += c;\n if (c === quote) {\n quote = null;\n }\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n current += c;\n continue;\n }\n if (c === ',') {\n const piece = current.trim();\n if (piece.length > 0) {\n parts.push(piece);\n }\n current = '';\n continue;\n }\n current += c;\n }\n const tail = current.trim();\n if (tail.length > 0) {\n parts.push(tail);\n }\n return parts;\n}\n\n/**\n * Extracts the package name from a yarn descriptor like `axios@^1.6.0`,\n * `\"@scope/pkg@^2.1.0\"`, or `\"@scope/pkg@npm:2.1.0\"`. The descriptor's\n * range portion is discarded — we only need the name, since the resolved\n * version comes from the `version` field of the block.\n */\nexport function extractName(rawSpec: string): string | null {\n let s = rawSpec.trim();\n if (s.length === 0) {\n return null;\n }\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n s = s.slice(1, -1);\n }\n // Position-0 `@` belongs to a scope, so we want the last `@` after it.\n const atIdx = s.lastIndexOf('@');\n if (atIdx <= 0) {\n return null;\n }\n const name = s.slice(0, atIdx);\n return name.length > 0 ? name : null;\n}\n\nfunction parseVersionField(content: string): string | null {\n if (!content.startsWith('version')) {\n return null;\n }\n const after = content.slice('version'.length);\n // yarn v1: `version \"1.2.3\"` (whitespace then quoted)\n // yarn berry: `version: 1.2.3` or `version: \"1.2.3\"`\n const firstChar = after.charAt(0);\n if (firstChar !== ' ' && firstChar !== '\\t' && firstChar !== ':') {\n return null;\n }\n let rest = firstChar === ':' ? after.slice(1) : after;\n rest = rest.trim();\n if (rest.length === 0) {\n return null;\n }\n if (\n (rest.startsWith('\"') && rest.endsWith('\"')) ||\n (rest.startsWith(\"'\") && rest.endsWith(\"'\"))\n ) {\n rest = rest.slice(1, -1);\n }\n return rest.length > 0 ? rest : null;\n}\n\nasync function readDirectDepNames(cwd: string): Promise<Set<string>> {\n const names = new Set<string>();\n let raw: string;\n try {\n raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n } catch {\n return names;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return names;\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return names;\n }\n const obj = parsed as Record<string, unknown>;\n\n for (const field of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies']) {\n const section = obj[field];\n if (typeof section !== 'object' || section === null) {\n continue;\n }\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n\n return names;\n}\n","import type { Manifest, PackageEntry } from './types.js';\n\nexport interface WirePackage {\n name: string;\n version: string;\n}\n\nexport interface WirePayload {\n ecosystem: Manifest['ecosystem'];\n packages: WirePackage[];\n}\n\nexport interface NormalizeStats {\n uniqueNames: number;\n duplicateNames: string[];\n totalEntries: number;\n}\n\nexport interface NormalizeResult {\n payload: WirePayload;\n stats: NormalizeStats;\n}\n\nexport function buildWirePayload(manifest: Manifest): NormalizeResult {\n const seen = new Map<string, Set<string>>();\n const wirePackages: WirePackage[] = [];\n\n for (const entry of manifest.packages) {\n const versions = seen.get(entry.name);\n if (versions) {\n if (versions.has(entry.version)) {\n continue;\n }\n versions.add(entry.version);\n } else {\n seen.set(entry.name, new Set([entry.version]));\n }\n wirePackages.push({ name: entry.name, version: entry.version });\n }\n\n wirePackages.sort((a, b) => {\n if (a.name === b.name) {\n return compareVersions(a.version, b.version);\n }\n return a.name < b.name ? -1 : 1;\n });\n\n const duplicateNames: string[] = [];\n for (const [name, versions] of seen) {\n if (versions.size > 1) {\n duplicateNames.push(name);\n }\n }\n\n return {\n payload: { ecosystem: manifest.ecosystem, packages: wirePackages },\n stats: {\n uniqueNames: seen.size,\n duplicateNames,\n totalEntries: manifest.packages.length,\n },\n };\n}\n\nexport function compareVersions(a: string, b: string): number {\n if (a === b) {\n return 0;\n }\n\n const [aBase, aPre] = splitPrerelease(a);\n const [bBase, bPre] = splitPrerelease(b);\n\n const baseCmp = compareSegments(aBase.split('.'), bBase.split('.'));\n if (baseCmp !== 0) {\n return baseCmp;\n }\n\n if (aPre === null && bPre === null) {\n return 0;\n }\n if (aPre === null) {\n return 1;\n }\n if (bPre === null) {\n return -1;\n }\n return compareSegments(aPre.split('.'), bPre.split('.'));\n}\n\nfunction splitPrerelease(version: string): [string, string | null] {\n const cleaned = version.replace(/^[v=]+/, '').split('+')[0]!;\n const dashIndex = cleaned.indexOf('-');\n if (dashIndex === -1) {\n return [cleaned, null];\n }\n return [cleaned.slice(0, dashIndex), cleaned.slice(dashIndex + 1)];\n}\n\nfunction compareSegments(a: string[], b: string[]): number {\n const max = Math.max(a.length, b.length);\n for (let i = 0; i < max; i++) {\n const aPart = a[i];\n const bPart = b[i];\n if (aPart === undefined) {\n return -1;\n }\n if (bPart === undefined) {\n return 1;\n }\n const aNum = /^\\d+$/.test(aPart);\n const bNum = /^\\d+$/.test(bPart);\n if (aNum && bNum) {\n const diff = Number(aPart) - Number(bPart);\n if (diff !== 0) {\n return diff < 0 ? -1 : 1;\n }\n continue;\n }\n if (aNum) {\n return -1;\n }\n if (bNum) {\n return 1;\n }\n if (aPart < bPart) {\n return -1;\n }\n if (aPart > bPart) {\n return 1;\n }\n }\n return 0;\n}\n\nexport function findPackageInManifest(\n manifest: Manifest,\n name: string,\n): PackageEntry[] {\n return manifest.packages.filter((p) => p.name === name);\n}\n","import { createHash } from 'node:crypto';\n\nimport type { WirePackage } from './normalize.js';\n\n/**\n * Fingerprint of a manifest's package set, byte-for-byte identical to the\n * checksum Patchstack stores server-side (PulseController::storeManifest): the\n * first 12 hex chars of sha256 over the JSON of the packages sorted by\n * `[name, version]` with plain lexicographic (byte) ordering.\n *\n * This mirrors PHP's `usort(..., fn($a,$b) => [$a['name'],$a['version']] <=> ...)`\n * followed by `json_encode(..., JSON_UNESCAPED_SLASHES)`. Two deliberate details:\n *\n * - The sort is lexicographic, NOT the semver-aware ordering `buildWirePayload`\n * uses for display. The server re-sorts lexicographically before hashing, so\n * the fingerprint must too (e.g. `1.10.0` sorts before `1.9.0`).\n * - npm/composer package names and versions are ASCII, so JS `JSON.stringify`\n * and PHP `json_encode` produce identical bytes (no unicode escaping, and\n * neither escapes `/`, so scoped names like `@babel/core` match).\n *\n * Injected into built HTML by `mark-build` and reported by the disclosure widget\n * so Patchstack can compare the live build against the last reported manifest.\n */\nexport function computeManifestChecksum(packages: WirePackage[]): string {\n const canonical = packages\n .map((pkg) => ({ name: pkg.name, version: pkg.version }))\n .sort((a, b) => {\n if (a.name !== b.name) {\n return a.name < b.name ? -1 : 1;\n }\n if (a.version !== b.version) {\n return a.version < b.version ? -1 : 1;\n }\n return 0;\n });\n\n return createHash('sha256').update(JSON.stringify(canonical)).digest('hex').slice(0, 12);\n}\n","import { PatchstackError, type Config, type StoreManifestResponse } from './types.js';\nimport type { WirePayload } from './normalize.js';\n\nexport const DEFAULT_ENDPOINT = 'https://api.patchstack.com/monitor/pulse/manifest';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport function buildEndpointUrl(base: string, siteUuid?: string | null): string {\n const trimmed = base.replace(/\\/$/, '');\n return siteUuid !== undefined && siteUuid !== null && siteUuid.length > 0\n ? `${trimmed}/${encodeURIComponent(siteUuid)}`\n : trimmed;\n}\n\n/**\n * Build the claim URL for a site. The claim page lives on the same origin as\n * the API endpoint, at `/monitor/claim?site=<uuid>`. Using the API endpoint's\n * origin (rather than a hard-coded https://api.patchstack.com) means staging,\n * ngrok tunnels and local dev environments all produce a claim URL on the same\n * host the connector is already talking to.\n */\nexport function buildClaimUrl(endpoint: string, siteUuid: string): string {\n const origin = new URL(endpoint).origin;\n return `${origin}/monitor/claim?site=${encodeURIComponent(siteUuid)}`;\n}\n\nexport async function postManifest(\n config: Config,\n payload: WirePayload,\n): Promise<StoreManifestResponse> {\n const url = buildEndpointUrl(config.endpoint, config.siteUuid);\n const timeoutMs = config.timeoutMs;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': '@patchstack/connect',\n },\n body: JSON.stringify({ ...payload, environment: config.environment }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (cause) {\n if (isTimeoutError(cause)) {\n throw new PatchstackError(\n `Patchstack request to ${url} timed out after ${timeoutMs}ms. Override with PATCHSTACK_TIMEOUT_MS.`,\n 'NETWORK_TIMEOUT',\n cause,\n );\n }\n throw new PatchstackError(\n `Could not reach Patchstack at ${url}. Check your network connection.`,\n 'NETWORK_ERROR',\n cause,\n );\n }\n\n const text = await response.text();\n let body: StoreManifestResponse | null = null;\n try {\n body = text.length > 0 ? (JSON.parse(text) as StoreManifestResponse) : null;\n } catch {\n body = null;\n }\n\n if (response.status === 404) {\n throw new PatchstackError(\n body?.error ?? 'Site not found. Check that your site UUID is correct and that the app is registered as a Pulse app in your Patchstack dashboard.',\n 'SITE_NOT_FOUND',\n );\n }\n\n if (response.status === 422) {\n throw new PatchstackError(\n body?.message ?? 'Patchstack rejected the manifest payload (validation failed).',\n 'VALIDATION_ERROR',\n );\n }\n\n if (response.status < 200 || response.status >= 300) {\n throw new PatchstackError(\n `Patchstack returned ${response.status}: ${text.slice(0, 200)}`,\n 'SERVER_ERROR',\n );\n }\n\n if (body === null) {\n throw new PatchstackError('Patchstack returned an empty response.', 'SERVER_ERROR');\n }\n\n return body;\n}\n\nfunction isTimeoutError(cause: unknown): boolean {\n if (cause instanceof Error) {\n return cause.name === 'TimeoutError' || cause.name === 'AbortError';\n }\n return false;\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type Config, type Environment } from './types.js';\nimport { DEFAULT_ENDPOINT, DEFAULT_TIMEOUT_MS } from './client.js';\n\nconst CONFIG_FILENAME = '.patchstackrc.json';\n\nexport const DEFAULT_ENVIRONMENT: Environment = 'production';\n\ninterface ConfigFile {\n siteUuid?: string;\n endpoint?: string;\n timeoutMs?: number;\n environment?: string;\n widget?: boolean;\n}\n\nexport interface ResolveConfigOptions {\n cwd: string;\n cliSiteUuid?: string;\n cliEndpoint?: string;\n /**\n * When true, resolveConfig throws CONFIG_MISSING if no site UUID is configured.\n * Defaults to false: callers that can run without a UUID (the first `scan` after\n * `npm install`) just get `siteUuid: null` back and learn the UUID from the\n * server response.\n */\n requireSiteUuid?: boolean;\n}\n\nexport async function resolveConfig(options: ResolveConfigOptions): Promise<Config> {\n const fromFile = await readConfigFile(options.cwd);\n const fromEnv = readEnv();\n\n const siteUuid =\n options.cliSiteUuid ??\n fromEnv.siteUuid ??\n fromFile.siteUuid ??\n null;\n\n const endpoint =\n options.cliEndpoint ??\n fromEnv.endpoint ??\n fromFile.endpoint ??\n DEFAULT_ENDPOINT;\n\n const timeoutMs = fromEnv.timeoutMs ?? fromFile.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const environmentRaw = fromEnv.environment ?? fromFile.environment;\n if (environmentRaw !== undefined && !isEnvironment(environmentRaw)) {\n throw new PatchstackError(\n `Environment must be \"production\" or \"sandbox\"; got \"${environmentRaw}\".`,\n 'CONFIG_INVALID',\n );\n }\n const environment: Environment = environmentRaw ?? DEFAULT_ENVIRONMENT;\n\n if (siteUuid !== null && siteUuid.length > 0 && !isUuid(siteUuid)) {\n throw new PatchstackError(\n `Site UUID \"${siteUuid}\" does not look like a valid UUID.`,\n 'CONFIG_INVALID',\n );\n }\n\n if (options.requireSiteUuid && (siteUuid === null || siteUuid.length === 0)) {\n throw new PatchstackError(\n 'No site UUID configured. Run `patchstack-connect scan` to provision one, or set PATCHSTACK_SITE_UUID.',\n 'CONFIG_MISSING',\n );\n }\n\n return {\n siteUuid: siteUuid === null || siteUuid.length === 0 ? null : siteUuid,\n endpoint,\n timeoutMs,\n environment,\n widget: fromFile.widget !== false,\n };\n}\n\nexport async function writeConfigFile(cwd: string, config: ConfigFile): Promise<string> {\n const target = path.join(cwd, CONFIG_FILENAME);\n const content = JSON.stringify(config, null, 2) + '\\n';\n await writeFile(target, content, 'utf8');\n return target;\n}\n\n/**\n * Merge a new siteUuid into the existing `.patchstackrc.json` (or create it).\n * Preserves any `endpoint` / `timeoutMs` the user already wrote.\n */\nexport async function persistSiteUuid(cwd: string, siteUuid: string): Promise<string> {\n const existing = await readConfigFile(cwd);\n return writeConfigFile(cwd, { ...existing, siteUuid });\n}\n\nasync function readConfigFile(cwd: string): Promise<ConfigFile> {\n const target = path.join(cwd, CONFIG_FILENAME);\n let raw: string;\n try {\n raw = await readFile(target, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw new PatchstackError(\n `Could not read ${target}: ${(err as Error).message}`,\n 'CONFIG_INVALID',\n err,\n );\n }\n\n try {\n return JSON.parse(raw) as ConfigFile;\n } catch (err) {\n throw new PatchstackError(\n `Config file ${target} contains invalid JSON.`,\n 'CONFIG_INVALID',\n err,\n );\n }\n}\n\nfunction readEnv(): ConfigFile {\n const timeoutRaw = process.env.PATCHSTACK_TIMEOUT_MS;\n let timeoutMs: number | undefined;\n if (timeoutRaw !== undefined && timeoutRaw.length > 0) {\n const parsed = Number(timeoutRaw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new PatchstackError(\n `PATCHSTACK_TIMEOUT_MS must be a positive number; got \"${timeoutRaw}\".`,\n 'CONFIG_INVALID',\n );\n }\n timeoutMs = parsed;\n }\n const environmentRaw = process.env.PATCHSTACK_ENVIRONMENT;\n return {\n siteUuid: process.env.PATCHSTACK_SITE_UUID ?? undefined,\n endpoint: process.env.PATCHSTACK_ENDPOINT ?? undefined,\n timeoutMs,\n environment:\n environmentRaw !== undefined && environmentRaw.length > 0 ? environmentRaw : undefined,\n };\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction isEnvironment(value: string): value is Environment {\n return value === 'production' || value === 'sandbox';\n}\n","import { existsSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { isEmptyStack, type StackDescriptor } from './stack.js';\n\n/** Attribute that tags our injected <script> so re-runs replace it instead of stacking. */\nexport const MARKER_ATTR = 'data-patchstack-build';\n\n/** Build output directories we look for, in priority order (Vite, CRA, Next export, Nuxt). */\nexport const BUILD_DIR_CANDIDATES = ['dist', 'build', 'out', '.output/public'];\n\n/**\n * Resolve the directory holding the built HTML. Honours an explicit `--dir`\n * override, otherwise picks the first known build directory that exists.\n * Returns null when nothing is found (mark-build then no-ops without failing).\n */\nexport function resolveBuildDir(cwd: string, override?: string): string | null {\n if (override !== undefined && override !== '') {\n const abs = path.resolve(cwd, override);\n return existsSync(abs) && statSync(abs).isDirectory() ? abs : null;\n }\n\n for (const candidate of BUILD_DIR_CANDIDATES) {\n const abs = path.resolve(cwd, candidate);\n if (existsSync(abs) && statSync(abs).isDirectory()) {\n return abs;\n }\n }\n\n return null;\n}\n\n/** Recursively collect every `.html` file under `dir`. */\nexport function findHtmlFiles(dir: string): string[] {\n const out: string[] = [];\n\n const walk = (current: string): void => {\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.isFile() && entry.name.toLowerCase().endsWith('.html')) {\n out.push(full);\n }\n }\n };\n\n walk(dir);\n return out;\n}\n\n/**\n * The <script> we inject into built HTML. Always marks the build as production\n * (so the widget hides the connect/claim prompt on the published site) and, when\n * available, exposes the build fingerprint (for the parity heartbeat) and the\n * detected stack descriptor (so the widget can report how the site was built).\n */\nexport function buildInjectionSnippet(\n checksum: string | null,\n stack?: StackDescriptor | null,\n): string {\n const statements = ['window.__PATCHSTACK_PROD__=true;'];\n if (checksum !== null && checksum !== '') {\n statements.push(`window.__PATCHSTACK_BUILD__=${JSON.stringify(checksum)};`);\n }\n if (stack != null && !isEmptyStack(stack)) {\n statements.push(`window.__PATCHSTACK_STACK__=${JSON.stringify(stack)};`);\n }\n return `<script ${MARKER_ATTR}>${statements.join('')}</script>`;\n}\n\n/**\n * Insert (or replace) the marker script in a single HTML document. Idempotent:\n * a prior marker is stripped first so repeated builds don't stack tags. Prefers\n * `</head>`, falls back to `</body>`, then appends.\n */\nexport function injectMarker(html: string, snippet: string): string {\n const stripped = html.replace(\n new RegExp(`\\\\s*<script ${MARKER_ATTR}[^>]*>[\\\\s\\\\S]*?</script>`, 'gi'),\n '',\n );\n\n if (/<\\/head>/i.test(stripped)) {\n return stripped.replace(/<\\/head>/i, `${snippet}</head>`);\n }\n if (/<\\/body>/i.test(stripped)) {\n return stripped.replace(/<\\/body>/i, `${snippet}</body>`);\n }\n return stripped + snippet;\n}\n","import type { WirePackage } from './normalize.js';\n\n/**\n * A best-effort description of the stack a build was produced with, derived\n * entirely from the lockfile (ground truth) plus the build-time environment.\n *\n * The disclosure widget reads this from `window.__PATCHSTACK_STACK__` (injected\n * by `mark-build`) and reports it to Patchstack, so we learn how the sites we\n * protect are actually built and hosted — across every \"vibe\" platform — without\n * shipping a runtime probe onto the host server. Every field is a coarse label\n * or a bare key *name*: no versions beyond the framework, and never an env value.\n */\nexport interface StackDescriptor {\n /** App / meta-framework, e.g. \"next\", \"nuxt\", \"tanstack-start\", \"remix\". */\n framework: string | null;\n /** UI runtime, e.g. \"react\", \"vue\", \"svelte\", \"solid\". */\n ui: string | null;\n /** Build tool / bundler, e.g. \"vite\", \"webpack\", \"rspack\". */\n bundler: string | null;\n /** Deployment-runtime hint from deps, e.g. \"cloudflare-workers\", \"vercel\". */\n runtime: string | null;\n /** The vibe/builder platform that generated the project, e.g. \"lovable\". */\n builder: string | null;\n /** Package ecosystem the manifest came from. */\n ecosystem: 'npm';\n /** Hosting-related build-environment variable NAMES (never their values). */\n hostingEnvKeys: string[];\n}\n\ntype Category = 'framework' | 'ui' | 'bundler' | 'runtime' | 'builder';\n\ninterface StackRule {\n category: Category;\n /** Exact package name that signals this label. */\n pkg: string;\n label: string;\n}\n\n/**\n * Package → stack-label registry. First match per category wins, so order\n * within a category is priority order (most specific first). Add a row to teach\n * the connector a new framework, bundler, or vibe platform.\n */\nconst STACK_RULES: readonly StackRule[] = [\n // Meta-frameworks (most specific first).\n { category: 'framework', pkg: '@tanstack/react-start', label: 'tanstack-start' },\n { category: 'framework', pkg: '@tanstack/start', label: 'tanstack-start' },\n { category: 'framework', pkg: 'next', label: 'next' },\n { category: 'framework', pkg: 'nuxt', label: 'nuxt' },\n { category: 'framework', pkg: '@remix-run/react', label: 'remix' },\n { category: 'framework', pkg: '@remix-run/node', label: 'remix' },\n { category: 'framework', pkg: 'react-router', label: 'react-router' },\n { category: 'framework', pkg: 'astro', label: 'astro' },\n { category: 'framework', pkg: '@sveltejs/kit', label: 'sveltekit' },\n { category: 'framework', pkg: '@builder.io/qwik-city', label: 'qwik-city' },\n { category: 'framework', pkg: 'gatsby', label: 'gatsby' },\n { category: 'framework', pkg: 'express', label: 'express' },\n { category: 'framework', pkg: 'fastify', label: 'fastify' },\n\n // UI runtimes.\n { category: 'ui', pkg: '@angular/core', label: 'angular' },\n { category: 'ui', pkg: 'react-dom', label: 'react' },\n { category: 'ui', pkg: 'react', label: 'react' },\n { category: 'ui', pkg: 'vue', label: 'vue' },\n { category: 'ui', pkg: 'svelte', label: 'svelte' },\n { category: 'ui', pkg: 'solid-js', label: 'solid' },\n { category: 'ui', pkg: 'preact', label: 'preact' },\n\n // Bundlers / build tools.\n { category: 'bundler', pkg: 'vite', label: 'vite' },\n { category: 'bundler', pkg: '@rspack/core', label: 'rspack' },\n { category: 'bundler', pkg: 'webpack', label: 'webpack' },\n { category: 'bundler', pkg: 'parcel', label: 'parcel' },\n { category: 'bundler', pkg: 'rollup', label: 'rollup' },\n { category: 'bundler', pkg: 'esbuild', label: 'esbuild' },\n\n // Deployment-runtime hints from build deps.\n { category: 'runtime', pkg: 'wrangler', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@cloudflare/workers-types', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@cloudflare/vite-plugin', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@vercel/node', label: 'vercel' },\n { category: 'runtime', pkg: '@netlify/functions', label: 'netlify' },\n { category: 'runtime', pkg: '@netlify/blobs', label: 'netlify' },\n\n // Vibe / builder platforms — the \"learn from each platform\" signal.\n { category: 'builder', pkg: 'lovable-tagger', label: 'lovable' },\n { category: 'builder', pkg: '@replit/vite-plugin-runtime-error-modal', label: 'replit' },\n { category: 'builder', pkg: '@replit/vite-plugin-cartographer', label: 'replit' },\n];\n\n/** Build-environment variable-name patterns that fingerprint a host, from server-insight. */\nconst HOSTING_ENV_PATTERNS: readonly RegExp[] = [\n /^CF_/,\n /^CLOUDFLARE_/,\n /^VERCEL/,\n /^NETLIFY/,\n /^AWS_(LAMBDA|REGION|EXECUTION)/,\n /^FLY_/,\n /^RENDER/,\n /^RAILWAY_/,\n /^DENO_/,\n /^EDGE_RUNTIME/,\n /^DYNO$/,\n /^K_SERVICE$/,\n /^GAE_/,\n /^FUNCTION_/,\n];\n\n/**\n * Return the sorted NAMES of hosting-related environment variables present in\n * `env`. Only names are surfaced — never values — so a build fingerprint can\n * distinguish \"deployed on Cloudflare\" from \"deployed on Vercel\" without ever\n * disclosing a secret.\n */\nexport function collectHostingEnvKeys(env: NodeJS.ProcessEnv = process.env): string[] {\n return Object.keys(env)\n .filter((key) => HOSTING_ENV_PATTERNS.some((pattern) => pattern.test(key)))\n .sort();\n}\n\n/**\n * Derive a {@link StackDescriptor} from the wire packages and the build\n * environment. Never throws: an unrecognised stack just yields nulls.\n */\nexport function detectStack(\n packages: readonly WirePackage[],\n env: NodeJS.ProcessEnv = process.env,\n): StackDescriptor {\n const present = new Set(packages.map((pkg) => pkg.name));\n\n const firstMatch = (category: Category): string | null => {\n for (const rule of STACK_RULES) {\n if (rule.category === category && present.has(rule.pkg)) {\n return rule.label;\n }\n }\n return null;\n };\n\n return {\n framework: firstMatch('framework'),\n ui: firstMatch('ui'),\n bundler: firstMatch('bundler'),\n runtime: firstMatch('runtime'),\n builder: firstMatch('builder'),\n ecosystem: 'npm',\n hostingEnvKeys: collectHostingEnvKeys(env),\n };\n}\n\n/** True when the descriptor carries no useful signal (nothing worth injecting). */\nexport function isEmptyStack(stack: StackDescriptor): boolean {\n return (\n stack.framework === null &&\n stack.ui === null &&\n stack.bundler === null &&\n stack.runtime === null &&\n stack.builder === null &&\n stack.hostingEnvKeys.length === 0\n );\n}\n","// `patchstack-connect guide` — a state-aware setup checklist.\n//\n// Instead of only printing the generic AGENT-INSTALL.md, the guide first inspects\n// the current project (package.json, lockfile, .patchstackrc.json, source tree)\n// and renders a checklist of what is already done and what is still missing, with\n// the exact commands/snippets for THIS project (right package manager, real site\n// UUID, framework-specific widget placement). Every probe is best-effort: an\n// unreadable project degrades to an all-todo checklist, never a crash.\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { DEFAULT_ENDPOINT, buildClaimUrl } from './client.js';\nimport { resolveConfig } from './config.js';\nimport { detectStack } from './stack.js';\nimport { buildWidgetTag } from './widget.js';\n\n/** Substring that marks the widget as installed anywhere in the source tree. */\nconst WIDGET_NEEDLE = 'patchstack-widget';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport interface GuideState {\n /** package.json `name`, when readable. */\n projectName: string | null;\n hasPackageJson: boolean;\n packageManager: PackageManager;\n /** Version + section when @patchstack/connect is declared, else null. */\n installed: { version: string; section: 'devDependencies' | 'dependencies' } | null;\n siteUuid: string | null;\n claimUrl: string | null;\n /** Non-default API endpoint in effect (rc file, env, or flag), else null. */\n endpointOverride: string | null;\n prebuildWired: boolean;\n postbuildWired: boolean;\n widgetInstalled: boolean;\n /** False when the widget is present but its site UUID isn't this project's. */\n widgetTokenMatches: boolean | null;\n /** True when .patchstackrc.json opts out of widget management (\"widget\": false). */\n widgetOptOut: boolean;\n /** Framework label from the declared dependencies (e.g. \"next\"), best-effort. */\n framework: string | null;\n /** Existing file the widget snippet belongs in, best-effort. */\n widgetFileHint: string | null;\n}\n\nconst INSTALL_COMMANDS: Record<PackageManager, string> = {\n npm: 'npm install --save-dev @patchstack/connect',\n pnpm: 'pnpm add -D @patchstack/connect',\n yarn: 'yarn add -D @patchstack/connect',\n bun: 'bun add -d @patchstack/connect',\n};\n\n/**\n * Lockfile → package manager for build-script semantics. Platform-native\n * lockfiles win over package-lock.json because agents often use npm as a\n * fallback inside Bun/pnpm/yarn projects, creating a secondary npm lockfile\n * without changing the platform's actual build runner.\n */\nconst PM_BY_LOCKFILE: ReadonlyArray<{ filename: string; pm: PackageManager }> = [\n { filename: 'bun.lock', pm: 'bun' },\n { filename: 'bun.lockb', pm: 'bun' },\n { filename: 'pnpm-lock.yaml', pm: 'pnpm' },\n { filename: 'yarn.lock', pm: 'yarn' },\n { filename: 'package-lock.json', pm: 'npm' },\n];\n\n/**\n * Framework → candidate layout files the widget snippet belongs in, most\n * specific first. The first candidate that exists in the project wins.\n */\nconst WIDGET_FILE_CANDIDATES: Record<string, string[]> = {\n next: [\n 'app/layout.tsx',\n 'app/layout.jsx',\n 'src/app/layout.tsx',\n 'src/app/layout.jsx',\n 'pages/_document.tsx',\n 'pages/_document.jsx',\n 'src/pages/_document.tsx',\n ],\n nuxt: ['app.vue', 'src/app.vue', 'app/app.vue'],\n remix: ['app/root.tsx', 'app/root.jsx'],\n 'react-router': ['app/root.tsx', 'src/root.tsx'],\n 'tanstack-start': ['src/routes/__root.tsx', 'app/routes/__root.tsx'],\n sveltekit: ['src/app.html'],\n astro: ['src/layouts/Layout.astro'],\n gatsby: ['src/html.js'],\n};\n\n/** Fallback candidates for plain Vite / CRA / static projects. */\nconst GENERIC_WIDGET_FILES = ['index.html', 'public/index.html'];\n\n/** Directories never worth searching for the widget snippet. */\nconst SKIPPED_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.output',\n '.next',\n '.nuxt',\n '.svelte-kit',\n '.vercel',\n '.netlify',\n 'coverage',\n 'vendor',\n]);\n\n/** Source extensions that can carry the widget <script> tags. */\nconst WIDGET_EXTENSIONS = new Set([\n '.html',\n '.htm',\n '.tsx',\n '.jsx',\n '.ts',\n '.js',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n '.ejs',\n '.hbs',\n]);\n\nconst WIDGET_SCAN_MAX_FILES = 4000;\nconst WIDGET_SCAN_MAX_DEPTH = 6;\nconst WIDGET_SCAN_MAX_BYTES = 512 * 1024;\n\ninterface PackageJson {\n name?: string;\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n const declared = readPackageJson(cwd)?.packageManager?.split('@')[0];\n if (declared === 'npm' || declared === 'pnpm' || declared === 'yarn' || declared === 'bun') {\n return declared;\n }\n for (const { filename, pm } of PM_BY_LOCKFILE) {\n if (existsSync(path.join(cwd, filename))) {\n return pm;\n }\n }\n return 'npm';\n}\n\nexport function installCommand(pm: PackageManager): string {\n return INSTALL_COMMANDS[pm];\n}\n\nfunction readPackageJson(cwd: string): PackageJson | null {\n try {\n return JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8')) as PackageJson;\n } catch {\n return null;\n }\n}\n\n/** Prefer the actually-installed version over the declared range. */\nfunction installedVersion(cwd: string, declaredRange: string): string {\n try {\n const pkg = JSON.parse(\n readFileSync(path.join(cwd, 'node_modules', '@patchstack', 'connect', 'package.json'), 'utf8'),\n ) as { version?: string };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // fall through to the declared range\n }\n return declaredRange;\n}\n\nexport interface WidgetScanResult {\n found: boolean;\n /**\n * When a site UUID is known: does any file carrying the widget also carry\n * that UUID as its userToken? null when the widget is absent or no UUID is\n * known yet. A stale/wrong userToken makes the widget silently no-op, so a\n * mismatch is worth surfacing rather than passing the check.\n */\n uuidMatches: boolean | null;\n}\n\n/**\n * Bounded recursive search for the widget marker in the source tree. Depth,\n * file-count and file-size capped so the guide stays instant on big projects.\n */\nexport function findWidgetMarker(cwd: string, siteUuid?: string | null): WidgetScanResult {\n let budget = WIDGET_SCAN_MAX_FILES;\n let sawWidget = false;\n let sawTokenMatch = false;\n\n // Stop early only once the answer can't improve: with no UUID to match, the\n // first hit settles it; with a UUID, keep looking until a matching file shows.\n const settled = (): boolean => sawTokenMatch || (sawWidget && siteUuid == null);\n\n const walk = (dir: string, depth: number): void => {\n if (depth > WIDGET_SCAN_MAX_DEPTH || budget <= 0) {\n return;\n }\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (budget <= 0 || settled()) {\n return;\n }\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIPPED_DIRS.has(entry.name) || entry.name.startsWith('.')) {\n continue;\n }\n walk(full, depth + 1);\n continue;\n }\n if (!entry.isFile() || !WIDGET_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n budget -= 1;\n try {\n if (statSync(full).size > WIDGET_SCAN_MAX_BYTES) {\n continue;\n }\n const content = readFileSync(full, 'utf8');\n if (!content.includes(WIDGET_NEEDLE)) {\n continue;\n }\n sawWidget = true;\n if (siteUuid != null && content.includes(siteUuid)) {\n sawTokenMatch = true;\n }\n } catch {\n // unreadable file — skip\n }\n }\n };\n\n walk(cwd, 0);\n return {\n found: sawWidget,\n uuidMatches: sawWidget && siteUuid != null ? sawTokenMatch : null,\n };\n}\n\nfunction resolveWidgetFileHint(cwd: string, framework: string | null): string | null {\n const candidates = [\n ...(framework !== null ? WIDGET_FILE_CANDIDATES[framework] ?? [] : []),\n ...GENERIC_WIDGET_FILES,\n ];\n for (const candidate of candidates) {\n if (existsSync(path.join(cwd, candidate))) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function collectGuideState(cwd: string): Promise<GuideState> {\n const pkg = readPackageJson(cwd);\n const packageManager = detectPackageManager(cwd);\n\n let installed: GuideState['installed'] = null;\n if (pkg?.devDependencies?.['@patchstack/connect'] !== undefined) {\n installed = {\n version: installedVersion(cwd, pkg.devDependencies['@patchstack/connect']),\n section: 'devDependencies',\n };\n } else if (pkg?.dependencies?.['@patchstack/connect'] !== undefined) {\n installed = {\n version: installedVersion(cwd, pkg.dependencies['@patchstack/connect']),\n section: 'dependencies',\n };\n }\n\n let siteUuid: string | null = null;\n let claimUrl: string | null = null;\n let endpointOverride: string | null = null;\n let widgetOptOut = false;\n try {\n const config = await resolveConfig({ cwd });\n siteUuid = config.siteUuid;\n if (siteUuid !== null) {\n claimUrl = buildClaimUrl(config.endpoint, siteUuid);\n }\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n endpointOverride = config.endpoint;\n }\n widgetOptOut = !config.widget;\n } catch {\n // invalid config — the checklist just shows the site as not provisioned\n }\n\n // Framework detection needs only the declared top-level dependencies, so we\n // read package.json instead of the (much heavier) lockfile scan.\n const declaredNames = Object.keys({ ...pkg?.dependencies, ...pkg?.devDependencies });\n const stack = detectStack(\n declaredNames.map((name) => ({ name, version: '' })),\n {},\n );\n\n const widget = findWidgetMarker(cwd, siteUuid);\n\n return {\n projectName: pkg?.name ?? null,\n hasPackageJson: pkg !== null,\n packageManager,\n installed,\n siteUuid,\n claimUrl,\n endpointOverride,\n // bun run doesn't execute npm-style pre/post scripts, so chaining inside\n // the build script itself also counts as wired (and is what we suggest on bun).\n prebuildWired:\n (pkg?.scripts?.prebuild ?? '').includes('patchstack-connect scan') ||\n (pkg?.scripts?.build ?? '').includes('patchstack-connect scan'),\n postbuildWired:\n (pkg?.scripts?.postbuild ?? '').includes('patchstack-connect mark-build') ||\n (pkg?.scripts?.build ?? '').includes('patchstack-connect mark-build'),\n widgetInstalled: widget.found,\n widgetTokenMatches: widget.uuidMatches,\n widgetOptOut,\n framework: stack.framework,\n widgetFileHint: resolveWidgetFileHint(cwd, stack.framework),\n };\n}\n\nconst ANSI = {\n reset: '\\u001B[0m',\n bold: '\\u001B[1m',\n dim: '\\u001B[2m',\n green: '\\u001B[32m',\n yellow: '\\u001B[33m',\n cyan: '\\u001B[36m',\n};\n\n/** Setup steps still missing — 0 means the checklist is fully green. */\nexport function countRemainingSteps(state: GuideState): number {\n return [\n state.installed !== null,\n state.siteUuid !== null,\n state.prebuildWired && state.postbuildWired,\n state.widgetOptOut || (state.widgetInstalled && state.widgetTokenMatches !== false),\n ].filter((step) => !step).length;\n}\n\nexport function renderGuideChecklist(state: GuideState, useColor: boolean): string {\n const paint = (code: string, text: string): string =>\n useColor ? `${code}${text}${ANSI.reset}` : text;\n const done = (text: string): string => ` ${paint(ANSI.green, '✔')} ${text}`;\n const todo = (text: string): string => ` ${paint(ANSI.yellow, '✖')} ${paint(ANSI.bold, text)}`;\n const detail = (text: string): string => ` ${paint(ANSI.dim, text)}`;\n const lines: string[] = [];\n\n const headerParts = [state.framework, state.packageManager].filter(\n (part): part is string => part !== null,\n );\n const name = state.projectName ?? path.basename(process.cwd());\n lines.push(paint(ANSI.bold, `Patchstack setup status — ${name} (${headerParts.join(' · ')})`));\n if (state.endpointOverride !== null) {\n lines.push(\n detail(\n `endpoint override in effect: ${state.endpointOverride} (set via .patchstackrc.json, PATCHSTACK_ENDPOINT, or --endpoint)`,\n ),\n );\n }\n lines.push('');\n\n if (!state.hasPackageJson) {\n lines.push(todo('No package.json found in this directory.'));\n lines.push(detail('Run the guide from the project root.'));\n return lines.join('\\n');\n }\n\n // 1. Install\n if (state.installed !== null) {\n lines.push(done(`@patchstack/connect installed (${state.installed.version}, ${state.installed.section})`));\n } else {\n lines.push(todo('Install @patchstack/connect as a dev dependency'));\n lines.push(detail(`Run → ${installCommand(state.packageManager)}`));\n if (state.packageManager === 'bun') {\n lines.push(detail(`(if bun isn't available here, ${INSTALL_COMMANDS.npm} works too)`));\n }\n }\n\n // 2. Provision (first scan)\n if (state.siteUuid !== null) {\n lines.push(done(`Site provisioned (${state.siteUuid})`));\n } else {\n lines.push(todo('Provision the site — run the first scan'));\n lines.push(detail('Run → npx @patchstack/connect scan'));\n lines.push(detail('Reads the lockfile, registers the project, writes .patchstackrc.json,'));\n lines.push(detail('and prints a dashboard link. The CLI prints the link but never opens it.'));\n }\n\n // 3. Build hooks\n if (state.prebuildWired && state.postbuildWired) {\n lines.push(done('Build hooks wired (scan before builds, mark-build after)'));\n } else if (state.packageManager === 'bun') {\n // bun run skips npm-style pre/post scripts, so chain inside the build script.\n lines.push(todo('Wire the build hooks yourself — edit package.json (bun skips pre/post hooks, so chain inside \"build\")'));\n lines.push(detail('Edit package.json → \"build\": \"patchstack-connect scan && <existing build command> && patchstack-connect mark-build\"'));\n } else {\n lines.push(todo('Wire the build hooks yourself — edit package.json \"scripts\" (chain with && if a hook already exists)'));\n if (!state.prebuildWired) {\n lines.push(detail('Edit package.json → \"prebuild\": \"patchstack-connect scan\"'));\n }\n if (!state.postbuildWired) {\n lines.push(detail('Edit package.json → \"postbuild\": \"patchstack-connect mark-build\"'));\n }\n }\n\n // 4. Disclosure widget\n const widgetOk = state.widgetInstalled && state.widgetTokenMatches !== false;\n if (state.widgetOptOut && !widgetOk) {\n lines.push(done('Disclosure widget disabled by config (\"widget\": false in .patchstackrc.json)'));\n } else if (widgetOk) {\n lines.push(done('Disclosure widget installed'));\n } else if (state.widgetInstalled) {\n lines.push(todo(\"Fix the disclosure widget yourself — its site UUID doesn't match this project's\"));\n lines.push(detail(`Edit the widget tag → set data-site-uuid (or userToken) to '${state.siteUuid}' (a wrong UUID makes the widget silently no-op)`));\n } else if (state.siteUuid === null) {\n lines.push(todo('Add the \"Report a vulnerability\" widget — the first scan does this for you'));\n lines.push(detail('Run → npx @patchstack/connect scan (provisions the site and adds the widget tag'));\n lines.push(detail(' to the root HTML shell: index.html / public/index.html / src/app.html)'));\n } else {\n lines.push(todo('Add the \"Report a vulnerability\" widget yourself — this root is code, not a plain HTML shell'));\n lines.push(detail('Note → a normal `scan` adds this tag to a plain HTML shell automatically; add it by hand here:'));\n const placement =\n state.widgetFileHint !== null\n ? `Edit ${state.widgetFileHint} → put it just before </body>:`\n : \"Edit your root layout → put it just before </body> (the framework's HTML/layout mechanism, never a JS entry point):\";\n lines.push(detail(placement));\n lines.push(detail(` ${buildWidgetTag(state.siteUuid)}`));\n lines.push(detail('The site UUID is public by design — it ships in client-side HTML.'));\n }\n\n // 5. Dashboard access — always keep the URL prominent.\n lines.push('');\n if (state.claimUrl !== null) {\n lines.push(` ${paint(ANSI.cyan, '➜')} ${paint(ANSI.bold, 'Dashboard link (open to view reports):')}`);\n lines.push(` ${paint(ANSI.cyan, state.claimUrl)}`);\n lines.push(detail('Open this link in a browser. The CLI never opens it.'));\n if (state.endpointOverride !== null) {\n lines.push(detail('(this URL inherits the endpoint override above)'));\n }\n } else {\n lines.push(detail('The dashboard link appears after the first scan (re-print any time with `status`).'));\n }\n\n const remaining = countRemainingSteps(state);\n lines.push('');\n if (remaining === 0) {\n lines.push(\n done(\n paint(\n ANSI.bold,\n 'All setup steps complete. Commit .patchstackrc.json, package.json, and the file carrying the widget snippet.',\n ),\n ),\n );\n if (state.claimUrl !== null) {\n lines.push(detail('The only manual action left is opening the dashboard link above (if not already connected).'));\n }\n } else {\n lines.push(\n ` ${paint(ANSI.yellow, String(remaining))} step(s) remaining — details in the reference guide below.`,\n );\n }\n\n return lines.join('\\n');\n}\n","// Managed disclosure-widget tag — the connector installs the widget for you.\n//\n// After a successful scan the connector ensures the site's root HTML shell\n// carries the widget's one-liner CDN tag (the canonical install form from the\n// widget docs: a single <script> with `data-site-uuid`, auto-initialising on\n// DOMContentLoaded). The tag carries an ownership attribute so re-runs update\n// it in place instead of stacking copies, and so `uninstall` flows can find it.\n// A manual/legacy install (any other reference to the widget script) is always\n// left untouched — we never convert or duplicate someone's hand-rolled tag.\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const WIDGET_SCRIPT_URL = 'https://cdn.patchstack.com/patchstack-widget.js';\n\n/** Attribute that tags the connector-managed widget tag so re-runs update it. */\nexport const WIDGET_MARKER_ATTR = 'data-patchstack-connect-widget';\n\n/** Substring that marks any widget install (managed or manual) in HTML. */\nconst WIDGET_NEEDLE = 'patchstack-widget';\n\n/**\n * Root HTML shells the connector is willing to edit, in priority order:\n * Vite/plain SPA, CRA-style, SvelteKit. Framework layouts that are code rather\n * than HTML (Next/Nuxt/Astro layouts) are never edited automatically — `guide`\n * prints the snippet and the right file for those.\n */\nexport const SOURCE_SHELL_CANDIDATES = ['index.html', 'public/index.html', 'src/app.html'];\n\nexport function buildWidgetTag(siteUuid: string): string {\n return `<script src=\"${WIDGET_SCRIPT_URL}\" data-site-uuid=\"${siteUuid}\" defer ${WIDGET_MARKER_ATTR}=\"true\"></script>`;\n}\n\nexport type WidgetEnsureAction =\n /** No widget present — the managed tag was inserted before </body>. */\n | 'added'\n /** A managed tag existed with a different UUID — replaced in place. */\n | 'updated'\n /** The managed tag is already present and current. */\n | 'unchanged'\n /** A manual (non-managed) widget install exists — left untouched. */\n | 'manual'\n /** The document has no </body> to anchor on — nothing was changed. */\n | 'no-body';\n\nexport interface WidgetEnsureResult {\n html: string;\n action: WidgetEnsureAction;\n}\n\nconst MANAGED_TAG_RE = new RegExp(\n `<script[^>]*${WIDGET_MARKER_ATTR}[^>]*>\\\\s*</script>`,\n 'i',\n);\n\n/**\n * Ensure a single HTML document carries the managed widget tag. Idempotent:\n * updates the managed tag in place, adopts (leaves alone) manual installs, and\n * only ever inserts immediately before </body>.\n */\nexport function ensureWidgetInHtml(html: string, siteUuid: string): WidgetEnsureResult {\n const tag = buildWidgetTag(siteUuid);\n\n const managed = html.match(MANAGED_TAG_RE);\n if (managed !== null) {\n if (managed[0].includes(`data-site-uuid=\"${siteUuid}\"`)) {\n return { html, action: 'unchanged' };\n }\n return { html: html.replace(MANAGED_TAG_RE, tag), action: 'updated' };\n }\n\n if (html.includes(WIDGET_NEEDLE)) {\n return { html, action: 'manual' };\n }\n\n const bodyClose = html.match(/([ \\t]*)<\\/body>/i);\n if (bodyClose === null || bodyClose.index === undefined) {\n return { html, action: 'no-body' };\n }\n const indent = bodyClose[1] ?? '';\n const insertion = `${indent} ${tag}\\n${indent}</body>`;\n return {\n html: html.slice(0, bodyClose.index) + insertion + html.slice(bodyClose.index + bodyClose[0].length),\n action: 'added',\n };\n}\n\n/** First editable root HTML shell in the project, or null when there is none. */\nexport function findSourceShell(cwd: string): string | null {\n for (const candidate of SOURCE_SHELL_CANDIDATES) {\n if (existsSync(path.join(cwd, candidate))) {\n return candidate;\n }\n }\n return null;\n}\n\nexport interface SourceWidgetResult {\n /** Project-relative path of the shell that was inspected, or null. */\n shell: string | null;\n action: WidgetEnsureAction | 'no-shell';\n}\n\n/**\n * Ensure the managed widget tag in the project's root HTML shell. Edits at most\n * that one file; returns what happened so the caller can report it.\n */\nexport function ensureSourceWidget(cwd: string, siteUuid: string): SourceWidgetResult {\n const shell = findSourceShell(cwd);\n if (shell === null) {\n return { shell: null, action: 'no-shell' };\n }\n const file = path.join(cwd, shell);\n const before = readFileSync(file, 'utf8');\n const { html, action } = ensureWidgetInHtml(before, siteUuid);\n if (html !== before) {\n writeFileSync(file, html);\n }\n return { shell, action };\n}\n","// `patchstack-connect protect` — installs the runtime guard into a TanStack Start + Supabase app.\n//\n// \"Add Patchstack\" already installs the connector; this wires the always-on guard so exploit\n// requests against known-vulnerable packages are blocked, with zero changes to the user's own\n// code. Idempotent (safe to re-run).\n//\n// The engine ships inside @patchstack/connect (exported as @patchstack/connect/protect), so the\n// scaffolded guard just imports it — no extra dependency, no local manifest. Rules come from the\n// Patchstack API at runtime (cached), with a bundled fallback until a token is configured.\n\nimport { readFileSync, writeFileSync, existsSync, mkdirSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\n// Guard templates ship next to the built CLI (dist/protect/templates). Resolve for both the\n// built layout (install.ts is bundled into dist/cli.js at the dist root → protect/templates) and\n// the source layout (install.ts lives in src/protect/ → templates is a sibling).\nconst HERE = dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES =\n [join(HERE, 'protect', 'templates'), join(HERE, 'templates')].find((p) => existsSync(p)) ??\n join(HERE, 'protect', 'templates');\nconst APP = process.cwd();\nconst PS_DIR = join(APP, 'src/integrations/patchstack');\n\nconst read = (p: string) => readFileSync(p, 'utf8');\nconst log = (msg: string) => console.log(`patchstack protect: ${msg}`);\n\nconst CLIENT_TUNNEL = [\n '',\n \" // PATCHSTACK: in the browser, tunnel Supabase traffic through the app's own server guard\",\n ' // (same-origin) so payloads are inspected before they reach Supabase.',\n \" if (typeof window !== 'undefined') {\",\n \" const target = typeof input === 'string' ? input : input instanceof Request ? input.url : String(input);\",\n \" const method = init?.method ?? (input instanceof Request ? input.method : 'GET');\",\n \" headers.set('x-ps-target', target);\",\n \" const guardUrl = new URL('/_patchstack/guard', window.location.origin).toString();\",\n ' return fetch(guardUrl, { ...init, method, headers });',\n ' }',\n '',\n].join('\\n');\n\nconst START_IMPORTS = [\n 'import { getRequest } from \"@tanstack/react-start/server\";',\n 'import { GUARD_PATH, handleGuardRequest, inspectServerFn, screenResponse } from \"@/integrations/patchstack/guard\";',\n].join('\\n');\n\nconst REQUEST_MIDDLEWARE_DEF = [\n '',\n '// Patchstack guard (browser tunnel): intercept tunneled Supabase traffic before anything else,',\n '// then screen the outgoing response (SSR HTML / data) for leaked secrets & PII.',\n 'const patchstackGuard = createMiddleware().server(async ({ next }) => {',\n ' const request = getRequest();',\n ' if (request) {',\n ' const { pathname } = new URL(request.url);',\n ' if (pathname === GUARD_PATH) return handleGuardRequest(request);',\n ' }',\n ' return screenResponse(await next());',\n '});',\n '',\n].join('\\n');\n\nconst FUNCTION_MIDDLEWARE_DEF = [\n '',\n '// Patchstack guard (server functions): inspect server-fn args before they reach the database,',\n '// covering apps that mutate via TanStack server functions (which bypass the browser tunnel).',\n 'const patchstackFunctionGuard = createMiddleware({ type: \"function\" }).server(async ({ next, data }) => {',\n ' const blocked = await inspectServerFn(data);',\n ' if (blocked) throw new Error(blocked.message);',\n ' return next();',\n '});',\n '',\n].join('\\n');\n\nexport function detectSupportedStack(cwd: string): boolean {\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) return false;\n const pkg = JSON.parse(read(pkgPath));\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n return (\n Boolean(deps['@tanstack/react-start']) &&\n existsSync(join(cwd, 'src/start.ts')) &&\n existsSync(join(cwd, 'src/integrations/supabase/client.ts'))\n );\n}\n\nfunction scaffold(cwd: string): void {\n const dst = join(cwd, 'src/integrations/patchstack');\n mkdirSync(dst, { recursive: true });\n copyFileSync(join(TEMPLATES, 'guard.ts'), join(dst, 'guard.ts'));\n copyFileSync(join(TEMPLATES, 'rules.json'), join(dst, 'rules.json'));\n log('scaffolded guard.ts + rules.json');\n}\n\n// Bake the site UUID from .patchstackrc.json (written by `patchstack-connect scan`) into the\n// scaffolded guard, so the deployed Worker calls the live Pulse rules API with zero user config.\n// Left as the inert placeholder (guard falls back to PATCHSTACK_SITE_UUID env / bundled rules)\n// when the app hasn't been scanned yet or the file can't be read.\nfunction bakeSiteUuid(cwd: string): void {\n const rc = join(cwd, '.patchstackrc.json');\n if (!existsSync(rc)) return log('no .patchstackrc.json — guard uses PATCHSTACK_SITE_UUID env or the bundled fallback');\n let uuid: string | undefined;\n try {\n uuid = JSON.parse(read(rc)).siteUuid;\n } catch {\n return log('.patchstackrc.json unreadable — skipping site-UUID bake');\n }\n // Guard on UUID format so a malformed value falls through to the inert placeholder rather\n // than baking junk into a TS string literal (broken build / replace-token hazards).\n if (!uuid || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(uuid)) {\n return log('.patchstackrc.json siteUuid missing or malformed — guard uses PATCHSTACK_SITE_UUID env or the bundled fallback');\n }\n const p = join(cwd, 'src/integrations/patchstack/guard.ts');\n if (!existsSync(p)) return;\n const s = read(p);\n if (!s.includes('__PATCHSTACK_SITE_UUID__')) return log('guard.ts site UUID already baked');\n writeFileSync(p, s.replace('__PATCHSTACK_SITE_UUID__', uuid));\n log('baked site UUID into guard.ts — live rules from the Patchstack API');\n}\n\nfunction patchClient(cwd: string): void {\n const p = join(cwd, 'src/integrations/supabase/client.ts');\n let s = read(p);\n if (s.includes('x-ps-target')) return log('client.ts already wired');\n const anchor = \"headers.set('apikey', supabaseKey);\";\n if (!s.includes(anchor)) return log('client.ts anchor not found — skipping (template changed?)');\n writeFileSync(p, s.replace(anchor, anchor + '\\n' + CLIENT_TUNNEL));\n log('patched client.ts (tunnel Supabase through the guard)');\n}\n\nfunction patchStart(cwd: string): void {\n const p = join(cwd, 'src/start.ts');\n let s = read(p);\n const importAnchor = 'import { createStart, createMiddleware } from \"@tanstack/react-start\";';\n const exportAnchor = 'export const startInstance';\n const rmAnchor = 'requestMiddleware: [';\n if (!s.includes(importAnchor) || !s.includes(exportAnchor)) {\n return log('start.ts anchors not found — skipping (template changed?)');\n }\n\n // Each step is independently idempotent, so re-running `protect` (including after a connect\n // upgrade that adds a new guard) reconciles only what's missing — never duplicates, never\n // silently skips a newly-added piece.\n const original = s;\n\n // Imports.\n if (!s.includes('@/integrations/patchstack/guard')) {\n s = s.replace(importAnchor, importAnchor + '\\n' + START_IMPORTS);\n } else if (!s.includes('inspectServerFn')) {\n // Upgrade from a build that only wired the browser tunnel: pull in inspectServerFn.\n s = s.replace(\n 'import { GUARD_PATH, handleGuardRequest } from \"@/integrations/patchstack/guard\";',\n 'import { GUARD_PATH, handleGuardRequest, inspectServerFn } from \"@/integrations/patchstack/guard\";',\n );\n }\n\n // Middleware definitions (each only if its const isn't already present).\n if (!s.includes('const patchstackGuard =')) {\n s = s.replace(exportAnchor, REQUEST_MIDDLEWARE_DEF + '\\n' + exportAnchor);\n }\n if (!s.includes('const patchstackFunctionGuard =')) {\n s = s.replace(exportAnchor, FUNCTION_MIDDLEWARE_DEF + '\\n' + exportAnchor);\n }\n\n // Register the browser-tunnel guard in requestMiddleware.\n if (s.includes(rmAnchor) && !s.includes('requestMiddleware: [patchstackGuard')) {\n s = s.replace(rmAnchor, rmAnchor + 'patchstackGuard, ');\n }\n\n // Register the server-function guard in functionMiddleware (create the key if the app has none).\n if (!s.includes('functionMiddleware: [patchstackFunctionGuard')) {\n const fmAnchor = 'functionMiddleware: [';\n if (s.includes(fmAnchor)) {\n s = s.replace(fmAnchor, fmAnchor + 'patchstackFunctionGuard, ');\n } else if (s.includes(rmAnchor)) {\n s = s.replace(rmAnchor, 'functionMiddleware: [patchstackFunctionGuard],\\n ' + rmAnchor);\n }\n }\n\n if (s === original) return log('start.ts already wired');\n writeFileSync(p, s);\n log('patched start.ts (guard registered as request + function middleware)');\n}\n\n/** Scaffold + wire the runtime guard into the app. */\nexport function runProtect(cwd: string): void {\n if (!detectSupportedStack(cwd)) {\n log('runtime protection currently supports TanStack Start + Supabase apps; stack not detected — skipping.');\n return;\n }\n scaffold(cwd);\n bakeSiteUuid(cwd);\n patchClient(cwd);\n patchStart(cwd);\n log('done — guard wired and always-on (blocks by default). Set PATCHSTACK_MODE=dry-run for log-only.');\n}\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport type { PackageManager } from './guide.js';\n\nconst SCAN_COMMAND = 'patchstack-connect scan';\nconst MARK_BUILD_COMMAND = 'patchstack-connect mark-build';\n\ninterface PackageJson {\n scripts?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface WireBuildScriptsResult {\n changed: boolean;\n strategy: 'build-chain' | 'lifecycle-hooks' | 'skipped';\n detail: string;\n}\n\n/** Add `command` after an existing lifecycle hook without duplicating it. */\nfunction appendHook(existing: string | undefined, command: string): string {\n if (existing === undefined || existing.trim().length === 0) {\n return command;\n }\n if (existing.includes(command)) {\n return existing;\n }\n return `${existing} && ${command}`;\n}\n\n/**\n * Wire scans around the project's build without invoking a shell or running the\n * build. Bun skips npm-style pre/post hooks, so Bun projects get a direct build\n * chain; other package managers get lifecycle hooks. Existing commands are\n * preserved and the operation is idempotent.\n */\nexport function wireBuildScripts(\n cwd: string,\n packageManager: PackageManager,\n): WireBuildScriptsResult {\n const target = path.join(cwd, 'package.json');\n const raw = readFileSync(target, 'utf8');\n const pkg = JSON.parse(raw) as PackageJson;\n const scripts = pkg.scripts ?? {};\n const build = scripts.build;\n\n if (build === undefined || build.trim().length === 0) {\n return {\n changed: false,\n strategy: 'skipped',\n detail: 'package.json has no build script; no build integration was added.',\n };\n }\n\n if (packageManager === 'bun') {\n let nextBuild = build;\n if (!nextBuild.includes(SCAN_COMMAND)) {\n nextBuild = `${SCAN_COMMAND} && ${nextBuild}`;\n }\n if (!nextBuild.includes(MARK_BUILD_COMMAND)) {\n nextBuild = `${nextBuild} && ${MARK_BUILD_COMMAND}`;\n }\n if (nextBuild === build) {\n return {\n changed: false,\n strategy: 'build-chain',\n detail: 'build script already runs scan and mark-build.',\n };\n }\n scripts.build = nextBuild;\n } else {\n const prebuild = appendHook(scripts.prebuild, SCAN_COMMAND);\n const postbuild = appendHook(scripts.postbuild, MARK_BUILD_COMMAND);\n if (prebuild === scripts.prebuild && postbuild === scripts.postbuild) {\n return {\n changed: false,\n strategy: 'lifecycle-hooks',\n detail: 'prebuild and postbuild hooks are already wired.',\n };\n }\n scripts.prebuild = prebuild;\n scripts.postbuild = postbuild;\n }\n\n pkg.scripts = scripts;\n const indentMatch = raw.match(/^[\\t ]+(?=\")/m)?.[0];\n const indent = indentMatch?.includes('\\t') ? '\\t' : indentMatch?.length ?? 2;\n const trailingNewline = raw.endsWith('\\n') ? '\\n' : '';\n writeFileSync(target, `${JSON.stringify(pkg, null, indent)}${trailingNewline}`, 'utf8');\n\n return packageManager === 'bun'\n ? {\n changed: true,\n strategy: 'build-chain',\n detail: 'chained scan and mark-build around the existing build command.',\n }\n : {\n changed: true,\n strategy: 'lifecycle-hooks',\n detail: 'added scan to prebuild and mark-build to postbuild.',\n };\n}\n"],"mappings":"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","names":["readFileSync","writeFileSync","path","readFile","path","readFile","path","readFile","path","path","readFile","readFile","readFile","readFile","path","readFile","path","path","readFile","path","path","readFile","path","path","walk","existsSync","readFileSync","readdirSync","statSync","path","existsSync","path","WIDGET_NEEDLE","existsSync","path","readFileSync","walk","readdirSync","statSync","readFileSync","writeFileSync","existsSync","readFileSync","writeFileSync","path","readFileSync","writeFileSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli.ts","../src/parsers/index.ts","../src/types.ts","../src/parsers/consistency.ts","../src/parsers/npm.ts","../src/parsers/node_modules.ts","../src/parsers/pnpm.ts","../src/parsers/yarn.ts","../src/normalize.ts","../src/checksum.ts","../src/client.ts","../src/config.ts","../src/mark-build.ts","../src/stack.ts","../src/guide.ts","../src/widget.ts","../src/protect/install/util.ts","../src/protect/install/adapters/tanstack-supabase.ts","../src/protect/install/adapters/next.ts","../src/protect/install/adapters/sveltekit.ts","../src/protect/install/seam.ts","../src/protect/install/adapters/astro.ts","../src/protect/install/find-app.ts","../src/protect/install/register.ts","../src/protect/install/generic.ts","../src/protect/install/adapters/nestjs.ts","../src/protect/install/adapters/fastify.ts","../src/protect/install/adapters/express.ts","../src/protect/install/index.ts","../src/setup.ts"],"sourcesContent":["import { readFileSync, writeFileSync } from 'node:fs';\n\nimport { scanLockfile } from './parsers/index.js';\nimport { buildWirePayload } from './normalize.js';\nimport { computeManifestChecksum } from './checksum.js';\nimport { DEFAULT_ENDPOINT, buildClaimUrl, postManifest } from './client.js';\nimport { persistSiteUuid, resolveConfig, writeConfigFile } from './config.js';\nimport {\n buildInjectionSnippet,\n findHtmlFiles,\n injectMarker,\n resolveBuildDir,\n} from './mark-build.js';\nimport {\n collectGuideState,\n countRemainingSteps,\n installCommand,\n renderGuideChecklist,\n} from './guide.js';\nimport { runProtect, runVerify } from './protect/install/index.js';\nimport { wireBuildScripts } from './setup.js';\nimport { detectStack, type StackDescriptor } from './stack.js';\nimport { PatchstackError } from './types.js';\nimport { buildWidgetTag, ensureSourceWidget, ensureWidgetInHtml } from './widget.js';\n\nconst HELP = `@patchstack/connect — scan your lockfile and report packages to Patchstack.\n\nUsage:\n patchstack-connect scan [options] Scan lockfile and POST to Patchstack.\n If no UUID is configured, the server\n provisions one and we persist it. After a\n successful post it also adds/updates the\n disclosure-widget <script> tag in the root\n HTML shell (index.html, public/index.html,\n or src/app.html) — opt out with\n \"widget\": false in .patchstackrc.json\n patchstack-connect setup [options] Finish the bounded project setup: run scan,\n manage the widget, and wire package.json build\n scripts. Never runs a build or protect\n patchstack-connect init <site-uuid> Optional: pre-seed .patchstackrc.json\n with an existing site UUID\n patchstack-connect status [options] Show current configuration\n patchstack-connect mark-build [options] Stamp built HTML with a production flag +\n build fingerprint, and ensure the widget\n tag in built pages (run as a postbuild step)\n patchstack-connect protect [--demo|--check] Install always-on runtime protection (the\n guard). Auto-wires known stacks (TanStack\n Start + Supabase); for others it scaffolds a\n generic guard + prints a wiring plan.\n --demo seeds a broad sample rule set (for\n demonstrations, not production).\n --check verifies the guard is wired (exit 1\n if not) — for the wire-then-verify loop.\n patchstack-connect guide [--full] Show this project's setup status (what's done,\n what's missing, with tailored commands), then\n print the full setup guide. --full prints the\n guide even when setup is complete\n patchstack-connect help Print this message\n\nOptions (for scan, setup, and status):\n --site-uuid <uuid> Override the configured site UUID\n --endpoint <url> Override the API endpoint\n --dry-run (scan only) Show the payload without posting\n\nOptions (for mark-build):\n --dir <path> Build output directory (default: auto-detect\n dist/ build/ out/ .output/public)\n\nEnvironment:\n PATCHSTACK_SITE_UUID Site UUID\n PATCHSTACK_ENDPOINT API endpoint (default: https://api.patchstack.com/monitor/pulse/manifest)\n PATCHSTACK_TIMEOUT_MS Request timeout in ms (default: 30000)\n PATCHSTACK_ENVIRONMENT Manifest environment: production | sandbox (default: production)\n PATCHSTACK_MODE (protect) Runtime guard mode: block (default) | dry-run\n PATCHSTACK_ROUTE_WAF (protect) Set to 1 to also screen every request at the route level (opt-in)\n\nPrecedence: CLI flag > environment variable > .patchstackrc.json.\n\nExamples:\n npx @patchstack/connect setup\n npx @patchstack/connect scan\n npx @patchstack/connect scan --dry-run\n npx @patchstack/connect init 550e8400-e29b-41d4-a716-446655440000\n npx @patchstack/connect scan --site-uuid 550e8400-...-446655440000\n`;\n\nconst VALUE_FLAGS = new Set(['site-uuid', 'endpoint', 'dir']);\n\ninterface ParsedArgs {\n command: string | null;\n positional: string[];\n flags: Map<string, string | true>;\n}\n\nfunction parseArgs(argv: string[]): ParsedArgs {\n const args = argv.slice(2);\n const positional: string[] = [];\n const flags = new Map<string, string | true>();\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i]!;\n if (!arg.startsWith('--')) {\n positional.push(arg);\n continue;\n }\n const stripped = arg.slice(2);\n const eqIdx = stripped.indexOf('=');\n if (eqIdx !== -1) {\n flags.set(stripped.slice(0, eqIdx), stripped.slice(eqIdx + 1));\n continue;\n }\n const next = args[i + 1];\n if (VALUE_FLAGS.has(stripped) && next !== undefined && !next.startsWith('--')) {\n flags.set(stripped, next);\n i++;\n } else {\n flags.set(stripped, true);\n }\n }\n\n return {\n command: positional.shift() ?? null,\n positional,\n flags,\n };\n}\n\nfunction getStringFlag(flags: Map<string, string | true>, name: string): string | undefined {\n const value = flags.get(name);\n return typeof value === 'string' ? value : undefined;\n}\n\nasync function runInit(args: ParsedArgs): Promise<number> {\n const uuid = args.positional[0];\n if (!uuid) {\n console.error('Error: site UUID is required.\\n');\n console.error('Usage: patchstack-connect init <site-uuid>');\n return 1;\n }\n if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(uuid)) {\n console.error(`Error: \"${uuid}\" does not look like a valid UUID.`);\n return 1;\n }\n\n const target = await writeConfigFile(process.cwd(), { siteUuid: uuid });\n console.log(`Wrote ${target}`);\n console.log('');\n console.log('Next: run `npx @patchstack/connect scan` to send your first manifest.');\n return 0;\n}\n\nasync function runScan(\n args: ParsedArgs,\n options: { showRemainingSetup?: boolean } = {},\n): Promise<number> {\n const dryRun = args.flags.get('dry-run') === true;\n const config = await resolveConfig({\n cwd: process.cwd(),\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n cliEndpoint: getStringFlag(args.flags, 'endpoint'),\n });\n const manifest = await scanLockfile(process.cwd());\n for (const warning of manifest.warnings ?? []) {\n console.warn(`patchstack: ${warning}`);\n }\n const { payload, stats } = buildWirePayload(manifest);\n\n console.log(\n `Found ${payload.packages.length} unique package versions across ${stats.uniqueNames} package names (${manifest.ecosystem} ecosystem).`,\n );\n console.log(\n `Reporting under the ${config.environment} environment (override with PATCHSTACK_ENVIRONMENT).`,\n );\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n console.log(\n `Using endpoint override: ${config.endpoint} (set via --endpoint, PATCHSTACK_ENDPOINT, or .patchstackrc.json).`,\n );\n }\n if (stats.duplicateNames.length > 0) {\n const sample = stats.duplicateNames.slice(0, 10).join(', ');\n const more =\n stats.duplicateNames.length > 10 ? `, +${stats.duplicateNames.length - 10} more` : '';\n console.log(\n `${stats.duplicateNames.length} package(s) appear at multiple versions: ${sample}${more}`,\n );\n }\n\n if (dryRun) {\n console.log('');\n if (config.siteUuid === null) {\n console.log('--dry-run: no site UUID configured. A real run would provision one.');\n } else {\n console.log(`--dry-run: not posting to Patchstack (site UUID ${config.siteUuid}).`);\n }\n console.log('Payload preview:');\n const preview = JSON.stringify(payload, null, 2).split('\\n');\n console.log(preview.slice(0, Math.min(preview.length, 30)).join('\\n'));\n if (preview.length > 30) {\n console.log(` ... (${preview.length - 30} more lines)`);\n }\n return 0;\n }\n\n const provisioning = config.siteUuid === null;\n if (provisioning) {\n console.log('No site UUID configured — provisioning a new Patchstack site from this manifest…');\n }\n\n const response = await postManifest(config, payload);\n\n // The server always returns the UUID. If we didn't have one, persist it so\n // every subsequent scan targets the same site.\n if (provisioning && response.uuid !== undefined && response.uuid.length > 0) {\n const target = await persistSiteUuid(process.cwd(), response.uuid);\n console.log(`Provisioned site ${response.uuid}. Saved UUID to ${target}.`);\n }\n\n if (response.stored) {\n console.log(`Stored manifest #${response.manifest_id} (checksum ${response.checksum}).`);\n } else if (response.reason === 'duplicate') {\n console.log('Manifest unchanged since last scan — nothing to store.');\n } else {\n console.log(`Server response: ${response.message ?? JSON.stringify(response)}`);\n }\n\n // With a UUID in hand (existing or freshly provisioned), ensure the\n // disclosure widget's managed tag in the source HTML shell so the very next\n // preview reload shows the \"Report a vulnerability\" button. Best-effort and\n // opt-out-able; a failed post never reaches this point, and --dry-run\n // returned above.\n const effectiveUuid = config.siteUuid ?? response.uuid ?? null;\n if (config.widget && effectiveUuid !== null && effectiveUuid.length > 0) {\n reportSourceWidget(effectiveUuid);\n }\n\n // On the first scan (provisioning), surface the dashboard URL so the user can\n // attach this site to their Patchstack account. `npx @patchstack/connect status`\n // re-displays it any time.\n if (provisioning && response.uuid !== undefined && response.uuid.length > 0) {\n console.log('');\n console.log('Open this dashboard link to view vulnerability reports:');\n console.log(` ${buildClaimUrl(config.endpoint, response.uuid)}`);\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n console.log(' (this URL inherits the endpoint override above)');\n }\n }\n\n // A scan can't wire the build hooks itself — an agent that runs `scan` but not\n // `guide` (a common shortcut) otherwise sees the widget + claim URL and assumes\n // setup is finished. Surface whatever is still missing so the loop actually closes.\n if (options.showRemainingSetup !== false) {\n try {\n const state = await collectGuideState(process.cwd());\n const remaining = countRemainingSteps(state);\n if (remaining > 0) {\n const hooksMissing = !(state.prebuildWired && state.postbuildWired);\n console.log('');\n console.log(\n `Setup not complete — ${remaining} step(s) remaining${hooksMissing ? \", including the package.json build hooks (which scan can't wire)\" : ''}.`,\n );\n console.log('Run `npx @patchstack/connect guide` for the exact steps to finish for this project.');\n }\n } catch {\n // Best-effort: never turn a successful scan into a failure over this nudge.\n }\n }\n\n return 0;\n}\n\n/**\n * Run the source-widget pass for `scan` and narrate the outcome. Never throws:\n * widget management is a convenience layered on top of a successful scan and\n * must not turn one into a failure.\n */\nfunction reportSourceWidget(siteUuid: string): void {\n try {\n const result = ensureSourceWidget(process.cwd(), siteUuid);\n switch (result.action) {\n case 'added':\n console.log(`Widget: added the \"Report a vulnerability\" tag to ${result.shell}. Reload your preview to see it.`);\n break;\n case 'updated':\n console.log(`Widget: updated the managed tag in ${result.shell} to site ${siteUuid}.`);\n break;\n case 'unchanged':\n console.log(`Widget: already installed in ${result.shell}.`);\n break;\n case 'manual':\n console.log(`Widget: found an existing (manual) install in ${result.shell} — left untouched.`);\n break;\n case 'no-body':\n console.log(`Widget: ${result.shell} has no </body> tag to anchor on. Add this tag to your root layout manually:`);\n console.log(` ${buildWidgetTag(siteUuid)}`);\n break;\n case 'no-shell':\n console.log('Widget: no plain HTML shell found (index.html / public/index.html / src/app.html).');\n console.log('Add this tag to your root layout before </body> (run `guide` for framework-specific placement):');\n console.log(` ${buildWidgetTag(siteUuid)}`);\n break;\n }\n if (result.action === 'added' || result.action === 'updated') {\n console.log(' (opt out any time with \"widget\": false in .patchstackrc.json)');\n }\n } catch (err) {\n console.warn(`Widget: skipped (${(err as Error).message}).`);\n }\n}\n\nasync function runProtectCommand(args: ParsedArgs): Promise<number> {\n // `--check`: verify the guard is wired (for the agent/CI loop). Non-zero exit if not.\n if (args.flags.get('check') === true) {\n const report = runVerify(process.cwd());\n console.log(`patchstack protect --check (${report.stack}):`);\n for (const c of report.checks) {\n console.log(` ${c.ok ? '✓' : '✗'} ${c.label}${!c.ok && c.hint ? ` — ${c.hint}` : ''}`);\n }\n console.log(report.wired ? 'guard is wired ✓' : 'guard is NOT fully wired ✗');\n return report.wired ? 0 : 1;\n }\n // Best-effort: like mark-build, this runs during builds and must never fail one.\n const demo = args.flags.get('demo') === true;\n try {\n runProtect(process.cwd(), { demo });\n } catch (err) {\n console.warn(`patchstack protect: skipped (${(err as Error).message}).`);\n }\n return 0;\n}\n\nasync function runGuide(args: ParsedArgs): Promise<number> {\n // The live checklist first: what this project already has and what's missing,\n // with commands tailored to it. Best-effort — a project we can't inspect\n // still gets the reference doc.\n let allDone = false;\n try {\n const state = await collectGuideState(process.cwd());\n const useColor = process.stdout.isTTY === true && process.env.NO_COLOR === undefined;\n console.log(renderGuideChecklist(state, useColor));\n allDone = countRemainingSteps(state) === 0;\n } catch {\n // fall through to the static guide\n }\n\n // A fully green project doesn't need the ~90-line manual again on every\n // re-run — point at it instead. `--full` always prints it.\n if (allDone && args.flags.get('full') !== true) {\n console.log('');\n console.log(\n 'Full reference guide: `npx @patchstack/connect guide --full` (or read node_modules/@patchstack/connect/AGENT-INSTALL.md).',\n );\n return 0;\n }\n\n console.log('');\n console.log('———— Full reference guide (ships as AGENT-INSTALL.md) ————');\n console.log('');\n\n // AGENT-INSTALL.md ships at the package root, one level above dist/ (and\n // above src/ when running unbundled), so the same relative path works in both.\n const guidePath = new URL('../AGENT-INSTALL.md', import.meta.url);\n console.log(readFileSync(guidePath, 'utf8'));\n return 0;\n}\n\nasync function runSetup(args: ParsedArgs): Promise<number> {\n if (args.flags.get('dry-run') === true) {\n console.error('Error: setup does not support --dry-run. Use `scan --dry-run` to preview the manifest.');\n return 1;\n }\n\n const before = await collectGuideState(process.cwd());\n if (!before.hasPackageJson) {\n console.error('Error: no package.json found. Run setup from the project root.');\n return 1;\n }\n if (before.installed === null) {\n console.error(\n `Error: @patchstack/connect is not declared in package.json.\\nRun: ${installCommand(before.packageManager)}`,\n );\n return 1;\n }\n\n console.log('Patchstack setup — applying bounded project changes');\n console.log(' 1. Scan dependencies, provision/reuse the site, and manage the source widget');\n const scanCode = await runScan(args, { showRemainingSetup: false });\n if (scanCode !== 0) {\n return scanCode;\n }\n\n console.log('');\n console.log(' 2. Wire scan and mark-build into package.json');\n const wired = wireBuildScripts(process.cwd(), before.packageManager);\n console.log(`Build integration: ${wired.detail}`);\n\n console.log('');\n console.log(' 3. Verify setup status');\n const after = await collectGuideState(process.cwd());\n const useColor = process.stdout.isTTY === true && process.env.NO_COLOR === undefined;\n console.log(renderGuideChecklist(after, useColor));\n\n const remaining = countRemainingSteps(after);\n if (remaining > 0) {\n console.log('');\n console.log(`Setup applied its bounded changes; ${remaining} manual step(s) remain above.`);\n }\n return 0;\n}\n\nasync function runStatus(args: ParsedArgs): Promise<number> {\n const config = await resolveConfig({\n cwd: process.cwd(),\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n cliEndpoint: getStringFlag(args.flags, 'endpoint'),\n });\n console.log(`Site UUID: ${config.siteUuid ?? '(none yet — the next `scan` will provision one)'}`);\n console.log(\n `Endpoint: ${config.endpoint}${config.endpoint === DEFAULT_ENDPOINT ? '' : ' (override)'}`,\n );\n console.log(`Timeout: ${config.timeoutMs}ms`);\n console.log(`Environment: ${config.environment}`);\n if (config.siteUuid !== null) {\n console.log(`Dashboard URL: ${buildClaimUrl(config.endpoint, config.siteUuid)}`);\n }\n return 0;\n}\n\n/** One-line, human-readable summary of a detected stack for CLI output. */\nfunction describeStack(stack: StackDescriptor): string | null {\n const parts = [stack.builder, stack.framework, stack.ui, stack.runtime].filter(\n (part): part is string => part !== null,\n );\n if (stack.hostingEnvKeys.length > 0) {\n parts.push(`${stack.hostingEnvKeys.length} hosting env key(s)`);\n }\n return parts.length > 0 ? parts.join(' · ') : null;\n}\n\nasync function runMarkBuild(args: ParsedArgs): Promise<number> {\n const cwd = process.cwd();\n\n // Compute the build fingerprint and stack descriptor from the lockfile.\n // Best-effort: mark-build is a postbuild step and must never fail the build, so\n // a missing/unreadable lockfile just means we stamp the production flag without\n // a fingerprint or stack.\n let checksum: string | null = null;\n let stack: StackDescriptor | null = null;\n try {\n const manifest = await scanLockfile(cwd);\n for (const warning of manifest.warnings ?? []) {\n console.warn(`mark-build: ${warning}`);\n }\n const { payload } = buildWirePayload(manifest);\n checksum = computeManifestChecksum(payload.packages);\n stack = detectStack(payload.packages);\n } catch (err) {\n console.warn(\n `mark-build: could not compute the build fingerprint (${(err as Error).message}). Stamping the production flag only.`,\n );\n }\n\n // The widget pass needs the configured UUID; best-effort for the same reason.\n let widgetUuid: string | null = null;\n try {\n const config = await resolveConfig({\n cwd,\n cliSiteUuid: getStringFlag(args.flags, 'site-uuid'),\n });\n if (config.widget) {\n widgetUuid = config.siteUuid;\n }\n } catch (err) {\n console.warn(\n `mark-build: could not resolve the site UUID (${(err as Error).message}). Skipping the widget pass.`,\n );\n }\n\n const dir = resolveBuildDir(cwd, getStringFlag(args.flags, 'dir'));\n if (dir === null) {\n console.warn(\n 'mark-build: no build output directory found (looked for dist/, build/, out/, .output/public). Pass --dir <path> if it is elsewhere. Nothing to mark.',\n );\n return 0;\n }\n\n const files = findHtmlFiles(dir);\n if (files.length === 0) {\n console.warn(`mark-build: no HTML files found under ${dir}. Nothing to mark.`);\n return 0;\n }\n\n const snippet = buildInjectionSnippet(checksum, stack);\n let marked = 0;\n let widgetTouched = 0;\n for (const file of files) {\n const before = readFileSync(file, 'utf8');\n let after = injectMarker(before, snippet);\n // Built HTML that came through a shell scan already edited carries the\n // managed tag; this covers output whose source shell we couldn't edit.\n // Manual installs are adopted (left untouched), same as in scan.\n if (widgetUuid !== null) {\n const ensured = ensureWidgetInHtml(after, widgetUuid);\n if (ensured.action === 'added' || ensured.action === 'updated') {\n widgetTouched += 1;\n }\n after = ensured.html;\n }\n if (after !== before) {\n writeFileSync(file, after);\n marked += 1;\n }\n }\n\n const stackSummary = stack !== null ? describeStack(stack) : null;\n console.log(\n `mark-build: marked ${marked} HTML file(s) in ${dir}` +\n `${checksum !== null ? ` (build ${checksum})` : ''}` +\n `${widgetTouched > 0 ? `, widget tag ensured in ${widgetTouched}` : ''}` +\n `${stackSummary !== null ? ` [${stackSummary}]` : ''}.`,\n );\n return 0;\n}\n\nasync function main(): Promise<number> {\n const args = parseArgs(process.argv);\n\n if (args.flags.has('help') || args.command === 'help' || args.command === null) {\n console.log(HELP);\n return 0;\n }\n\n switch (args.command) {\n case 'init':\n return runInit(args);\n case 'scan':\n return runScan(args);\n case 'status':\n return runStatus(args);\n case 'mark-build':\n return runMarkBuild(args);\n case 'protect':\n return runProtectCommand(args);\n case 'guide':\n return runGuide(args);\n case 'setup':\n return runSetup(args);\n default:\n console.error(`Unknown command: ${args.command}\\n`);\n console.error(HELP);\n return 1;\n }\n}\n\nmain()\n .then((code) => process.exit(code))\n .catch((err: unknown) => {\n if (err instanceof PatchstackError) {\n console.error(`Error (${err.code}): ${err.message}`);\n process.exit(1);\n }\n console.error('Unexpected error:', err);\n process.exit(2);\n });\n","import { access } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type Manifest, type PackageEntry } from '../types.js';\nimport { missingDependencies, readDeclaredDependencyNames } from './consistency.js';\nimport { parseNpmLockfile } from './npm.js';\nimport { walkNodeModules } from './node_modules.js';\nimport { parsePnpmLockfile } from './pnpm.js';\nimport { parseYarnLockfile } from './yarn.js';\n\ntype LockfileFilename =\n | 'package-lock.json'\n | 'bun.lock'\n | 'bun.lockb'\n | 'yarn.lock'\n | 'pnpm-lock.yaml';\n\ntype DetectionStrategy =\n | 'npm-lockfile'\n | 'node-modules-walk'\n | 'pnpm-lockfile'\n | 'yarn-lockfile';\n\ninterface DetectedLockfile {\n ecosystem: 'npm';\n filePath: string;\n filename: LockfileFilename;\n strategy: DetectionStrategy;\n}\n\ninterface LockfileCandidate {\n filename: LockfileFilename;\n strategy: DetectionStrategy;\n}\n\n// Checked in priority order: the first candidate present in `cwd` wins.\nconst LOCKFILE_CANDIDATES: readonly LockfileCandidate[] = [\n { filename: 'package-lock.json', strategy: 'npm-lockfile' },\n { filename: 'bun.lock', strategy: 'node-modules-walk' },\n { filename: 'bun.lockb', strategy: 'node-modules-walk' },\n { filename: 'pnpm-lock.yaml', strategy: 'pnpm-lockfile' },\n { filename: 'yarn.lock', strategy: 'yarn-lockfile' },\n];\n\nexport async function detectLockfile(cwd: string): Promise<DetectedLockfile> {\n // Probe every candidate concurrently, then resolve by declaration order so\n // the result is identical to a sequential first-match scan — but bounded by a\n // single I/O round-trip instead of up to one `stat` per candidate.\n const probed = await Promise.all(\n LOCKFILE_CANDIDATES.map(async (candidate) => {\n const filePath = path.join(cwd, candidate.filename);\n return { ...candidate, filePath, present: await exists(filePath) };\n }),\n );\n\n const match = probed.find((candidate) => candidate.present);\n if (match) {\n return {\n ecosystem: 'npm',\n filePath: match.filePath,\n filename: match.filename,\n strategy: match.strategy,\n };\n }\n\n const expected = LOCKFILE_CANDIDATES.map((candidate) => candidate.filename).join(', ');\n throw new PatchstackError(\n `No lockfile found in ${cwd}. Expected one of: ${expected}.`,\n 'LOCKFILE_NOT_FOUND',\n );\n}\n\nexport async function scanLockfile(cwd: string): Promise<Manifest> {\n const candidates = await presentLockfiles(cwd);\n if (candidates.length === 0) {\n // Preserve the exact historical error for the no-lockfile case.\n await detectLockfile(cwd);\n }\n\n // Validate each source against package.json before trusting it. A lockfile\n // missing declared dependencies is a fossil — e.g. `npm install` planted a\n // package-lock.json once on a bun-managed platform (Lovable), and the native\n // dependency flow never updates it again. Trusting it would freeze the\n // manifest and the build fingerprint while the real dependency set drifts.\n const declared = await readDeclaredDependencyNames(cwd);\n const warnings: string[] = [];\n let firstParsed: { packages: PackageEntry[]; filename: string } | null = null;\n let walkTried = false;\n\n for (const candidate of candidates) {\n let packages: PackageEntry[];\n try {\n packages = await runStrategy(candidate, cwd);\n } catch {\n continue;\n }\n walkTried ||= candidate.strategy === 'node-modules-walk';\n firstParsed ??= { packages, filename: candidate.filename };\n\n const missing = missingDependencies(declared, packages);\n if (missing.length === 0) {\n return manifestWith(packages, warnings);\n }\n warnings.push(staleWarning(candidate.filename, missing));\n }\n\n // Last resort: the installed truth. node_modules reflects what the build\n // actually compiles against, whichever package manager wrote it.\n if (!walkTried) {\n try {\n const packages = await walkNodeModules(cwd);\n const missing = missingDependencies(declared, packages);\n if (missing.length > 0) {\n warnings.push(staleWarning('node_modules/', missing));\n }\n warnings.push('Scanned node_modules/ instead. Delete the stale lockfile to silence this warning.');\n return manifestWith(packages, warnings);\n } catch {\n // fall through to the best lockfile we managed to parse\n }\n }\n\n if (firstParsed === null) {\n const expected = LOCKFILE_CANDIDATES.map((candidate) => candidate.filename).join(', ');\n throw new PatchstackError(\n `No readable lockfile found in ${cwd}. Expected one of: ${expected}.`,\n 'LOCKFILE_NOT_FOUND',\n );\n }\n\n warnings.push(\n `No fully-consistent source found; reporting ${firstParsed.filename}. The manifest may understate the real dependency set.`,\n );\n\n return manifestWith(firstParsed.packages, warnings);\n}\n\nfunction manifestWith(packages: PackageEntry[], warnings: string[]): Manifest {\n return warnings.length > 0\n ? { ecosystem: 'npm', packages, warnings }\n : { ecosystem: 'npm', packages };\n}\n\nfunction staleWarning(source: string, missing: string[]): string {\n const sample = missing.slice(0, 3).join(', ');\n const suffix = missing.length > 3 ? `, +${missing.length - 3} more` : '';\n return `${source} looks stale: package.json declares ${missing.length} dependenc${missing.length === 1 ? 'y' : 'ies'} it does not contain (${sample}${suffix}).`;\n}\n\nasync function presentLockfiles(cwd: string): Promise<DetectedLockfile[]> {\n const probed = await Promise.all(\n LOCKFILE_CANDIDATES.map(async (candidate) => {\n const filePath = path.join(cwd, candidate.filename);\n return { ...candidate, filePath, present: await exists(filePath) };\n }),\n );\n\n return probed\n .filter((candidate) => candidate.present)\n .map(({ filename, strategy, filePath }) => ({ ecosystem: 'npm' as const, filename, strategy, filePath }));\n}\n\nasync function runStrategy(\n detected: DetectedLockfile,\n cwd: string,\n): Promise<PackageEntry[]> {\n switch (detected.strategy) {\n case 'npm-lockfile':\n return parseNpmLockfile(detected.filePath);\n case 'pnpm-lockfile':\n return parsePnpmLockfile(detected.filePath);\n case 'yarn-lockfile':\n return parseYarnLockfile(detected.filePath);\n case 'node-modules-walk':\n return walkNodeModules(cwd);\n }\n}\n\nasync function exists(filePath: string): Promise<boolean> {\n try {\n await access(filePath);\n return true;\n } catch {\n return false;\n }\n}\n","export type Ecosystem = 'npm' | 'composer';\n\n/**\n * Which environment a manifest was captured in. The connector reports from real\n * builds (prebuild scan / build hooks), so it defaults to 'production'. Override\n * with PATCHSTACK_ENVIRONMENT=sandbox (or \"environment\" in .patchstackrc.json)\n * for test manifests.\n */\nexport type Environment = 'production' | 'sandbox';\n\nexport interface PackageEntry {\n name: string;\n version: string;\n path?: string;\n direct?: boolean;\n}\n\nexport interface Manifest {\n ecosystem: Ecosystem;\n packages: PackageEntry[];\n /**\n * Human-readable scan diagnostics — set when the preferred lockfile looked\n * stale (missing dependencies declared in package.json) and another source\n * was used, or when no fully-consistent source existed. Never fatal.\n */\n warnings?: string[];\n}\n\nexport interface Config {\n /**\n * The site UUID. `null` means we don't have one yet — `postManifest` will then\n * post to the bare endpoint, the server will provision a fresh site, and the\n * UUID it returns should be persisted via `persistSiteUuid()`.\n */\n siteUuid: string | null;\n endpoint: string;\n timeoutMs: number;\n /** Environment to report the manifest under. Defaults to 'production'. */\n environment: Environment;\n /**\n * Whether the connector manages the disclosure-widget tag (source shell on\n * `scan`, built HTML on `mark-build`). Defaults to true; persist\n * `\"widget\": false` in .patchstackrc.json for dependency-scanning only.\n */\n widget: boolean;\n}\n\nexport interface StoreManifestResponse {\n /** The UUID of the site the manifest was stored against. Always returned. */\n uuid?: string;\n stored: boolean;\n manifest_id?: number;\n checksum?: string;\n reason?: string;\n message?: string;\n error?: string;\n}\n\nexport class PatchstackError extends Error {\n constructor(\n message: string,\n public readonly code:\n | 'CONFIG_MISSING'\n | 'CONFIG_INVALID'\n | 'LOCKFILE_NOT_FOUND'\n | 'LOCKFILE_UNSUPPORTED'\n | 'LOCKFILE_PARSE_ERROR'\n | 'NETWORK_ERROR'\n | 'NETWORK_TIMEOUT'\n | 'SITE_NOT_FOUND'\n | 'VALIDATION_ERROR'\n | 'SERVER_ERROR',\n public readonly cause?: unknown,\n ) {\n super(message);\n this.name = 'PatchstackError';\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport type { PackageEntry } from '../types.js';\n\n/**\n * Registry-installable dependency names declared in package.json\n * (dependencies + devDependencies). Non-registry specifiers (file:, link:,\n * workspace:, portal:) are excluded — lockfile parsers skip those too, so\n * their absence from a parsed set says nothing about staleness. Returns []\n * when package.json is missing or unreadable (nothing to validate against).\n */\nexport async function readDeclaredDependencyNames(cwd: string): Promise<string[]> {\n let raw: string;\n try {\n raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n } catch {\n return [];\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return [];\n }\n if (typeof parsed !== 'object' || parsed === null) {\n return [];\n }\n\n const names = new Set<string>();\n for (const group of ['dependencies', 'devDependencies'] as const) {\n const deps = (parsed as Record<string, unknown>)[group];\n if (typeof deps !== 'object' || deps === null) {\n continue;\n }\n for (const [name, spec] of Object.entries(deps as Record<string, unknown>)) {\n if (typeof spec === 'string' && /^(file|link|workspace|portal):/.test(spec)) {\n continue;\n }\n names.add(name);\n }\n }\n\n return [...names];\n}\n\n/**\n * Declared names absent from a parsed package set. A non-empty result means\n * the source predates package.json — the fossil-lockfile failure mode where\n * e.g. `npm install` planted a package-lock.json once and the platform's\n * native package manager (bun on Lovable) never updates it again.\n */\nexport function missingDependencies(declared: string[], packages: PackageEntry[]): string[] {\n const present = new Set(packages.map((entry) => entry.name));\n return declared.filter((name) => !present.has(name));\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\ninterface LockfileV2Package {\n name?: string;\n version?: string;\n link?: boolean;\n resolved?: string;\n}\n\ninterface LockfileV2 {\n lockfileVersion: number;\n packages?: Record<string, LockfileV2Package>;\n dependencies?: Record<string, LockfileV1Dependency>;\n}\n\ninterface LockfileV1Dependency {\n version: string;\n dependencies?: Record<string, LockfileV1Dependency>;\n}\n\nexport async function parseNpmLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(`Could not read lockfile at ${lockfilePath}`, 'LOCKFILE_NOT_FOUND', cause);\n }\n\n let parsed: LockfileV2;\n try {\n parsed = JSON.parse(raw) as LockfileV2;\n } catch (cause) {\n throw new PatchstackError(`Lockfile at ${lockfilePath} is not valid JSON`, 'LOCKFILE_PARSE_ERROR', cause);\n }\n\n if (parsed.packages) {\n return extractFromV2(parsed.packages);\n }\n\n if (parsed.dependencies) {\n return extractFromV1(parsed.dependencies);\n }\n\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} has no \"packages\" or \"dependencies\" key`,\n 'LOCKFILE_PARSE_ERROR',\n );\n}\n\nfunction extractFromV2(packages: Record<string, LockfileV2Package>): PackageEntry[] {\n const entries: PackageEntry[] = [];\n\n for (const [pkgPath, pkg] of Object.entries(packages)) {\n if (pkgPath === '') {\n continue;\n }\n if (pkg.link === true) {\n continue;\n }\n if (typeof pkg.version !== 'string' || pkg.version.length === 0) {\n continue;\n }\n\n const name = pkg.name ?? extractNameFromPath(pkgPath);\n if (name === null) {\n continue;\n }\n\n entries.push({\n name,\n version: pkg.version,\n path: pkgPath,\n direct: isDirectV2(pkgPath),\n });\n }\n\n return entries;\n}\n\nfunction extractFromV1(\n deps: Record<string, LockfileV1Dependency>,\n acc: PackageEntry[] = [],\n depth = 0,\n): PackageEntry[] {\n for (const [name, dep] of Object.entries(deps)) {\n if (typeof dep.version === 'string' && dep.version.length > 0) {\n acc.push({ name, version: dep.version, direct: depth === 0 });\n }\n if (dep.dependencies) {\n extractFromV1(dep.dependencies, acc, depth + 1);\n }\n }\n return acc;\n}\n\nfunction extractNameFromPath(pkgPath: string): string | null {\n const segments = pkgPath.split('node_modules' + path.sep === pkgPath ? path.sep : '/');\n const parts = pkgPath.split('/');\n const nmIndex = parts.lastIndexOf('node_modules');\n if (nmIndex === -1 || nmIndex >= parts.length - 1) {\n return segments[segments.length - 1] ?? null;\n }\n const tail = parts.slice(nmIndex + 1);\n if (tail.length === 0) {\n return null;\n }\n const first = tail[0];\n if (first !== undefined && first.startsWith('@') && tail.length >= 2) {\n return `${first}/${tail[1]}`;\n }\n return first ?? null;\n}\n\nfunction isDirectV2(pkgPath: string): boolean {\n const parts = pkgPath.split('/');\n const nmCount = parts.filter((p) => p === 'node_modules').length;\n return nmCount === 1;\n}\n","import { lstat, readFile, readdir, stat } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\nexport async function walkNodeModules(cwd: string): Promise<PackageEntry[]> {\n const root = path.join(cwd, 'node_modules');\n\n try {\n const info = await stat(root);\n if (!info.isDirectory()) {\n throw new PatchstackError(\n `${root} exists but is not a directory.`,\n 'LOCKFILE_NOT_FOUND',\n );\n }\n } catch (cause) {\n if (cause instanceof PatchstackError) {\n throw cause;\n }\n throw new PatchstackError(\n `node_modules/ not found at ${cwd}. Install dependencies first (e.g. \\`bun install\\` or \\`npm install\\`).`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const entries: PackageEntry[] = [];\n await walk(root, entries, 0);\n return entries;\n}\n\nasync function walk(dir: string, acc: PackageEntry[], depth: number): Promise<void> {\n let names: string[];\n try {\n names = await readdir(dir);\n } catch {\n return;\n }\n\n for (const name of names) {\n if (name.startsWith('.')) {\n continue;\n }\n\n const fullPath = path.join(dir, name);\n if (!(await isPlainDirectory(fullPath))) {\n continue;\n }\n\n if (name.startsWith('@')) {\n let subNames: string[];\n try {\n subNames = await readdir(fullPath);\n } catch {\n continue;\n }\n for (const sub of subNames) {\n if (sub.startsWith('.')) {\n continue;\n }\n const scopedDir = path.join(fullPath, sub);\n if (!(await isPlainDirectory(scopedDir))) {\n continue;\n }\n await readPackage(scopedDir, depth, acc);\n await walkNested(scopedDir, acc, depth);\n }\n continue;\n }\n\n await readPackage(fullPath, depth, acc);\n await walkNested(fullPath, acc, depth);\n }\n}\n\nasync function readPackage(\n pkgDir: string,\n depth: number,\n acc: PackageEntry[],\n): Promise<void> {\n let raw: string;\n try {\n raw = await readFile(path.join(pkgDir, 'package.json'), 'utf8');\n } catch {\n return;\n }\n\n let parsed: { name?: unknown; version?: unknown };\n try {\n parsed = JSON.parse(raw) as { name?: unknown; version?: unknown };\n } catch {\n return;\n }\n\n if (typeof parsed.name !== 'string' || parsed.name.length === 0) {\n return;\n }\n if (typeof parsed.version !== 'string' || parsed.version.length === 0) {\n return;\n }\n\n acc.push({\n name: parsed.name,\n version: parsed.version,\n direct: depth === 0,\n });\n}\n\nasync function walkNested(\n pkgDir: string,\n acc: PackageEntry[],\n depth: number,\n): Promise<void> {\n const nested = path.join(pkgDir, 'node_modules');\n if (!(await isPlainDirectory(nested))) {\n return;\n }\n await walk(nested, acc, depth + 1);\n}\n\nasync function isPlainDirectory(dir: string): Promise<boolean> {\n try {\n const info = await lstat(dir);\n return info.isDirectory() && !info.isSymbolicLink();\n } catch {\n return false;\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\n/**\n * Parses pnpm-lock.yaml without pulling in a YAML library. We don't need full\n * YAML semantics — only the `packages:` block (the canonical list of every\n * installed package) and, for direct-dep marking, the dependency sections under\n * `importers:` (v9+) or at the top level (v6-v8 single-project).\n *\n * Supported pnpm-lock key formats:\n * v5: /pkg/1.0.0 /@scope/pkg/1.0.0\n * v6-v8: /pkg@1.0.0 /@scope/pkg@1.0.0 (optional `(peer@x)` suffix)\n * v9: pkg@1.0.0 @scope/pkg@1.0.0 (optional `(peer@x)` suffix, may be quoted)\n */\nexport async function parsePnpmLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(\n `Could not read lockfile at ${lockfilePath}`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const lines = raw.split(/\\r?\\n/);\n const directNames = collectDirectDepNames(lines);\n const packageKeys = collectPackagesBlockKeys(lines);\n\n if (packageKeys.length === 0) {\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} has no \"packages\" entries`,\n 'LOCKFILE_PARSE_ERROR',\n );\n }\n\n const entries: PackageEntry[] = [];\n for (const key of packageKeys) {\n const parsed = parsePackageKey(key);\n if (parsed === null) {\n continue;\n }\n entries.push({\n name: parsed.name,\n version: parsed.version,\n direct: directNames.has(parsed.name),\n });\n }\n\n return entries;\n}\n\ninterface ParsedKey {\n name: string;\n version: string;\n}\n\nexport function parsePackageKey(rawKey: string): ParsedKey | null {\n let k = rawKey.trim();\n if (k.length === 0) {\n return null;\n }\n\n if (\n (k.startsWith(\"'\") && k.endsWith(\"'\")) ||\n (k.startsWith('\"') && k.endsWith('\"'))\n ) {\n k = k.slice(1, -1);\n }\n\n if (k.startsWith('/')) {\n k = k.slice(1);\n }\n\n // Strip peer-dependency suffix used by v6+: `pkg@1.0.0(peer@1.0.0)(other@2)`.\n const parenIdx = k.indexOf('(');\n if (parenIdx >= 0) {\n k = k.slice(0, parenIdx);\n }\n\n // Split off the optional `@scope/` prefix so the remaining \"body\" contains\n // exactly one separator between the bare name and the version. npm forbids\n // both `@` and `/` inside the bare-name portion, so the first occurrence of\n // either character in the body is unambiguously the name/version separator.\n let scopePrefix = '';\n let body = k;\n if (k.startsWith('@')) {\n const firstSlash = k.indexOf('/');\n if (firstSlash <= 0) {\n return null;\n }\n scopePrefix = k.slice(0, firstSlash + 1);\n body = k.slice(firstSlash + 1);\n }\n\n const slashIdx = body.indexOf('/');\n const atIdx = body.indexOf('@');\n\n let sepIdx: number;\n if (slashIdx < 0 && atIdx < 0) {\n return null;\n } else if (slashIdx < 0) {\n sepIdx = atIdx;\n } else if (atIdx < 0) {\n sepIdx = slashIdx;\n } else {\n sepIdx = Math.min(slashIdx, atIdx);\n }\n\n const name = scopePrefix + body.slice(0, sepIdx);\n let version = body.slice(sepIdx + 1);\n\n // v5 peer suffix uses `_`: `1.0.0_react@18.2.0`.\n const underscoreIdx = version.indexOf('_');\n if (underscoreIdx >= 0) {\n version = version.slice(0, underscoreIdx);\n }\n\n if (name.length === 0 || version.length === 0) {\n return null;\n }\n\n return { name, version };\n}\n\nfunction indentOf(line: string): number {\n let i = 0;\n while (i < line.length && line[i] === ' ') {\n i++;\n }\n return i;\n}\n\nfunction isBlankOrComment(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.length === 0 || trimmed.startsWith('#');\n}\n\n/**\n * Collects keys directly nested under the top-level `packages:` block. Stops\n * when another top-level key (e.g. `snapshots:`) appears.\n */\nfunction collectPackagesBlockKeys(lines: string[]): string[] {\n const keys: string[] = [];\n let inBlock = false;\n let childIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n\n const indent = indentOf(line);\n\n if (!inBlock) {\n if (indent === 0 && line.trim() === 'packages:') {\n inBlock = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n if (childIndent === null) {\n childIndent = indent;\n }\n\n if (indent !== childIndent) {\n continue;\n }\n\n const content = line.slice(indent);\n if (!content.endsWith(':')) {\n continue;\n }\n\n keys.push(content.slice(0, -1));\n }\n\n return keys;\n}\n\n/**\n * Collects direct dependency names. Looks in two places, since the format\n * differs across lockfile versions and workspaces:\n *\n * 1. `importers:` > `<importer>:` > `{dependencies,devDependencies,optionalDependencies}:`\n * (v9 always, v6-v8 in workspaces)\n * 2. Top-level `{dependencies,devDependencies,optionalDependencies}:`\n * (v6-v8 single-project lockfiles)\n *\n * Direct-dep marking is best-effort: a name absent from both is simply left as\n * not-direct, matching the npm parser's behaviour for transitive packages.\n */\nfunction collectDirectDepNames(lines: string[]): Set<string> {\n const names = new Set<string>();\n collectFromImporters(lines, names);\n for (const section of ['dependencies', 'devDependencies', 'optionalDependencies']) {\n collectFromTopLevelSection(lines, section, names);\n }\n return names;\n}\n\nconst DEP_SECTIONS = new Set([\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n]);\n\nfunction collectFromImporters(lines: string[], out: Set<string>): void {\n let inImporters = false;\n let importerIndent: number | null = null;\n let inDepSection = false;\n let depSectionIndent: number | null = null;\n let leafIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n const indent = indentOf(line);\n const trimmed = line.trim();\n\n if (!inImporters) {\n if (indent === 0 && trimmed === 'importers:') {\n inImporters = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n // Track the indent at which importer entries (e.g. `.:`, `packages/foo:`) sit.\n if (importerIndent === null) {\n importerIndent = indent;\n }\n\n if (indent === importerIndent) {\n inDepSection = false;\n depSectionIndent = null;\n leafIndent = null;\n continue;\n }\n\n if (!inDepSection) {\n const key = stripTrailingColon(trimmed);\n if (key !== null && DEP_SECTIONS.has(key)) {\n inDepSection = true;\n depSectionIndent = indent;\n }\n continue;\n }\n\n if (depSectionIndent !== null && indent <= depSectionIndent) {\n // Reset — we've exited the dep section. Reconsider this line.\n inDepSection = false;\n depSectionIndent = null;\n leafIndent = null;\n const key = stripTrailingColon(trimmed);\n if (key !== null && DEP_SECTIONS.has(key)) {\n inDepSection = true;\n depSectionIndent = indent;\n }\n continue;\n }\n\n if (leafIndent === null) {\n leafIndent = indent;\n }\n\n if (indent !== leafIndent) {\n continue;\n }\n\n const name = extractLeafName(trimmed);\n if (name !== null) {\n out.add(name);\n }\n }\n}\n\nfunction collectFromTopLevelSection(\n lines: string[],\n section: string,\n out: Set<string>,\n): void {\n let inSection = false;\n let leafIndent: number | null = null;\n\n for (const line of lines) {\n if (isBlankOrComment(line)) {\n continue;\n }\n const indent = indentOf(line);\n const trimmed = line.trim();\n\n if (!inSection) {\n if (indent === 0 && trimmed === `${section}:`) {\n inSection = true;\n }\n continue;\n }\n\n if (indent === 0) {\n break;\n }\n\n if (leafIndent === null) {\n leafIndent = indent;\n }\n\n if (indent !== leafIndent) {\n continue;\n }\n\n const name = extractLeafName(trimmed);\n if (name !== null) {\n out.add(name);\n }\n }\n}\n\nfunction stripTrailingColon(s: string): string | null {\n if (!s.endsWith(':')) {\n return null;\n }\n return s.slice(0, -1).trim();\n}\n\n/**\n * Extracts the package name from a dependency-section leaf, handling both the\n * short form (`pkg: 1.0.0`) and the v9 expanded form (`pkg:` followed by\n * `specifier:` / `version:` children). Quoted scoped names like `'@scope/pkg':`\n * are unquoted.\n */\nfunction extractLeafName(trimmed: string): string | null {\n const colonIdx = trimmed.indexOf(':');\n if (colonIdx < 0) {\n return null;\n }\n let name = trimmed.slice(0, colonIdx).trim();\n if (name.length === 0) {\n return null;\n }\n if (\n (name.startsWith(\"'\") && name.endsWith(\"'\")) ||\n (name.startsWith('\"') && name.endsWith('\"'))\n ) {\n name = name.slice(1, -1);\n }\n return name.length > 0 ? name : null;\n}\n","import { readFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type PackageEntry } from '../types.js';\n\n/**\n * Parses yarn.lock (yarn classic v1 and yarn berry v2+) without a YAML\n * dependency. Both generations share the same block structure — a top-level\n * mapping of comma-separated descriptor lists to a block containing a\n * `version` field — so we walk them with the same scanner and only branch on\n * the `version` syntax (`version \"x\"` for v1, `version: x` for berry).\n *\n * Direct vs transitive can't be derived from yarn.lock alone (yarn does not\n * record an importer manifest the way pnpm v9 does), so we cross-reference\n * the sibling `package.json` when present.\n */\nexport async function parseYarnLockfile(lockfilePath: string): Promise<PackageEntry[]> {\n let raw: string;\n try {\n raw = await readFile(lockfilePath, 'utf8');\n } catch (cause) {\n throw new PatchstackError(\n `Could not read lockfile at ${lockfilePath}`,\n 'LOCKFILE_NOT_FOUND',\n cause,\n );\n }\n\n const blocks = parseBlocks(raw);\n if (blocks.length === 0) {\n throw new PatchstackError(\n `Lockfile at ${lockfilePath} contains no package entries`,\n 'LOCKFILE_PARSE_ERROR',\n );\n }\n\n const directNames = await readDirectDepNames(path.dirname(lockfilePath));\n\n const entries: PackageEntry[] = [];\n const seen = new Set<string>();\n for (const block of blocks) {\n if (block.version.length === 0 || block.names.size === 0) {\n continue;\n }\n for (const name of block.names) {\n const dedupKey = `${name}@${block.version}`;\n if (seen.has(dedupKey)) {\n continue;\n }\n seen.add(dedupKey);\n entries.push({\n name,\n version: block.version,\n direct: directNames.has(name),\n });\n }\n }\n\n return entries;\n}\n\ninterface Block {\n names: Set<string>;\n version: string;\n}\n\nfunction parseBlocks(raw: string): Block[] {\n const lines = raw.split(/\\r?\\n/);\n const blocks: Block[] = [];\n let current: Block | null = null;\n\n const finalize = () => {\n if (current !== null && current.version.length > 0 && current.names.size > 0) {\n blocks.push(current);\n }\n current = null;\n };\n\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0 || trimmed.startsWith('#')) {\n continue;\n }\n\n const indent = countLeadingSpaces(line);\n\n if (indent === 0) {\n finalize();\n if (!trimmed.endsWith(':')) {\n continue;\n }\n // `__metadata:` (yarn berry header) has no `@` in any descriptor and\n // produces an empty names set, so it's naturally skipped on finalize.\n const keyLine = trimmed.slice(0, -1);\n const names = new Set<string>();\n for (const spec of splitDescriptors(keyLine)) {\n const name = extractName(spec);\n if (name !== null) {\n names.add(name);\n }\n }\n current = { names, version: '' };\n continue;\n }\n\n if (current === null) {\n continue;\n }\n\n const version = parseVersionField(trimmed);\n if (version !== null) {\n current.version = version;\n }\n }\n\n finalize();\n return blocks;\n}\n\nfunction countLeadingSpaces(line: string): number {\n let i = 0;\n while (i < line.length && line[i] === ' ') {\n i++;\n }\n return i;\n}\n\n/**\n * Splits a yarn descriptor key list on top-level commas. yarn quotes any\n * descriptor that contains characters needing escaping, so we respect quotes\n * while splitting to avoid breaking on commas inside (rare in practice but\n * cheap to handle).\n */\nexport function splitDescriptors(keyLine: string): string[] {\n const parts: string[] = [];\n let current = '';\n let quote: '\"' | \"'\" | null = null;\n\n for (let i = 0; i < keyLine.length; i++) {\n const c = keyLine[i];\n if (quote !== null) {\n current += c;\n if (c === quote) {\n quote = null;\n }\n continue;\n }\n if (c === '\"' || c === \"'\") {\n quote = c;\n current += c;\n continue;\n }\n if (c === ',') {\n const piece = current.trim();\n if (piece.length > 0) {\n parts.push(piece);\n }\n current = '';\n continue;\n }\n current += c;\n }\n const tail = current.trim();\n if (tail.length > 0) {\n parts.push(tail);\n }\n return parts;\n}\n\n/**\n * Extracts the package name from a yarn descriptor like `axios@^1.6.0`,\n * `\"@scope/pkg@^2.1.0\"`, or `\"@scope/pkg@npm:2.1.0\"`. The descriptor's\n * range portion is discarded — we only need the name, since the resolved\n * version comes from the `version` field of the block.\n */\nexport function extractName(rawSpec: string): string | null {\n let s = rawSpec.trim();\n if (s.length === 0) {\n return null;\n }\n if (\n (s.startsWith('\"') && s.endsWith('\"')) ||\n (s.startsWith(\"'\") && s.endsWith(\"'\"))\n ) {\n s = s.slice(1, -1);\n }\n // Position-0 `@` belongs to a scope, so we want the last `@` after it.\n const atIdx = s.lastIndexOf('@');\n if (atIdx <= 0) {\n return null;\n }\n const name = s.slice(0, atIdx);\n return name.length > 0 ? name : null;\n}\n\nfunction parseVersionField(content: string): string | null {\n if (!content.startsWith('version')) {\n return null;\n }\n const after = content.slice('version'.length);\n // yarn v1: `version \"1.2.3\"` (whitespace then quoted)\n // yarn berry: `version: 1.2.3` or `version: \"1.2.3\"`\n const firstChar = after.charAt(0);\n if (firstChar !== ' ' && firstChar !== '\\t' && firstChar !== ':') {\n return null;\n }\n let rest = firstChar === ':' ? after.slice(1) : after;\n rest = rest.trim();\n if (rest.length === 0) {\n return null;\n }\n if (\n (rest.startsWith('\"') && rest.endsWith('\"')) ||\n (rest.startsWith(\"'\") && rest.endsWith(\"'\"))\n ) {\n rest = rest.slice(1, -1);\n }\n return rest.length > 0 ? rest : null;\n}\n\nasync function readDirectDepNames(cwd: string): Promise<Set<string>> {\n const names = new Set<string>();\n let raw: string;\n try {\n raw = await readFile(path.join(cwd, 'package.json'), 'utf8');\n } catch {\n return names;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return names;\n }\n\n if (typeof parsed !== 'object' || parsed === null) {\n return names;\n }\n const obj = parsed as Record<string, unknown>;\n\n for (const field of ['dependencies', 'devDependencies', 'optionalDependencies', 'peerDependencies']) {\n const section = obj[field];\n if (typeof section !== 'object' || section === null) {\n continue;\n }\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n\n return names;\n}\n","import type { Manifest, PackageEntry } from './types.js';\n\nexport interface WirePackage {\n name: string;\n version: string;\n}\n\nexport interface WirePayload {\n ecosystem: Manifest['ecosystem'];\n packages: WirePackage[];\n}\n\nexport interface NormalizeStats {\n uniqueNames: number;\n duplicateNames: string[];\n totalEntries: number;\n}\n\nexport interface NormalizeResult {\n payload: WirePayload;\n stats: NormalizeStats;\n}\n\nexport function buildWirePayload(manifest: Manifest): NormalizeResult {\n const seen = new Map<string, Set<string>>();\n const wirePackages: WirePackage[] = [];\n\n for (const entry of manifest.packages) {\n const versions = seen.get(entry.name);\n if (versions) {\n if (versions.has(entry.version)) {\n continue;\n }\n versions.add(entry.version);\n } else {\n seen.set(entry.name, new Set([entry.version]));\n }\n wirePackages.push({ name: entry.name, version: entry.version });\n }\n\n wirePackages.sort((a, b) => {\n if (a.name === b.name) {\n return compareVersions(a.version, b.version);\n }\n return a.name < b.name ? -1 : 1;\n });\n\n const duplicateNames: string[] = [];\n for (const [name, versions] of seen) {\n if (versions.size > 1) {\n duplicateNames.push(name);\n }\n }\n\n return {\n payload: { ecosystem: manifest.ecosystem, packages: wirePackages },\n stats: {\n uniqueNames: seen.size,\n duplicateNames,\n totalEntries: manifest.packages.length,\n },\n };\n}\n\nexport function compareVersions(a: string, b: string): number {\n if (a === b) {\n return 0;\n }\n\n const [aBase, aPre] = splitPrerelease(a);\n const [bBase, bPre] = splitPrerelease(b);\n\n const baseCmp = compareSegments(aBase.split('.'), bBase.split('.'));\n if (baseCmp !== 0) {\n return baseCmp;\n }\n\n if (aPre === null && bPre === null) {\n return 0;\n }\n if (aPre === null) {\n return 1;\n }\n if (bPre === null) {\n return -1;\n }\n return compareSegments(aPre.split('.'), bPre.split('.'));\n}\n\nfunction splitPrerelease(version: string): [string, string | null] {\n const cleaned = version.replace(/^[v=]+/, '').split('+')[0]!;\n const dashIndex = cleaned.indexOf('-');\n if (dashIndex === -1) {\n return [cleaned, null];\n }\n return [cleaned.slice(0, dashIndex), cleaned.slice(dashIndex + 1)];\n}\n\nfunction compareSegments(a: string[], b: string[]): number {\n const max = Math.max(a.length, b.length);\n for (let i = 0; i < max; i++) {\n const aPart = a[i];\n const bPart = b[i];\n if (aPart === undefined) {\n return -1;\n }\n if (bPart === undefined) {\n return 1;\n }\n const aNum = /^\\d+$/.test(aPart);\n const bNum = /^\\d+$/.test(bPart);\n if (aNum && bNum) {\n const diff = Number(aPart) - Number(bPart);\n if (diff !== 0) {\n return diff < 0 ? -1 : 1;\n }\n continue;\n }\n if (aNum) {\n return -1;\n }\n if (bNum) {\n return 1;\n }\n if (aPart < bPart) {\n return -1;\n }\n if (aPart > bPart) {\n return 1;\n }\n }\n return 0;\n}\n\nexport function findPackageInManifest(\n manifest: Manifest,\n name: string,\n): PackageEntry[] {\n return manifest.packages.filter((p) => p.name === name);\n}\n","import { createHash } from 'node:crypto';\n\nimport type { WirePackage } from './normalize.js';\n\n/**\n * Fingerprint of a manifest's package set, byte-for-byte identical to the\n * checksum Patchstack stores server-side (PulseController::storeManifest): the\n * first 12 hex chars of sha256 over the JSON of the packages sorted by\n * `[name, version]` with plain lexicographic (byte) ordering.\n *\n * This mirrors PHP's `usort(..., fn($a,$b) => [$a['name'],$a['version']] <=> ...)`\n * followed by `json_encode(..., JSON_UNESCAPED_SLASHES)`. Two deliberate details:\n *\n * - The sort is lexicographic, NOT the semver-aware ordering `buildWirePayload`\n * uses for display. The server re-sorts lexicographically before hashing, so\n * the fingerprint must too (e.g. `1.10.0` sorts before `1.9.0`).\n * - npm/composer package names and versions are ASCII, so JS `JSON.stringify`\n * and PHP `json_encode` produce identical bytes (no unicode escaping, and\n * neither escapes `/`, so scoped names like `@babel/core` match).\n *\n * Injected into built HTML by `mark-build` and reported by the disclosure widget\n * so Patchstack can compare the live build against the last reported manifest.\n */\nexport function computeManifestChecksum(packages: WirePackage[]): string {\n const canonical = packages\n .map((pkg) => ({ name: pkg.name, version: pkg.version }))\n .sort((a, b) => {\n if (a.name !== b.name) {\n return a.name < b.name ? -1 : 1;\n }\n if (a.version !== b.version) {\n return a.version < b.version ? -1 : 1;\n }\n return 0;\n });\n\n return createHash('sha256').update(JSON.stringify(canonical)).digest('hex').slice(0, 12);\n}\n","import { PatchstackError, type Config, type StoreManifestResponse } from './types.js';\nimport type { WirePayload } from './normalize.js';\n\nexport const DEFAULT_ENDPOINT = 'https://api.patchstack.com/monitor/pulse/manifest';\nexport const DEFAULT_TIMEOUT_MS = 30_000;\n\nexport function buildEndpointUrl(base: string, siteUuid?: string | null): string {\n const trimmed = base.replace(/\\/$/, '');\n return siteUuid !== undefined && siteUuid !== null && siteUuid.length > 0\n ? `${trimmed}/${encodeURIComponent(siteUuid)}`\n : trimmed;\n}\n\n/**\n * Build the claim URL for a site. The claim page lives on the same origin as\n * the API endpoint, at `/monitor/claim?site=<uuid>`. Using the API endpoint's\n * origin (rather than a hard-coded https://api.patchstack.com) means staging,\n * ngrok tunnels and local dev environments all produce a claim URL on the same\n * host the connector is already talking to.\n */\nexport function buildClaimUrl(endpoint: string, siteUuid: string): string {\n const origin = new URL(endpoint).origin;\n return `${origin}/monitor/claim?site=${encodeURIComponent(siteUuid)}`;\n}\n\nexport async function postManifest(\n config: Config,\n payload: WirePayload,\n): Promise<StoreManifestResponse> {\n const url = buildEndpointUrl(config.endpoint, config.siteUuid);\n const timeoutMs = config.timeoutMs;\n\n let response: Response;\n try {\n response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': '@patchstack/connect',\n },\n body: JSON.stringify({ ...payload, environment: config.environment }),\n signal: AbortSignal.timeout(timeoutMs),\n });\n } catch (cause) {\n if (isTimeoutError(cause)) {\n throw new PatchstackError(\n `Patchstack request to ${url} timed out after ${timeoutMs}ms. Override with PATCHSTACK_TIMEOUT_MS.`,\n 'NETWORK_TIMEOUT',\n cause,\n );\n }\n throw new PatchstackError(\n `Could not reach Patchstack at ${url}. Check your network connection.`,\n 'NETWORK_ERROR',\n cause,\n );\n }\n\n const text = await response.text();\n let body: StoreManifestResponse | null = null;\n try {\n body = text.length > 0 ? (JSON.parse(text) as StoreManifestResponse) : null;\n } catch {\n body = null;\n }\n\n if (response.status === 404) {\n throw new PatchstackError(\n body?.error ?? 'Site not found. Check that your site UUID is correct and that the app is registered as a Pulse app in your Patchstack dashboard.',\n 'SITE_NOT_FOUND',\n );\n }\n\n if (response.status === 422) {\n throw new PatchstackError(\n body?.message ?? 'Patchstack rejected the manifest payload (validation failed).',\n 'VALIDATION_ERROR',\n );\n }\n\n if (response.status < 200 || response.status >= 300) {\n throw new PatchstackError(\n `Patchstack returned ${response.status}: ${text.slice(0, 200)}`,\n 'SERVER_ERROR',\n );\n }\n\n if (body === null) {\n throw new PatchstackError('Patchstack returned an empty response.', 'SERVER_ERROR');\n }\n\n return body;\n}\n\nfunction isTimeoutError(cause: unknown): boolean {\n if (cause instanceof Error) {\n return cause.name === 'TimeoutError' || cause.name === 'AbortError';\n }\n return false;\n}\n","import { readFile, writeFile } from 'node:fs/promises';\nimport path from 'node:path';\nimport { PatchstackError, type Config, type Environment } from './types.js';\nimport { DEFAULT_ENDPOINT, DEFAULT_TIMEOUT_MS } from './client.js';\n\nconst CONFIG_FILENAME = '.patchstackrc.json';\n\nexport const DEFAULT_ENVIRONMENT: Environment = 'production';\n\ninterface ConfigFile {\n siteUuid?: string;\n endpoint?: string;\n timeoutMs?: number;\n environment?: string;\n widget?: boolean;\n}\n\nexport interface ResolveConfigOptions {\n cwd: string;\n cliSiteUuid?: string;\n cliEndpoint?: string;\n /**\n * When true, resolveConfig throws CONFIG_MISSING if no site UUID is configured.\n * Defaults to false: callers that can run without a UUID (the first `scan` after\n * `npm install`) just get `siteUuid: null` back and learn the UUID from the\n * server response.\n */\n requireSiteUuid?: boolean;\n}\n\nexport async function resolveConfig(options: ResolveConfigOptions): Promise<Config> {\n const fromFile = await readConfigFile(options.cwd);\n const fromEnv = readEnv();\n\n const siteUuid =\n options.cliSiteUuid ??\n fromEnv.siteUuid ??\n fromFile.siteUuid ??\n null;\n\n const endpoint =\n options.cliEndpoint ??\n fromEnv.endpoint ??\n fromFile.endpoint ??\n DEFAULT_ENDPOINT;\n\n const timeoutMs = fromEnv.timeoutMs ?? fromFile.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n\n const environmentRaw = fromEnv.environment ?? fromFile.environment;\n if (environmentRaw !== undefined && !isEnvironment(environmentRaw)) {\n throw new PatchstackError(\n `Environment must be \"production\" or \"sandbox\"; got \"${environmentRaw}\".`,\n 'CONFIG_INVALID',\n );\n }\n const environment: Environment = environmentRaw ?? DEFAULT_ENVIRONMENT;\n\n if (siteUuid !== null && siteUuid.length > 0 && !isUuid(siteUuid)) {\n throw new PatchstackError(\n `Site UUID \"${siteUuid}\" does not look like a valid UUID.`,\n 'CONFIG_INVALID',\n );\n }\n\n if (options.requireSiteUuid && (siteUuid === null || siteUuid.length === 0)) {\n throw new PatchstackError(\n 'No site UUID configured. Run `patchstack-connect scan` to provision one, or set PATCHSTACK_SITE_UUID.',\n 'CONFIG_MISSING',\n );\n }\n\n return {\n siteUuid: siteUuid === null || siteUuid.length === 0 ? null : siteUuid,\n endpoint,\n timeoutMs,\n environment,\n widget: fromFile.widget !== false,\n };\n}\n\nexport async function writeConfigFile(cwd: string, config: ConfigFile): Promise<string> {\n const target = path.join(cwd, CONFIG_FILENAME);\n const content = JSON.stringify(config, null, 2) + '\\n';\n await writeFile(target, content, 'utf8');\n return target;\n}\n\n/**\n * Merge a new siteUuid into the existing `.patchstackrc.json` (or create it).\n * Preserves any `endpoint` / `timeoutMs` the user already wrote.\n */\nexport async function persistSiteUuid(cwd: string, siteUuid: string): Promise<string> {\n const existing = await readConfigFile(cwd);\n return writeConfigFile(cwd, { ...existing, siteUuid });\n}\n\nasync function readConfigFile(cwd: string): Promise<ConfigFile> {\n const target = path.join(cwd, CONFIG_FILENAME);\n let raw: string;\n try {\n raw = await readFile(target, 'utf8');\n } catch (err) {\n if ((err as NodeJS.ErrnoException).code === 'ENOENT') {\n return {};\n }\n throw new PatchstackError(\n `Could not read ${target}: ${(err as Error).message}`,\n 'CONFIG_INVALID',\n err,\n );\n }\n\n try {\n return JSON.parse(raw) as ConfigFile;\n } catch (err) {\n throw new PatchstackError(\n `Config file ${target} contains invalid JSON.`,\n 'CONFIG_INVALID',\n err,\n );\n }\n}\n\nfunction readEnv(): ConfigFile {\n const timeoutRaw = process.env.PATCHSTACK_TIMEOUT_MS;\n let timeoutMs: number | undefined;\n if (timeoutRaw !== undefined && timeoutRaw.length > 0) {\n const parsed = Number(timeoutRaw);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new PatchstackError(\n `PATCHSTACK_TIMEOUT_MS must be a positive number; got \"${timeoutRaw}\".`,\n 'CONFIG_INVALID',\n );\n }\n timeoutMs = parsed;\n }\n const environmentRaw = process.env.PATCHSTACK_ENVIRONMENT;\n return {\n siteUuid: process.env.PATCHSTACK_SITE_UUID ?? undefined,\n endpoint: process.env.PATCHSTACK_ENDPOINT ?? undefined,\n timeoutMs,\n environment:\n environmentRaw !== undefined && environmentRaw.length > 0 ? environmentRaw : undefined,\n };\n}\n\nfunction isUuid(value: string): boolean {\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\n\nfunction isEnvironment(value: string): value is Environment {\n return value === 'production' || value === 'sandbox';\n}\n","import { existsSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { isEmptyStack, type StackDescriptor } from './stack.js';\n\n/** Attribute that tags our injected <script> so re-runs replace it instead of stacking. */\nexport const MARKER_ATTR = 'data-patchstack-build';\n\n/** Build output directories we look for, in priority order (Vite, CRA, Next export, Nuxt). */\nexport const BUILD_DIR_CANDIDATES = ['dist', 'build', 'out', '.output/public'];\n\n/**\n * Resolve the directory holding the built HTML. Honours an explicit `--dir`\n * override, otherwise picks the first known build directory that exists.\n * Returns null when nothing is found (mark-build then no-ops without failing).\n */\nexport function resolveBuildDir(cwd: string, override?: string): string | null {\n if (override !== undefined && override !== '') {\n const abs = path.resolve(cwd, override);\n return existsSync(abs) && statSync(abs).isDirectory() ? abs : null;\n }\n\n for (const candidate of BUILD_DIR_CANDIDATES) {\n const abs = path.resolve(cwd, candidate);\n if (existsSync(abs) && statSync(abs).isDirectory()) {\n return abs;\n }\n }\n\n return null;\n}\n\n/** Recursively collect every `.html` file under `dir`. */\nexport function findHtmlFiles(dir: string): string[] {\n const out: string[] = [];\n\n const walk = (current: string): void => {\n for (const entry of readdirSync(current, { withFileTypes: true })) {\n const full = path.join(current, entry.name);\n if (entry.isDirectory()) {\n walk(full);\n } else if (entry.isFile() && entry.name.toLowerCase().endsWith('.html')) {\n out.push(full);\n }\n }\n };\n\n walk(dir);\n return out;\n}\n\n/**\n * The <script> we inject into built HTML. Always marks the build as production\n * (so the widget hides the connect/claim prompt on the published site) and, when\n * available, exposes the build fingerprint (for the parity heartbeat) and the\n * detected stack descriptor (so the widget can report how the site was built).\n */\nexport function buildInjectionSnippet(\n checksum: string | null,\n stack?: StackDescriptor | null,\n): string {\n const statements = ['window.__PATCHSTACK_PROD__=true;'];\n if (checksum !== null && checksum !== '') {\n statements.push(`window.__PATCHSTACK_BUILD__=${JSON.stringify(checksum)};`);\n }\n if (stack != null && !isEmptyStack(stack)) {\n statements.push(`window.__PATCHSTACK_STACK__=${JSON.stringify(stack)};`);\n }\n return `<script ${MARKER_ATTR}>${statements.join('')}</script>`;\n}\n\n/**\n * Insert (or replace) the marker script in a single HTML document. Idempotent:\n * a prior marker is stripped first so repeated builds don't stack tags. Prefers\n * `</head>`, falls back to `</body>`, then appends.\n */\nexport function injectMarker(html: string, snippet: string): string {\n const stripped = html.replace(\n new RegExp(`\\\\s*<script ${MARKER_ATTR}[^>]*>[\\\\s\\\\S]*?</script>`, 'gi'),\n '',\n );\n\n if (/<\\/head>/i.test(stripped)) {\n return stripped.replace(/<\\/head>/i, `${snippet}</head>`);\n }\n if (/<\\/body>/i.test(stripped)) {\n return stripped.replace(/<\\/body>/i, `${snippet}</body>`);\n }\n return stripped + snippet;\n}\n","import type { WirePackage } from './normalize.js';\n\n/**\n * A best-effort description of the stack a build was produced with, derived\n * entirely from the lockfile (ground truth) plus the build-time environment.\n *\n * The disclosure widget reads this from `window.__PATCHSTACK_STACK__` (injected\n * by `mark-build`) and reports it to Patchstack, so we learn how the sites we\n * protect are actually built and hosted — across every \"vibe\" platform — without\n * shipping a runtime probe onto the host server. Every field is a coarse label\n * or a bare key *name*: no versions beyond the framework, and never an env value.\n */\nexport interface StackDescriptor {\n /** App / meta-framework, e.g. \"next\", \"nuxt\", \"tanstack-start\", \"remix\". */\n framework: string | null;\n /** UI runtime, e.g. \"react\", \"vue\", \"svelte\", \"solid\". */\n ui: string | null;\n /** Build tool / bundler, e.g. \"vite\", \"webpack\", \"rspack\". */\n bundler: string | null;\n /** Deployment-runtime hint from deps, e.g. \"cloudflare-workers\", \"vercel\". */\n runtime: string | null;\n /** The vibe/builder platform that generated the project, e.g. \"lovable\". */\n builder: string | null;\n /** Package ecosystem the manifest came from. */\n ecosystem: 'npm';\n /** Hosting-related build-environment variable NAMES (never their values). */\n hostingEnvKeys: string[];\n}\n\ntype Category = 'framework' | 'ui' | 'bundler' | 'runtime' | 'builder';\n\ninterface StackRule {\n category: Category;\n /** Exact package name that signals this label. */\n pkg: string;\n label: string;\n}\n\n/**\n * Package → stack-label registry. First match per category wins, so order\n * within a category is priority order (most specific first). Add a row to teach\n * the connector a new framework, bundler, or vibe platform.\n */\nconst STACK_RULES: readonly StackRule[] = [\n // Meta-frameworks (most specific first).\n { category: 'framework', pkg: '@tanstack/react-start', label: 'tanstack-start' },\n { category: 'framework', pkg: '@tanstack/start', label: 'tanstack-start' },\n { category: 'framework', pkg: 'next', label: 'next' },\n { category: 'framework', pkg: 'nuxt', label: 'nuxt' },\n { category: 'framework', pkg: '@remix-run/react', label: 'remix' },\n { category: 'framework', pkg: '@remix-run/node', label: 'remix' },\n { category: 'framework', pkg: 'react-router', label: 'react-router' },\n { category: 'framework', pkg: 'astro', label: 'astro' },\n { category: 'framework', pkg: '@sveltejs/kit', label: 'sveltekit' },\n { category: 'framework', pkg: '@builder.io/qwik-city', label: 'qwik-city' },\n { category: 'framework', pkg: 'gatsby', label: 'gatsby' },\n { category: 'framework', pkg: 'express', label: 'express' },\n { category: 'framework', pkg: 'fastify', label: 'fastify' },\n\n // UI runtimes.\n { category: 'ui', pkg: '@angular/core', label: 'angular' },\n { category: 'ui', pkg: 'react-dom', label: 'react' },\n { category: 'ui', pkg: 'react', label: 'react' },\n { category: 'ui', pkg: 'vue', label: 'vue' },\n { category: 'ui', pkg: 'svelte', label: 'svelte' },\n { category: 'ui', pkg: 'solid-js', label: 'solid' },\n { category: 'ui', pkg: 'preact', label: 'preact' },\n\n // Bundlers / build tools.\n { category: 'bundler', pkg: 'vite', label: 'vite' },\n { category: 'bundler', pkg: '@rspack/core', label: 'rspack' },\n { category: 'bundler', pkg: 'webpack', label: 'webpack' },\n { category: 'bundler', pkg: 'parcel', label: 'parcel' },\n { category: 'bundler', pkg: 'rollup', label: 'rollup' },\n { category: 'bundler', pkg: 'esbuild', label: 'esbuild' },\n\n // Deployment-runtime hints from build deps.\n { category: 'runtime', pkg: 'wrangler', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@cloudflare/workers-types', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@cloudflare/vite-plugin', label: 'cloudflare-workers' },\n { category: 'runtime', pkg: '@vercel/node', label: 'vercel' },\n { category: 'runtime', pkg: '@netlify/functions', label: 'netlify' },\n { category: 'runtime', pkg: '@netlify/blobs', label: 'netlify' },\n\n // Vibe / builder platforms — the \"learn from each platform\" signal.\n { category: 'builder', pkg: 'lovable-tagger', label: 'lovable' },\n { category: 'builder', pkg: '@replit/vite-plugin-runtime-error-modal', label: 'replit' },\n { category: 'builder', pkg: '@replit/vite-plugin-cartographer', label: 'replit' },\n];\n\n/** Build-environment variable-name patterns that fingerprint a host, from server-insight. */\nconst HOSTING_ENV_PATTERNS: readonly RegExp[] = [\n /^CF_/,\n /^CLOUDFLARE_/,\n /^VERCEL/,\n /^NETLIFY/,\n /^AWS_(LAMBDA|REGION|EXECUTION)/,\n /^FLY_/,\n /^RENDER/,\n /^RAILWAY_/,\n /^DENO_/,\n /^EDGE_RUNTIME/,\n /^DYNO$/,\n /^K_SERVICE$/,\n /^GAE_/,\n /^FUNCTION_/,\n];\n\n/**\n * Return the sorted NAMES of hosting-related environment variables present in\n * `env`. Only names are surfaced — never values — so a build fingerprint can\n * distinguish \"deployed on Cloudflare\" from \"deployed on Vercel\" without ever\n * disclosing a secret.\n */\nexport function collectHostingEnvKeys(env: NodeJS.ProcessEnv = process.env): string[] {\n return Object.keys(env)\n .filter((key) => HOSTING_ENV_PATTERNS.some((pattern) => pattern.test(key)))\n .sort();\n}\n\n/**\n * Derive a {@link StackDescriptor} from the wire packages and the build\n * environment. Never throws: an unrecognised stack just yields nulls.\n */\nexport function detectStack(\n packages: readonly WirePackage[],\n env: NodeJS.ProcessEnv = process.env,\n): StackDescriptor {\n const present = new Set(packages.map((pkg) => pkg.name));\n\n const firstMatch = (category: Category): string | null => {\n for (const rule of STACK_RULES) {\n if (rule.category === category && present.has(rule.pkg)) {\n return rule.label;\n }\n }\n return null;\n };\n\n return {\n framework: firstMatch('framework'),\n ui: firstMatch('ui'),\n bundler: firstMatch('bundler'),\n runtime: firstMatch('runtime'),\n builder: firstMatch('builder'),\n ecosystem: 'npm',\n hostingEnvKeys: collectHostingEnvKeys(env),\n };\n}\n\n/** True when the descriptor carries no useful signal (nothing worth injecting). */\nexport function isEmptyStack(stack: StackDescriptor): boolean {\n return (\n stack.framework === null &&\n stack.ui === null &&\n stack.bundler === null &&\n stack.runtime === null &&\n stack.builder === null &&\n stack.hostingEnvKeys.length === 0\n );\n}\n","// `patchstack-connect guide` — a state-aware setup checklist.\n//\n// Instead of only printing the generic AGENT-INSTALL.md, the guide first inspects\n// the current project (package.json, lockfile, .patchstackrc.json, source tree)\n// and renders a checklist of what is already done and what is still missing, with\n// the exact commands/snippets for THIS project (right package manager, real site\n// UUID, framework-specific widget placement). Every probe is best-effort: an\n// unreadable project degrades to an all-todo checklist, never a crash.\n\nimport { existsSync, readFileSync, readdirSync, statSync } from 'node:fs';\nimport path from 'node:path';\n\nimport { DEFAULT_ENDPOINT, buildClaimUrl } from './client.js';\nimport { resolveConfig } from './config.js';\nimport { detectStack } from './stack.js';\nimport { buildWidgetTag } from './widget.js';\n\n/** Substring that marks the widget as installed anywhere in the source tree. */\nconst WIDGET_NEEDLE = 'patchstack-widget';\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\nexport interface GuideState {\n /** package.json `name`, when readable. */\n projectName: string | null;\n hasPackageJson: boolean;\n packageManager: PackageManager;\n /** Version + section when @patchstack/connect is declared, else null. */\n installed: { version: string; section: 'devDependencies' | 'dependencies' } | null;\n siteUuid: string | null;\n claimUrl: string | null;\n /** Non-default API endpoint in effect (rc file, env, or flag), else null. */\n endpointOverride: string | null;\n prebuildWired: boolean;\n postbuildWired: boolean;\n widgetInstalled: boolean;\n /** False when the widget is present but its site UUID isn't this project's. */\n widgetTokenMatches: boolean | null;\n /** True when .patchstackrc.json opts out of widget management (\"widget\": false). */\n widgetOptOut: boolean;\n /** Framework label from the declared dependencies (e.g. \"next\"), best-effort. */\n framework: string | null;\n /** Existing file the widget snippet belongs in, best-effort. */\n widgetFileHint: string | null;\n}\n\nconst INSTALL_COMMANDS: Record<PackageManager, string> = {\n npm: 'npm install --save-dev @patchstack/connect',\n pnpm: 'pnpm add -D @patchstack/connect',\n yarn: 'yarn add -D @patchstack/connect',\n bun: 'bun add -d @patchstack/connect',\n};\n\n/**\n * Lockfile → package manager for build-script semantics. Platform-native\n * lockfiles win over package-lock.json because agents often use npm as a\n * fallback inside Bun/pnpm/yarn projects, creating a secondary npm lockfile\n * without changing the platform's actual build runner.\n */\nconst PM_BY_LOCKFILE: ReadonlyArray<{ filename: string; pm: PackageManager }> = [\n { filename: 'bun.lock', pm: 'bun' },\n { filename: 'bun.lockb', pm: 'bun' },\n { filename: 'pnpm-lock.yaml', pm: 'pnpm' },\n { filename: 'yarn.lock', pm: 'yarn' },\n { filename: 'package-lock.json', pm: 'npm' },\n];\n\n/**\n * Framework → candidate layout files the widget snippet belongs in, most\n * specific first. The first candidate that exists in the project wins.\n */\nconst WIDGET_FILE_CANDIDATES: Record<string, string[]> = {\n next: [\n 'app/layout.tsx',\n 'app/layout.jsx',\n 'src/app/layout.tsx',\n 'src/app/layout.jsx',\n 'pages/_document.tsx',\n 'pages/_document.jsx',\n 'src/pages/_document.tsx',\n ],\n nuxt: ['app.vue', 'src/app.vue', 'app/app.vue'],\n remix: ['app/root.tsx', 'app/root.jsx'],\n 'react-router': ['app/root.tsx', 'src/root.tsx'],\n 'tanstack-start': ['src/routes/__root.tsx', 'app/routes/__root.tsx'],\n sveltekit: ['src/app.html'],\n astro: ['src/layouts/Layout.astro'],\n gatsby: ['src/html.js'],\n};\n\n/** Fallback candidates for plain Vite / CRA / static projects. */\nconst GENERIC_WIDGET_FILES = ['index.html', 'public/index.html'];\n\n/** Directories never worth searching for the widget snippet. */\nconst SKIPPED_DIRS = new Set([\n 'node_modules',\n '.git',\n 'dist',\n 'build',\n 'out',\n '.output',\n '.next',\n '.nuxt',\n '.svelte-kit',\n '.vercel',\n '.netlify',\n 'coverage',\n 'vendor',\n]);\n\n/** Source extensions that can carry the widget <script> tags. */\nconst WIDGET_EXTENSIONS = new Set([\n '.html',\n '.htm',\n '.tsx',\n '.jsx',\n '.ts',\n '.js',\n '.mjs',\n '.cjs',\n '.vue',\n '.svelte',\n '.astro',\n '.ejs',\n '.hbs',\n]);\n\nconst WIDGET_SCAN_MAX_FILES = 4000;\nconst WIDGET_SCAN_MAX_DEPTH = 6;\nconst WIDGET_SCAN_MAX_BYTES = 512 * 1024;\n\ninterface PackageJson {\n name?: string;\n packageManager?: string;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n scripts?: Record<string, string>;\n}\n\nexport function detectPackageManager(cwd: string): PackageManager {\n const declared = readPackageJson(cwd)?.packageManager?.split('@')[0];\n if (declared === 'npm' || declared === 'pnpm' || declared === 'yarn' || declared === 'bun') {\n return declared;\n }\n for (const { filename, pm } of PM_BY_LOCKFILE) {\n if (existsSync(path.join(cwd, filename))) {\n return pm;\n }\n }\n return 'npm';\n}\n\nexport function installCommand(pm: PackageManager): string {\n return INSTALL_COMMANDS[pm];\n}\n\nfunction readPackageJson(cwd: string): PackageJson | null {\n try {\n return JSON.parse(readFileSync(path.join(cwd, 'package.json'), 'utf8')) as PackageJson;\n } catch {\n return null;\n }\n}\n\n/** Prefer the actually-installed version over the declared range. */\nfunction installedVersion(cwd: string, declaredRange: string): string {\n try {\n const pkg = JSON.parse(\n readFileSync(path.join(cwd, 'node_modules', '@patchstack', 'connect', 'package.json'), 'utf8'),\n ) as { version?: string };\n if (typeof pkg.version === 'string' && pkg.version.length > 0) {\n return pkg.version;\n }\n } catch {\n // fall through to the declared range\n }\n return declaredRange;\n}\n\nexport interface WidgetScanResult {\n found: boolean;\n /**\n * When a site UUID is known: does any file carrying the widget also carry\n * that UUID as its userToken? null when the widget is absent or no UUID is\n * known yet. A stale/wrong userToken makes the widget silently no-op, so a\n * mismatch is worth surfacing rather than passing the check.\n */\n uuidMatches: boolean | null;\n}\n\n/**\n * Bounded recursive search for the widget marker in the source tree. Depth,\n * file-count and file-size capped so the guide stays instant on big projects.\n */\nexport function findWidgetMarker(cwd: string, siteUuid?: string | null): WidgetScanResult {\n let budget = WIDGET_SCAN_MAX_FILES;\n let sawWidget = false;\n let sawTokenMatch = false;\n\n // Stop early only once the answer can't improve: with no UUID to match, the\n // first hit settles it; with a UUID, keep looking until a matching file shows.\n const settled = (): boolean => sawTokenMatch || (sawWidget && siteUuid == null);\n\n const walk = (dir: string, depth: number): void => {\n if (depth > WIDGET_SCAN_MAX_DEPTH || budget <= 0) {\n return;\n }\n let entries;\n try {\n entries = readdirSync(dir, { withFileTypes: true });\n } catch {\n return;\n }\n for (const entry of entries) {\n if (budget <= 0 || settled()) {\n return;\n }\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (SKIPPED_DIRS.has(entry.name) || entry.name.startsWith('.')) {\n continue;\n }\n walk(full, depth + 1);\n continue;\n }\n if (!entry.isFile() || !WIDGET_EXTENSIONS.has(path.extname(entry.name).toLowerCase())) {\n continue;\n }\n budget -= 1;\n try {\n if (statSync(full).size > WIDGET_SCAN_MAX_BYTES) {\n continue;\n }\n const content = readFileSync(full, 'utf8');\n if (!content.includes(WIDGET_NEEDLE)) {\n continue;\n }\n sawWidget = true;\n if (siteUuid != null && content.includes(siteUuid)) {\n sawTokenMatch = true;\n }\n } catch {\n // unreadable file — skip\n }\n }\n };\n\n walk(cwd, 0);\n return {\n found: sawWidget,\n uuidMatches: sawWidget && siteUuid != null ? sawTokenMatch : null,\n };\n}\n\nfunction resolveWidgetFileHint(cwd: string, framework: string | null): string | null {\n const candidates = [\n ...(framework !== null ? WIDGET_FILE_CANDIDATES[framework] ?? [] : []),\n ...GENERIC_WIDGET_FILES,\n ];\n for (const candidate of candidates) {\n if (existsSync(path.join(cwd, candidate))) {\n return candidate;\n }\n }\n return null;\n}\n\nexport async function collectGuideState(cwd: string): Promise<GuideState> {\n const pkg = readPackageJson(cwd);\n const packageManager = detectPackageManager(cwd);\n\n let installed: GuideState['installed'] = null;\n if (pkg?.devDependencies?.['@patchstack/connect'] !== undefined) {\n installed = {\n version: installedVersion(cwd, pkg.devDependencies['@patchstack/connect']),\n section: 'devDependencies',\n };\n } else if (pkg?.dependencies?.['@patchstack/connect'] !== undefined) {\n installed = {\n version: installedVersion(cwd, pkg.dependencies['@patchstack/connect']),\n section: 'dependencies',\n };\n }\n\n let siteUuid: string | null = null;\n let claimUrl: string | null = null;\n let endpointOverride: string | null = null;\n let widgetOptOut = false;\n try {\n const config = await resolveConfig({ cwd });\n siteUuid = config.siteUuid;\n if (siteUuid !== null) {\n claimUrl = buildClaimUrl(config.endpoint, siteUuid);\n }\n if (config.endpoint !== DEFAULT_ENDPOINT) {\n endpointOverride = config.endpoint;\n }\n widgetOptOut = !config.widget;\n } catch {\n // invalid config — the checklist just shows the site as not provisioned\n }\n\n // Framework detection needs only the declared top-level dependencies, so we\n // read package.json instead of the (much heavier) lockfile scan.\n const declaredNames = Object.keys({ ...pkg?.dependencies, ...pkg?.devDependencies });\n const stack = detectStack(\n declaredNames.map((name) => ({ name, version: '' })),\n {},\n );\n\n const widget = findWidgetMarker(cwd, siteUuid);\n\n return {\n projectName: pkg?.name ?? null,\n hasPackageJson: pkg !== null,\n packageManager,\n installed,\n siteUuid,\n claimUrl,\n endpointOverride,\n // bun run doesn't execute npm-style pre/post scripts, so chaining inside\n // the build script itself also counts as wired (and is what we suggest on bun).\n prebuildWired:\n (pkg?.scripts?.prebuild ?? '').includes('patchstack-connect scan') ||\n (pkg?.scripts?.build ?? '').includes('patchstack-connect scan'),\n postbuildWired:\n (pkg?.scripts?.postbuild ?? '').includes('patchstack-connect mark-build') ||\n (pkg?.scripts?.build ?? '').includes('patchstack-connect mark-build'),\n widgetInstalled: widget.found,\n widgetTokenMatches: widget.uuidMatches,\n widgetOptOut,\n framework: stack.framework,\n widgetFileHint: resolveWidgetFileHint(cwd, stack.framework),\n };\n}\n\nconst ANSI = {\n reset: '\\u001B[0m',\n bold: '\\u001B[1m',\n dim: '\\u001B[2m',\n green: '\\u001B[32m',\n yellow: '\\u001B[33m',\n cyan: '\\u001B[36m',\n};\n\n/** Setup steps still missing — 0 means the checklist is fully green. */\nexport function countRemainingSteps(state: GuideState): number {\n return [\n state.installed !== null,\n state.siteUuid !== null,\n state.prebuildWired && state.postbuildWired,\n state.widgetOptOut || (state.widgetInstalled && state.widgetTokenMatches !== false),\n ].filter((step) => !step).length;\n}\n\nexport function renderGuideChecklist(state: GuideState, useColor: boolean): string {\n const paint = (code: string, text: string): string =>\n useColor ? `${code}${text}${ANSI.reset}` : text;\n const done = (text: string): string => ` ${paint(ANSI.green, '✔')} ${text}`;\n const todo = (text: string): string => ` ${paint(ANSI.yellow, '✖')} ${paint(ANSI.bold, text)}`;\n const detail = (text: string): string => ` ${paint(ANSI.dim, text)}`;\n const lines: string[] = [];\n\n const headerParts = [state.framework, state.packageManager].filter(\n (part): part is string => part !== null,\n );\n const name = state.projectName ?? path.basename(process.cwd());\n lines.push(paint(ANSI.bold, `Patchstack setup status — ${name} (${headerParts.join(' · ')})`));\n if (state.endpointOverride !== null) {\n lines.push(\n detail(\n `endpoint override in effect: ${state.endpointOverride} (set via .patchstackrc.json, PATCHSTACK_ENDPOINT, or --endpoint)`,\n ),\n );\n }\n lines.push('');\n\n if (!state.hasPackageJson) {\n lines.push(todo('No package.json found in this directory.'));\n lines.push(detail('Run the guide from the project root.'));\n return lines.join('\\n');\n }\n\n // 1. Install\n if (state.installed !== null) {\n lines.push(done(`@patchstack/connect installed (${state.installed.version}, ${state.installed.section})`));\n } else {\n lines.push(todo('Install @patchstack/connect as a dev dependency'));\n lines.push(detail(`Run → ${installCommand(state.packageManager)}`));\n if (state.packageManager === 'bun') {\n lines.push(detail(`(if bun isn't available here, ${INSTALL_COMMANDS.npm} works too)`));\n }\n }\n\n // 2. Provision (first scan)\n if (state.siteUuid !== null) {\n lines.push(done(`Site provisioned (${state.siteUuid})`));\n } else {\n lines.push(todo('Provision the site — run the first scan'));\n lines.push(detail('Run → npx @patchstack/connect scan'));\n lines.push(detail('Reads the lockfile, registers the project, writes .patchstackrc.json,'));\n lines.push(detail('and prints a dashboard link. The CLI prints the link but never opens it.'));\n }\n\n // 3. Build hooks\n if (state.prebuildWired && state.postbuildWired) {\n lines.push(done('Build hooks wired (scan before builds, mark-build after)'));\n } else if (state.packageManager === 'bun') {\n // bun run skips npm-style pre/post scripts, so chain inside the build script.\n lines.push(todo('Wire the build hooks yourself — edit package.json (bun skips pre/post hooks, so chain inside \"build\")'));\n lines.push(detail('Edit package.json → \"build\": \"patchstack-connect scan && <existing build command> && patchstack-connect mark-build\"'));\n } else {\n lines.push(todo('Wire the build hooks yourself — edit package.json \"scripts\" (chain with && if a hook already exists)'));\n if (!state.prebuildWired) {\n lines.push(detail('Edit package.json → \"prebuild\": \"patchstack-connect scan\"'));\n }\n if (!state.postbuildWired) {\n lines.push(detail('Edit package.json → \"postbuild\": \"patchstack-connect mark-build\"'));\n }\n }\n\n // 4. Disclosure widget\n const widgetOk = state.widgetInstalled && state.widgetTokenMatches !== false;\n if (state.widgetOptOut && !widgetOk) {\n lines.push(done('Disclosure widget disabled by config (\"widget\": false in .patchstackrc.json)'));\n } else if (widgetOk) {\n lines.push(done('Disclosure widget installed'));\n } else if (state.widgetInstalled) {\n lines.push(todo(\"Fix the disclosure widget yourself — its site UUID doesn't match this project's\"));\n lines.push(detail(`Edit the widget tag → set data-site-uuid (or userToken) to '${state.siteUuid}' (a wrong UUID makes the widget silently no-op)`));\n } else if (state.siteUuid === null) {\n lines.push(todo('Add the \"Report a vulnerability\" widget — the first scan does this for you'));\n lines.push(detail('Run → npx @patchstack/connect scan (provisions the site and adds the widget tag'));\n lines.push(detail(' to the root HTML shell: index.html / public/index.html / src/app.html)'));\n } else {\n lines.push(todo('Add the \"Report a vulnerability\" widget yourself — this root is code, not a plain HTML shell'));\n lines.push(detail('Note → a normal `scan` adds this tag to a plain HTML shell automatically; add it by hand here:'));\n const placement =\n state.widgetFileHint !== null\n ? `Edit ${state.widgetFileHint} → put it just before </body>:`\n : \"Edit your root layout → put it just before </body> (the framework's HTML/layout mechanism, never a JS entry point):\";\n lines.push(detail(placement));\n lines.push(detail(` ${buildWidgetTag(state.siteUuid)}`));\n lines.push(detail('The site UUID is public by design — it ships in client-side HTML.'));\n }\n\n // 5. Dashboard access — always keep the URL prominent.\n lines.push('');\n if (state.claimUrl !== null) {\n lines.push(` ${paint(ANSI.cyan, '➜')} ${paint(ANSI.bold, 'Dashboard link (open to view reports):')}`);\n lines.push(` ${paint(ANSI.cyan, state.claimUrl)}`);\n lines.push(detail('Open this link in a browser. The CLI never opens it.'));\n if (state.endpointOverride !== null) {\n lines.push(detail('(this URL inherits the endpoint override above)'));\n }\n } else {\n lines.push(detail('The dashboard link appears after the first scan (re-print any time with `status`).'));\n }\n\n const remaining = countRemainingSteps(state);\n lines.push('');\n if (remaining === 0) {\n lines.push(\n done(\n paint(\n ANSI.bold,\n 'All setup steps complete. Commit .patchstackrc.json, package.json, and the file carrying the widget snippet.',\n ),\n ),\n );\n if (state.claimUrl !== null) {\n lines.push(detail('The only manual action left is opening the dashboard link above (if not already connected).'));\n }\n } else {\n lines.push(\n ` ${paint(ANSI.yellow, String(remaining))} step(s) remaining — details in the reference guide below.`,\n );\n }\n\n return lines.join('\\n');\n}\n","// Managed disclosure-widget tag — the connector installs the widget for you.\n//\n// After a successful scan the connector ensures the site's root HTML shell\n// carries the widget's one-liner CDN tag (the canonical install form from the\n// widget docs: a single <script> with `data-site-uuid`, auto-initialising on\n// DOMContentLoaded). The tag carries an ownership attribute so re-runs update\n// it in place instead of stacking copies, and so `uninstall` flows can find it.\n// A manual/legacy install (any other reference to the widget script) is always\n// left untouched — we never convert or duplicate someone's hand-rolled tag.\n\nimport { existsSync, readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nexport const WIDGET_SCRIPT_URL = 'https://cdn.patchstack.com/patchstack-widget.js';\n\n/** Attribute that tags the connector-managed widget tag so re-runs update it. */\nexport const WIDGET_MARKER_ATTR = 'data-patchstack-connect-widget';\n\n/** Substring that marks any widget install (managed or manual) in HTML. */\nconst WIDGET_NEEDLE = 'patchstack-widget';\n\n/**\n * Root HTML shells the connector is willing to edit, in priority order:\n * Vite/plain SPA, CRA-style, SvelteKit. Framework layouts that are code rather\n * than HTML (Next/Nuxt/Astro layouts) are never edited automatically — `guide`\n * prints the snippet and the right file for those.\n */\nexport const SOURCE_SHELL_CANDIDATES = ['index.html', 'public/index.html', 'src/app.html'];\n\nexport function buildWidgetTag(siteUuid: string): string {\n return `<script src=\"${WIDGET_SCRIPT_URL}\" data-site-uuid=\"${siteUuid}\" defer ${WIDGET_MARKER_ATTR}=\"true\"></script>`;\n}\n\nexport type WidgetEnsureAction =\n /** No widget present — the managed tag was inserted before </body>. */\n | 'added'\n /** A managed tag existed with a different UUID — replaced in place. */\n | 'updated'\n /** The managed tag is already present and current. */\n | 'unchanged'\n /** A manual (non-managed) widget install exists — left untouched. */\n | 'manual'\n /** The document has no </body> to anchor on — nothing was changed. */\n | 'no-body';\n\nexport interface WidgetEnsureResult {\n html: string;\n action: WidgetEnsureAction;\n}\n\nconst MANAGED_TAG_RE = new RegExp(\n `<script[^>]*${WIDGET_MARKER_ATTR}[^>]*>\\\\s*</script>`,\n 'i',\n);\n\n/**\n * Ensure a single HTML document carries the managed widget tag. Idempotent:\n * updates the managed tag in place, adopts (leaves alone) manual installs, and\n * only ever inserts immediately before </body>.\n */\nexport function ensureWidgetInHtml(html: string, siteUuid: string): WidgetEnsureResult {\n const tag = buildWidgetTag(siteUuid);\n\n const managed = html.match(MANAGED_TAG_RE);\n if (managed !== null) {\n if (managed[0].includes(`data-site-uuid=\"${siteUuid}\"`)) {\n return { html, action: 'unchanged' };\n }\n return { html: html.replace(MANAGED_TAG_RE, tag), action: 'updated' };\n }\n\n if (html.includes(WIDGET_NEEDLE)) {\n return { html, action: 'manual' };\n }\n\n const bodyClose = html.match(/([ \\t]*)<\\/body>/i);\n if (bodyClose === null || bodyClose.index === undefined) {\n return { html, action: 'no-body' };\n }\n const indent = bodyClose[1] ?? '';\n const insertion = `${indent} ${tag}\\n${indent}</body>`;\n return {\n html: html.slice(0, bodyClose.index) + insertion + html.slice(bodyClose.index + bodyClose[0].length),\n action: 'added',\n };\n}\n\n/** First editable root HTML shell in the project, or null when there is none. */\nexport function findSourceShell(cwd: string): string | null {\n for (const candidate of SOURCE_SHELL_CANDIDATES) {\n if (existsSync(path.join(cwd, candidate))) {\n return candidate;\n }\n }\n return null;\n}\n\nexport interface SourceWidgetResult {\n /** Project-relative path of the shell that was inspected, or null. */\n shell: string | null;\n action: WidgetEnsureAction | 'no-shell';\n}\n\n/**\n * Ensure the managed widget tag in the project's root HTML shell. Edits at most\n * that one file; returns what happened so the caller can report it.\n */\nexport function ensureSourceWidget(cwd: string, siteUuid: string): SourceWidgetResult {\n const shell = findSourceShell(cwd);\n if (shell === null) {\n return { shell: null, action: 'no-shell' };\n }\n const file = path.join(cwd, shell);\n const before = readFileSync(file, 'utf8');\n const { html, action } = ensureWidgetInHtml(before, siteUuid);\n if (html !== before) {\n writeFileSync(file, html);\n }\n return { shell, action };\n}\n","// Shared helpers for the `patchstack-connect protect` scaffolder (adapters + orchestrator).\n\nimport { readFileSync, existsSync, writeFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport const read = (p: string): string => readFileSync(p, 'utf8');\nexport const log = (msg: string): void => console.log(`patchstack protect: ${msg}`);\n\n/** True when `name` is in the project's dependencies or devDependencies. */\nexport function hasDependency(cwd: string, name: string): boolean {\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n return Boolean({ ...pkg.dependencies, ...pkg.devDependencies }[name]);\n } catch {\n return false;\n }\n}\n\nconst SITE_UUID_PLACEHOLDER = '__PATCHSTACK_SITE_UUID__';\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;\n\n/**\n * Bake the site UUID written by `scan` into a managed runtime-guard template.\n *\n * The UUID is public project configuration (the disclosure widget exposes the\n * same value). Keeping the environment-variable fallback in the template lets\n * unscanned projects remain inert and lets deployments override it explicitly.\n */\nexport function bakeSiteUuid(cwd: string, guardRelPath: string): boolean {\n const rc = join(cwd, '.patchstackrc.json');\n if (!existsSync(rc)) {\n log('no .patchstackrc.json — guard uses PATCHSTACK_SITE_UUID env or the bundled fallback');\n return false;\n }\n\n let uuid: unknown;\n try {\n uuid = JSON.parse(read(rc)).siteUuid;\n } catch {\n log('.patchstackrc.json unreadable — skipping site-UUID bake');\n return false;\n }\n\n if (typeof uuid !== 'string' || !UUID_RE.test(uuid)) {\n log('.patchstackrc.json siteUuid missing or malformed — guard uses PATCHSTACK_SITE_UUID env or the bundled fallback');\n return false;\n }\n\n const guardPath = join(cwd, guardRelPath);\n if (!existsSync(guardPath)) return false;\n const source = read(guardPath);\n if (!source.includes(SITE_UUID_PLACEHOLDER)) {\n log(`${guardRelPath} site UUID already baked`);\n return false;\n }\n\n writeFileSync(guardPath, source.replace(SITE_UUID_PLACEHOLDER, uuid));\n log(`baked site UUID into ${guardRelPath} — live rules from the Patchstack API`);\n return true;\n}\n\n// Guard templates ship next to the built CLI (dist/protect/templates). Resolve for the built\n// layout (this code is bundled into dist/cli.js at the dist root → protect/templates) and the\n// source layout (this file lives in src/protect/install/ → ../templates).\nconst HERE = dirname(fileURLToPath(import.meta.url));\nexport function templatesDir(): string {\n const builtLayout = join(HERE, 'protect', 'templates'); // built: dist/cli.js → dist/protect/templates\n const candidates = [\n builtLayout,\n join(HERE, '..', 'templates'), // source: src/protect/install/ → src/protect/templates\n join(HERE, 'templates'),\n ];\n return candidates.find((p) => existsSync(p)) ?? builtLayout;\n}\n","// Adapter: TanStack Start + Supabase (the shape Lovable emits).\n//\n// Wires the always-on guard with zero changes to the user's own code — patches the generated\n// Supabase client (browser→Supabase tunnel) and src/start.ts (request + function middleware),\n// scaffolds src/integrations/patchstack/{guard.ts,rules.json}, and bakes the site UUID.\n// Idempotent + upgrades in place via the managed `#region` blocks.\n\nimport { writeFileSync, existsSync, mkdirSync, copyFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { bakeSiteUuid, read, log, templatesDir } from '../util.js';\nimport type { Adapter, WireOptions, WireResult, VerifyResult } from '../types.js';\n\nconst CLIENT_TUNNEL = [\n '',\n \" // PATCHSTACK: in the browser, tunnel Supabase traffic through the app's own server guard\",\n ' // (same-origin) so payloads are inspected before they reach Supabase.',\n \" if (typeof window !== 'undefined') {\",\n \" const target = typeof input === 'string' ? input : input instanceof Request ? input.url : String(input);\",\n \" const method = init?.method ?? (input instanceof Request ? input.method : 'GET');\",\n \" headers.set('x-ps-target', target);\",\n \" const guardUrl = new URL('/_patchstack/guard', window.location.origin).toString();\",\n ' return fetch(guardUrl, { ...init, method, headers });',\n ' }',\n '',\n].join('\\n');\n\nconst GUARD_IMPORT =\n 'import { GUARD_PATH, handleGuardRequest, inspectServerFn, screenResponse, guardRequest } from \"@/integrations/patchstack/guard\";';\nconst GUARD_IMPORT_RE = /import \\{[^}]*\\} from \"@\\/integrations\\/patchstack\\/guard\";/;\n\nconst START_IMPORTS = ['import { getRequest } from \"@tanstack/react-start/server\";', GUARD_IMPORT].join('\\n');\n\n// Managed middleware blocks, delimited by #region markers so a re-run can UPGRADE them in place\n// (e.g. adding the route-WAF hook to an already-wired app) instead of skipping. Keep the markers —\n// reconcileBlock() keys off them.\nconst REQUEST_MIDDLEWARE_BLOCK = [\n '// #region patchstack-guard (managed by patchstack-connect protect — do not edit)',\n '// Browser→Supabase tunnel + response screening; optional route WAF via PATCHSTACK_ROUTE_WAF=1.',\n 'const patchstackGuard = createMiddleware().server(async ({ next }) => {',\n ' const request = getRequest();',\n ' if (request) {',\n ' const { pathname } = new URL(request.url);',\n ' if (pathname === GUARD_PATH) return handleGuardRequest(request);',\n ' if (process.env.PATCHSTACK_ROUTE_WAF === \"1\") {',\n ' const blocked = await guardRequest(request);',\n ' if (blocked) return blocked;',\n ' }',\n ' }',\n ' return screenResponse(await next());',\n '});',\n '// #endregion patchstack-guard',\n].join('\\n');\n\nconst FUNCTION_MIDDLEWARE_BLOCK = [\n '// #region patchstack-function-guard (managed by patchstack-connect protect — do not edit)',\n '// Inspect server-function args before they reach the database.',\n 'const patchstackFunctionGuard = createMiddleware({ type: \"function\" }).server(async ({ next, data }) => {',\n ' const blocked = await inspectServerFn(data);',\n ' if (blocked) throw new Error(blocked.message);',\n ' return next();',\n '});',\n '// #endregion patchstack-function-guard',\n].join('\\n');\n\n// Reconcile a managed block: replace a marked region in place (UPGRADE), migrate a legacy\n// (un-marked) block, or insert before `insertBefore` (fresh). Legacy blocks are our own single\n// arrow-fn statements whose only line-leading `});` is the terminator, so we bound them from the\n// `const` line (plus the comment header immediately above) to that `});`.\nfunction reconcileBlock(s: string, region: string, block: string, legacyConst: string, insertBefore: string): string {\n const lines = s.split('\\n');\n const startMarker = `// #region ${region} `;\n const endMarker = `// #endregion ${region}`;\n const si = lines.findIndex((l) => l.includes(startMarker));\n if (si !== -1) {\n const ei = lines.findIndex((l, i) => i > si && l.trim() === endMarker);\n if (ei !== -1) {\n lines.splice(si, ei - si + 1, ...block.split('\\n'));\n return lines.join('\\n');\n }\n }\n const ci = lines.findIndex((l) => l.includes(legacyConst));\n if (ci !== -1) {\n const close = lines.findIndex((l, i) => i >= ci && l.trim() === '});');\n if (close !== -1) {\n let start = ci;\n while (start > 0 && (lines[start - 1] ?? '').trim().startsWith('//')) start--; // eat old comment header\n lines.splice(start, close - start + 1, ...block.split('\\n'));\n return lines.join('\\n');\n }\n }\n return s.replace(insertBefore, block + '\\n\\n' + insertBefore);\n}\n\nfunction detect(cwd: string): boolean {\n const pkgPath = join(cwd, 'package.json');\n if (!existsSync(pkgPath)) return false;\n let pkg: { dependencies?: Record<string, string>; devDependencies?: Record<string, string> };\n try {\n pkg = JSON.parse(read(pkgPath));\n } catch {\n return false;\n }\n const deps = { ...pkg.dependencies, ...pkg.devDependencies };\n return (\n Boolean(deps['@tanstack/react-start']) &&\n existsSync(join(cwd, 'src/start.ts')) &&\n existsSync(join(cwd, 'src/integrations/supabase/client.ts'))\n );\n}\n\nconst GUARD_FILE = 'src/integrations/patchstack/guard.ts';\n\nfunction scaffold(cwd: string, opts: WireOptions): string[] {\n const templates = templatesDir();\n const dst = join(cwd, 'src/integrations/patchstack');\n mkdirSync(dst, { recursive: true });\n copyFileSync(join(templates, 'guard.ts'), join(dst, 'guard.ts')); // guard.ts is managed — always refreshed\n const changed = [GUARD_FILE];\n const rulesDst = join(dst, 'rules.json');\n // Default: the high-precision starter, written only if absent (don't clobber the user's rules on\n // re-run). --demo: (re)seed the broad multi-class sample bundle for a self-contained demonstration.\n if (opts.demo) {\n copyFileSync(join(templates, 'demo-rules.json'), rulesDst);\n changed.push('src/integrations/patchstack/rules.json');\n log('scaffolded guard.ts + rules.json (demo sample rule set)');\n } else if (!existsSync(rulesDst)) {\n copyFileSync(join(templates, 'rules.json'), rulesDst);\n changed.push('src/integrations/patchstack/rules.json');\n log('scaffolded guard.ts + rules.json (starter rules)');\n } else {\n log('scaffolded guard.ts (kept existing rules.json)');\n }\n return changed;\n}\n\nfunction patchClient(cwd: string): boolean {\n const p = join(cwd, 'src/integrations/supabase/client.ts');\n const s = read(p);\n if (s.includes('x-ps-target')) {\n log('client.ts already wired');\n return false;\n }\n const anchor = \"headers.set('apikey', supabaseKey);\";\n if (!s.includes(anchor)) {\n log('client.ts anchor not found — skipping (template changed?)');\n return false;\n }\n writeFileSync(p, s.replace(anchor, anchor + '\\n' + CLIENT_TUNNEL));\n log('patched client.ts (tunnel Supabase through the guard)');\n return true;\n}\n\nfunction patchStart(cwd: string): boolean {\n const p = join(cwd, 'src/start.ts');\n let s = read(p);\n const importAnchor = 'import { createStart, createMiddleware } from \"@tanstack/react-start\";';\n const exportAnchor = 'export const startInstance';\n const rmAnchor = 'requestMiddleware: [';\n if (!s.includes(importAnchor) || !s.includes(exportAnchor)) {\n log('start.ts anchors not found — skipping (template changed?)');\n return false;\n }\n\n // Each step reconciles idempotently: a re-run (including after a connect upgrade) refreshes the\n // managed blocks in place — never duplicates, never leaves a stale version behind.\n const original = s;\n\n // Imports — refresh the managed guard import line wholesale (upgrade), else insert both imports.\n if (GUARD_IMPORT_RE.test(s)) {\n s = s.replace(GUARD_IMPORT_RE, GUARD_IMPORT);\n } else {\n s = s.replace(importAnchor, importAnchor + '\\n' + START_IMPORTS);\n }\n\n // Middleware blocks — upgrade a marked region / migrate a legacy block / insert fresh.\n s = reconcileBlock(s, 'patchstack-guard', REQUEST_MIDDLEWARE_BLOCK, 'const patchstackGuard =', exportAnchor);\n s = reconcileBlock(s, 'patchstack-function-guard', FUNCTION_MIDDLEWARE_BLOCK, 'const patchstackFunctionGuard =', exportAnchor);\n\n // Register the browser-tunnel guard in requestMiddleware.\n if (s.includes(rmAnchor) && !s.includes('requestMiddleware: [patchstackGuard')) {\n s = s.replace(rmAnchor, rmAnchor + 'patchstackGuard, ');\n }\n\n // Register the server-function guard in functionMiddleware (create the key if the app has none).\n if (!s.includes('functionMiddleware: [patchstackFunctionGuard')) {\n const fmAnchor = 'functionMiddleware: [';\n if (s.includes(fmAnchor)) {\n s = s.replace(fmAnchor, fmAnchor + 'patchstackFunctionGuard, ');\n } else if (s.includes(rmAnchor)) {\n s = s.replace(rmAnchor, 'functionMiddleware: [patchstackFunctionGuard],\\n ' + rmAnchor);\n }\n }\n\n if (s === original) {\n log('start.ts already wired');\n return false;\n }\n writeFileSync(p, s);\n log('patched start.ts (guard registered as request + function middleware)');\n return true;\n}\n\nfunction wire(cwd: string, opts: WireOptions): WireResult {\n const changed = scaffold(cwd, opts);\n // In demo mode, keep the local sample rules active — don't bake a site UUID (which would make\n // the guard fetch live Pulse rules instead of the bundled demo set).\n if (!opts.demo && bakeSiteUuid(cwd, GUARD_FILE)) changed.push(GUARD_FILE);\n if (patchClient(cwd)) changed.push('src/integrations/supabase/client.ts');\n if (patchStart(cwd)) changed.push('src/start.ts');\n log(\n opts.demo\n ? 'done — guard wired with the demo sample rules (blocks by default). Set PATCHSTACK_MODE=dry-run for log-only.'\n : 'done — guard wired and always-on (blocks by default). Set PATCHSTACK_MODE=dry-run for log-only.',\n );\n return { ok: true, changed: [...new Set(changed)] };\n}\n\nfunction verify(cwd: string): VerifyResult {\n const guardPath = join(cwd, GUARD_FILE);\n const clientPath = join(cwd, 'src/integrations/supabase/client.ts');\n const startPath = join(cwd, 'src/start.ts');\n const guard = existsSync(guardPath) ? read(guardPath) : '';\n const client = existsSync(clientPath) ? read(clientPath) : '';\n const start = existsSync(startPath) ? read(startPath) : '';\n\n const checks = [\n { label: 'guard.ts scaffolded', ok: guard.length > 0, hint: 'run `patchstack-connect protect`' },\n { label: 'Supabase client tunnels through the guard', ok: client.includes('x-ps-target'), hint: 'run `patchstack-connect protect` to re-patch src/integrations/supabase/client.ts' },\n { label: 'request middleware defined + registered', ok: start.includes('const patchstackGuard =') && start.includes('requestMiddleware: [patchstackGuard'), hint: 'run `patchstack-connect protect` to re-patch src/start.ts' },\n { label: 'server-function middleware defined + registered', ok: start.includes('const patchstackFunctionGuard =') && start.includes('functionMiddleware: [patchstackFunctionGuard'), hint: 'run `patchstack-connect protect` to re-patch src/start.ts' },\n ];\n return { wired: checks.every((c) => c.ok), checks };\n}\n\nexport const tanstackSupabaseAdapter: Adapter = {\n name: 'tanstack-supabase',\n label: 'TanStack Start + Supabase',\n detect,\n wire,\n verify,\n};\n","// Adapter: Next.js. Wires the guard as edge middleware (request-phase WAF + egress SSRF).\n// If the app has no middleware yet, scaffolds `middleware.ts` (+ patchstack.rules.json). If a\n// middleware file already exists, we do NOT clobber it — we scaffold the rules and print a plan\n// (add the guard to your middleware), so an existing middleware is never silently overwritten.\n\nimport { writeFileSync, existsSync, mkdirSync, copyFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { bakeSiteUuid, read, log, templatesDir } from '../util.js';\nimport type { Adapter, WireOptions, WireResult, VerifyResult } from '../types.js';\n\nfunction hasNextDep(cwd: string): boolean {\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n return Boolean({ ...pkg.dependencies, ...pkg.devDependencies }.next);\n } catch {\n return false;\n }\n}\n\n// Next reads middleware from `middleware.ts` at the project root, or `src/middleware.ts` when the\n// app uses a `src/` dir. Return the existing one if present, else the conventional target.\nfunction middlewareInfo(cwd: string): { relDir: string; relFile: string; exists: boolean } {\n const candidates = ['middleware.ts', 'middleware.js', 'src/middleware.ts', 'src/middleware.js'];\n for (const rel of candidates) {\n if (existsSync(join(cwd, rel))) return { relDir: rel.includes('/') ? 'src' : '.', relFile: rel, exists: true };\n }\n const useSrc = existsSync(join(cwd, 'src'));\n return { relDir: useSrc ? 'src' : '.', relFile: useSrc ? 'src/middleware.ts' : 'middleware.ts', exists: false };\n}\n\nfunction detect(cwd: string): boolean {\n return hasNextDep(cwd);\n}\n\nfunction rulesFile(relDir: string): string {\n return relDir === '.' ? 'patchstack.rules.json' : `${relDir}/patchstack.rules.json`;\n}\n\nfunction wire(cwd: string, opts: WireOptions): WireResult {\n const templates = templatesDir();\n const mw = middlewareInfo(cwd);\n const dir = join(cwd, mw.relDir === '.' ? '' : mw.relDir);\n mkdirSync(dir, { recursive: true });\n\n // Co-locate the rules next to the middleware (the template imports ./patchstack.rules.json).\n const rulesDst = join(dir, 'patchstack.rules.json');\n const changed: string[] = [];\n if (opts.demo || !existsSync(rulesDst)) {\n copyFileSync(join(templates, opts.demo ? 'demo-rules.json' : 'rules.json'), rulesDst);\n changed.push(rulesFile(mw.relDir));\n }\n\n const mwPath = join(cwd, mw.relFile);\n const existing = mw.exists ? read(mwPath) : '';\n if (mw.exists && !existing.includes('patchstack-next')) {\n // Don't overwrite the app's own middleware — leave it, and tell the user how to add the guard.\n log(\n `existing ${mw.relFile} left untouched — scaffolded ${rulesFile(mw.relDir)}; add the guard to your ` +\n `middleware: import { createProtection } from \"@patchstack/connect/protect\", run fetchGuard() on the ` +\n `request, and return the block Response. Then: npx patchstack-connect protect --check`,\n );\n return { ok: true, changed };\n }\n\n // Fresh (or already-ours) → write the managed middleware.\n copyFileSync(join(templates, 'next-middleware.ts'), mwPath);\n if (!opts.demo) bakeSiteUuid(cwd, mw.relFile);\n changed.push(mw.relFile);\n log(mw.exists ? `refreshed ${mw.relFile} (Patchstack middleware)` : `scaffolded ${mw.relFile} (Patchstack middleware)`);\n return { ok: true, changed: [...new Set(changed)] };\n}\n\nfunction verify(cwd: string): VerifyResult {\n const mw = middlewareInfo(cwd);\n const present = mw.exists && read(join(cwd, mw.relFile)).includes('patchstack-next');\n const rulesPresent = existsSync(join(cwd, rulesFile(mw.relDir)));\n return {\n wired: present && rulesPresent,\n checks: [\n { label: 'Patchstack middleware present', ok: present, hint: `run \\`patchstack-connect protect\\` (writes ${mw.relFile})` },\n { label: 'rules co-located with the middleware', ok: rulesPresent, hint: 'run `patchstack-connect protect`' },\n ],\n };\n}\n\nexport const nextAdapter: Adapter = {\n name: 'nextjs',\n label: 'Next.js',\n detect,\n wire,\n verify,\n};\n","// Adapter: SvelteKit. Wires the guard as a server hook (`src/hooks.server.ts` → `handle`).\nimport { join } from 'node:path';\nimport { read } from '../util.js';\nimport { wireSeam, verifySeam, type SeamSpec } from '../seam.js';\nimport type { Adapter, WireOptions, WireResult, VerifyResult } from '../types.js';\n\nconst SPEC: SeamSpec = {\n templateName: 'sveltekit-hooks.ts',\n candidates: ['src/hooks.server.ts', 'src/hooks.server.js'],\n target: 'src/hooks.server.ts',\n marker: 'patchstack-sveltekit',\n planHint: 'add the guard to your `handle` (compose with `sequence()` from \"@sveltejs/kit/hooks\"), then: npx patchstack-connect protect --check',\n seamLabel: 'SvelteKit server hook',\n};\n\nfunction detect(cwd: string): boolean {\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n return Boolean({ ...pkg.dependencies, ...pkg.devDependencies }['@sveltejs/kit']);\n } catch {\n return false;\n }\n}\n\nfunction wire(cwd: string, opts: WireOptions): WireResult {\n return wireSeam(cwd, opts, SPEC);\n}\n\nfunction verify(cwd: string): VerifyResult {\n return verifySeam(cwd, SPEC);\n}\n\nexport const sveltekitAdapter: Adapter = {\n name: 'sveltekit',\n label: 'SvelteKit',\n detect,\n wire,\n verify,\n};\n","// Shared \"seam-file is the guard\" wiring, used by adapters whose framework has a single server hook\n// that IS the guard (SvelteKit `hooks.server.ts`, Astro `src/middleware.ts`). Scaffold the seam from\n// a template + co-locate patchstack.rules.json. An EXISTING seam file is never clobbered — we scaffold\n// the rules and print a plan instead (so a hand-written hook is preserved).\n\nimport { existsSync, mkdirSync, copyFileSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { bakeSiteUuid, read, log, templatesDir } from './util.js';\nimport type { WireOptions, WireResult, VerifyResult } from './types.js';\n\nexport interface SeamSpec {\n templateName: string; // template copied to the seam target when none exists\n candidates: string[]; // existing seam files to look for, in order (repo-relative)\n target: string; // where to create the seam if none exists (repo-relative)\n marker: string; // #region marker id proving it's ours (e.g. 'patchstack-sveltekit')\n planHint: string; // guidance when an existing seam file can't be safely edited\n seamLabel: string; // human label for the check (e.g. 'SvelteKit hook')\n}\n\nfunction rulesRel(seamRel: string): string {\n const d = dirname(seamRel);\n return (d === '.' ? 'patchstack.rules.json' : `${d}/patchstack.rules.json`).replace(/\\\\/g, '/');\n}\n\nexport function wireSeam(cwd: string, opts: WireOptions, spec: SeamSpec): WireResult {\n const templates = templatesDir();\n const existing = spec.candidates.find((c) => existsSync(join(cwd, c)));\n const seamRel = existing ?? spec.target;\n mkdirSync(dirname(join(cwd, seamRel)), { recursive: true });\n\n // Rules co-locate next to the seam (the templates import ./patchstack.rules.json).\n const rulesDst = join(cwd, rulesRel(seamRel));\n const changed: string[] = [];\n if (opts.demo || !existsSync(rulesDst)) {\n copyFileSync(join(templates, opts.demo ? 'demo-rules.json' : 'rules.json'), rulesDst);\n changed.push(rulesRel(seamRel));\n }\n\n const current = existing ? read(join(cwd, existing)) : '';\n if (existing && !current.includes(spec.marker)) {\n log(`existing ${existing} left untouched — scaffolded ${rulesRel(seamRel)}; ${spec.planHint}`);\n return { ok: true, changed };\n }\n\n copyFileSync(join(templates, spec.templateName), join(cwd, seamRel));\n if (!opts.demo) bakeSiteUuid(cwd, seamRel);\n changed.push(seamRel);\n log(existing ? `refreshed ${seamRel}` : `scaffolded ${seamRel}`);\n return { ok: true, changed: [...new Set(changed)] };\n}\n\nexport function verifySeam(cwd: string, spec: SeamSpec): VerifyResult {\n const existing = spec.candidates.find((c) => existsSync(join(cwd, c)));\n const seamRel = existing ?? spec.target;\n const present = existing ? read(join(cwd, existing)).includes(spec.marker) : false;\n const rulesPresent = existsSync(join(cwd, rulesRel(seamRel)));\n return {\n wired: present && rulesPresent,\n checks: [\n { label: `${spec.seamLabel} present`, ok: present, hint: `run \\`patchstack-connect protect\\` (writes ${spec.target})` },\n { label: 'rules co-located with the guard', ok: rulesPresent, hint: 'run `patchstack-connect protect`' },\n ],\n };\n}\n","// Adapter: Astro. Wires the guard as middleware (`src/middleware.ts` → `onRequest`).\nimport { join } from 'node:path';\nimport { read } from '../util.js';\nimport { wireSeam, verifySeam, type SeamSpec } from '../seam.js';\nimport type { Adapter, WireOptions, WireResult, VerifyResult } from '../types.js';\n\nconst SPEC: SeamSpec = {\n templateName: 'astro-middleware.ts',\n candidates: ['src/middleware.ts', 'src/middleware.js', 'src/middleware/index.ts', 'src/middleware/index.js'],\n target: 'src/middleware.ts',\n marker: 'patchstack-astro',\n planHint: 'add the guard to your `onRequest` (compose with `sequence()` from \"astro:middleware\"), then: npx patchstack-connect protect --check',\n seamLabel: 'Astro middleware',\n};\n\nfunction detect(cwd: string): boolean {\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n return Boolean({ ...pkg.dependencies, ...pkg.devDependencies }.astro);\n } catch {\n return false;\n }\n}\n\nfunction wire(cwd: string, opts: WireOptions): WireResult {\n return wireSeam(cwd, opts, SPEC);\n}\n\nfunction verify(cwd: string): VerifyResult {\n return verifySeam(cwd, SPEC);\n}\n\nexport const astroAdapter: Adapter = {\n name: 'astro',\n label: 'Astro',\n detect,\n wire,\n verify,\n};\n","// Locate the source file + variable where an app instance is created, for the register-into-app\n// adapters (Express/Fastify/NestJS). Dependency-free: walk src/ (or the repo root) for a source\n// file matching `re`, which MUST capture the app variable name in group 1.\n\nimport { readFileSync, existsSync, readdirSync, statSync } from 'node:fs';\nimport { join, relative, dirname } from 'node:path';\n\nexport function findAppInstance(cwd: string, re: RegExp): { relPath: string; appVar: string } | null {\n const root = existsSync(join(cwd, 'src')) ? join(cwd, 'src') : cwd;\n let hit: { relPath: string; appVar: string } | null = null;\n const walk = (dir: string): void => {\n if (hit) return;\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n for (const name of entries) {\n if (hit) return;\n if (name === 'node_modules' || name === 'patchstack' || name.startsWith('.')) continue;\n const p = join(dir, name);\n let st;\n try {\n st = statSync(p);\n } catch {\n continue;\n }\n if (st.isDirectory()) walk(p);\n else if (/\\.(?:ts|js|mjs|cjs)$/.test(name)) {\n let src: string;\n try {\n src = readFileSync(p, 'utf8');\n } catch {\n continue;\n }\n const m = re.exec(src);\n if (m) hit = { relPath: relative(cwd, p).replace(/\\\\/g, '/'), appVar: m[1]! };\n }\n }\n };\n walk(root);\n return hit;\n}\n\n/** Relative ESM specifier from `fromRel` to `toRel` (both repo-relative, extension stripped). */\nexport function importSpecifier(fromRel: string, toRel: string): string {\n let spec = relative(dirname(fromRel), toRel).replace(/\\\\/g, '/').replace(/\\.(?:ts|js)$/, '');\n if (!spec.startsWith('.')) spec = `./${spec}`;\n return spec;\n}\n","// Shared \"register-into-app\" wiring for adapters whose framework exposes a mutable app instance you\n// hook a guard onto (Express `app.use`, Fastify `app.register`, NestJS `app.use` on main.ts). Scaffold\n// the guard, then insert the registration call right after the app instance is created — dependency-free\n// anchor + #region-marker patching, idempotent.\n\nimport { writeFileSync, existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { read, log } from './util.js';\nimport { scaffoldGeneric } from './generic.js';\nimport { findAppInstance, importSpecifier } from './find-app.js';\nimport type { WireOptions, WireResult, VerifyResult } from './types.js';\n\nexport interface RegisterSpec {\n appRe: RegExp; // matches the app-instance line; MUST capture the app var in group 1\n guardTemplate: string; // guard template scaffolded as src/patchstack/guard.ts\n importName: string; // named export the entry imports from the guard\n call: (appVar: string) => string; // the registration statement, e.g. `${v}.use(patchstackMiddleware);`\n label: string; // human label for logs / verify checks, e.g. 'Express app'\n manualHint: string; // guidance when no app-instance site is found\n}\n\nconst REGION = '// #region patchstack (managed by patchstack-connect protect — do not edit)';\n\nexport function wireRegister(cwd: string, opts: WireOptions, spec: RegisterSpec): WireResult {\n const { changed, dir } = scaffoldGeneric(cwd, opts, spec.guardTemplate);\n const entry = findAppInstance(cwd, spec.appRe);\n if (!entry) {\n log(`${spec.label} not located — scaffolded guard; ${spec.manualHint}`);\n return { ok: true, changed };\n }\n\n const p = join(cwd, entry.relPath);\n const s = read(p);\n if (s.includes(spec.importName)) {\n log(`${entry.relPath} already wired`);\n return { ok: true, changed };\n }\n\n const importLine = `import { ${spec.importName} } from \"${importSpecifier(entry.relPath, `${dir}/guard`)}\";`;\n const lines = s.split('\\n');\n let lastImport = -1;\n for (let i = 0; i < lines.length; i++) if (/^\\s*import\\b/.test(lines[i] ?? '')) lastImport = i;\n lines.splice(lastImport + 1, 0, importLine);\n const appIdx = lines.findIndex((l) => spec.appRe.test(l));\n if (appIdx !== -1) {\n lines.splice(appIdx + 1, 0, REGION, spec.call(entry.appVar), '// #endregion patchstack');\n }\n writeFileSync(p, lines.join('\\n'));\n changed.push(entry.relPath);\n log(`patched ${entry.relPath} (${spec.call(entry.appVar).trim()})`);\n return { ok: true, changed: [...new Set(changed)] };\n}\n\nexport function verifyRegister(cwd: string, spec: RegisterSpec): VerifyResult {\n const dir = existsSync(join(cwd, 'src')) ? 'src/patchstack' : 'patchstack';\n const scaffolded = existsSync(join(cwd, dir, 'guard.ts'));\n const entry = findAppInstance(cwd, spec.appRe);\n const wired = entry ? read(join(cwd, entry.relPath)).includes(spec.importName) : false;\n return {\n wired: scaffolded && wired,\n checks: [\n { label: `${spec.label} guard scaffolded`, ok: scaffolded, hint: 'run `patchstack-connect protect`' },\n { label: `guard registered on the ${spec.label}`, ok: wired, hint: spec.manualHint },\n ],\n };\n}\n","// Generic fallback for stacks no built-in adapter matches. Rather than silently skip, we scaffold\n// a framework-agnostic guard, print a wiring plan (with best-effort entry-point detection), and\n// provide a `--check` verifier — so the builder's own agent can finish the wiring and confirm it,\n// entirely through the CLI (no server, no hosted infra).\n\nimport { readFileSync, existsSync, mkdirSync, copyFileSync, readdirSync, statSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { bakeSiteUuid, read, templatesDir } from './util.js';\nimport type { WireOptions, VerifyResult } from './types.js';\n\nconst GUARD_MARKER = 'patchstack/guard';\n\nfunction genericDir(cwd: string): string {\n return existsSync(join(cwd, 'src')) ? 'src/patchstack' : 'patchstack';\n}\n\nexport function scaffoldGeneric(cwd: string, opts: WireOptions, guardTemplate = 'generic-guard.ts'): { changed: string[]; dir: string } {\n const templates = templatesDir();\n const dir = genericDir(cwd);\n const dst = join(cwd, dir);\n mkdirSync(dst, { recursive: true });\n copyFileSync(join(templates, guardTemplate), join(dst, 'guard.ts'));\n const changed = [`${dir}/guard.ts`];\n if (!opts.demo) bakeSiteUuid(cwd, `${dir}/guard.ts`);\n const rulesDst = join(dst, 'rules.json');\n if (opts.demo || !existsSync(rulesDst)) {\n copyFileSync(join(templates, opts.demo ? 'demo-rules.json' : 'rules.json'), rulesDst);\n changed.push(`${dir}/rules.json`);\n }\n return { changed, dir };\n}\n\n// Best-effort: likely server entry files + whether Express is a dependency.\nfunction candidateEntries(cwd: string): string[] {\n const names = [\n 'src/server.ts', 'src/server.js', 'src/index.ts', 'src/index.js', 'src/app.ts', 'src/app.js',\n 'src/main.ts', 'server.ts', 'server.js', 'index.ts', 'index.js', 'app.ts', 'app.js',\n ];\n const hits = names.filter((n) => existsSync(join(cwd, n)));\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n if (typeof pkg.main === 'string' && existsSync(join(cwd, pkg.main))) hits.push(pkg.main);\n } catch {\n /* ignore */\n }\n return [...new Set(hits)];\n}\n\nfunction usesExpress(cwd: string): boolean {\n try {\n const pkg = JSON.parse(read(join(cwd, 'package.json')));\n return Boolean({ ...pkg.dependencies, ...pkg.devDependencies }.express);\n } catch {\n return false;\n }\n}\n\nexport function wiringPlan(cwd: string, dir: string): string {\n const entries = candidateEntries(cwd);\n const express = usesExpress(cwd);\n const lines = [\n `no built-in adapter matched this stack — scaffolded a generic guard at ${dir}/guard.ts + ${dir}/rules.json.`,\n 'Finish by wiring it into your server (pick the one that fits):',\n ` • Web-Fetch entry: export default { fetch: protectFetch(yourHandler) } // import from \"${dir}/guard\"`,\n ` • Node / Express: app.use(patchstackMiddleware) // add before your routes`,\n entries.length\n ? `Likely server ${entries.length === 1 ? 'entry' : 'entries'}: ${entries.join(', ')}${express ? ' (Express detected)' : ''}.`\n : 'Could not locate a server entry — wire it wherever requests enter your app.',\n 'Then confirm it is hooked up: npx patchstack-connect protect --check',\n ];\n return lines.join('\\n');\n}\n\nexport function genericVerify(cwd: string): VerifyResult {\n const dir = genericDir(cwd);\n const scaffolded = existsSync(join(cwd, dir, 'guard.ts'));\n const imported = scaffolded && guardIsImported(cwd, join(cwd, dir, 'guard.ts'));\n return {\n wired: scaffolded && imported,\n checks: [\n { label: 'generic guard scaffolded', ok: scaffolded, hint: 'run `patchstack-connect protect`' },\n {\n label: 'guard imported into a server entry',\n ok: imported,\n hint: `import { protectFetch } (or patchstackMiddleware) from \"${dir}/guard\" and wire it into your request path`,\n },\n ],\n };\n}\n\nfunction guardIsImported(cwd: string, guardPath: string): boolean {\n const root = existsSync(join(cwd, 'src')) ? join(cwd, 'src') : cwd;\n let found = false;\n const walk = (d: string): void => {\n if (found) return;\n let entries: string[];\n try {\n entries = readdirSync(d);\n } catch {\n return;\n }\n for (const name of entries) {\n if (found) return;\n if (name === 'node_modules' || name.startsWith('.')) continue;\n const p = join(d, name);\n let st;\n try {\n st = statSync(p);\n } catch {\n continue;\n }\n if (st.isDirectory()) walk(p);\n else if (/\\.(?:ts|tsx|js|jsx|mjs|cjs)$/.test(name) && p !== guardPath) {\n try {\n if (readFileSync(p, 'utf8').includes(GUARD_MARKER)) found = true;\n } catch {\n /* ignore */\n }\n }\n }\n };\n walk(root);\n return found;\n}\n","// Adapter: NestJS. Wires the guard in the bootstrap file — `app.use(patchstackMiddleware)` right\n// after `NestFactory.create(...)`. Nest's INestApplication.use() accepts Express-style middleware\n// (the default platform), so this reuses the framework-agnostic guard rather than a Nest module +\n// decorators. On the Fastify platform the guard is still fail-open; response screening isn't wired.\nimport { hasDependency } from '../util.js';\nimport { findAppInstance } from '../find-app.js';\nimport { wireRegister, verifyRegister, type RegisterSpec } from '../register.js';\nimport type { Adapter } from '../types.js';\n\nconst SPEC: RegisterSpec = {\n appRe: /(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*await\\s+NestFactory\\.create/,\n guardTemplate: 'generic-guard.ts',\n importName: 'patchstackMiddleware',\n call: (v) => `${v}.use(patchstackMiddleware);`,\n label: 'NestJS app',\n manualHint: 'add `app.use(patchstackMiddleware)` right after your NestFactory.create(...) call',\n};\n\nexport const nestjsAdapter: Adapter = {\n name: 'nestjs',\n label: 'NestJS',\n detect: (cwd) => hasDependency(cwd, '@nestjs/core') && findAppInstance(cwd, SPEC.appRe) !== null,\n wire: (cwd, opts) => wireRegister(cwd, opts, SPEC),\n verify: (cwd) => verifyRegister(cwd, SPEC),\n};\n","// Adapter: Fastify (Node). Scaffolds the Fastify guard plugin and registers it on the app —\n// `app.register(patchstackFastify)` right after the `fastify()` instance is created.\nimport { hasDependency } from '../util.js';\nimport { findAppInstance } from '../find-app.js';\nimport { wireRegister, verifyRegister, type RegisterSpec } from '../register.js';\nimport type { Adapter } from '../types.js';\n\nconst SPEC: RegisterSpec = {\n appRe: /(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*(?:fastify|Fastify)\\(/,\n guardTemplate: 'fastify-plugin.ts',\n importName: 'patchstackFastify',\n call: (v) => `${v}.register(patchstackFastify);`,\n label: 'Fastify app',\n manualHint: 'add `app.register(patchstackFastify)` right after you create your fastify() app',\n};\n\nexport const fastifyAdapter: Adapter = {\n name: 'fastify',\n label: 'Fastify (Node)',\n detect: (cwd) => hasDependency(cwd, 'fastify') && findAppInstance(cwd, SPEC.appRe) !== null,\n wire: (cwd, opts) => wireRegister(cwd, opts, SPEC),\n verify: (cwd) => verifyRegister(cwd, SPEC),\n};\n","// Adapter: Express (Node). Scaffolds the framework-agnostic guard and wires it as the first\n// middleware — `app.use(patchstackMiddleware)` right after the `express()` app is created.\nimport { hasDependency } from '../util.js';\nimport { findAppInstance } from '../find-app.js';\nimport { wireRegister, verifyRegister, type RegisterSpec } from '../register.js';\nimport type { Adapter } from '../types.js';\n\nconst SPEC: RegisterSpec = {\n appRe: /(?:const|let|var)\\s+([A-Za-z_$][\\w$]*)\\s*=\\s*express\\(\\)/,\n guardTemplate: 'generic-guard.ts',\n importName: 'patchstackMiddleware',\n call: (v) => `${v}.use(patchstackMiddleware);`,\n label: 'Express app',\n manualHint: 'add `app.use(patchstackMiddleware)` right after you create your express() app',\n};\n\nexport const expressAdapter: Adapter = {\n name: 'express',\n label: 'Express (Node)',\n detect: (cwd) => hasDependency(cwd, 'express') && findAppInstance(cwd, SPEC.appRe) !== null,\n wire: (cwd, opts) => wireRegister(cwd, opts, SPEC),\n verify: (cwd) => verifyRegister(cwd, SPEC),\n};\n","// `patchstack-connect protect` — scaffold the always-on runtime guard into an app.\n//\n// Stack-specific wiring lives in one adapter per builder/framework shape (see ./adapters/). This\n// orchestrator picks the first adapter that matches the app and delegates. If none matches it\n// ESCALATES (never silently skips) — the guard engine itself is stack-agnostic, so an unmatched\n// app is a gap in auto-wiring coverage to be closed by a new adapter or an agent-assisted install,\n// not a reason to leave the app unprotected quietly.\n\nimport { log } from './util.js';\nimport { tanstackSupabaseAdapter } from './adapters/tanstack-supabase.js';\nimport { nextAdapter } from './adapters/next.js';\nimport { sveltekitAdapter } from './adapters/sveltekit.js';\nimport { astroAdapter } from './adapters/astro.js';\nimport { nestjsAdapter } from './adapters/nestjs.js';\nimport { fastifyAdapter } from './adapters/fastify.js';\nimport { expressAdapter } from './adapters/express.js';\nimport { scaffoldGeneric, wiringPlan, genericVerify } from './generic.js';\nimport type { Adapter, WireOptions, ProtectResult, VerifyReport } from './types.js';\n\n// Registry — order = match priority (most specific first): framework meta-frameworks before the\n// bare server libraries (a SvelteKit/Astro app may also carry express/fastify as a transitive dep).\nconst ADAPTERS: Adapter[] = [\n tanstackSupabaseAdapter,\n nextAdapter,\n sveltekitAdapter,\n astroAdapter,\n nestjsAdapter,\n fastifyAdapter,\n expressAdapter,\n];\n\n/** Scaffold + wire the runtime guard into the app at `cwd`. Best-effort — never throws. */\nexport function runProtect(cwd: string, opts: WireOptions = {}): ProtectResult {\n const adapter = ADAPTERS.find((a) => a.detect(cwd));\n if (adapter) {\n const result = adapter.wire(cwd, opts);\n return { status: 'wired', adapter: adapter.name, changed: result.changed };\n }\n\n // No adapter matched — DON'T silently skip. Scaffold the framework-agnostic guard and print a\n // wiring plan the builder's agent (or user) can finish, then verify with `protect --check`.\n const { changed, dir } = scaffoldGeneric(cwd, opts);\n const plan = wiringPlan(cwd, dir);\n log(plan);\n return { status: 'scaffolded', adapter: 'generic', changed, plan };\n}\n\n/** Verify the guard is correctly wired (backs `protect --check`). Fail-open — never throws. */\nexport function runVerify(cwd: string): VerifyReport {\n const adapter = ADAPTERS.find((a) => a.detect(cwd));\n if (adapter) return { stack: adapter.label, ...adapter.verify(cwd) };\n return { stack: 'generic', ...genericVerify(cwd) };\n}\n\nexport type { Adapter, WireOptions, WireResult, VerifyResult, VerifyReport, ProtectResult } from './types.js';\n","import { readFileSync, writeFileSync } from 'node:fs';\nimport path from 'node:path';\n\nimport type { PackageManager } from './guide.js';\n\nconst SCAN_COMMAND = 'patchstack-connect scan';\nconst MARK_BUILD_COMMAND = 'patchstack-connect mark-build';\n\ninterface PackageJson {\n scripts?: Record<string, string>;\n [key: string]: unknown;\n}\n\nexport interface WireBuildScriptsResult {\n changed: boolean;\n strategy: 'build-chain' | 'lifecycle-hooks' | 'skipped';\n detail: string;\n}\n\n/** Add `command` after an existing lifecycle hook without duplicating it. */\nfunction appendHook(existing: string | undefined, command: string): string {\n if (existing === undefined || existing.trim().length === 0) {\n return command;\n }\n if (existing.includes(command)) {\n return existing;\n }\n return `${existing} && ${command}`;\n}\n\n/**\n * Wire scans around the project's build without invoking a shell or running the\n * build. Bun skips npm-style pre/post hooks, so Bun projects get a direct build\n * chain; other package managers get lifecycle hooks. Existing commands are\n * preserved and the operation is idempotent.\n */\nexport function wireBuildScripts(\n cwd: string,\n packageManager: PackageManager,\n): WireBuildScriptsResult {\n const target = path.join(cwd, 'package.json');\n const raw = readFileSync(target, 'utf8');\n const pkg = JSON.parse(raw) as PackageJson;\n const scripts = pkg.scripts ?? {};\n const build = scripts.build;\n\n if (build === undefined || build.trim().length === 0) {\n return {\n changed: false,\n strategy: 'skipped',\n detail: 'package.json has no build script; no build integration was added.',\n };\n }\n\n if (packageManager === 'bun') {\n let nextBuild = build;\n if (!nextBuild.includes(SCAN_COMMAND)) {\n nextBuild = `${SCAN_COMMAND} && ${nextBuild}`;\n }\n if (!nextBuild.includes(MARK_BUILD_COMMAND)) {\n nextBuild = `${nextBuild} && ${MARK_BUILD_COMMAND}`;\n }\n if (nextBuild === build) {\n return {\n changed: false,\n strategy: 'build-chain',\n detail: 'build script already runs scan and mark-build.',\n };\n }\n scripts.build = nextBuild;\n } else {\n const prebuild = appendHook(scripts.prebuild, SCAN_COMMAND);\n const postbuild = appendHook(scripts.postbuild, MARK_BUILD_COMMAND);\n if (prebuild === scripts.prebuild && postbuild === scripts.postbuild) {\n return {\n changed: false,\n strategy: 'lifecycle-hooks',\n detail: 'prebuild and postbuild hooks are already wired.',\n };\n }\n scripts.prebuild = prebuild;\n scripts.postbuild = postbuild;\n }\n\n pkg.scripts = scripts;\n const indentMatch = raw.match(/^[\\t ]+(?=\")/m)?.[0];\n const indent = indentMatch?.includes('\\t') ? '\\t' : indentMatch?.length ?? 2;\n const trailingNewline = raw.endsWith('\\n') ? '\\n' : '';\n writeFileSync(target, `${JSON.stringify(pkg, null, indent)}${trailingNewline}`, 'utf8');\n\n return packageManager === 'bun'\n ? {\n changed: true,\n strategy: 'build-chain',\n detail: 'chained scan and mark-build around the existing build command.',\n }\n : {\n changed: true,\n strategy: 'lifecycle-hooks',\n detail: 'added scan to prebuild and mark-build to postbuild.',\n };\n}\n"],"mappings":"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","names":["readFileSync","writeFileSync","path","readFile","path","readFile","path","readFile","path","path","readFile","readFile","readFile","readFile","path","readFile","path","path","readFile","path","path","readFile","path","path","walk","existsSync","readFileSync","readdirSync","statSync","path","existsSync","path","WIDGET_NEEDLE","existsSync","path","readFileSync","walk","readdirSync","statSync","readFileSync","existsSync","writeFileSync","writeFileSync","existsSync","join","join","existsSync","writeFileSync","existsSync","mkdirSync","copyFileSync","join","join","existsSync","detect","wire","mkdirSync","copyFileSync","verify","join","existsSync","mkdirSync","copyFileSync","join","dirname","dirname","existsSync","join","mkdirSync","copyFileSync","detect","join","wire","verify","join","SPEC","detect","join","wire","verify","readFileSync","existsSync","readdirSync","statSync","join","dirname","walk","writeFileSync","existsSync","join","readFileSync","existsSync","mkdirSync","copyFileSync","readdirSync","statSync","join","existsSync","join","mkdirSync","copyFileSync","walk","readdirSync","statSync","readFileSync","join","writeFileSync","existsSync","SPEC","SPEC","SPEC","readFileSync","writeFileSync","path","readFileSync","writeFileSync"]}
|