@emeryld/rrroutes-export 1.1.0 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +115 -1
- package/bin/rrroutes-checkpoint.mjs +9 -0
- package/bin/rrroutes-export-changes.mjs +9 -0
- package/bin/rrroutes-export-snapshot.mjs +9 -0
- package/bin/rrroutes-inspector-serve.mjs +9 -0
- package/dist/adapters/express.d.ts +6 -0
- package/dist/checkpoint/lock.d.ts +4 -0
- package/dist/checkpoint/retention.d.ts +15 -0
- package/dist/checkpoint/service.d.ts +11 -0
- package/dist/checkpoint/types.d.ts +65 -0
- package/dist/cli/changes.d.ts +4 -0
- package/dist/cli/checkpoint.d.ts +1 -0
- package/dist/cli/runtime.d.ts +7 -0
- package/dist/cli/serve.d.ts +7 -0
- package/dist/cli/snapshot.d.ts +4 -0
- package/dist/diff/diff-snapshots.d.ts +4 -0
- package/dist/diff/types.d.ts +58 -0
- package/dist/exportFinalizedLeaves.changelog.d.ts +4 -0
- package/dist/files/baked-payload.d.ts +21 -0
- package/dist/files/write.d.ts +10 -0
- package/dist/http/handler.d.ts +2 -0
- package/dist/http/types.d.ts +24 -0
- package/dist/index.cjs +3100 -121
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +25 -0
- package/dist/index.mjs +3070 -118
- package/dist/index.mjs.map +1 -1
- package/dist/inspection/diagnostics.d.ts +8 -0
- package/dist/inspection/inspect-clients.d.ts +9 -0
- package/dist/inspection/inspect-contract.d.ts +8 -0
- package/dist/inspection/inspect-server.d.ts +8 -0
- package/dist/inspection/inspect-sockets.d.ts +4 -0
- package/dist/inspection/join-routes.d.ts +10 -0
- package/dist/inspection/native.d.ts +4 -0
- package/dist/inspection/normalize-clients.d.ts +8 -0
- package/dist/inspection/normalize-routes.d.ts +3 -0
- package/dist/inspection/normalize-sockets.d.ts +7 -0
- package/dist/inspection/serializable.d.ts +3 -0
- package/dist/runtime.d.ts +16 -0
- package/dist/serializeLeafContract.d.ts +1 -0
- package/dist/snapshot/build.d.ts +2 -0
- package/dist/snapshot/canonicalize.d.ts +6 -0
- package/dist/snapshot/hash.d.ts +5 -0
- package/dist/snapshot/types.d.ts +287 -0
- package/dist/storage/filesystem.d.ts +5 -0
- package/dist/storage/memory.d.ts +2 -0
- package/dist/storage/sqlite.d.ts +15 -0
- package/dist/storage/types.d.ts +27 -0
- package/package.json +70 -8
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/schemaIntrospection.ts","../src/serializeLeafContract.ts","../src/flattenSchema.ts","../src/exportFinalizedLeaves.ts","../src/defaultViewerTemplate.ts","../src/extractLeafSourceByAst.ts","../src/exportFinalizedLeaves.cli.ts","../src/exportFinalizedLeaves.changelog.ts","../src/exportFinalizedLeaves.changelog.cli.ts","../src/exportFinalizedLeaves.bundle.ts"],"sourcesContent":["import * as z from 'zod'\n\nexport const serializableSchemaKinds = [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n 'array',\n 'enum',\n 'literal',\n 'union',\n 'record',\n 'tuple',\n 'unknown',\n 'any',\n] as const\n\nexport type SerializableSchemaKind = (typeof serializableSchemaKinds)[number]\n\nexport type SerializableSchema = {\n kind: SerializableSchemaKind\n optional?: boolean\n nullable?: boolean\n description?: string\n properties?: Record<string, SerializableSchema>\n element?: SerializableSchema\n union?: SerializableSchema[]\n literal?: unknown\n enumValues?: string[]\n}\n\ntype ZodAny = z.ZodTypeAny\n\ntype InternalSchemaKind = SerializableSchemaKind | 'intersection'\n\ntype IntrospectionWalker = (schema: ZodAny | undefined) => SerializableSchema | undefined\n\nexport type IntrospectionContext = {\n zod: typeof z\n introspect: IntrospectionWalker\n getDef: (schema: unknown) => any | undefined\n unwrap: (schema: ZodAny) => { base: ZodAny; optional: boolean; nullable: boolean }\n getDescription: (schema: ZodAny) => string | undefined\n}\n\nexport type IntrospectionNode = {\n schema: ZodAny\n base: ZodAny\n def: any\n kind: InternalSchemaKind\n optional: boolean\n nullable: boolean\n node: SerializableSchema\n}\n\nexport type SchemaIntrospectionHandler = (\n args: IntrospectionNode,\n ctx: IntrospectionContext,\n) => SerializableSchema | undefined\n\nexport type SchemaIntrospectionHandlerMap = Partial<\n Record<InternalSchemaKind, SchemaIntrospectionHandler>\n>\n\nexport type IntrospectSchemaOptions = {\n handlers?: SchemaIntrospectionHandlerMap\n}\n\nconst globalHandlers: SchemaIntrospectionHandlerMap = {}\n\nexport function registerSchemaIntrospectionHandler(\n kind: InternalSchemaKind,\n handler: SchemaIntrospectionHandler,\n) {\n globalHandlers[kind] = handler\n}\n\nexport function clearSchemaIntrospectionHandlers() {\n for (const key of Object.keys(globalHandlers) as InternalSchemaKind[]) {\n delete globalHandlers[key]\n }\n}\n\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let current: ZodAny = schema\n let optional = false\n let nullable = false\n\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (ZodEffectsCtor && current instanceof ZodEffectsCtor) {\n const def = getDef(current) || {}\n const sourceType =\n typeof (current as any).sourceType === 'function'\n ? (current as any).sourceType()\n : def.schema\n if (!sourceType) break\n current = sourceType\n continue\n }\n\n if (current instanceof z.ZodOptional) {\n optional = true\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n if (current instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n if (current instanceof z.ZodDefault) {\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n break\n }\n\n return { base: current, optional, nullable }\n}\n\nfunction mergeProps(\n a: Record<string, SerializableSchema> | undefined,\n b: Record<string, SerializableSchema> | undefined,\n): Record<string, SerializableSchema> | undefined {\n if (!a && !b) return undefined\n return { ...(a ?? {}), ...(b ?? {}) }\n}\n\nfunction inferKind(schema: ZodAny): SerializableSchemaKind {\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n return 'unknown'\n}\n\nconst defaultHandlers: SchemaIntrospectionHandlerMap = {\n intersection({ base, def, node }, ctx) {\n const left = def?.left as ZodAny | undefined\n const right = def?.right as ZodAny | undefined\n\n const leftNode = left ? ctx.introspect(left) : undefined\n const rightNode = right ? ctx.introspect(right) : undefined\n\n const leftIsObj = leftNode?.kind === 'object' && !!leftNode.properties\n const rightIsObj = rightNode?.kind === 'object' && !!rightNode.properties\n\n if (leftIsObj && rightIsObj) {\n node.kind = 'object'\n node.description =\n node.description ?? leftNode.description ?? rightNode.description\n node.properties = mergeProps(leftNode.properties, rightNode.properties)\n return node\n }\n\n if (leftNode && rightNode) {\n node.properties = {\n left: leftNode,\n right: rightNode,\n }\n }\n\n return node\n },\n\n object({ base, def, node }, ctx) {\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchema> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = ctx.introspect(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n return node\n },\n\n array({ def, node }, ctx) {\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = ctx.introspect(inner)\n }\n return node\n },\n\n union({ def, node }, ctx) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => ctx.introspect(opt))\n .filter(Boolean) as SerializableSchema[]\n return node\n },\n\n literal({ def, node }) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.literal = def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n node.literal = def.value\n }\n }\n return node\n },\n\n enum({ def, node }) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n node.enumValues = Object.values(def.entries).map((v: unknown) => String(v))\n }\n }\n return node\n },\n}\n\nexport function createSchemaIntrospector(options: IntrospectSchemaOptions = {}) {\n const handlers = {\n ...defaultHandlers,\n ...globalHandlers,\n ...(options.handlers ?? {}),\n }\n\n const introspect: IntrospectionWalker = (schema) => {\n if (!schema) return undefined\n\n const unwrapped = unwrap(schema)\n const base = unwrapped.base\n const def = getDef(base)\n const kind: InternalSchemaKind =\n base instanceof z.ZodIntersection ? 'intersection' : inferKind(base)\n\n const node: SerializableSchema = {\n kind: kind === 'intersection' ? 'unknown' : kind,\n optional: unwrapped.optional || undefined,\n nullable: unwrapped.nullable || undefined,\n description: getDescription(base),\n }\n\n const handler = handlers[kind]\n if (!handler) return node\n\n return handler(\n {\n schema,\n base,\n def,\n kind,\n optional: unwrapped.optional,\n nullable: unwrapped.nullable,\n node,\n },\n {\n zod: z,\n introspect,\n getDef,\n unwrap,\n getDescription,\n },\n )\n }\n\n return introspect\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n options: IntrospectSchemaOptions = {},\n): SerializableSchema | undefined {\n const introspect = createSchemaIntrospector(options)\n return introspect(schema)\n}\n","import {\n routeSchemaParse,\n type AnyLeafLowProfile,\n type FileField,\n type MethodCfgLowProfile,\n} from '@emeryld/rrroutes-contract'\nimport {\n introspectSchema,\n type IntrospectSchemaOptions,\n type SerializableSchema,\n} from './schemaIntrospection'\n\nexport type ContractLeafSchemas = {\n body?: SerializableSchema\n query?: SerializableSchema\n params?: SerializableSchema\n output?: SerializableSchema\n outputMeta?: SerializableSchema\n queryExtension?: SerializableSchema\n}\n\nexport type SerializedLeafContract = {\n key: string\n method: AnyLeafLowProfile['method']\n path: string\n cfg: {\n description?: string\n summary?: string\n docsGroup?: string\n tags?: string[]\n deprecated?: boolean\n stability?: 'experimental' | 'beta' | 'stable' | 'deprecated'\n docsHidden?: boolean\n docsMeta?: Record<string, unknown>\n feed?: boolean\n bodyFiles?: FileField[]\n schemas: ContractLeafSchemas\n }\n}\n\nexport type SerializeLeafContractOptions = IntrospectSchemaOptions\n\nfunction serializeContractSchema(\n schema: MethodCfgLowProfile['bodySchema'],\n options: SerializeLeafContractOptions,\n) {\n return schema ? introspectSchema(routeSchemaParse(schema), options) : undefined\n}\n\nfunction serializeBodyFiles(cfg: MethodCfgLowProfile): FileField[] | undefined {\n if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0) {\n return undefined\n }\n\n return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }))\n}\n\nexport function serializeLeafContract(\n leaf: AnyLeafLowProfile,\n options: SerializeLeafContractOptions = {},\n): SerializedLeafContract {\n const cfg = leaf.cfg\n\n return {\n key: `${leaf.method.toUpperCase()} ${leaf.path}`,\n method: leaf.method,\n path: leaf.path,\n cfg: {\n description: cfg.description,\n summary: cfg.summary,\n docsGroup: cfg.docsGroup,\n tags: Array.isArray(cfg.tags) ? cfg.tags.slice() : undefined,\n deprecated: cfg.deprecated,\n stability: cfg.stability,\n docsHidden: cfg.docsHidden,\n docsMeta: cfg.docsMeta,\n feed: cfg.feed,\n bodyFiles: serializeBodyFiles(cfg),\n schemas: {\n body: serializeContractSchema(cfg.bodySchema, options),\n query: serializeContractSchema(cfg.querySchema, options),\n params: serializeContractSchema(cfg.paramsSchema, options),\n output: serializeContractSchema(cfg.outputSchema, options),\n outputMeta: serializeContractSchema(cfg.outputMetaSchema, options),\n queryExtension: serializeContractSchema(cfg.queryExtensionSchema, options),\n },\n },\n }\n}\n\nexport function serializeLeavesContract(\n leaves: readonly AnyLeafLowProfile[],\n options: SerializeLeafContractOptions = {},\n): SerializedLeafContract[] {\n return leaves.map((leaf) => serializeLeafContract(leaf, options))\n}\n","import type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport {\n serializeLeafContract,\n type SerializedLeafContract,\n} from './serializeLeafContract'\nimport type { SerializableSchema } from './schemaIntrospection'\n\nexport type FlatSchemaEntry = {\n type: string\n nullable: boolean\n optional: boolean\n literal?: unknown\n}\n\nexport type FlatSchemaMap = Record<string, FlatSchemaEntry>\n\ntype FlattenState = {\n optional: boolean\n nullable: boolean\n}\n\nfunction formatLiteralType(literal: unknown): string {\n if (typeof literal === 'string') return literal\n if (\n typeof literal === 'number' ||\n typeof literal === 'boolean' ||\n typeof literal === 'bigint'\n ) {\n return String(literal)\n }\n if (literal === null) return 'null'\n if (Array.isArray(literal)) {\n return literal.map((item) => formatLiteralType(item)).join('|')\n }\n if (typeof literal === 'object') {\n try {\n return JSON.stringify(literal)\n } catch {\n return 'object'\n }\n }\n return 'unknown'\n}\n\nfunction normalizeType(schema: SerializableSchema): string {\n switch (schema.kind) {\n case 'string':\n case 'number':\n case 'date':\n case 'boolean':\n case 'object':\n case 'array':\n return schema.kind\n case 'enum': {\n if (Array.isArray(schema.enumValues) && schema.enumValues.length > 0) {\n return schema.enumValues.join('|')\n }\n return 'unknown'\n }\n case 'literal': {\n return formatLiteralType(schema.literal)\n }\n default:\n return 'unknown'\n }\n}\n\nfunction isNonEmptyPath(path: string | undefined): path is string {\n return typeof path === 'string' && path.length > 0\n}\n\nfunction setNode(\n out: FlatSchemaMap,\n path: string,\n schema: SerializableSchema,\n inherited: FlattenState,\n) {\n if (!isNonEmptyPath(path)) return\n out[path] = {\n type: normalizeType(schema),\n nullable: inherited.nullable || Boolean(schema.nullable),\n optional: inherited.optional || Boolean(schema.optional),\n literal: schema.kind === 'literal' ? schema.literal : undefined,\n }\n}\n\nfunction flattenInto(\n out: FlatSchemaMap,\n schema: SerializableSchema | undefined,\n path: string,\n inherited: FlattenState,\n) {\n if (!schema || !isNonEmptyPath(path)) return\n\n const nextInherited: FlattenState = {\n optional: inherited.optional || Boolean(schema.optional),\n nullable: inherited.nullable || Boolean(schema.nullable),\n }\n\n if (schema.kind === 'union' && Array.isArray(schema.union) && schema.union.length > 0) {\n schema.union.forEach((option, index) => {\n const optionPath = `${path}-${index + 1}`\n flattenInto(out, option, optionPath, inherited)\n })\n return\n }\n\n setNode(out, path, schema, inherited)\n\n if (schema.kind === 'object' && schema.properties) {\n for (const [key, child] of Object.entries(schema.properties)) {\n const childPath = `${path}.${key}`\n flattenInto(out, child, childPath, nextInherited)\n }\n return\n }\n\n if (schema.kind === 'array' && schema.element) {\n flattenInto(out, schema.element, `${path}[]`, nextInherited)\n }\n}\n\nexport function flattenSerializableSchema(\n schema: SerializableSchema | undefined,\n path: string,\n): FlatSchemaMap {\n const out: FlatSchemaMap = {}\n flattenInto(out, schema, path, { optional: false, nullable: false })\n return out\n}\n\nfunction isSerializedLeaf(value: unknown): value is SerializedLeafContract {\n if (!value || typeof value !== 'object') return false\n const item = value as SerializedLeafContract\n return typeof item.key === 'string' && !!item.cfg && typeof item.cfg === 'object'\n}\n\nexport function flattenLeafSchemas(\n leaf: AnyLeafLowProfile | SerializedLeafContract,\n): FlatSchemaMap {\n const serialized = isSerializedLeaf(leaf) ? leaf : serializeLeafContract(leaf)\n\n const out: FlatSchemaMap = {}\n const sections = serialized.cfg.schemas\n\n Object.assign(out, flattenSerializableSchema(sections.params, 'params'))\n Object.assign(out, flattenSerializableSchema(sections.query, 'query'))\n Object.assign(out, flattenSerializableSchema(sections.body, 'body'))\n Object.assign(out, flattenSerializableSchema(sections.output, 'output'))\n\n return out\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type {\n AnyLeafLowProfile,\n FinalizedRegistry,\n} from '@emeryld/rrroutes-contract'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport {\n flattenLeafSchemas,\n type FlatSchemaMap,\n} from './flattenSchema'\nimport {\n serializeLeavesContract,\n type SerializeLeafContractOptions,\n type SerializedLeafContract,\n} from './serializeLeafContract'\nimport {\n extractLeafSourceByAst,\n type LeafSourceByKey,\n type SourceExtractionReason,\n} from './extractLeafSourceByAst'\n\nexport type ExportFinalizedLeavesInput =\n | readonly AnyLeafLowProfile[]\n | FinalizedRegistry<readonly AnyLeafLowProfile[]>\n\nexport type ExportFinalizedLeavesMeta = {\n generatedAt: string\n description: string\n sourceExtraction?: {\n mode: 'ast'\n enabled: boolean\n modulePath?: string\n exportName?: string\n tsconfigPath?: string\n resolvedLeafCount: number\n reason?: SourceExtractionReason\n stats?: {\n visitedSymbols: number\n visitedFiles: number\n unresolvedReferences: number\n }\n }\n fieldCatalog: {\n leaf: string[]\n cfg: string[]\n schemaNode: string[]\n flatSchemaEntry: string[]\n }\n flattening: {\n notation: 'dot+[]'\n unionBranchSuffix: '-N'\n sections: readonly ['params', 'query', 'body', 'output']\n }\n}\n\nexport type FinalizedLeavesExport = {\n _meta: ExportFinalizedLeavesMeta\n leaves: SerializedLeafContract[]\n schemaFlatByLeaf: Record<string, FlatSchemaMap>\n sourceByLeaf?: LeafSourceByKey\n}\n\nexport type ExportFinalizedLeavesOptions = SerializeLeafContractOptions & {\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n includeSource?: boolean\n tsconfigPath?: string\n sourceModulePath?: string\n sourceExportName?: string\n}\n\nexport type WriteFinalizedLeavesExportOptions = {\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n}\n\nfunction isRegistry(\n value: ExportFinalizedLeavesInput,\n): value is FinalizedRegistry<readonly AnyLeafLowProfile[]> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'all' in value &&\n 'byKey' in value\n )\n}\n\nfunction getLeaves(input: ExportFinalizedLeavesInput): readonly AnyLeafLowProfile[] {\n return isRegistry(input) ? input.all : input\n}\n\nfunction buildMeta(sourceExtraction?: ExportFinalizedLeavesMeta['sourceExtraction']): ExportFinalizedLeavesMeta {\n return {\n generatedAt: new Date().toISOString(),\n description:\n 'Finalized RRRoutes leaves export with serialized schemas and flattened schema paths for downstream processing.',\n sourceExtraction,\n fieldCatalog: {\n leaf: ['key', 'method', 'path', 'cfg'],\n cfg: [\n 'description?',\n 'summary?',\n 'docsGroup?',\n 'tags?',\n 'deprecated?',\n 'stability?',\n 'docsHidden?',\n 'docsMeta?',\n 'feed?',\n 'bodyFiles?',\n 'schemas',\n ],\n schemaNode: [\n 'kind',\n 'optional?',\n 'nullable?',\n 'description?',\n 'properties?',\n 'element?',\n 'union?',\n 'literal?',\n 'enumValues?',\n ],\n flatSchemaEntry: ['type', 'nullable', 'optional', 'literal?'],\n },\n flattening: {\n notation: 'dot+[]',\n unionBranchSuffix: '-N',\n sections: ['params', 'query', 'body', 'output'],\n },\n }\n}\n\nconst BAKED_PAYLOAD_MARKER = '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->'\n\nfunction escapePayloadForInlineScript(payload: FinalizedLeavesExport) {\n return JSON.stringify(payload).replace(/<\\//g, '<\\\\/').replace(/<!--/g, '<\\\\!--')\n}\n\nfunction injectPayloadIntoViewerHtml(\n htmlTemplate: string,\n payload: FinalizedLeavesExport,\n) {\n const payloadScript = `${BAKED_PAYLOAD_MARKER}\n<script id=\"finalized-leaves-baked-payload\">window.__FINALIZED_LEAVES_PAYLOAD = ${escapePayloadForInlineScript(\n payload,\n )};</script>`\n\n if (htmlTemplate.includes(BAKED_PAYLOAD_MARKER)) {\n return htmlTemplate.replace(BAKED_PAYLOAD_MARKER, payloadScript)\n }\n\n if (htmlTemplate.includes('</body>')) {\n return htmlTemplate.replace('</body>', `${payloadScript}\\n</body>`)\n }\n\n return `${payloadScript}\\n${htmlTemplate}`\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(\n process.cwd(),\n 'tools/finalized-leaves-viewer.html',\n ),\n path.resolve(\n process.cwd(),\n 'packages/export/tools/finalized-leaves-viewer.html',\n ),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(payload: FinalizedLeavesExport, outFile: string) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesExport,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectPayloadIntoViewerHtml(template, payload)\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport async function writeFinalizedLeavesExport(\n payload: FinalizedLeavesExport,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n\nexport async function exportFinalizedLeaves(\n input: ExportFinalizedLeavesInput,\n options: ExportFinalizedLeavesOptions = {},\n): Promise<FinalizedLeavesExport> {\n const leaves = getLeaves(input)\n const serializedLeaves = serializeLeavesContract(leaves, options)\n\n const schemaFlatByLeaf = Object.fromEntries(\n serializedLeaves.map((leaf) => [leaf.key, flattenLeafSchemas(leaf)]),\n )\n\n const sourceByLeaf: LeafSourceByKey = {}\n let sourceExtraction: ExportFinalizedLeavesMeta['sourceExtraction'] | undefined\n\n if (options.includeSource) {\n const modulePath = options.sourceModulePath\n const exportName = options.sourceExportName ?? 'leaves'\n if (modulePath) {\n const extracted = extractLeafSourceByAst({\n modulePath,\n exportName,\n tsconfigPath: options.tsconfigPath,\n })\n\n const allowedLeafKeys = new Set(serializedLeaves.map((leaf) => leaf.key))\n for (const [key, source] of Object.entries(extracted.sourceByLeaf)) {\n if (allowedLeafKeys.has(key)) {\n sourceByLeaf[key] = source\n }\n }\n\n sourceExtraction = {\n mode: 'ast',\n enabled: true,\n modulePath: path.resolve(modulePath),\n exportName,\n tsconfigPath: extracted.tsconfigPath,\n resolvedLeafCount: Object.keys(sourceByLeaf).length,\n reason: extracted.reason,\n stats: extracted.stats,\n }\n } else {\n sourceExtraction = {\n mode: 'ast',\n enabled: false,\n exportName,\n tsconfigPath: options.tsconfigPath\n ? path.resolve(options.tsconfigPath)\n : undefined,\n resolvedLeafCount: 0,\n reason: 'resolved_zero_leaves',\n stats: {\n visitedSymbols: 0,\n visitedFiles: 0,\n unresolvedReferences: 0,\n },\n }\n }\n }\n\n const payload: FinalizedLeavesExport = {\n _meta: buildMeta(sourceExtraction),\n leaves: serializedLeaves,\n schemaFlatByLeaf,\n sourceByLeaf:\n options.includeSource && Object.keys(sourceByLeaf).length > 0\n ? sourceByLeaf\n : undefined,\n }\n\n if (options.outFile || options.htmlFile) {\n await writeFinalizedLeavesExport(payload, {\n outFile: options.outFile,\n htmlFile: options.htmlFile,\n viewerTemplateFile: options.viewerTemplateFile,\n openOnFinish: options.openOnFinish,\n })\n }\n\n return payload\n}\n","export const DEFAULT_VIEWER_TEMPLATE = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>RRRoutes Export Viewer</title>\n <style>\n :root {\n --bg: #212121;\n --surface: #2a2a2a;\n --border: #4a4a4a;\n --text: #fffafa;\n --muted: #c8c2c2;\n --accent: #a764d3;\n --schema-accent: #fbbd23;\n }\n body {\n margin: 0;\n font-family: 'Iosevka Web', 'SFMono-Regular', Menlo, Consolas, monospace;\n color: var(--text);\n background: var(--bg);\n }\n a { color: var(--schema-accent); }\n .wrap { max-width: 1100px; margin: 0 auto; padding: 20px; }\n .card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }\n .meta { color: var(--muted); font-size: 12px; }\n #results { margin-top: 12px; display: grid; gap: 8px; }\n details { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 8px 10px; }\n summary { cursor: pointer; font-weight: 700; color: var(--accent); }\n pre { margin: 10px 0 0; overflow: auto; border: 1px solid var(--border); border-radius: 8px; padding: 10px; background: #303030; color: var(--text); }\n </style>\n </head>\n <body>\n <div class=\"wrap\">\n <h1>RRRoutes Export Viewer (Baked)</h1>\n <div class=\"card\">\n <div id=\"status\" class=\"meta\">Waiting for baked payload...</div>\n </div>\n <div id=\"results\"></div>\n </div>\n\n <!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->\n\n <script>\n const statusEl = document.getElementById('status')\n const resultsEl = document.getElementById('results')\n const payload = window.__FINALIZED_LEAVES_PAYLOAD\n\n if (payload && payload.kind === 'finalized-leaves-changelog') {\n statusEl.textContent =\n 'Loaded changelog payload with ' + (payload.commits?.length || 0) + ' commits.'\n\n const wrapSection = (title, value) => {\n const card = document.createElement('details')\n const summary = document.createElement('summary')\n summary.textContent = title\n const pre = document.createElement('pre')\n pre.textContent = JSON.stringify(value, null, 2)\n card.appendChild(summary)\n card.appendChild(pre)\n return card\n }\n\n resultsEl.appendChild(wrapSection('Commits', payload.commits || []))\n resultsEl.appendChild(wrapSection('By Route', payload.byRoute || {}))\n resultsEl.appendChild(\n wrapSection('By Source Object', payload.bySourceObject || {}),\n )\n } else if (!payload || !Array.isArray(payload.leaves)) {\n statusEl.textContent = 'No baked leaves/changelog/bundle payload found in this HTML file.'\n } else {\n statusEl.textContent = \\\n 'Loaded baked payload with ' + payload.leaves.length + ' routes.'\n\n const toHref = (source) => {\n if (!source || !source.file) return null\n const normalizedPath = String(source.file).replace(/\\\\\\\\/g, '/')\n const platform =\n (navigator.userAgentData && navigator.userAgentData.platform) ||\n navigator.platform ||\n ''\n const isWindows = /win/i.test(platform)\n const vscodePath = isWindows\n ? normalizedPath.replace(/^\\\\/+/, '')\n : normalizedPath.startsWith('/')\n ? normalizedPath\n : '/' + normalizedPath\n const line = Number.isFinite(source.line) ? source.line : 1\n const column = Number.isFinite(source.column) ? source.column : 1\n return 'vscode://file/' + encodeURI(vscodePath) + ':' + line + ':' + column\n }\n\n const sourceDisplay = (source) => {\n return ''\n }\n\n payload.leaves.forEach((leaf) => {\n const details = document.createElement('details')\n const summary = document.createElement('summary')\n summary.textContent = String(leaf.method || '').toUpperCase() + ' ' + (leaf.path || '')\n\n const pre = document.createElement('pre')\n pre.textContent = JSON.stringify(leaf, null, 2)\n\n const source = payload.sourceByLeaf && payload.sourceByLeaf[leaf.key]\n let sourceWrap = null\n if (source) {\n sourceWrap = document.createElement('div')\n sourceWrap.className = 'meta'\n\n const definitionHref = toHref(source.definition)\n if (definitionHref) {\n const label = document.createElement('div')\n const link = document.createElement('a')\n link.href = definitionHref\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = 'definition'\n label.appendChild(link)\n sourceWrap.appendChild(label)\n }\n\n if (source.schemas && typeof source.schemas === 'object') {\n Object.entries(source.schemas).forEach(([name, schema]) => {\n if (!schema) return\n const href = toHref(schema)\n const row = document.createElement('div')\n if (href) {\n const link = document.createElement('a')\n link.href = href\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent =\n name + ': ' + (schema.sourceName || schema.tag || '<anonymous>')\n row.appendChild(link)\n } else {\n row.textContent = name + ': ' + (schema.sourceName || schema.tag || '<anonymous>')\n }\n sourceWrap.appendChild(row)\n })\n }\n\n }\n\n details.appendChild(summary)\n if (sourceWrap) details.appendChild(sourceWrap)\n details.appendChild(pre)\n resultsEl.appendChild(details)\n })\n }\n </script>\n </body>\n</html>\n`\n","import path from 'node:path'\nimport ts from 'typescript'\n\nconst SCHEMA_KEYS = [\n 'bodySchema',\n 'querySchema',\n 'paramsSchema',\n 'outputSchema',\n 'outputMetaSchema',\n 'queryExtensionSchema',\n] as const\n\nconst HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete'])\nconst MAX_RECURSION_DEPTH = 120\n\nexport type SourceExtractionReason =\n | 'module_not_in_program'\n | 'export_not_found'\n | 'unsupported_expression_shape'\n | 'resolved_zero_leaves'\n\ntype SchemaKey = (typeof SCHEMA_KEYS)[number]\n\nexport type LeafSourceLocation = {\n file: string\n line: number\n column: number\n}\n\nexport type SchemaSourceMetadata = LeafSourceLocation & {\n sourceName?: string\n tag?: '<inline>' | '<anonymous>' | '<expression>'\n}\n\nexport type LeafSourceMetadata = {\n definition: LeafSourceLocation & { symbolName?: string }\n schemas: Partial<Record<SchemaKey, SchemaSourceMetadata>>\n}\n\nexport type LeafSourceByKey = Record<string, LeafSourceMetadata>\n\nexport type ExtractLeafSourceByAstOptions = {\n modulePath: string\n exportName: string\n tsconfigPath?: string\n cwd?: string\n}\n\nexport type ExtractLeafSourceByAstStats = {\n visitedSymbols: number\n visitedFiles: number\n unresolvedReferences: number\n}\n\nexport type ExtractLeafSourceByAstResult = {\n sourceByLeaf: LeafSourceByKey\n tsconfigPath?: string\n reason?: SourceExtractionReason\n stats: ExtractLeafSourceByAstStats\n}\n\ntype EvaluatedLeaf = {\n method: string\n path: string\n definitionNode: ts.Node\n schemas: Partial<Record<SchemaKey, ts.Expression>>\n}\n\ntype EvalContext = {\n checker: ts.TypeChecker\n activeExpressionKeys: Set<string>\n activeSymbols: Set<string>\n visitedSymbolKeys: Set<string>\n visitedFilePaths: Set<string>\n unresolvedReferences: number\n unsupportedShapeSeen: boolean\n}\n\ntype BranchState = {\n base: string\n leaves: EvaluatedLeaf[]\n}\n\nfunction toLocation(node: ts.Node): LeafSourceLocation {\n const sourceFile = node.getSourceFile()\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n )\n return {\n file: path.resolve(sourceFile.fileName),\n line: line + 1,\n column: character + 1,\n }\n}\n\nfunction markFile(ctx: EvalContext, sourceFile: ts.SourceFile | undefined) {\n if (!sourceFile) return\n ctx.visitedFilePaths.add(path.resolve(sourceFile.fileName))\n}\n\nfunction trimPreview(text: string, max = 80) {\n const normalized = text.replace(/\\s+/g, ' ').trim()\n return normalized.length > max ? `${normalized.slice(0, max)}...` : normalized\n}\n\nfunction unwrapExpression(expression: ts.Expression): ts.Expression {\n let current = expression\n while (true) {\n if (\n ts.isParenthesizedExpression(current) ||\n ts.isAsExpression(current) ||\n ts.isTypeAssertionExpression(current) ||\n ts.isNonNullExpression(current) ||\n ts.isSatisfiesExpression(current)\n ) {\n current = current.expression\n continue\n }\n break\n }\n return current\n}\n\nfunction getTextName(name: ts.PropertyName): string | undefined {\n if (\n ts.isIdentifier(name) ||\n ts.isStringLiteral(name) ||\n ts.isNumericLiteral(name)\n ) {\n return name.text\n }\n return undefined\n}\n\nfunction joinPaths(parent: string, child: string) {\n if (!parent) return child\n if (!child) return parent\n const trimmedParent = parent.endsWith('/') ? parent.replace(/\\/+$/, '') : parent\n const trimmedChild = child.startsWith('/') ? child.replace(/^\\/+/, '') : child\n if (!trimmedChild) return trimmedParent\n return `${trimmedParent}/${trimmedChild}`\n}\n\nfunction buildLeafKey(method: string, leafPath: string) {\n return `${method.toUpperCase()} ${leafPath}`\n}\n\nfunction normalizeResourceBase(raw: string) {\n if (raw === '') return ''\n if (raw.startsWith('/') || raw.startsWith(':') || raw.startsWith('*')) {\n return raw\n }\n return `/${raw}`\n}\n\nfunction getModuleSymbol(\n checker: ts.TypeChecker,\n sourceFile: ts.SourceFile,\n): ts.Symbol | undefined {\n return checker.getSymbolAtLocation(sourceFile)\n}\n\nfunction getAliasedSymbolIfNeeded(checker: ts.TypeChecker, symbol: ts.Symbol) {\n if ((symbol.flags & ts.SymbolFlags.Alias) !== 0) {\n try {\n return checker.getAliasedSymbol(symbol)\n } catch {\n return symbol\n }\n }\n return symbol\n}\n\nfunction findSourceFile(program: ts.Program, filePath: string): ts.SourceFile | undefined {\n const wanted = path.resolve(filePath)\n const normalizedWanted = path.normalize(wanted)\n return program\n .getSourceFiles()\n .find((file) => path.normalize(path.resolve(file.fileName)) === normalizedWanted)\n}\n\nfunction declarationToExpression(\n declaration: ts.Declaration | undefined,\n): ts.Expression | undefined {\n if (!declaration) return undefined\n if (ts.isVariableDeclaration(declaration)) {\n return declaration.initializer\n }\n if (ts.isExportAssignment(declaration)) {\n return declaration.expression\n }\n if (ts.isPropertyAssignment(declaration)) {\n return declaration.initializer\n }\n if (ts.isShorthandPropertyAssignment(declaration)) {\n return declaration.name\n }\n if (ts.isBindingElement(declaration)) {\n return declaration.initializer\n }\n if (ts.isEnumMember(declaration)) {\n return declaration.initializer\n }\n return undefined\n}\n\nfunction symbolKey(symbol: ts.Symbol): string {\n const decl = symbol.declarations?.[0]\n if (!decl) return `${symbol.getName()}#${symbol.flags}`\n const file = path.resolve(decl.getSourceFile().fileName)\n return `${file}:${decl.getStart()}:${symbol.getName()}`\n}\n\nfunction resolveSymbolFromNode(\n node: ts.Node,\n ctx: EvalContext,\n): ts.Symbol | undefined {\n const symbol = ctx.checker.getSymbolAtLocation(node)\n if (!symbol) {\n ctx.unresolvedReferences += 1\n return undefined\n }\n const target = getAliasedSymbolIfNeeded(ctx.checker, symbol)\n const key = symbolKey(target)\n ctx.visitedSymbolKeys.add(key)\n return target\n}\n\nfunction getExpressionFromSymbol(\n symbol: ts.Symbol,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const key = symbolKey(symbol)\n if (ctx.activeSymbols.has(key)) return undefined\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n ctx.activeSymbols.add(key)\n try {\n const declaration = symbol.declarations?.[0]\n markFile(ctx, declaration?.getSourceFile())\n const direct = declarationToExpression(declaration)\n if (direct) return direct\n\n if (declaration && ts.isImportSpecifier(declaration)) {\n const target = getAliasedSymbolIfNeeded(ctx.checker, symbol)\n if (target !== symbol) {\n return getExpressionFromSymbol(target, ctx, depth + 1)\n }\n }\n\n return undefined\n } finally {\n ctx.activeSymbols.delete(key)\n }\n}\n\nfunction resolveIdentifierExpression(\n identifier: ts.Identifier,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const symbol = resolveSymbolFromNode(identifier, ctx)\n if (!symbol) return undefined\n return getExpressionFromSymbol(symbol, ctx, depth)\n}\n\nfunction resolvePropertyExpression(\n expression: ts.PropertyAccessExpression | ts.ElementAccessExpression,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isPropertyAccessExpression(expression)) {\n const symbol = resolveSymbolFromNode(expression.name, ctx)\n if (symbol) {\n const fromSymbol = getExpressionFromSymbol(symbol, ctx, depth + 1)\n if (fromSymbol) return fromSymbol\n }\n } else if (expression.argumentExpression) {\n const symbol = resolveSymbolFromNode(expression.argumentExpression, ctx)\n if (symbol) {\n const fromSymbol = getExpressionFromSymbol(symbol, ctx, depth + 1)\n if (fromSymbol) return fromSymbol\n }\n }\n\n const ownerExpr = evaluateExpressionReference(expression.expression, ctx, depth + 1)\n const owner = ownerExpr ? maybeObjectLiteral(ownerExpr, ctx, depth + 1) : undefined\n if (!owner) return undefined\n\n const propName = ts.isPropertyAccessExpression(expression)\n ? expression.name.text\n : expression.argumentExpression && ts.isStringLiteralLike(expression.argumentExpression)\n ? expression.argumentExpression.text\n : undefined\n if (!propName) return undefined\n\n for (const property of owner.properties) {\n if (ts.isPropertyAssignment(property) && getTextName(property.name) === propName) {\n return property.initializer\n }\n if (ts.isShorthandPropertyAssignment(property) && property.name.text === propName) {\n return property.name\n }\n }\n\n return undefined\n}\n\nfunction evaluateExpressionReference(\n expression: ts.Expression,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isIdentifier(resolved)) {\n return resolveIdentifierExpression(resolved, ctx, depth + 1)\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n return resolvePropertyExpression(resolved, ctx, depth + 1)\n }\n\n return undefined\n}\n\nfunction resolveExportExpression(\n sourceFile: ts.SourceFile,\n exportName: string,\n checker: ts.TypeChecker,\n): ts.Expression | undefined {\n const moduleSymbol = getModuleSymbol(checker, sourceFile)\n if (!moduleSymbol) return undefined\n const exports = checker.getExportsOfModule(moduleSymbol)\n const explicit = exports.find((entry) => entry.getName() === exportName)\n if (explicit) {\n const declaration = getAliasedSymbolIfNeeded(checker, explicit).declarations?.[0]\n return declarationToExpression(declaration)\n }\n\n const defaultExport = exports.find((entry) => entry.getName() === 'default')\n if (!defaultExport) return undefined\n const defaultDecl = getAliasedSymbolIfNeeded(checker, defaultExport).declarations?.[0]\n const defaultExpr = declarationToExpression(defaultDecl)\n if (!defaultExpr) return undefined\n const resolved = unwrapExpression(defaultExpr)\n if (!ts.isObjectLiteralExpression(resolved)) return undefined\n\n for (const property of resolved.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const propertyName = getTextName(property.name)\n if (propertyName !== exportName) continue\n return property.initializer\n }\n\n return undefined\n}\n\nfunction maybeObjectLiteral(\n expression: ts.Expression | undefined,\n ctx: EvalContext,\n depth = 0,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression || depth > MAX_RECURSION_DEPTH) return undefined\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n if (ts.isObjectLiteralExpression(resolved)) return resolved\n\n const referenced = evaluateExpressionReference(resolved, ctx, depth + 1)\n if (!referenced) return undefined\n return maybeObjectLiteral(referenced, ctx, depth + 1)\n}\n\nfunction collectSchemaExpressionsFromObject(\n objectLiteral: ts.ObjectLiteralExpression,\n ctx: EvalContext,\n depth: number,\n): Partial<Record<SchemaKey, ts.Expression>> {\n const schemas: Partial<Record<SchemaKey, ts.Expression>> = {}\n\n for (const property of objectLiteral.properties) {\n if (ts.isSpreadAssignment(property)) {\n const spreadObject = maybeObjectLiteral(property.expression, ctx, depth + 1)\n if (!spreadObject) continue\n Object.assign(\n schemas,\n collectSchemaExpressionsFromObject(spreadObject, ctx, depth + 1),\n )\n continue\n }\n\n if (ts.isPropertyAssignment(property)) {\n const key = getTextName(property.name)\n if (!key || !SCHEMA_KEYS.includes(key as SchemaKey)) continue\n schemas[key as SchemaKey] = property.initializer\n continue\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n const key = property.name.text\n if (!SCHEMA_KEYS.includes(key as SchemaKey)) continue\n schemas[key as SchemaKey] = property.name\n }\n }\n\n return schemas\n}\n\nfunction extractSchemaExpressions(\n cfgExpression: ts.Expression | undefined,\n ctx: EvalContext,\n depth: number,\n): Partial<Record<SchemaKey, ts.Expression>> {\n const objectLiteral = maybeObjectLiteral(cfgExpression, ctx, depth)\n if (!objectLiteral) return {}\n return collectSchemaExpressionsFromObject(objectLiteral, ctx, depth)\n}\n\nfunction getNearestVariableName(node: ts.Node): string | undefined {\n let current: ts.Node | undefined = node\n while (current) {\n if (ts.isVariableDeclaration(current) && ts.isIdentifier(current.name)) {\n return current.name.text\n }\n current = current.parent\n }\n return undefined\n}\n\nfunction isAllAccess(\n expression: ts.PropertyAccessExpression | ts.ElementAccessExpression,\n): boolean {\n if (ts.isPropertyAccessExpression(expression)) {\n return expression.name.text === 'all'\n }\n return Boolean(\n expression.argumentExpression &&\n ts.isStringLiteralLike(expression.argumentExpression) &&\n expression.argumentExpression.text === 'all',\n )\n}\n\nfunction evaluateBranchExpression(\n expression: ts.Expression,\n ctx: EvalContext,\n depth: number,\n): BranchState | undefined {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isIdentifier(resolved)) {\n const valueExpr = resolveIdentifierExpression(resolved, ctx, depth + 1)\n if (!valueExpr) return undefined\n return evaluateBranchExpression(valueExpr, ctx, depth + 1)\n }\n\n if (!ts.isCallExpression(resolved)) return undefined\n\n const call = resolved\n if (ts.isIdentifier(call.expression) && call.expression.text === 'resource') {\n const firstArg = call.arguments[0]\n if (!firstArg || !ts.isStringLiteralLike(firstArg)) {\n ctx.unsupportedShapeSeen = true\n return undefined\n }\n return { base: normalizeResourceBase(firstArg.text), leaves: [] }\n }\n\n if (!ts.isPropertyAccessExpression(call.expression)) {\n ctx.unsupportedShapeSeen = true\n return undefined\n }\n\n const owner = call.expression.expression\n const method = call.expression.name.text\n const branch = evaluateBranchExpression(owner, ctx, depth + 1)\n if (!branch) return undefined\n\n if (method === 'with') return branch\n\n if (HTTP_METHODS.has(method)) {\n const cfgExpression = call.arguments[0]\n const schemas = extractSchemaExpressions(cfgExpression, ctx, depth + 1)\n const nextLeaf: EvaluatedLeaf = {\n method,\n path: branch.base,\n definitionNode: call.expression.name,\n schemas,\n }\n return {\n ...branch,\n leaves: [...branch.leaves, nextLeaf],\n }\n }\n\n if (method === 'sub') {\n const mountedLeaves = call.arguments.flatMap((arg) =>\n evaluateLeavesFromExpression(arg, ctx, depth + 1),\n )\n const prefixed = mountedLeaves.map((leaf) => ({\n ...leaf,\n path: joinPaths(branch.base, leaf.path),\n }))\n return {\n ...branch,\n leaves: [...branch.leaves, ...prefixed],\n }\n }\n\n ctx.unsupportedShapeSeen = true\n return undefined\n}\n\nfunction expressionKey(expression: ts.Expression) {\n const source = expression.getSourceFile()\n return `${path.resolve(source.fileName)}:${expression.getStart(source)}:${expression.getEnd()}:${expression.kind}`\n}\n\nfunction evaluateLeavesFromExpression(\n expression: ts.Expression,\n ctx: EvalContext,\n depth = 0,\n): EvaluatedLeaf[] {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n const key = expressionKey(resolved)\n if (ctx.activeExpressionKeys.has(key)) return []\n if (depth > MAX_RECURSION_DEPTH) return []\n ctx.activeExpressionKeys.add(key)\n\n try {\n if (ts.isIdentifier(resolved)) {\n const valueExpr = resolveIdentifierExpression(resolved, ctx, depth + 1)\n if (!valueExpr) return []\n return evaluateLeavesFromExpression(valueExpr, ctx, depth + 1)\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n if (isAllAccess(resolved)) {\n return evaluateLeavesFromExpression(resolved.expression, ctx, depth + 1)\n }\n const refExpr = resolvePropertyExpression(resolved, ctx, depth + 1)\n if (refExpr) {\n return evaluateLeavesFromExpression(refExpr, ctx, depth + 1)\n }\n return []\n }\n\n if (ts.isArrayLiteralExpression(resolved)) {\n const leaves: EvaluatedLeaf[] = []\n for (const element of resolved.elements) {\n if (ts.isSpreadElement(element)) {\n leaves.push(...evaluateLeavesFromExpression(element.expression, ctx, depth + 1))\n continue\n }\n leaves.push(...evaluateLeavesFromExpression(element as ts.Expression, ctx, depth + 1))\n }\n return leaves\n }\n\n if (ts.isCallExpression(resolved)) {\n if (ts.isIdentifier(resolved.expression)) {\n const callName = resolved.expression.text\n if (callName === 'finalize') {\n const arg = resolved.arguments[0]\n if (!arg) return []\n return evaluateLeavesFromExpression(arg, ctx, depth + 1)\n }\n if (callName === 'mergeArrays') {\n return resolved.arguments.flatMap((arg) =>\n evaluateLeavesFromExpression(arg, ctx, depth + 1),\n )\n }\n }\n\n if (ts.isPropertyAccessExpression(resolved.expression)) {\n const prop = resolved.expression.name.text\n if (prop === 'done') {\n const branch = evaluateBranchExpression(\n resolved.expression.expression,\n ctx,\n depth + 1,\n )\n return branch?.leaves ?? []\n }\n }\n\n const refExpr = evaluateExpressionReference(resolved, ctx, depth + 1)\n if (refExpr) return evaluateLeavesFromExpression(refExpr, ctx, depth + 1)\n\n ctx.unsupportedShapeSeen = true\n return []\n }\n\n const branch = evaluateBranchExpression(resolved, ctx, depth + 1)\n if (branch) return branch.leaves\n\n ctx.unsupportedShapeSeen = true\n return []\n } finally {\n ctx.activeExpressionKeys.delete(key)\n }\n}\n\nfunction resolveSchemaMetadata(\n expression: ts.Expression,\n ctx: EvalContext,\n): SchemaSourceMetadata {\n const resolved = unwrapExpression(expression)\n\n if (ts.isIdentifier(resolved)) {\n const symbol = resolveSymbolFromNode(resolved, ctx)\n const declaration = symbol?.declarations?.[0]\n const locationNode = declaration\n ? ts.isVariableDeclaration(declaration)\n ? declaration.name\n : declaration\n : resolved\n\n const sourceName =\n declaration && ts.isVariableDeclaration(declaration) && ts.isIdentifier(declaration.name)\n ? declaration.name.text\n : resolved.text\n\n return {\n ...toLocation(locationNode),\n sourceName,\n tag: declaration ? undefined : '<anonymous>',\n }\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n return {\n ...toLocation(resolved),\n sourceName: trimPreview(resolved.getText()),\n tag: '<expression>',\n }\n }\n\n return {\n ...toLocation(resolved),\n sourceName: trimPreview(resolved.getText()),\n tag: '<inline>',\n }\n}\n\nfunction parseTsConfig(cwd: string, tsconfigPath?: string) {\n const resolvedTsconfig = tsconfigPath\n ? path.resolve(cwd, tsconfigPath)\n : ts.findConfigFile(cwd, ts.sys.fileExists, 'tsconfig.json')\n if (!resolvedTsconfig) {\n return undefined\n }\n\n const read = ts.readConfigFile(resolvedTsconfig, ts.sys.readFile)\n if (read.error) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, '\\n'))\n }\n const parsed = ts.parseJsonConfigFileContent(\n read.config,\n ts.sys,\n path.dirname(resolvedTsconfig),\n undefined,\n resolvedTsconfig,\n )\n const nonEmptyInputErrors = parsed.errors.filter((entry) => entry.code !== 18003)\n if (nonEmptyInputErrors.length > 0) {\n throw new Error(\n nonEmptyInputErrors\n .map((entry) => ts.flattenDiagnosticMessageText(entry.messageText, '\\n'))\n .join('\\n'),\n )\n }\n\n return { resolvedTsconfig, parsed }\n}\n\nfunction createProgramWithFallback(parsed: ts.ParsedCommandLine, moduleFileAbs: string) {\n const base = ts.createProgram({\n rootNames: parsed.fileNames,\n options: parsed.options,\n })\n\n if (findSourceFile(base, moduleFileAbs)) {\n return base\n }\n\n const rootNames = Array.from(new Set([...parsed.fileNames, moduleFileAbs]))\n return ts.createProgram({ rootNames, options: parsed.options })\n}\n\nexport function extractLeafSourceByAst({\n modulePath,\n exportName,\n tsconfigPath,\n cwd = process.cwd(),\n}: ExtractLeafSourceByAstOptions): ExtractLeafSourceByAstResult {\n const parsedConfig = parseTsConfig(cwd, tsconfigPath)\n if (!parsedConfig) {\n return {\n sourceByLeaf: {},\n reason: 'module_not_in_program',\n stats: { visitedSymbols: 0, visitedFiles: 0, unresolvedReferences: 0 },\n }\n }\n\n const moduleAbs = path.resolve(cwd, modulePath)\n const program = createProgramWithFallback(parsedConfig.parsed, moduleAbs)\n const checker = program.getTypeChecker()\n const moduleFile = findSourceFile(program, moduleAbs)\n if (!moduleFile) {\n return {\n sourceByLeaf: {},\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason: 'module_not_in_program',\n stats: { visitedSymbols: 0, visitedFiles: 0, unresolvedReferences: 0 },\n }\n }\n\n const exportedExpression = resolveExportExpression(moduleFile, exportName, checker)\n if (!exportedExpression) {\n return {\n sourceByLeaf: {},\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason: 'export_not_found',\n stats: { visitedSymbols: 0, visitedFiles: 1, unresolvedReferences: 0 },\n }\n }\n\n const ctx: EvalContext = {\n checker,\n activeExpressionKeys: new Set<string>(),\n activeSymbols: new Set<string>(),\n visitedSymbolKeys: new Set<string>(),\n visitedFilePaths: new Set<string>([path.resolve(moduleFile.fileName)]),\n unresolvedReferences: 0,\n unsupportedShapeSeen: false,\n }\n\n const evaluatedLeaves = evaluateLeavesFromExpression(exportedExpression, ctx, 0)\n\n const sourceByLeaf: LeafSourceByKey = {}\n for (const leaf of evaluatedLeaves) {\n const key = buildLeafKey(leaf.method, leaf.path)\n const definition = {\n ...toLocation(leaf.definitionNode),\n symbolName: getNearestVariableName(leaf.definitionNode),\n }\n ctx.visitedFilePaths.add(definition.file)\n\n const schemas: Partial<Record<SchemaKey, SchemaSourceMetadata>> = {}\n for (const schemaKey of SCHEMA_KEYS) {\n const schemaExpression = leaf.schemas[schemaKey]\n if (!schemaExpression) continue\n const schemaMeta = resolveSchemaMetadata(schemaExpression, ctx)\n ctx.visitedFilePaths.add(schemaMeta.file)\n schemas[schemaKey] = schemaMeta\n }\n\n sourceByLeaf[key] = { definition, schemas }\n }\n\n const reason: SourceExtractionReason | undefined =\n Object.keys(sourceByLeaf).length > 0\n ? undefined\n : ctx.unsupportedShapeSeen\n ? 'unsupported_expression_shape'\n : 'resolved_zero_leaves'\n\n return {\n sourceByLeaf,\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason,\n stats: {\n visitedSymbols: ctx.visitedSymbolKeys.size,\n visitedFiles: ctx.visitedFilePaths.size,\n unresolvedReferences: ctx.unresolvedReferences,\n },\n }\n}\n","import path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport {\n exportFinalizedLeaves,\n type ExportFinalizedLeavesInput,\n} from './exportFinalizedLeaves'\n\nexport type FinalizedLeavesCliArgs = {\n modulePath: string\n exportName: string\n outFile: string\n withSource: boolean\n tsconfigPath?: string\n}\n\nexport function parseFinalizedLeavesCliArgs(argv: string[]): FinalizedLeavesCliArgs {\n const args = new Map<string, string>()\n let withSource = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const key = argv[i]\n if (key === '--') continue\n if (!key.startsWith('--')) continue\n if (key === '--with-source') {\n withSource = true\n continue\n }\n const value = argv[i + 1]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${key}`)\n }\n args.set(key, value)\n i += 1\n }\n\n const modulePath = args.get('--module')\n if (!modulePath) {\n throw new Error('Missing required --module argument')\n }\n\n return {\n modulePath,\n exportName: args.get('--export') ?? 'leaves',\n outFile: args.get('--out') ?? 'finalized-leaves.export.json',\n withSource,\n tsconfigPath: args.get('--tsconfig') ?? undefined,\n }\n}\n\nexport async function loadFinalizedLeavesInput({\n modulePath,\n exportName,\n}: FinalizedLeavesCliArgs): Promise<ExportFinalizedLeavesInput> {\n const resolvedModule = path.resolve(process.cwd(), modulePath)\n const mod = await import(pathToFileURL(resolvedModule).href)\n const value = (mod[exportName] ??\n (mod.default && (mod.default as Record<string, unknown>)[exportName])) as\n | ExportFinalizedLeavesInput\n | undefined\n\n if (!value) {\n throw new Error(`Export \"${exportName}\" not found in module: ${resolvedModule}`)\n }\n\n return value\n}\n\nexport async function runExportFinalizedLeavesCli(argv: string[]) {\n const args = parseFinalizedLeavesCliArgs(argv)\n const input = await loadFinalizedLeavesInput(args)\n const payload = await exportFinalizedLeaves(input, {\n outFile: args.outFile,\n includeSource: args.withSource,\n tsconfigPath: args.tsconfigPath,\n sourceModulePath: args.modulePath,\n sourceExportName: args.exportName,\n })\n\n return {\n payload,\n outFile: path.resolve(args.outFile),\n }\n}\n","import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\nimport { execFile as execFileCallback, spawn } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { pathToFileURL } from 'node:url'\nimport ts from 'typescript'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport {\n exportFinalizedLeaves,\n type ExportFinalizedLeavesOptions,\n type FinalizedLeavesExport,\n type WriteFinalizedLeavesExportOptions,\n} from './exportFinalizedLeaves'\nimport type { FlatSchemaEntry, FlatSchemaMap } from './flattenSchema'\n\nconst execFile = promisify(execFileCallback)\n\nconst CHANGESET_CFG_FIELDS = [\n 'summary',\n 'description',\n 'tags',\n 'deprecated',\n 'stability',\n 'docsGroup',\n 'docsHidden',\n 'feed',\n] as const\n\nconst SCHEMA_SECTIONS = ['params', 'query', 'body', 'output'] as const\nconst MODULE_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts', '.js', '.mjs', '.cjs'] as const\nconst COMPILE_CACHE_VERSION = 'v2'\n\ntype ChangelogSchemaSection = (typeof SCHEMA_SECTIONS)[number]\n\ntype SourceSchemaKey =\n | 'paramsSchema'\n | 'querySchema'\n | 'bodySchema'\n | 'outputSchema'\n\nconst SOURCE_KEY_BY_SECTION: Record<ChangelogSchemaSection, SourceSchemaKey> = {\n params: 'paramsSchema',\n query: 'querySchema',\n body: 'bodySchema',\n output: 'outputSchema',\n}\n\ntype RouteCfgSubset = Partial<Record<(typeof CHANGESET_CFG_FIELDS)[number], unknown>>\n\ntype SourceIdentity = {\n id: string\n displayName: string\n file?: string\n line?: number\n column?: number\n tag?: string\n sourceName?: string\n}\n\ntype RouteSnapshot = {\n key: string\n method: string\n path: string\n cfg: RouteCfgSubset\n flatSchema: FlatSchemaMap\n sourceBySection: Partial<Record<ChangelogSchemaSection, SourceIdentity>>\n}\n\ntype SourceObjectSectionSnapshot = Record<string, string[]>\n\ntype SourceObjectSnapshot = {\n id: string\n displayName: string\n routeKeys: string[]\n sections: Record<ChangelogSchemaSection, SourceObjectSectionSnapshot>\n}\n\ntype CommitSnapshot = {\n commit: ChangelogCommit\n routesByKey: Record<string, RouteSnapshot>\n sourceObjectsById: Record<string, SourceObjectSnapshot>\n missing?: boolean\n unresolvedModule?: boolean\n fallbackReason?: 'module_unresolved' | 'snapshot_error'\n fallbackError?: string\n}\n\ntype DiffOp = 'added' | 'removed' | 'changed'\n\nexport type SchemaPathDelta = {\n path: string\n op: DiffOp\n before?: FlatSchemaEntry\n after?: FlatSchemaEntry\n}\n\nexport type RouteCfgFieldDelta = {\n field: (typeof CHANGESET_CFG_FIELDS)[number]\n before?: unknown\n after?: unknown\n}\n\nexport type SourceSchemaPathDelta = {\n section: ChangelogSchemaSection\n path: string\n op: DiffOp\n before?: string[]\n after?: string[]\n}\n\nexport type ChangelogCommit = {\n sha: string\n authorDate: string\n authorName: string\n subject: string\n}\n\nexport type RouteChangeType =\n | 'route_added'\n | 'route_removed'\n | 'schema_changed'\n | 'cfg_changed'\n\nexport type SourceObjectChangeType =\n | 'source_object_added'\n | 'source_object_removed'\n | 'source_schema_changed'\n\nexport type RouteChangeEvent = {\n type: RouteChangeType\n commitSha: string\n routeKey: string\n method?: string\n path?: string\n schemaDiff?: SchemaPathDelta[]\n cfgDiff?: RouteCfgFieldDelta[]\n}\n\nexport type SourceObjectChangeEvent = {\n type: SourceObjectChangeType\n commitSha: string\n sourceObjectId: string\n displayName: string\n impactedRoutes: string[]\n schemaDiff?: SourceSchemaPathDelta[]\n routeAdded?: string[]\n routeRemoved?: string[]\n}\n\nexport type ChangelogRollups = {\n route: Record<RouteChangeType, number>\n sourceObject: Record<SourceObjectChangeType, number>\n byCommit: Record<string, { routeEvents: number; sourceEvents: number }>\n}\n\nexport type FinalizedLeavesChangelogExport = {\n kind: 'finalized-leaves-changelog'\n _meta: {\n generatedAt: string\n description: string\n modulePath: string\n exportName: string\n from: string\n to: string\n selectedCommitCount: number\n unresolvedModuleCommits?: string[]\n snapshotFallbacks?: Array<{\n sha: string\n reason: 'module_unresolved' | 'snapshot_error'\n error?: string\n }>\n }\n commits: ChangelogCommit[]\n byRoute: Record<string, RouteChangeEvent[]>\n bySourceObject: Record<string, SourceObjectChangeEvent[]>\n rollups: ChangelogRollups\n}\n\nexport type ExportFinalizedLeavesChangelogOptions = {\n modulePath: string\n exportName?: string\n tsconfigPath?: string\n from?: string\n to?: string\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n includeSource?: boolean\n handlers?: ExportFinalizedLeavesOptions['handlers']\n log?: (message: string) => void\n cacheDir?: string\n noCache?: boolean\n}\n\nfunction normalizePath(p: string) {\n return p.replace(/\\\\/g, '/')\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n const sorted = Object.entries(v as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce<Record<string, unknown>>((acc, [k, inner]) => {\n acc[k] = inner\n return acc\n }, {})\n return sorted\n }\n return v\n })\n}\n\nfunction sanitizeCfgValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.slice().sort((a, b) => String(a).localeCompare(String(b)))\n }\n return value\n}\n\nfunction toCfgSubset(cfg: Record<string, unknown>): RouteCfgSubset {\n const out: RouteCfgSubset = {}\n for (const field of CHANGESET_CFG_FIELDS) {\n const value = sanitizeCfgValue(cfg[field])\n if (value !== undefined) {\n out[field] = value\n }\n }\n return out\n}\n\nfunction entrySignature(entry: FlatSchemaEntry): string {\n return stableStringify({\n type: entry.type,\n nullable: Boolean(entry.nullable),\n optional: Boolean(entry.optional),\n literal: entry.literal,\n })\n}\n\nfunction semverToTuple(tag: string): {\n major: number\n minor: number\n patch: number\n prerelease: string\n} | null {\n const match = tag.match(/^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/)\n if (!match) return null\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ?? '',\n }\n}\n\nfunction compareSemverTags(a: string, b: string) {\n const av = semverToTuple(a)\n const bv = semverToTuple(b)\n if (!av && !bv) return 0\n if (!av) return -1\n if (!bv) return 1\n if (av.major !== bv.major) return av.major - bv.major\n if (av.minor !== bv.minor) return av.minor - bv.minor\n if (av.patch !== bv.patch) return av.patch - bv.patch\n if (!av.prerelease && bv.prerelease) return 1\n if (av.prerelease && !bv.prerelease) return -1\n return av.prerelease.localeCompare(bv.prerelease)\n}\n\nasync function runGit(cwd: string, args: string[]) {\n const { stdout } = await execFile('git', args, { cwd })\n return stdout.trim()\n}\n\nasync function resolveCommit(cwd: string, rev: string) {\n return runGit(cwd, ['rev-parse', '--verify', `${rev}^{commit}`])\n}\n\nasync function findLastReachableSemverTag(cwd: string, to: string) {\n const tagsRaw = await runGit(cwd, ['tag', '--merged', to])\n const tags = tagsRaw\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .filter((tag) => semverToTuple(tag) !== null)\n\n if (tags.length === 0) {\n return undefined\n }\n\n tags.sort(compareSemverTags)\n return tags[tags.length - 1]\n}\n\nasync function findDefaultFromCommit(cwd: string, toCommit: string) {\n const tag = await findLastReachableSemverTag(cwd, toCommit)\n if (tag) {\n return resolveCommit(cwd, tag)\n }\n\n const root = await runGit(cwd, ['rev-list', '--max-parents=0', toCommit])\n const rootCommit = root.split('\\n').map((item) => item.trim()).filter(Boolean)[0]\n if (!rootCommit) {\n throw new Error('Failed to resolve a baseline commit for changelog generation.')\n }\n return rootCommit\n}\n\nasync function resolveCommitWindow(cwd: string, from?: string, to?: string) {\n const toCommit = await resolveCommit(cwd, to ?? 'HEAD')\n const fromCommit = from\n ? await resolveCommit(cwd, from)\n : await findDefaultFromCommit(cwd, toCommit)\n\n return { from: fromCommit, to: toCommit }\n}\n\nasync function resolveCommitPath(cwd: string, fromCommit: string, toCommit: string) {\n if (fromCommit === toCommit) {\n return [toCommit]\n }\n\n const pathRaw = await runGit(cwd, [\n 'rev-list',\n '--reverse',\n '--ancestry-path',\n `${fromCommit}..${toCommit}`,\n ])\n const commits = pathRaw\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n\n return [fromCommit, ...commits]\n}\n\nfunction modulePathStem(modulePath: string) {\n const normalized = normalizePath(modulePath).replace(/^\\/+/, '')\n for (const ext of MODULE_EXTENSIONS) {\n if (normalized.endsWith(ext)) {\n return normalized.slice(0, -ext.length)\n }\n }\n return normalized\n}\n\nfunction extensionVariants(pathLike: string) {\n const stem = modulePathStem(pathLike)\n return MODULE_EXTENSIONS.map((ext) => `${stem}${ext}`)\n}\n\nasync function buildModulePathCandidates(\n repoRoot: string,\n toCommit: string,\n requestedModuleRel: string,\n) {\n const requested = normalizePath(requestedModuleRel).replace(/^\\/+/, '')\n const out: string[] = []\n const seen = new Set<string>()\n\n const pushCandidate = (value: string) => {\n const normalized = normalizePath(value).replace(/^\\/+/, '')\n if (!normalized) return\n if (seen.has(normalized)) return\n seen.add(normalized)\n out.push(normalized)\n }\n\n pushCandidate(requested)\n extensionVariants(requested).forEach(pushCandidate)\n\n const history = await runGit(repoRoot, [\n 'log',\n '--follow',\n '--name-only',\n '--format=',\n toCommit,\n '--',\n requested,\n ])\n\n history\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .forEach((candidate) => {\n pushCandidate(candidate)\n extensionVariants(candidate).forEach(pushCandidate)\n })\n\n return out\n}\n\nasync function commitHasPath(repoRoot: string, commitSha: string, candidatePath: string) {\n try {\n await execFile('git', ['cat-file', '-e', `${commitSha}:${candidatePath}`], {\n cwd: repoRoot,\n })\n return true\n } catch {\n return false\n }\n}\n\nasync function resolveModulePathForCommit(\n repoRoot: string,\n commitSha: string,\n candidates: readonly string[],\n) {\n for (const candidate of candidates) {\n if (await commitHasPath(repoRoot, commitSha, candidate)) {\n return candidate\n }\n }\n return undefined\n}\n\nfunction parentDirectories(relativePath: string) {\n const clean = normalizePath(relativePath).replace(/^\\/+/, '')\n const dir = path.posix.dirname(clean)\n if (!dir || dir === '.') return []\n\n const parts = dir.split('/')\n const out: string[] = []\n for (let i = parts.length; i > 0; i -= 1) {\n out.push(parts.slice(0, i).join('/'))\n }\n return out\n}\n\nfunction buildRelevantConfigFiles(moduleCandidates: readonly string[], tsconfigRel?: string) {\n const dirs = new Set<string>()\n for (const moduleRel of moduleCandidates) {\n parentDirectories(moduleRel).forEach((item) => dirs.add(item))\n }\n if (tsconfigRel) {\n parentDirectories(tsconfigRel).forEach((item) => dirs.add(item))\n dirs.add(path.posix.dirname(normalizePath(tsconfigRel)))\n }\n\n const files = new Set<string>(['pnpm-workspace.yaml'])\n for (const dir of dirs) {\n if (!dir || dir === '.') continue\n files.add(`${dir}/package.json`)\n files.add(`${dir}/tsconfig.json`)\n }\n\n return files\n}\n\nasync function commitTouchedRelevantPaths(\n cwd: string,\n commit: string,\n moduleCandidates: readonly string[],\n tsconfigRel?: string,\n) {\n const changed = await runGit(cwd, [\n 'show',\n '--pretty=format:',\n '--name-only',\n '--diff-filter=ACMRTUXB',\n commit,\n ])\n\n const changedFiles = changed\n .split('\\n')\n .map((item) => normalizePath(item.trim()).replace(/^\\/+/, ''))\n .filter(Boolean)\n\n const moduleFiles = Array.from(\n new Set(moduleCandidates.map((item) => normalizePath(item).replace(/^\\/+/, ''))),\n )\n const moduleDirs = Array.from(\n new Set(\n moduleFiles\n .map((item) => normalizePath(path.posix.dirname(item)).replace(/^\\/+/, ''))\n .filter((item) => item && item !== '.'),\n ),\n )\n const tsconfigFile = tsconfigRel\n ? normalizePath(tsconfigRel).replace(/^\\/+/, '')\n : undefined\n const configFiles = buildRelevantConfigFiles(moduleFiles, tsconfigFile)\n\n return changedFiles.some((file) => {\n if (moduleFiles.includes(file)) return true\n for (const moduleDir of moduleDirs) {\n if (file === moduleDir || file.startsWith(`${moduleDir}/`)) {\n return true\n }\n }\n if (tsconfigFile && file === tsconfigFile) return true\n return configFiles.has(file)\n })\n}\n\nasync function filterCommits(\n cwd: string,\n commits: string[],\n moduleCandidates: readonly string[],\n tsconfigRel?: string,\n) {\n if (commits.length <= 1) {\n return commits\n }\n\n const keep = [commits[0]]\n for (let i = 1; i < commits.length; i += 1) {\n const commit = commits[i]\n if (await commitTouchedRelevantPaths(cwd, commit, moduleCandidates, tsconfigRel)) {\n keep.push(commit)\n }\n }\n\n const tip = commits[commits.length - 1]\n if (!keep.includes(tip)) {\n keep.push(tip)\n }\n\n return keep\n}\n\nasync function getCommitMetadata(cwd: string, commit: string): Promise<ChangelogCommit> {\n const out = await runGit(cwd, ['show', '-s', '--format=%H%x1f%aI%x1f%an%x1f%s', commit])\n const [sha, authorDate, authorName, subject] = out.split('\\x1f')\n if (!sha || !authorDate || !authorName) {\n throw new Error(`Unable to read commit metadata for ${commit}`)\n }\n\n return {\n sha,\n authorDate,\n authorName,\n subject: subject ?? '',\n }\n}\n\nfunction buildSourceIdentity(section: ChangelogSchemaSection, value: Record<string, unknown>): SourceIdentity {\n const sourceName = typeof value.sourceName === 'string' ? value.sourceName : undefined\n const tag = typeof value.tag === 'string' ? value.tag : undefined\n const file = typeof value.file === 'string' ? value.file : undefined\n const line = typeof value.line === 'number' ? value.line : undefined\n const column = typeof value.column === 'number' ? value.column : undefined\n\n const fallbackName = sourceName ?? tag ?? section\n const suffix = file ? `${file}:${line ?? 1}:${column ?? 1}` : `${section}:unknown`\n\n return {\n id: sourceName ?? `${fallbackName}@${suffix}`,\n displayName: sourceName ?? `${fallbackName} (${suffix})`,\n sourceName,\n tag,\n file,\n line,\n column,\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' ? (value as Record<string, unknown>) : {}\n}\n\nfunction toRouteSnapshots(payload: FinalizedLeavesExport): Record<string, RouteSnapshot> {\n const routes: Record<string, RouteSnapshot> = {}\n\n for (const leaf of payload.leaves) {\n const flatSchema = payload.schemaFlatByLeaf[leaf.key] ?? {}\n const cfg = toCfgSubset(asRecord(leaf.cfg as unknown))\n const sourceLeaf = payload.sourceByLeaf?.[leaf.key]\n const sourceSchemas = sourceLeaf?.schemas\n\n const sourceBySection: Partial<Record<ChangelogSchemaSection, SourceIdentity>> = {}\n for (const section of SCHEMA_SECTIONS) {\n const schemaKey = SOURCE_KEY_BY_SECTION[section]\n const sectionSource = sourceSchemas?.[schemaKey]\n if (!sectionSource || typeof sectionSource !== 'object') continue\n sourceBySection[section] = buildSourceIdentity(\n section,\n sectionSource as Record<string, unknown>,\n )\n }\n\n routes[leaf.key] = {\n key: leaf.key,\n method: String(leaf.method).toUpperCase(),\n path: leaf.path,\n cfg,\n flatSchema,\n sourceBySection,\n }\n }\n\n return routes\n}\n\nfunction sectionPathEntries(flatSchema: FlatSchemaMap, section: ChangelogSchemaSection) {\n return Object.entries(flatSchema).filter(([schemaPath]) =>\n schemaPath === section || schemaPath.startsWith(`${section}.`) || schemaPath.startsWith(`${section}[]`),\n )\n}\n\nfunction toSourceObjectSnapshots(routesByKey: Record<string, RouteSnapshot>) {\n const working = new Map<\n string,\n {\n id: string\n displayName: string\n routeKeys: Set<string>\n sections: Record<ChangelogSchemaSection, Map<string, Set<string>>>\n }\n >()\n\n for (const route of Object.values(routesByKey)) {\n for (const section of SCHEMA_SECTIONS) {\n const sourceIdentity = route.sourceBySection[section]\n if (!sourceIdentity) continue\n\n const entries = sectionPathEntries(route.flatSchema, section)\n if (entries.length === 0) continue\n\n const existing =\n working.get(sourceIdentity.id) ??\n {\n id: sourceIdentity.id,\n displayName: sourceIdentity.displayName,\n routeKeys: new Set<string>(),\n sections: {\n params: new Map<string, Set<string>>(),\n query: new Map<string, Set<string>>(),\n body: new Map<string, Set<string>>(),\n output: new Map<string, Set<string>>(),\n },\n }\n\n existing.routeKeys.add(route.key)\n for (const [schemaPath, schemaEntry] of entries) {\n const sectionMap = existing.sections[section]\n const signatures = sectionMap.get(schemaPath) ?? new Set<string>()\n signatures.add(entrySignature(schemaEntry))\n sectionMap.set(schemaPath, signatures)\n }\n\n working.set(sourceIdentity.id, existing)\n }\n }\n\n const out: Record<string, SourceObjectSnapshot> = {}\n for (const [id, item] of working.entries()) {\n const sections: Record<ChangelogSchemaSection, SourceObjectSectionSnapshot> = {\n params: {},\n query: {},\n body: {},\n output: {},\n }\n\n for (const section of SCHEMA_SECTIONS) {\n for (const [schemaPath, signatures] of item.sections[section].entries()) {\n sections[section][schemaPath] = Array.from(signatures).sort()\n }\n }\n\n out[id] = {\n id,\n displayName: item.displayName,\n routeKeys: Array.from(item.routeKeys).sort(),\n sections,\n }\n }\n\n return out\n}\n\nfunction diffRouteSchemas(before: FlatSchemaMap, after: FlatSchemaMap): SchemaPathDelta[] {\n const paths = new Set([...Object.keys(before), ...Object.keys(after)])\n const out: SchemaPathDelta[] = []\n\n for (const schemaPath of Array.from(paths).sort()) {\n const prev = before[schemaPath]\n const next = after[schemaPath]\n\n if (!prev && next) {\n out.push({ path: schemaPath, op: 'added', after: next })\n continue\n }\n if (prev && !next) {\n out.push({ path: schemaPath, op: 'removed', before: prev })\n continue\n }\n if (!prev || !next) continue\n\n if (entrySignature(prev) !== entrySignature(next)) {\n out.push({ path: schemaPath, op: 'changed', before: prev, after: next })\n }\n }\n\n return out\n}\n\nfunction diffRouteCfg(before: RouteCfgSubset, after: RouteCfgSubset): RouteCfgFieldDelta[] {\n const out: RouteCfgFieldDelta[] = []\n\n for (const field of CHANGESET_CFG_FIELDS) {\n const prev = before[field]\n const next = after[field]\n if (stableStringify(prev) !== stableStringify(next)) {\n out.push({\n field,\n before: prev,\n after: next,\n })\n }\n }\n\n return out\n}\n\nfunction flattenSourceSections(snapshot: SourceObjectSnapshot) {\n const map = new Map<string, string[]>()\n\n for (const section of SCHEMA_SECTIONS) {\n const entries = snapshot.sections[section]\n for (const [schemaPath, signatures] of Object.entries(entries)) {\n map.set(`${section}:${schemaPath}`, signatures)\n }\n }\n\n return map\n}\n\nfunction emptySourceSnapshotLike(snapshot: SourceObjectSnapshot): SourceObjectSnapshot {\n return {\n id: snapshot.id,\n displayName: snapshot.displayName,\n routeKeys: [],\n sections: {\n params: {},\n query: {},\n body: {},\n output: {},\n },\n }\n}\n\nfunction diffSourceSchemas(\n before: SourceObjectSnapshot,\n after: SourceObjectSnapshot,\n): SourceSchemaPathDelta[] {\n const prev = flattenSourceSections(before)\n const next = flattenSourceSections(after)\n const keys = new Set([...prev.keys(), ...next.keys()])\n const out: SourceSchemaPathDelta[] = []\n\n for (const key of Array.from(keys).sort()) {\n const prevSignatures = prev.get(key)\n const nextSignatures = next.get(key)\n const [section, ...rest] = key.split(':')\n const schemaPath = rest.join(':')\n\n if (!prevSignatures && nextSignatures) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'added',\n after: nextSignatures,\n })\n continue\n }\n\n if (prevSignatures && !nextSignatures) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'removed',\n before: prevSignatures,\n })\n continue\n }\n\n if (!prevSignatures || !nextSignatures) continue\n\n if (stableStringify(prevSignatures) !== stableStringify(nextSignatures)) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'changed',\n before: prevSignatures,\n after: nextSignatures,\n })\n }\n }\n\n return out\n}\n\nfunction routeRecordByKey(events: RouteChangeEvent[]) {\n const out: Record<string, RouteChangeEvent[]> = {}\n for (const event of events) {\n out[event.routeKey] ??= []\n out[event.routeKey].push(event)\n }\n return out\n}\n\nfunction sourceRecordById(events: SourceObjectChangeEvent[]) {\n const out: Record<string, SourceObjectChangeEvent[]> = {}\n for (const event of events) {\n out[event.sourceObjectId] ??= []\n out[event.sourceObjectId].push(event)\n }\n return out\n}\n\nfunction buildRollups(\n routeEvents: RouteChangeEvent[],\n sourceEvents: SourceObjectChangeEvent[],\n commits: ChangelogCommit[],\n): ChangelogRollups {\n const route: Record<RouteChangeType, number> = {\n route_added: 0,\n route_removed: 0,\n schema_changed: 0,\n cfg_changed: 0,\n }\n const sourceObject: Record<SourceObjectChangeType, number> = {\n source_object_added: 0,\n source_object_removed: 0,\n source_schema_changed: 0,\n }\n\n for (const event of routeEvents) {\n route[event.type] += 1\n }\n\n for (const event of sourceEvents) {\n sourceObject[event.type] += 1\n }\n\n const byCommit: Record<string, { routeEvents: number; sourceEvents: number }> = {}\n for (const commit of commits) {\n byCommit[commit.sha] = { routeEvents: 0, sourceEvents: 0 }\n }\n\n for (const event of routeEvents) {\n byCommit[event.commitSha] ??= { routeEvents: 0, sourceEvents: 0 }\n byCommit[event.commitSha].routeEvents += 1\n }\n for (const event of sourceEvents) {\n byCommit[event.commitSha] ??= { routeEvents: 0, sourceEvents: 0 }\n byCommit[event.commitSha].sourceEvents += 1\n }\n\n return {\n route,\n sourceObject,\n byCommit,\n }\n}\n\nasync function loadChangelogInput(modulePath: string, exportName: string) {\n const mod = await import(`${pathToFileURL(modulePath).href}?v=${Date.now()}`)\n const value = (mod[exportName] ??\n (mod.default && (mod.default as Record<string, unknown>)[exportName])) as unknown\n\n if (!value) {\n throw new Error(`Export \"${exportName}\" not found in module: ${modulePath}`)\n }\n\n return value\n}\n\nasync function ensureWorktreeDependencies(repoRoot: string, worktreeDir: string) {\n const rootNodeModules = path.join(repoRoot, 'node_modules')\n const worktreeNodeModules = path.join(worktreeDir, 'node_modules')\n\n try {\n await fs.access(rootNodeModules)\n } catch {\n throw new Error(\n `Missing dependencies at ${rootNodeModules}. Run install in the repository root before changelog export.`,\n )\n }\n\n try {\n await fs.lstat(worktreeNodeModules)\n return\n } catch {\n // create symlink below\n }\n\n await fs.symlink(rootNodeModules, worktreeNodeModules, 'junction')\n}\n\nasync function pathExists(filePath: string) {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isTypeScriptModule(modulePath: string) {\n const ext = path.extname(modulePath).toLowerCase()\n return ext === '.ts' || ext === '.tsx' || ext === '.mts' || ext === '.cts'\n}\n\nfunction isJavaScriptModule(modulePath: string) {\n const ext = path.extname(modulePath).toLowerCase()\n return ext === '.js' || ext === '.mjs' || ext === '.cjs'\n}\n\nasync function resolveSnapshotTsconfig(\n worktreeDir: string,\n modulePath: string,\n tsconfigOverride?: string,\n) {\n if (tsconfigOverride) {\n const resolved = path.resolve(worktreeDir, tsconfigOverride)\n if (!(await pathExists(resolved))) {\n throw new Error(`tsconfig not found: ${resolved}`)\n }\n return resolved\n }\n\n let current = path.dirname(modulePath)\n const normalizedRoot = normalizePath(path.resolve(worktreeDir))\n\n // Walk upward from module directory to worktree root.\n while (true) {\n const candidate = path.join(current, 'tsconfig.json')\n if (await pathExists(candidate)) {\n return candidate\n }\n\n const parent = path.dirname(current)\n if (parent === current) break\n if (!normalizePath(parent).startsWith(normalizedRoot)) break\n current = parent\n }\n\n throw new Error(\n `Unable to resolve tsconfig for TypeScript module: ${modulePath}. Pass --tsconfig to override.`,\n )\n}\n\nfunction toEmittedModulePath(moduleRel: string) {\n const normalized = normalizePath(moduleRel)\n if (normalized.endsWith('.mts')) return normalized.slice(0, -4) + '.mjs'\n if (normalized.endsWith('.cts')) return normalized.slice(0, -4) + '.cjs'\n if (normalized.endsWith('.tsx')) return normalized.slice(0, -4) + '.js'\n if (normalized.endsWith('.ts')) return normalized.slice(0, -3) + '.js'\n return normalized\n}\n\nfunction buildCompileCacheKey(\n commitSha: string,\n moduleRel: string,\n tsconfigKeyPath: string,\n) {\n return crypto\n .createHash('sha1')\n .update(COMPILE_CACHE_VERSION)\n .update('\\n')\n .update(commitSha)\n .update('\\n')\n .update(normalizePath(moduleRel))\n .update('\\n')\n .update(normalizePath(tsconfigKeyPath))\n .digest('hex')\n}\n\nasync function collectFilesRecursive(rootDir: string): Promise<string[]> {\n const files: string[] = []\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const target = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n await walk(target)\n continue\n }\n if (entry.isFile()) {\n files.push(target)\n }\n }\n }\n\n if (await pathExists(rootDir)) {\n await walk(rootDir)\n }\n\n return files\n}\n\nfunction suffixMatchScore(candidate: string, wanted: string) {\n const left = normalizePath(candidate).split('/')\n const right = normalizePath(wanted).split('/')\n let score = 0\n\n while (score < left.length && score < right.length) {\n const a = left[left.length - 1 - score]\n const b = right[right.length - 1 - score]\n if (a !== b) break\n score += 1\n }\n\n return score\n}\n\nasync function resolveEmittedEntryPath(emitRoot: string, moduleRel: string) {\n const expected = path.resolve(emitRoot, toEmittedModulePath(moduleRel))\n if (await pathExists(expected)) {\n return expected\n }\n\n const wantedRel = toEmittedModulePath(moduleRel)\n const wantedBase = path.posix.basename(normalizePath(wantedRel))\n const files = await collectFilesRecursive(emitRoot)\n const candidates = files.filter(\n (file) => path.posix.basename(normalizePath(file)) === wantedBase,\n )\n\n if (candidates.length === 0) {\n return undefined\n }\n\n candidates.sort(\n (a, b) =>\n suffixMatchScore(b, wantedRel) - suffixMatchScore(a, wantedRel),\n )\n return candidates[0]\n}\n\nasync function compileSnapshotEntry(options: {\n worktreeDir: string\n moduleRel: string\n modulePath: string\n tsconfigPath: string\n commitSha: string\n cacheRoot: string\n noCache?: boolean\n log?: (message: string) => void\n}) {\n const log = options.log ?? (() => undefined)\n const relativeTsconfigPath = normalizePath(\n path.relative(options.worktreeDir, options.tsconfigPath),\n )\n const tsconfigKeyPath =\n relativeTsconfigPath.startsWith('..') || path.isAbsolute(relativeTsconfigPath)\n ? normalizePath(options.tsconfigPath)\n : relativeTsconfigPath\n const cacheKey = buildCompileCacheKey(\n options.commitSha,\n options.moduleRel,\n tsconfigKeyPath,\n )\n const emitRoot = path.join(options.cacheRoot, cacheKey, 'dist')\n let emittedEntry = await resolveEmittedEntryPath(emitRoot, options.moduleRel)\n\n if (!options.noCache && emittedEntry && (await pathExists(emittedEntry))) {\n log(`[changelog] compile cache hit: ${options.commitSha.slice(0, 12)}`)\n return emittedEntry\n }\n\n log(\n `[changelog] compile cache ${options.noCache ? 'disabled' : 'miss'}: ${options.commitSha.slice(0, 12)}`,\n )\n await fs.rm(path.join(options.cacheRoot, cacheKey), { recursive: true, force: true }).catch(\n () => undefined,\n )\n await fs.mkdir(emitRoot, { recursive: true })\n\n const readResult = ts.readConfigFile(options.tsconfigPath, ts.sys.readFile)\n if (readResult.error) {\n throw new Error(ts.flattenDiagnosticMessageText(readResult.error.messageText, '\\n'))\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n path.dirname(options.tsconfigPath),\n )\n\n const compilerOptions: ts.CompilerOptions = {\n ...parsed.options,\n noEmit: false,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n inlineSourceMap: false,\n inlineSources: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n outDir: emitRoot,\n }\n\n const program = ts.createProgram([options.modulePath], compilerOptions)\n const emitResult = program.emit()\n\n const diagnostics = ts\n .getPreEmitDiagnostics(program)\n .concat(emitResult.diagnostics)\n .filter((diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error)\n\n if (diagnostics.length > 0) {\n const host: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (fileName) => fileName,\n getCurrentDirectory: () => options.worktreeDir,\n getNewLine: () => '\\n',\n }\n const message = ts.formatDiagnosticsWithColorAndContext(diagnostics.slice(0, 20), host)\n throw new Error(\n `TypeScript snapshot compile failed for ${options.moduleRel} at ${options.commitSha.slice(0, 12)}:\\n${message}`,\n )\n }\n\n emittedEntry = await resolveEmittedEntryPath(emitRoot, options.moduleRel)\n if (!emittedEntry || !(await pathExists(emittedEntry))) {\n throw new Error(\n `Compiled snapshot entry was not emitted for ${options.moduleRel} under ${emitRoot}. Check module/tsconfig compatibility.`,\n )\n }\n\n log(`[changelog] compiled snapshot entry: ${emittedEntry}`)\n return emittedEntry\n}\n\nasync function loadSnapshotExport(options: { entryPath: string; exportName: string }) {\n return loadChangelogInput(options.entryPath, options.exportName)\n}\n\nasync function createSnapshot(\n repoRoot: string,\n moduleCandidates: readonly string[],\n exportName: string,\n commit: ChangelogCommit,\n tempRoot: string,\n tsconfigRel?: string,\n exportOptions?: Pick<\n ExportFinalizedLeavesChangelogOptions,\n 'handlers' | 'cacheDir' | 'noCache'\n >,\n log?: (message: string) => void,\n): Promise<CommitSnapshot> {\n const worktreeDir = path.join(tempRoot, `wt-${commit.sha.slice(0, 12)}`)\n await runGit(repoRoot, ['worktree', 'add', '--detach', worktreeDir, commit.sha])\n\n try {\n try {\n await ensureWorktreeDependencies(repoRoot, worktreeDir)\n const resolvedModuleRel = await resolveModulePathForCommit(\n repoRoot,\n commit.sha,\n moduleCandidates,\n )\n\n if (!resolvedModuleRel) {\n log?.(\n `[changelog] unresolved module for commit ${commit.sha.slice(0, 12)}; using empty snapshot`,\n )\n return {\n commit,\n routesByKey: {},\n sourceObjectsById: {},\n unresolvedModule: true,\n fallbackReason: 'module_unresolved',\n }\n }\n\n log?.(\n `[changelog] resolved module for commit ${commit.sha.slice(0, 12)}: ${resolvedModuleRel}`,\n )\n const modulePath = path.resolve(worktreeDir, resolvedModuleRel)\n\n let snapshotRuntimePath = modulePath\n let resolvedTsconfigPath: string | undefined\n\n if (isTypeScriptModule(modulePath)) {\n resolvedTsconfigPath = await resolveSnapshotTsconfig(\n worktreeDir,\n modulePath,\n tsconfigRel,\n )\n log?.(`[changelog] using tsconfig: ${resolvedTsconfigPath}`)\n\n const compileCacheRoot = path.resolve(\n exportOptions?.cacheDir ??\n path.join(os.tmpdir(), 'rrroutes-export-changelog-cache'),\n )\n snapshotRuntimePath = await compileSnapshotEntry({\n worktreeDir,\n moduleRel: resolvedModuleRel,\n modulePath,\n tsconfigPath: resolvedTsconfigPath,\n commitSha: commit.sha,\n cacheRoot: compileCacheRoot,\n noCache: exportOptions?.noCache,\n log,\n })\n } else if (!isJavaScriptModule(modulePath)) {\n throw new Error(\n `Unsupported module extension for changelog snapshots: ${modulePath}`,\n )\n }\n\n const input = await loadSnapshotExport({\n entryPath: snapshotRuntimePath,\n exportName,\n })\n\n const payload = await exportFinalizedLeaves(input as never, {\n includeSource: true,\n sourceModulePath: modulePath,\n sourceExportName: exportName,\n tsconfigPath:\n resolvedTsconfigPath ??\n (tsconfigRel ? path.resolve(worktreeDir, tsconfigRel) : undefined),\n handlers: exportOptions?.handlers,\n })\n\n const routesByKey = toRouteSnapshots(payload)\n const sourceObjectsById = toSourceObjectSnapshots(routesByKey)\n\n return {\n commit,\n routesByKey,\n sourceObjectsById,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log?.(\n `[changelog] snapshot failed for ${commit.sha.slice(0, 12)}; using empty snapshot. ${message}`,\n )\n return {\n commit,\n routesByKey: {},\n sourceObjectsById: {},\n missing: true,\n fallbackReason: 'snapshot_error',\n fallbackError: message,\n }\n }\n } finally {\n await runGit(repoRoot, ['worktree', 'remove', '--force', worktreeDir]).catch(() => undefined)\n await fs.rm(worktreeDir, { recursive: true, force: true }).catch(() => undefined)\n }\n}\n\nfunction diffSnapshots(\n previous: CommitSnapshot,\n current: CommitSnapshot,\n): {\n routeEvents: RouteChangeEvent[]\n sourceEvents: SourceObjectChangeEvent[]\n} {\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n\n const routeKeys = new Set([\n ...Object.keys(previous.routesByKey),\n ...Object.keys(current.routesByKey),\n ])\n\n for (const routeKey of Array.from(routeKeys).sort()) {\n const prevRoute = previous.routesByKey[routeKey]\n const nextRoute = current.routesByKey[routeKey]\n\n if (!prevRoute && nextRoute) {\n const schemaDiff = diffRouteSchemas({}, nextRoute.flatSchema)\n routeEvents.push({\n type: 'route_added',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n })\n continue\n }\n\n if (prevRoute && !nextRoute) {\n routeEvents.push({\n type: 'route_removed',\n commitSha: current.commit.sha,\n routeKey,\n method: prevRoute.method,\n path: prevRoute.path,\n })\n continue\n }\n\n if (!prevRoute || !nextRoute) continue\n\n const schemaDiff = diffRouteSchemas(prevRoute.flatSchema, nextRoute.flatSchema)\n if (schemaDiff.length > 0) {\n routeEvents.push({\n type: 'schema_changed',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n schemaDiff,\n })\n }\n\n const cfgDiff = diffRouteCfg(prevRoute.cfg, nextRoute.cfg)\n if (cfgDiff.length > 0) {\n routeEvents.push({\n type: 'cfg_changed',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n cfgDiff,\n })\n }\n }\n\n const sourceKeys = new Set([\n ...Object.keys(previous.sourceObjectsById),\n ...Object.keys(current.sourceObjectsById),\n ])\n\n for (const sourceObjectId of Array.from(sourceKeys).sort()) {\n const prevSource = previous.sourceObjectsById[sourceObjectId]\n const nextSource = current.sourceObjectsById[sourceObjectId]\n\n if (!prevSource && nextSource) {\n const schemaDiff = diffSourceSchemas(\n emptySourceSnapshotLike(nextSource),\n nextSource,\n )\n sourceEvents.push({\n type: 'source_object_added',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n })\n continue\n }\n\n if (prevSource && !nextSource) {\n sourceEvents.push({\n type: 'source_object_removed',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: prevSource.displayName,\n impactedRoutes: prevSource.routeKeys,\n })\n continue\n }\n\n if (!prevSource || !nextSource) continue\n\n const schemaDiff = diffSourceSchemas(prevSource, nextSource)\n const prevRoutes = new Set(prevSource.routeKeys)\n const nextRoutes = new Set(nextSource.routeKeys)\n const routeAdded = Array.from(nextRoutes).filter((routeKey) => !prevRoutes.has(routeKey))\n const routeRemoved = Array.from(prevRoutes).filter((routeKey) => !nextRoutes.has(routeKey))\n\n if (schemaDiff.length > 0 || routeAdded.length > 0 || routeRemoved.length > 0) {\n sourceEvents.push({\n type: 'source_schema_changed',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n routeAdded: routeAdded.length > 0 ? routeAdded : undefined,\n routeRemoved: routeRemoved.length > 0 ? routeRemoved : undefined,\n })\n }\n }\n\n return {\n routeEvents,\n sourceEvents,\n }\n}\n\nconst BAKED_PAYLOAD_MARKER = '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->'\n\nfunction escapePayloadForInlineScript(payload: unknown) {\n return JSON.stringify(payload).replace(/<\\//g, '<\\\\/').replace(/<!--/g, '<\\\\!--')\n}\n\nfunction injectPayloadIntoViewerHtml(htmlTemplate: string, payload: unknown) {\n const payloadScript = `${BAKED_PAYLOAD_MARKER}\\n<script id=\"finalized-leaves-baked-payload\">window.__FINALIZED_LEAVES_PAYLOAD = ${escapePayloadForInlineScript(\n payload,\n )};</script>`\n\n if (htmlTemplate.includes(BAKED_PAYLOAD_MARKER)) {\n return htmlTemplate.replace(BAKED_PAYLOAD_MARKER, payloadScript)\n }\n\n if (htmlTemplate.includes('</body>')) {\n return htmlTemplate.replace('</body>', `${payloadScript}\\n</body>`)\n }\n\n return `${payloadScript}\\n${htmlTemplate}`\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(process.cwd(), 'tools/finalized-leaves-viewer.html'),\n path.resolve(process.cwd(), 'packages/export/tools/finalized-leaves-viewer.html'),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(payload: FinalizedLeavesChangelogExport, outFile: string) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesChangelogExport,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectPayloadIntoViewerHtml(template, payload)\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport async function writeFinalizedLeavesChangelogExport(\n payload: FinalizedLeavesChangelogExport,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n\nexport async function exportFinalizedLeavesChangelog(\n options: ExportFinalizedLeavesChangelogOptions,\n): Promise<FinalizedLeavesChangelogExport> {\n const log = options.log ?? (() => undefined)\n const cwd = process.cwd()\n log(`[changelog] resolving repository root from ${cwd}`)\n const repoRoot = await runGit(cwd, ['rev-parse', '--show-toplevel'])\n const modulePathAbsolute = path.resolve(cwd, options.modulePath)\n const modulePathRelative = normalizePath(path.relative(repoRoot, modulePathAbsolute))\n\n if (modulePathRelative.startsWith('..')) {\n throw new Error('modulePath must resolve inside the git repository root.')\n }\n\n const tsconfigAbsolute = options.tsconfigPath\n ? path.resolve(cwd, options.tsconfigPath)\n : undefined\n const tsconfigRelative = tsconfigAbsolute\n ? normalizePath(path.relative(repoRoot, tsconfigAbsolute))\n : undefined\n\n if (tsconfigRelative && tsconfigRelative.startsWith('..')) {\n throw new Error('tsconfigPath must resolve inside the git repository root.')\n }\n\n const exportName = options.exportName ?? 'leaves'\n log('[changelog] resolving commit window')\n const window = await resolveCommitWindow(repoRoot, options.from, options.to)\n log(`[changelog] window: ${window.from.slice(0, 12)}..${window.to.slice(0, 12)}`)\n const moduleCandidates = await buildModulePathCandidates(\n repoRoot,\n window.to,\n modulePathRelative,\n )\n log(`[changelog] module candidates discovered: ${moduleCandidates.length}`)\n const allCommits = await resolveCommitPath(repoRoot, window.from, window.to)\n log(`[changelog] commits in ancestry path: ${allCommits.length}`)\n const selectedCommitShas = await filterCommits(\n repoRoot,\n allCommits,\n moduleCandidates,\n tsconfigRelative,\n )\n log(`[changelog] commits after path filter: ${selectedCommitShas.length}`)\n\n if (selectedCommitShas.length === 0) {\n selectedCommitShas.push(window.to)\n log('[changelog] filter returned no commits, forcing tip commit inclusion')\n }\n\n const commits: ChangelogCommit[] = []\n log('[changelog] loading commit metadata')\n for (const commit of selectedCommitShas) {\n commits.push(await getCommitMetadata(repoRoot, commit))\n }\n\n const tempRoot = await fs.mkdtemp(path.join(os.tmpdir(), 'rrroutes-export-changelog-'))\n log(`[changelog] temp workspace: ${tempRoot}`)\n try {\n const snapshots: CommitSnapshot[] = []\n const unresolvedModuleCommits: string[] = []\n const snapshotFallbacks: Array<{\n sha: string\n reason: 'module_unresolved' | 'snapshot_error'\n error?: string\n }> = []\n\n for (let index = 0; index < commits.length; index += 1) {\n const commit = commits[index]\n log(\n `[changelog] snapshot ${index + 1}/${commits.length}: ${commit.sha.slice(0, 12)} ${commit.subject}`,\n )\n snapshots.push(\n await createSnapshot(\n repoRoot,\n moduleCandidates,\n exportName,\n commit,\n tempRoot,\n tsconfigRelative,\n options,\n log,\n ),\n )\n const lastSnapshot = snapshots[snapshots.length - 1]\n if (lastSnapshot?.unresolvedModule) {\n unresolvedModuleCommits.push(commit.sha)\n }\n if (lastSnapshot?.fallbackReason) {\n snapshotFallbacks.push({\n sha: commit.sha,\n reason: lastSnapshot.fallbackReason,\n error: lastSnapshot.fallbackError,\n })\n }\n }\n\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n\n log('[changelog] diffing successful snapshots')\n let previousSnapshot: CommitSnapshot | undefined\n for (const snapshot of snapshots) {\n if (snapshot.missing) {\n continue\n }\n if (!previousSnapshot) {\n previousSnapshot = snapshot\n continue\n }\n const { routeEvents: nextRouteEvents, sourceEvents: nextSourceEvents } = diffSnapshots(\n previousSnapshot,\n snapshot,\n )\n routeEvents.push(...nextRouteEvents)\n sourceEvents.push(...nextSourceEvents)\n previousSnapshot = snapshot\n }\n log(\n `[changelog] diff complete: route events=${routeEvents.length}, source events=${sourceEvents.length}`,\n )\n\n const payload: FinalizedLeavesChangelogExport = {\n kind: 'finalized-leaves-changelog',\n _meta: {\n generatedAt: new Date().toISOString(),\n description:\n 'Git-history changelog for RRRoutes finalized leaves with route-level and source-object schema diffs.',\n modulePath: options.modulePath,\n exportName,\n from: window.from,\n to: window.to,\n selectedCommitCount: commits.length,\n unresolvedModuleCommits:\n unresolvedModuleCommits.length > 0 ? unresolvedModuleCommits : undefined,\n snapshotFallbacks: snapshotFallbacks.length > 0 ? snapshotFallbacks : undefined,\n },\n commits,\n byRoute: routeRecordByKey(routeEvents),\n bySourceObject: sourceRecordById(sourceEvents),\n rollups: buildRollups(routeEvents, sourceEvents, commits),\n }\n\n if (options.outFile || options.htmlFile) {\n log('[changelog] writing output artifacts')\n await writeFinalizedLeavesChangelogExport(payload, {\n outFile: options.outFile,\n htmlFile: options.htmlFile,\n viewerTemplateFile: options.viewerTemplateFile,\n openOnFinish: options.openOnFinish,\n })\n }\n log('[changelog] done')\n\n return payload\n } finally {\n await fs.rm(tempRoot, { recursive: true, force: true }).catch(() => undefined)\n log('[changelog] cleaned temp workspace')\n }\n}\n\nexport const __private = {\n resolveCommitWindow,\n resolveCommitPath,\n filterCommits,\n buildModulePathCandidates,\n resolveModulePathForCommit,\n resolveSnapshotTsconfig,\n toEmittedModulePath,\n buildCompileCacheKey,\n compileSnapshotEntry,\n loadSnapshotExport,\n toRouteSnapshots,\n toSourceObjectSnapshots,\n diffSnapshots,\n buildSourceIdentity,\n}\n","import path from 'node:path'\nimport {\n exportFinalizedLeavesChangelog,\n type ExportFinalizedLeavesChangelogOptions,\n} from './exportFinalizedLeaves.changelog'\n\nexport type FinalizedLeavesChangelogCliArgs = {\n modulePath: string\n exportName: string\n outFile: string\n htmlFile?: string\n tsconfigPath?: string\n from?: string\n to?: string\n cacheDir?: string\n noCache: boolean\n}\n\nexport function parseFinalizedLeavesChangelogCliArgs(\n argv: string[],\n): FinalizedLeavesChangelogCliArgs {\n const args = new Map<string, string>()\n let noCache = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const key = argv[i]\n if (key === '--') continue\n if (!key.startsWith('--')) continue\n if (key === '--with-source') {\n continue\n }\n if (key === '--no-cache') {\n noCache = true\n continue\n }\n const value = argv[i + 1]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${key}`)\n }\n args.set(key, value)\n i += 1\n }\n\n const modulePath = args.get('--module')\n if (!modulePath) {\n throw new Error('Missing required --module argument')\n }\n\n return {\n modulePath,\n exportName: args.get('--export') ?? 'leaves',\n outFile: args.get('--out') ?? 'finalized-leaves.changelog.json',\n htmlFile: args.get('--html') ?? undefined,\n tsconfigPath: args.get('--tsconfig') ?? undefined,\n from: args.get('--from') ?? undefined,\n to: args.get('--to') ?? undefined,\n cacheDir: args.get('--cache-dir') ?? undefined,\n noCache,\n }\n}\n\nexport async function runExportFinalizedLeavesChangelogCli(argv: string[]) {\n const args = parseFinalizedLeavesChangelogCliArgs(argv)\n const log = (message: string) => {\n process.stdout.write(`${message}\\n`)\n }\n const options: ExportFinalizedLeavesChangelogOptions = {\n modulePath: args.modulePath,\n exportName: args.exportName,\n outFile: args.outFile,\n htmlFile: args.htmlFile,\n tsconfigPath: args.tsconfigPath,\n from: args.from,\n to: args.to,\n includeSource: true,\n cacheDir: args.cacheDir,\n noCache: args.noCache,\n log,\n }\n\n log('[changelog-cli] starting changelog export')\n const payload = await exportFinalizedLeavesChangelog(options)\n log('[changelog-cli] changelog export completed')\n\n return {\n payload,\n outFile: path.resolve(args.outFile),\n htmlFile: args.htmlFile ? path.resolve(args.htmlFile) : undefined,\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport type {\n FinalizedLeavesExport,\n WriteFinalizedLeavesExportOptions,\n} from './exportFinalizedLeaves'\nimport type { FinalizedLeavesChangelogExport } from './exportFinalizedLeaves.changelog'\n\nexport type FinalizedLeavesViewerBundleMeta = {\n generatedAt: string\n description: string\n}\n\nexport type FinalizedLeavesViewerBundle = {\n kind: 'finalized-leaves-bundle'\n _meta: FinalizedLeavesViewerBundleMeta\n leavesPayload: FinalizedLeavesExport\n changelogPayload: FinalizedLeavesChangelogExport\n}\n\nexport type BuildFinalizedLeavesViewerBundleInput = {\n leavesPayload: FinalizedLeavesExport\n changelogPayload: FinalizedLeavesChangelogExport\n}\n\nconst BAKED_PAYLOAD_MARKER = '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->'\n\nfunction escapePayloadForInlineScript(payload: unknown) {\n return JSON.stringify(payload).replace(/<\\//g, '<\\\\/').replace(/<!--/g, '<\\\\!--')\n}\n\nfunction injectPayloadIntoViewerHtml(htmlTemplate: string, payload: unknown) {\n const payloadScript = `${BAKED_PAYLOAD_MARKER}\\n<script id=\"finalized-leaves-baked-payload\">window.__FINALIZED_LEAVES_PAYLOAD = ${escapePayloadForInlineScript(\n payload,\n )};</script>`\n\n if (htmlTemplate.includes(BAKED_PAYLOAD_MARKER)) {\n return htmlTemplate.replace(BAKED_PAYLOAD_MARKER, payloadScript)\n }\n\n if (htmlTemplate.includes('</body>')) {\n return htmlTemplate.replace('</body>', `${payloadScript}\\n</body>`)\n }\n\n return `${payloadScript}\\n${htmlTemplate}`\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(process.cwd(), 'tools/finalized-leaves-viewer.html'),\n path.resolve(process.cwd(), 'packages/export/tools/finalized-leaves-viewer.html'),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(payload: FinalizedLeavesViewerBundle, outFile: string) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesViewerBundle,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectPayloadIntoViewerHtml(template, payload)\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport function buildFinalizedLeavesViewerBundle(\n input: BuildFinalizedLeavesViewerBundleInput,\n): FinalizedLeavesViewerBundle {\n return {\n kind: 'finalized-leaves-bundle',\n _meta: {\n generatedAt: new Date().toISOString(),\n description:\n 'Unified viewer bundle including finalized leaves snapshot and changelog timeline payloads.',\n },\n leavesPayload: input.leavesPayload,\n changelogPayload: input.changelogPayload,\n }\n}\n\nexport async function writeFinalizedLeavesViewerBundle(\n payload: FinalizedLeavesViewerBundle,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n"],"mappings":"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","names":["path","path","branch","path","path","path","fs","path","spawn","pathToFileURL","ts","path","pathToFileURL","fs","ts","schemaDiff","BAKED_PAYLOAD_MARKER","escapePayloadForInlineScript","injectPayloadIntoViewerHtml","resolveViewerTemplatePath","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","spawn","path","path","fs","path","spawn","BAKED_PAYLOAD_MARKER","escapePayloadForInlineScript","injectPayloadIntoViewerHtml","resolveViewerTemplatePath","path","fs","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","spawn"]}
|
|
1
|
+
{"version":3,"sources":["../src/schemaIntrospection.ts","../src/serializeLeafContract.ts","../src/flattenSchema.ts","../src/exportFinalizedLeaves.ts","../src/defaultViewerTemplate.ts","../src/extractLeafSourceByAst.ts","../src/files/baked-payload.ts","../src/exportFinalizedLeaves.cli.ts","../src/exportFinalizedLeaves.changelog.ts","../src/snapshot/canonicalize.ts","../src/snapshot/hash.ts","../src/diff/diff-snapshots.ts","../src/exportFinalizedLeaves.changelog.cli.ts","../src/exportFinalizedLeaves.bundle.ts","../src/snapshot/build.ts","../src/inspection/diagnostics.ts","../src/inspection/inspect-clients.ts","../src/inspection/native.ts","../src/inspection/normalize-clients.ts","../src/inspection/serializable.ts","../src/inspection/inspect-contract.ts","../src/inspection/inspect-server.ts","../src/inspection/inspect-sockets.ts","../src/inspection/join-routes.ts","../src/inspection/normalize-routes.ts","../src/inspection/normalize-sockets.ts","../src/storage/memory.ts","../src/checkpoint/lock.ts","../src/checkpoint/retention.ts","../src/checkpoint/service.ts","../src/storage/filesystem.ts","../src/storage/sqlite.ts","../src/http/handler.ts","../src/adapters/express.ts","../src/files/write.ts","../src/runtime.ts","../src/cli/runtime.ts","../src/cli/snapshot.ts","../src/cli/changes.ts","../src/cli/checkpoint.ts","../src/cli/serve.ts"],"sourcesContent":["import * as z from 'zod'\n\nexport const serializableSchemaKinds = [\n 'object',\n 'string',\n 'number',\n 'boolean',\n 'bigint',\n 'date',\n 'array',\n 'enum',\n 'literal',\n 'union',\n 'record',\n 'tuple',\n 'unknown',\n 'any',\n] as const\n\nexport type SerializableSchemaKind = (typeof serializableSchemaKinds)[number]\n\nexport type SerializableSchema = {\n kind: SerializableSchemaKind\n optional?: boolean\n nullable?: boolean\n description?: string\n properties?: Record<string, SerializableSchema>\n element?: SerializableSchema\n union?: SerializableSchema[]\n literal?: unknown\n enumValues?: string[]\n}\n\ntype ZodAny = z.ZodTypeAny\n\ntype InternalSchemaKind = SerializableSchemaKind | 'intersection'\n\ntype IntrospectionWalker = (schema: ZodAny | undefined) => SerializableSchema | undefined\n\nexport type IntrospectionContext = {\n zod: typeof z\n introspect: IntrospectionWalker\n getDef: (schema: unknown) => any | undefined\n unwrap: (schema: ZodAny) => { base: ZodAny; optional: boolean; nullable: boolean }\n getDescription: (schema: ZodAny) => string | undefined\n}\n\nexport type IntrospectionNode = {\n schema: ZodAny\n base: ZodAny\n def: any\n kind: InternalSchemaKind\n optional: boolean\n nullable: boolean\n node: SerializableSchema\n}\n\nexport type SchemaIntrospectionHandler = (\n args: IntrospectionNode,\n ctx: IntrospectionContext,\n) => SerializableSchema | undefined\n\nexport type SchemaIntrospectionHandlerMap = Partial<\n Record<InternalSchemaKind, SchemaIntrospectionHandler>\n>\n\nexport type IntrospectSchemaOptions = {\n handlers?: SchemaIntrospectionHandlerMap\n}\n\nconst globalHandlers: SchemaIntrospectionHandlerMap = {}\n\nexport function registerSchemaIntrospectionHandler(\n kind: InternalSchemaKind,\n handler: SchemaIntrospectionHandler,\n) {\n globalHandlers[kind] = handler\n}\n\nexport function clearSchemaIntrospectionHandlers() {\n for (const key of Object.keys(globalHandlers) as InternalSchemaKind[]) {\n delete globalHandlers[key]\n }\n}\n\nfunction getDef(schema: unknown): any | undefined {\n if (!schema || typeof schema !== 'object') return undefined\n const anySchema = schema as any\n return anySchema._zod?.def ?? anySchema._def\n}\n\nfunction getDescription(schema: ZodAny): string | undefined {\n const anyZ: any = z as any\n\n const registry = anyZ.globalRegistry?.get\n ? anyZ.globalRegistry.get(schema)\n : undefined\n if (registry && typeof registry.description === 'string') {\n return registry.description\n }\n\n const def = getDef(schema)\n if (def && typeof def.description === 'string') {\n return def.description\n }\n\n return undefined\n}\n\nfunction unwrap(schema: ZodAny): {\n base: ZodAny\n optional: boolean\n nullable: boolean\n} {\n let current: ZodAny = schema\n let optional = false\n let nullable = false\n\n const ZodEffectsCtor: any = (z as any).ZodEffects\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (ZodEffectsCtor && current instanceof ZodEffectsCtor) {\n const def = getDef(current) || {}\n const sourceType =\n typeof (current as any).sourceType === 'function'\n ? (current as any).sourceType()\n : def.schema\n if (!sourceType) break\n current = sourceType\n continue\n }\n\n if (current instanceof z.ZodOptional) {\n optional = true\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n if (current instanceof z.ZodNullable) {\n nullable = true\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n if (current instanceof z.ZodDefault) {\n const def = getDef(current)\n current = (def && def.innerType) || current\n continue\n }\n\n break\n }\n\n return { base: current, optional, nullable }\n}\n\nfunction mergeProps(\n a: Record<string, SerializableSchema> | undefined,\n b: Record<string, SerializableSchema> | undefined,\n): Record<string, SerializableSchema> | undefined {\n if (!a && !b) return undefined\n return { ...(a ?? {}), ...(b ?? {}) }\n}\n\nfunction inferKind(schema: ZodAny): SerializableSchemaKind {\n if (schema instanceof z.ZodString) return 'string'\n if (schema instanceof z.ZodNumber) return 'number'\n if (schema instanceof z.ZodBoolean) return 'boolean'\n if (schema instanceof z.ZodBigInt) return 'bigint'\n if (schema instanceof z.ZodDate) return 'date'\n if (schema instanceof z.ZodArray) return 'array'\n if (schema instanceof z.ZodObject) return 'object'\n if (schema instanceof z.ZodUnion) return 'union'\n if (schema instanceof z.ZodLiteral) return 'literal'\n if (schema instanceof z.ZodEnum) return 'enum'\n if (schema instanceof z.ZodRecord) return 'record'\n if (schema instanceof z.ZodTuple) return 'tuple'\n if (schema instanceof z.ZodUnknown) return 'unknown'\n if (schema instanceof z.ZodAny) return 'any'\n return 'unknown'\n}\n\nconst defaultHandlers: SchemaIntrospectionHandlerMap = {\n intersection({ base, def, node }, ctx) {\n const left = def?.left as ZodAny | undefined\n const right = def?.right as ZodAny | undefined\n\n const leftNode = left ? ctx.introspect(left) : undefined\n const rightNode = right ? ctx.introspect(right) : undefined\n\n const leftIsObj = leftNode?.kind === 'object' && !!leftNode.properties\n const rightIsObj = rightNode?.kind === 'object' && !!rightNode.properties\n\n if (leftIsObj && rightIsObj) {\n node.kind = 'object'\n node.description =\n node.description ?? leftNode.description ?? rightNode.description\n node.properties = mergeProps(leftNode.properties, rightNode.properties)\n return node\n }\n\n if (leftNode && rightNode) {\n node.properties = {\n left: leftNode,\n right: rightNode,\n }\n }\n\n return node\n },\n\n object({ base, def, node }, ctx) {\n const rawShape: any =\n (base as any).shape ??\n (def && typeof def.shape === 'function' ? def.shape() : def?.shape)\n\n const shape = typeof rawShape === 'function' ? rawShape() : (rawShape ?? {})\n\n const props: Record<string, SerializableSchema> = {}\n for (const key of Object.keys(shape)) {\n const child = shape[key] as ZodAny\n const childNode = ctx.introspect(child)\n if (childNode) props[key] = childNode\n }\n node.properties = props\n return node\n },\n\n array({ def, node }, ctx) {\n const inner =\n (def && (def.element as ZodAny)) ||\n (def && (def.type as ZodAny)) ||\n undefined\n if (inner) {\n node.element = ctx.introspect(inner)\n }\n return node\n },\n\n union({ def, node }, ctx) {\n const options: ZodAny[] = (def && def.options) || []\n node.union = options\n .map((opt) => ctx.introspect(opt))\n .filter(Boolean) as SerializableSchema[]\n return node\n },\n\n literal({ def, node }) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.literal = def.values.length === 1 ? def.values[0] : def.values.slice()\n } else {\n node.literal = def.value\n }\n }\n return node\n },\n\n enum({ def, node }) {\n if (def) {\n if (Array.isArray(def.values)) {\n node.enumValues = def.values.slice()\n } else if (def.entries && typeof def.entries === 'object') {\n node.enumValues = Object.values(def.entries).map((v: unknown) => String(v))\n }\n }\n return node\n },\n}\n\nexport function createSchemaIntrospector(options: IntrospectSchemaOptions = {}) {\n const handlers = {\n ...defaultHandlers,\n ...globalHandlers,\n ...(options.handlers ?? {}),\n }\n\n const introspect: IntrospectionWalker = (schema) => {\n if (!schema) return undefined\n\n const unwrapped = unwrap(schema)\n const base = unwrapped.base\n const def = getDef(base)\n const kind: InternalSchemaKind =\n base instanceof z.ZodIntersection ? 'intersection' : inferKind(base)\n\n const node: SerializableSchema = {\n kind: kind === 'intersection' ? 'unknown' : kind,\n optional: unwrapped.optional || undefined,\n nullable: unwrapped.nullable || undefined,\n description: getDescription(base),\n }\n\n const handler = handlers[kind]\n if (!handler) return node\n\n return handler(\n {\n schema,\n base,\n def,\n kind,\n optional: unwrapped.optional,\n nullable: unwrapped.nullable,\n node,\n },\n {\n zod: z,\n introspect,\n getDef,\n unwrap,\n getDescription,\n },\n )\n }\n\n return introspect\n}\n\nexport function introspectSchema(\n schema: ZodAny | undefined,\n options: IntrospectSchemaOptions = {},\n): SerializableSchema | undefined {\n const introspect = createSchemaIntrospector(options)\n return introspect(schema)\n}\n","import {\n asZodSchema,\n type AnyLeafLowProfile,\n type FileField,\n type MethodCfgLowProfile,\n} from '@emeryld/rrroutes-contract'\nimport {\n introspectSchema,\n type IntrospectSchemaOptions,\n type SerializableSchema,\n} from './schemaIntrospection'\n\nexport type ContractLeafSchemas = {\n body?: SerializableSchema\n query?: SerializableSchema\n params?: SerializableSchema\n output?: SerializableSchema\n outputMeta?: SerializableSchema\n queryExtension?: SerializableSchema\n}\n\nexport type SerializedLeafContract = {\n key: string\n id?: string\n method: AnyLeafLowProfile['method']\n path: string\n cfg: {\n description?: string\n summary?: string\n docsGroup?: string\n tags?: string[]\n deprecated?: boolean\n stability?: 'experimental' | 'beta' | 'stable' | 'deprecated'\n docsHidden?: boolean\n docsMeta?: Record<string, unknown>\n feed?: boolean\n bodyFiles?: FileField[]\n schemas: ContractLeafSchemas\n }\n}\n\nexport type SerializeLeafContractOptions = IntrospectSchemaOptions\n\nfunction serializeContractSchema(\n schema: MethodCfgLowProfile['bodySchema'],\n options: SerializeLeafContractOptions,\n) {\n return schema ? introspectSchema(asZodSchema(schema), options) : undefined\n}\n\nfunction serializeBodyFiles(cfg: MethodCfgLowProfile): FileField[] | undefined {\n if (!Array.isArray(cfg.bodyFiles) || cfg.bodyFiles.length === 0) {\n return undefined\n }\n\n return cfg.bodyFiles.map(({ name, maxCount }) => ({ name, maxCount }))\n}\n\nexport function serializeLeafContract(\n leaf: AnyLeafLowProfile,\n options: SerializeLeafContractOptions = {},\n): SerializedLeafContract {\n const cfg = leaf.cfg\n\n return {\n key: `${leaf.method.toUpperCase()} ${leaf.path}`,\n id: cfg.id,\n method: leaf.method,\n path: leaf.path,\n cfg: {\n description: cfg.description,\n summary: cfg.summary,\n docsGroup: cfg.docsGroup,\n tags: Array.isArray(cfg.tags) ? cfg.tags.slice() : undefined,\n deprecated: cfg.deprecated,\n stability: cfg.stability,\n docsHidden: cfg.docsHidden,\n docsMeta: cfg.docsMeta,\n feed: cfg.feed,\n bodyFiles: serializeBodyFiles(cfg),\n schemas: {\n body: serializeContractSchema(cfg.bodySchema, options),\n query: serializeContractSchema(cfg.querySchema, options),\n params: serializeContractSchema(cfg.paramsSchema, options),\n output: serializeContractSchema(cfg.outputSchema, options),\n outputMeta: serializeContractSchema(cfg.outputMetaSchema, options),\n queryExtension: serializeContractSchema(\n cfg.queryExtensionSchema,\n options,\n ),\n },\n },\n }\n}\n\nexport function serializeLeavesContract(\n leaves: readonly AnyLeafLowProfile[],\n options: SerializeLeafContractOptions = {},\n): SerializedLeafContract[] {\n return leaves.map((leaf) => serializeLeafContract(leaf, options))\n}\n","import type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport {\n serializeLeafContract,\n type SerializedLeafContract,\n} from './serializeLeafContract'\nimport type { SerializableSchema } from './schemaIntrospection'\n\nexport type FlatSchemaEntry = {\n type: string\n nullable: boolean\n optional: boolean\n literal?: unknown\n}\n\nexport type FlatSchemaMap = Record<string, FlatSchemaEntry>\n\ntype FlattenState = {\n optional: boolean\n nullable: boolean\n}\n\nfunction formatLiteralType(literal: unknown): string {\n if (typeof literal === 'string') return literal\n if (\n typeof literal === 'number' ||\n typeof literal === 'boolean' ||\n typeof literal === 'bigint'\n ) {\n return String(literal)\n }\n if (literal === null) return 'null'\n if (Array.isArray(literal)) {\n return literal.map((item) => formatLiteralType(item)).join('|')\n }\n if (typeof literal === 'object') {\n try {\n return JSON.stringify(literal)\n } catch {\n return 'object'\n }\n }\n return 'unknown'\n}\n\nfunction normalizeType(schema: SerializableSchema): string {\n switch (schema.kind) {\n case 'string':\n case 'number':\n case 'date':\n case 'boolean':\n case 'object':\n case 'array':\n return schema.kind\n case 'enum': {\n if (Array.isArray(schema.enumValues) && schema.enumValues.length > 0) {\n return schema.enumValues.join('|')\n }\n return 'unknown'\n }\n case 'literal': {\n return formatLiteralType(schema.literal)\n }\n default:\n return 'unknown'\n }\n}\n\nfunction isNonEmptyPath(path: string | undefined): path is string {\n return typeof path === 'string' && path.length > 0\n}\n\nfunction setNode(\n out: FlatSchemaMap,\n path: string,\n schema: SerializableSchema,\n inherited: FlattenState,\n) {\n if (!isNonEmptyPath(path)) return\n out[path] = {\n type: normalizeType(schema),\n nullable: inherited.nullable || Boolean(schema.nullable),\n optional: inherited.optional || Boolean(schema.optional),\n literal: schema.kind === 'literal' ? schema.literal : undefined,\n }\n}\n\nfunction flattenInto(\n out: FlatSchemaMap,\n schema: SerializableSchema | undefined,\n path: string,\n inherited: FlattenState,\n) {\n if (!schema || !isNonEmptyPath(path)) return\n\n const nextInherited: FlattenState = {\n optional: inherited.optional || Boolean(schema.optional),\n nullable: inherited.nullable || Boolean(schema.nullable),\n }\n\n if (schema.kind === 'union' && Array.isArray(schema.union) && schema.union.length > 0) {\n schema.union.forEach((option, index) => {\n const optionPath = `${path}-${index + 1}`\n flattenInto(out, option, optionPath, inherited)\n })\n return\n }\n\n setNode(out, path, schema, inherited)\n\n if (schema.kind === 'object' && schema.properties) {\n for (const [key, child] of Object.entries(schema.properties)) {\n const childPath = `${path}.${key}`\n flattenInto(out, child, childPath, nextInherited)\n }\n return\n }\n\n if (schema.kind === 'array' && schema.element) {\n flattenInto(out, schema.element, `${path}[]`, nextInherited)\n }\n}\n\nexport function flattenSerializableSchema(\n schema: SerializableSchema | undefined,\n path: string,\n): FlatSchemaMap {\n const out: FlatSchemaMap = {}\n flattenInto(out, schema, path, { optional: false, nullable: false })\n return out\n}\n\nfunction isSerializedLeaf(value: unknown): value is SerializedLeafContract {\n if (!value || typeof value !== 'object') return false\n const item = value as SerializedLeafContract\n return typeof item.key === 'string' && !!item.cfg && typeof item.cfg === 'object'\n}\n\nexport function flattenLeafSchemas(\n leaf: AnyLeafLowProfile | SerializedLeafContract,\n): FlatSchemaMap {\n const serialized = isSerializedLeaf(leaf) ? leaf : serializeLeafContract(leaf)\n\n const out: FlatSchemaMap = {}\n const sections = serialized.cfg.schemas\n\n Object.assign(out, flattenSerializableSchema(sections.params, 'params'))\n Object.assign(out, flattenSerializableSchema(sections.query, 'query'))\n Object.assign(out, flattenSerializableSchema(sections.body, 'body'))\n Object.assign(out, flattenSerializableSchema(sections.output, 'output'))\n\n return out\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport type {\n AnyLeafLowProfile,\n FinalizedRegistry,\n} from '@emeryld/rrroutes-contract'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport { flattenLeafSchemas, type FlatSchemaMap } from './flattenSchema'\nimport {\n serializeLeavesContract,\n type SerializeLeafContractOptions,\n type SerializedLeafContract,\n} from './serializeLeafContract'\nimport {\n extractLeafSourceByAst,\n type LeafSourceByKey,\n type SourceExtractionReason,\n} from './extractLeafSourceByAst'\nimport { injectBakedInspectorPayload } from './files/baked-payload'\n\nexport type ExportFinalizedLeavesInput =\n | readonly AnyLeafLowProfile[]\n | FinalizedRegistry<readonly AnyLeafLowProfile[]>\n\nexport type ExportFinalizedLeavesMeta = {\n generatedAt: string\n description: string\n sourceExtraction?: {\n mode: 'ast'\n enabled: boolean\n modulePath?: string\n exportName?: string\n tsconfigPath?: string\n resolvedLeafCount: number\n reason?: SourceExtractionReason\n stats?: {\n visitedSymbols: number\n visitedFiles: number\n unresolvedReferences: number\n }\n }\n fieldCatalog: {\n leaf: string[]\n cfg: string[]\n schemaNode: string[]\n flatSchemaEntry: string[]\n }\n flattening: {\n notation: 'dot+[]'\n unionBranchSuffix: '-N'\n sections: readonly ['params', 'query', 'body', 'output']\n }\n}\n\nexport type FinalizedLeavesExport = {\n _meta: ExportFinalizedLeavesMeta\n leaves: SerializedLeafContract[]\n schemaFlatByLeaf: Record<string, FlatSchemaMap>\n sourceByLeaf?: LeafSourceByKey\n}\n\nexport type ExportFinalizedLeavesOptions = SerializeLeafContractOptions & {\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n includeSource?: boolean\n tsconfigPath?: string\n sourceModulePath?: string\n sourceExportName?: string\n}\n\nexport type WriteFinalizedLeavesExportOptions = {\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n}\n\nfunction isRegistry(\n value: ExportFinalizedLeavesInput,\n): value is FinalizedRegistry<readonly AnyLeafLowProfile[]> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'all' in value &&\n 'byKey' in value\n )\n}\n\nfunction getLeaves(\n input: ExportFinalizedLeavesInput,\n): readonly AnyLeafLowProfile[] {\n return isRegistry(input) ? input.all : input\n}\n\nfunction buildMeta(\n sourceExtraction?: ExportFinalizedLeavesMeta['sourceExtraction'],\n): ExportFinalizedLeavesMeta {\n return {\n generatedAt: new Date().toISOString(),\n description:\n 'Finalized RRRoutes leaves export with serialized schemas and flattened schema paths for downstream processing.',\n sourceExtraction,\n fieldCatalog: {\n leaf: ['key', 'id?', 'method', 'path', 'cfg'],\n cfg: [\n 'description?',\n 'summary?',\n 'docsGroup?',\n 'tags?',\n 'deprecated?',\n 'stability?',\n 'docsHidden?',\n 'docsMeta?',\n 'feed?',\n 'bodyFiles?',\n 'schemas',\n ],\n schemaNode: [\n 'kind',\n 'optional?',\n 'nullable?',\n 'description?',\n 'properties?',\n 'element?',\n 'union?',\n 'literal?',\n 'enumValues?',\n ],\n flatSchemaEntry: ['type', 'nullable', 'optional', 'literal?'],\n },\n flattening: {\n notation: 'dot+[]',\n unionBranchSuffix: '-N',\n sections: ['params', 'query', 'body', 'output'],\n },\n }\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(process.cwd(), 'tools/finalized-leaves-viewer.html'),\n path.resolve(\n process.cwd(),\n 'packages/export/tools/finalized-leaves-viewer.html',\n ),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(\n payload: FinalizedLeavesExport,\n outFile: string,\n) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesExport,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectBakedInspectorPayload(template, payload, {\n marker: '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->',\n globalName: '__FINALIZED_LEAVES_PAYLOAD',\n scriptId: 'finalized-leaves-baked-payload',\n })\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport async function writeFinalizedLeavesExport(\n payload: FinalizedLeavesExport,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n\nexport async function exportFinalizedLeaves(\n input: ExportFinalizedLeavesInput,\n options: ExportFinalizedLeavesOptions = {},\n): Promise<FinalizedLeavesExport> {\n const leaves = getLeaves(input)\n const serializedLeaves = serializeLeavesContract(leaves, options)\n\n const schemaFlatByLeaf = Object.fromEntries(\n serializedLeaves.map((leaf) => [leaf.key, flattenLeafSchemas(leaf)]),\n )\n\n const sourceByLeaf: LeafSourceByKey = {}\n let sourceExtraction:\n | ExportFinalizedLeavesMeta['sourceExtraction']\n | undefined\n\n if (options.includeSource) {\n const modulePath = options.sourceModulePath\n const exportName = options.sourceExportName ?? 'leaves'\n if (modulePath) {\n const extracted = extractLeafSourceByAst({\n modulePath,\n exportName,\n tsconfigPath: options.tsconfigPath,\n })\n\n const allowedLeafKeys = new Set(serializedLeaves.map((leaf) => leaf.key))\n for (const [key, source] of Object.entries(extracted.sourceByLeaf)) {\n if (allowedLeafKeys.has(key)) {\n sourceByLeaf[key] = source\n }\n }\n\n sourceExtraction = {\n mode: 'ast',\n enabled: true,\n modulePath: path.resolve(modulePath),\n exportName,\n tsconfigPath: extracted.tsconfigPath,\n resolvedLeafCount: Object.keys(sourceByLeaf).length,\n reason: extracted.reason,\n stats: extracted.stats,\n }\n } else {\n sourceExtraction = {\n mode: 'ast',\n enabled: false,\n exportName,\n tsconfigPath: options.tsconfigPath\n ? path.resolve(options.tsconfigPath)\n : undefined,\n resolvedLeafCount: 0,\n reason: 'resolved_zero_leaves',\n stats: {\n visitedSymbols: 0,\n visitedFiles: 0,\n unresolvedReferences: 0,\n },\n }\n }\n }\n\n const payload: FinalizedLeavesExport = {\n _meta: buildMeta(sourceExtraction),\n leaves: serializedLeaves,\n schemaFlatByLeaf,\n sourceByLeaf:\n options.includeSource && Object.keys(sourceByLeaf).length > 0\n ? sourceByLeaf\n : undefined,\n }\n\n if (options.outFile || options.htmlFile) {\n await writeFinalizedLeavesExport(payload, {\n outFile: options.outFile,\n htmlFile: options.htmlFile,\n viewerTemplateFile: options.viewerTemplateFile,\n openOnFinish: options.openOnFinish,\n })\n }\n\n return payload\n}\n","export const DEFAULT_VIEWER_TEMPLATE = `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>RRRoutes Export Viewer</title>\n <style>\n :root {\n --bg: #212121;\n --surface: #2a2a2a;\n --border: #4a4a4a;\n --text: #fffafa;\n --muted: #c8c2c2;\n --accent: #a764d3;\n --schema-accent: #fbbd23;\n }\n body {\n margin: 0;\n font-family: 'Iosevka Web', 'SFMono-Regular', Menlo, Consolas, monospace;\n color: var(--text);\n background: var(--bg);\n }\n a { color: var(--schema-accent); }\n .wrap { max-width: 1100px; margin: 0 auto; padding: 20px; }\n .card { background: var(--surface); border: 1px solid var(--border); border-radius: 12px; padding: 14px; }\n .meta { color: var(--muted); font-size: 12px; }\n #results { margin-top: 12px; display: grid; gap: 8px; }\n details { background: var(--surface); border: 1px solid var(--border); border-radius: 10px; padding: 8px 10px; }\n summary { cursor: pointer; font-weight: 700; color: var(--accent); }\n pre { margin: 10px 0 0; overflow: auto; border: 1px solid var(--border); border-radius: 8px; padding: 10px; background: #303030; color: var(--text); }\n </style>\n </head>\n <body>\n <div class=\"wrap\">\n <h1>RRRoutes Export Viewer (Baked)</h1>\n <div class=\"card\">\n <div id=\"status\" class=\"meta\">Waiting for baked payload...</div>\n </div>\n <div id=\"results\"></div>\n </div>\n\n <!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->\n\n <script>\n const statusEl = document.getElementById('status')\n const resultsEl = document.getElementById('results')\n const payload = window.__FINALIZED_LEAVES_PAYLOAD\n\n if (payload && payload.kind === 'finalized-leaves-changelog') {\n statusEl.textContent =\n 'Loaded changelog payload with ' + (payload.commits?.length || 0) + ' commits.'\n\n const wrapSection = (title, value) => {\n const card = document.createElement('details')\n const summary = document.createElement('summary')\n summary.textContent = title\n const pre = document.createElement('pre')\n pre.textContent = JSON.stringify(value, null, 2)\n card.appendChild(summary)\n card.appendChild(pre)\n return card\n }\n\n resultsEl.appendChild(wrapSection('Commits', payload.commits || []))\n resultsEl.appendChild(wrapSection('By Route', payload.byRoute || {}))\n resultsEl.appendChild(\n wrapSection('By Source Object', payload.bySourceObject || {}),\n )\n } else if (!payload || !Array.isArray(payload.leaves)) {\n statusEl.textContent = 'No baked leaves/changelog/bundle payload found in this HTML file.'\n } else {\n statusEl.textContent = \\\n 'Loaded baked payload with ' + payload.leaves.length + ' routes.'\n\n const toHref = (source) => {\n if (!source || !source.file) return null\n const normalizedPath = String(source.file).replace(/\\\\\\\\/g, '/')\n const platform =\n (navigator.userAgentData && navigator.userAgentData.platform) ||\n navigator.platform ||\n ''\n const isWindows = /win/i.test(platform)\n const vscodePath = isWindows\n ? normalizedPath.replace(/^\\\\/+/, '')\n : normalizedPath.startsWith('/')\n ? normalizedPath\n : '/' + normalizedPath\n const line = Number.isFinite(source.line) ? source.line : 1\n const column = Number.isFinite(source.column) ? source.column : 1\n return 'vscode://file/' + encodeURI(vscodePath) + ':' + line + ':' + column\n }\n\n const sourceDisplay = (source) => {\n return ''\n }\n\n payload.leaves.forEach((leaf) => {\n const details = document.createElement('details')\n const summary = document.createElement('summary')\n summary.textContent = String(leaf.method || '').toUpperCase() + ' ' + (leaf.path || '')\n\n const pre = document.createElement('pre')\n pre.textContent = JSON.stringify(leaf, null, 2)\n\n const source = payload.sourceByLeaf && payload.sourceByLeaf[leaf.key]\n let sourceWrap = null\n if (source) {\n sourceWrap = document.createElement('div')\n sourceWrap.className = 'meta'\n\n const definitionHref = toHref(source.definition)\n if (definitionHref) {\n const label = document.createElement('div')\n const link = document.createElement('a')\n link.href = definitionHref\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent = 'definition'\n label.appendChild(link)\n sourceWrap.appendChild(label)\n }\n\n if (source.schemas && typeof source.schemas === 'object') {\n Object.entries(source.schemas).forEach(([name, schema]) => {\n if (!schema) return\n const href = toHref(schema)\n const row = document.createElement('div')\n if (href) {\n const link = document.createElement('a')\n link.href = href\n link.target = '_blank'\n link.rel = 'noopener noreferrer'\n link.textContent =\n name + ': ' + (schema.sourceName || schema.tag || '<anonymous>')\n row.appendChild(link)\n } else {\n row.textContent = name + ': ' + (schema.sourceName || schema.tag || '<anonymous>')\n }\n sourceWrap.appendChild(row)\n })\n }\n\n }\n\n details.appendChild(summary)\n if (sourceWrap) details.appendChild(sourceWrap)\n details.appendChild(pre)\n resultsEl.appendChild(details)\n })\n }\n </script>\n </body>\n</html>\n`\n","import path from 'node:path'\nimport ts from 'typescript'\n\nconst SCHEMA_KEYS = [\n 'bodySchema',\n 'querySchema',\n 'paramsSchema',\n 'outputSchema',\n 'outputMetaSchema',\n 'queryExtensionSchema',\n] as const\n\nconst HTTP_METHODS = new Set(['get', 'post', 'put', 'patch', 'delete'])\nconst MAX_RECURSION_DEPTH = 120\n\nexport type SourceExtractionReason =\n | 'module_not_in_program'\n | 'export_not_found'\n | 'unsupported_expression_shape'\n | 'resolved_zero_leaves'\n\ntype SchemaKey = (typeof SCHEMA_KEYS)[number]\n\nexport type LeafSourceLocation = {\n file: string\n line: number\n column: number\n}\n\nexport type SchemaSourceMetadata = LeafSourceLocation & {\n sourceName?: string\n tag?: '<inline>' | '<anonymous>' | '<expression>'\n}\n\nexport type LeafSourceMetadata = {\n definition: LeafSourceLocation & { symbolName?: string }\n schemas: Partial<Record<SchemaKey, SchemaSourceMetadata>>\n}\n\nexport type LeafSourceByKey = Record<string, LeafSourceMetadata>\n\nexport type ExtractLeafSourceByAstOptions = {\n modulePath: string\n exportName: string\n tsconfigPath?: string\n cwd?: string\n}\n\nexport type ExtractLeafSourceByAstStats = {\n visitedSymbols: number\n visitedFiles: number\n unresolvedReferences: number\n}\n\nexport type ExtractLeafSourceByAstResult = {\n sourceByLeaf: LeafSourceByKey\n tsconfigPath?: string\n reason?: SourceExtractionReason\n stats: ExtractLeafSourceByAstStats\n}\n\ntype EvaluatedLeaf = {\n method: string\n path: string\n definitionNode: ts.Node\n schemas: Partial<Record<SchemaKey, ts.Expression>>\n}\n\ntype EvalContext = {\n checker: ts.TypeChecker\n activeExpressionKeys: Set<string>\n activeSymbols: Set<string>\n visitedSymbolKeys: Set<string>\n visitedFilePaths: Set<string>\n unresolvedReferences: number\n unsupportedShapeSeen: boolean\n}\n\ntype BranchState = {\n base: string\n leaves: EvaluatedLeaf[]\n}\n\nfunction toLocation(node: ts.Node): LeafSourceLocation {\n const sourceFile = node.getSourceFile()\n const { line, character } = sourceFile.getLineAndCharacterOfPosition(\n node.getStart(sourceFile),\n )\n return {\n file: path.resolve(sourceFile.fileName),\n line: line + 1,\n column: character + 1,\n }\n}\n\nfunction markFile(ctx: EvalContext, sourceFile: ts.SourceFile | undefined) {\n if (!sourceFile) return\n ctx.visitedFilePaths.add(path.resolve(sourceFile.fileName))\n}\n\nfunction trimPreview(text: string, max = 80) {\n const normalized = text.replace(/\\s+/g, ' ').trim()\n return normalized.length > max ? `${normalized.slice(0, max)}...` : normalized\n}\n\nfunction unwrapExpression(expression: ts.Expression): ts.Expression {\n let current = expression\n while (true) {\n if (\n ts.isParenthesizedExpression(current) ||\n ts.isAsExpression(current) ||\n ts.isTypeAssertionExpression(current) ||\n ts.isNonNullExpression(current) ||\n ts.isSatisfiesExpression(current)\n ) {\n current = current.expression\n continue\n }\n break\n }\n return current\n}\n\nfunction getTextName(name: ts.PropertyName): string | undefined {\n if (\n ts.isIdentifier(name) ||\n ts.isStringLiteral(name) ||\n ts.isNumericLiteral(name)\n ) {\n return name.text\n }\n return undefined\n}\n\nfunction joinPaths(parent: string, child: string) {\n if (!parent) return child\n if (!child) return parent\n const trimmedParent = parent.endsWith('/') ? parent.replace(/\\/+$/, '') : parent\n const trimmedChild = child.startsWith('/') ? child.replace(/^\\/+/, '') : child\n if (!trimmedChild) return trimmedParent\n return `${trimmedParent}/${trimmedChild}`\n}\n\nfunction buildLeafKey(method: string, leafPath: string) {\n return `${method.toUpperCase()} ${leafPath}`\n}\n\nfunction normalizeResourceBase(raw: string) {\n if (raw === '') return ''\n if (raw.startsWith('/') || raw.startsWith(':') || raw.startsWith('*')) {\n return raw\n }\n return `/${raw}`\n}\n\nfunction getModuleSymbol(\n checker: ts.TypeChecker,\n sourceFile: ts.SourceFile,\n): ts.Symbol | undefined {\n return checker.getSymbolAtLocation(sourceFile)\n}\n\nfunction getAliasedSymbolIfNeeded(checker: ts.TypeChecker, symbol: ts.Symbol) {\n if ((symbol.flags & ts.SymbolFlags.Alias) !== 0) {\n try {\n return checker.getAliasedSymbol(symbol)\n } catch {\n return symbol\n }\n }\n return symbol\n}\n\nfunction findSourceFile(program: ts.Program, filePath: string): ts.SourceFile | undefined {\n const wanted = path.resolve(filePath)\n const normalizedWanted = path.normalize(wanted)\n return program\n .getSourceFiles()\n .find((file) => path.normalize(path.resolve(file.fileName)) === normalizedWanted)\n}\n\nfunction declarationToExpression(\n declaration: ts.Declaration | undefined,\n): ts.Expression | undefined {\n if (!declaration) return undefined\n if (ts.isVariableDeclaration(declaration)) {\n return declaration.initializer\n }\n if (ts.isExportAssignment(declaration)) {\n return declaration.expression\n }\n if (ts.isPropertyAssignment(declaration)) {\n return declaration.initializer\n }\n if (ts.isShorthandPropertyAssignment(declaration)) {\n return declaration.name\n }\n if (ts.isBindingElement(declaration)) {\n return declaration.initializer\n }\n if (ts.isEnumMember(declaration)) {\n return declaration.initializer\n }\n return undefined\n}\n\nfunction symbolKey(symbol: ts.Symbol): string {\n const decl = symbol.declarations?.[0]\n if (!decl) return `${symbol.getName()}#${symbol.flags}`\n const file = path.resolve(decl.getSourceFile().fileName)\n return `${file}:${decl.getStart()}:${symbol.getName()}`\n}\n\nfunction resolveSymbolFromNode(\n node: ts.Node,\n ctx: EvalContext,\n): ts.Symbol | undefined {\n const symbol = ctx.checker.getSymbolAtLocation(node)\n if (!symbol) {\n ctx.unresolvedReferences += 1\n return undefined\n }\n const target = getAliasedSymbolIfNeeded(ctx.checker, symbol)\n const key = symbolKey(target)\n ctx.visitedSymbolKeys.add(key)\n return target\n}\n\nfunction getExpressionFromSymbol(\n symbol: ts.Symbol,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const key = symbolKey(symbol)\n if (ctx.activeSymbols.has(key)) return undefined\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n ctx.activeSymbols.add(key)\n try {\n const declaration = symbol.declarations?.[0]\n markFile(ctx, declaration?.getSourceFile())\n const direct = declarationToExpression(declaration)\n if (direct) return direct\n\n if (declaration && ts.isImportSpecifier(declaration)) {\n const target = getAliasedSymbolIfNeeded(ctx.checker, symbol)\n if (target !== symbol) {\n return getExpressionFromSymbol(target, ctx, depth + 1)\n }\n }\n\n return undefined\n } finally {\n ctx.activeSymbols.delete(key)\n }\n}\n\nfunction resolveIdentifierExpression(\n identifier: ts.Identifier,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const symbol = resolveSymbolFromNode(identifier, ctx)\n if (!symbol) return undefined\n return getExpressionFromSymbol(symbol, ctx, depth)\n}\n\nfunction resolvePropertyExpression(\n expression: ts.PropertyAccessExpression | ts.ElementAccessExpression,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isPropertyAccessExpression(expression)) {\n const symbol = resolveSymbolFromNode(expression.name, ctx)\n if (symbol) {\n const fromSymbol = getExpressionFromSymbol(symbol, ctx, depth + 1)\n if (fromSymbol) return fromSymbol\n }\n } else if (expression.argumentExpression) {\n const symbol = resolveSymbolFromNode(expression.argumentExpression, ctx)\n if (symbol) {\n const fromSymbol = getExpressionFromSymbol(symbol, ctx, depth + 1)\n if (fromSymbol) return fromSymbol\n }\n }\n\n const ownerExpr = evaluateExpressionReference(expression.expression, ctx, depth + 1)\n const owner = ownerExpr ? maybeObjectLiteral(ownerExpr, ctx, depth + 1) : undefined\n if (!owner) return undefined\n\n const propName = ts.isPropertyAccessExpression(expression)\n ? expression.name.text\n : expression.argumentExpression && ts.isStringLiteralLike(expression.argumentExpression)\n ? expression.argumentExpression.text\n : undefined\n if (!propName) return undefined\n\n for (const property of owner.properties) {\n if (ts.isPropertyAssignment(property) && getTextName(property.name) === propName) {\n return property.initializer\n }\n if (ts.isShorthandPropertyAssignment(property) && property.name.text === propName) {\n return property.name\n }\n }\n\n return undefined\n}\n\nfunction evaluateExpressionReference(\n expression: ts.Expression,\n ctx: EvalContext,\n depth: number,\n): ts.Expression | undefined {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isIdentifier(resolved)) {\n return resolveIdentifierExpression(resolved, ctx, depth + 1)\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n return resolvePropertyExpression(resolved, ctx, depth + 1)\n }\n\n return undefined\n}\n\nfunction resolveExportExpression(\n sourceFile: ts.SourceFile,\n exportName: string,\n checker: ts.TypeChecker,\n): ts.Expression | undefined {\n const moduleSymbol = getModuleSymbol(checker, sourceFile)\n if (!moduleSymbol) return undefined\n const exports = checker.getExportsOfModule(moduleSymbol)\n const explicit = exports.find((entry) => entry.getName() === exportName)\n if (explicit) {\n const declaration = getAliasedSymbolIfNeeded(checker, explicit).declarations?.[0]\n return declarationToExpression(declaration)\n }\n\n const defaultExport = exports.find((entry) => entry.getName() === 'default')\n if (!defaultExport) return undefined\n const defaultDecl = getAliasedSymbolIfNeeded(checker, defaultExport).declarations?.[0]\n const defaultExpr = declarationToExpression(defaultDecl)\n if (!defaultExpr) return undefined\n const resolved = unwrapExpression(defaultExpr)\n if (!ts.isObjectLiteralExpression(resolved)) return undefined\n\n for (const property of resolved.properties) {\n if (!ts.isPropertyAssignment(property)) continue\n const propertyName = getTextName(property.name)\n if (propertyName !== exportName) continue\n return property.initializer\n }\n\n return undefined\n}\n\nfunction maybeObjectLiteral(\n expression: ts.Expression | undefined,\n ctx: EvalContext,\n depth = 0,\n): ts.ObjectLiteralExpression | undefined {\n if (!expression || depth > MAX_RECURSION_DEPTH) return undefined\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n if (ts.isObjectLiteralExpression(resolved)) return resolved\n\n const referenced = evaluateExpressionReference(resolved, ctx, depth + 1)\n if (!referenced) return undefined\n return maybeObjectLiteral(referenced, ctx, depth + 1)\n}\n\nfunction collectSchemaExpressionsFromObject(\n objectLiteral: ts.ObjectLiteralExpression,\n ctx: EvalContext,\n depth: number,\n): Partial<Record<SchemaKey, ts.Expression>> {\n const schemas: Partial<Record<SchemaKey, ts.Expression>> = {}\n\n for (const property of objectLiteral.properties) {\n if (ts.isSpreadAssignment(property)) {\n const spreadObject = maybeObjectLiteral(property.expression, ctx, depth + 1)\n if (!spreadObject) continue\n Object.assign(\n schemas,\n collectSchemaExpressionsFromObject(spreadObject, ctx, depth + 1),\n )\n continue\n }\n\n if (ts.isPropertyAssignment(property)) {\n const key = getTextName(property.name)\n if (!key || !SCHEMA_KEYS.includes(key as SchemaKey)) continue\n schemas[key as SchemaKey] = property.initializer\n continue\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n const key = property.name.text\n if (!SCHEMA_KEYS.includes(key as SchemaKey)) continue\n schemas[key as SchemaKey] = property.name\n }\n }\n\n return schemas\n}\n\nfunction extractSchemaExpressions(\n cfgExpression: ts.Expression | undefined,\n ctx: EvalContext,\n depth: number,\n): Partial<Record<SchemaKey, ts.Expression>> {\n const objectLiteral = maybeObjectLiteral(cfgExpression, ctx, depth)\n if (!objectLiteral) return {}\n return collectSchemaExpressionsFromObject(objectLiteral, ctx, depth)\n}\n\nfunction getNearestVariableName(node: ts.Node): string | undefined {\n let current: ts.Node | undefined = node\n while (current) {\n if (ts.isVariableDeclaration(current) && ts.isIdentifier(current.name)) {\n return current.name.text\n }\n current = current.parent\n }\n return undefined\n}\n\nfunction isAllAccess(\n expression: ts.PropertyAccessExpression | ts.ElementAccessExpression,\n): boolean {\n if (ts.isPropertyAccessExpression(expression)) {\n return expression.name.text === 'all'\n }\n return Boolean(\n expression.argumentExpression &&\n ts.isStringLiteralLike(expression.argumentExpression) &&\n expression.argumentExpression.text === 'all',\n )\n}\n\nfunction evaluateBranchExpression(\n expression: ts.Expression,\n ctx: EvalContext,\n depth: number,\n): BranchState | undefined {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n if (depth > MAX_RECURSION_DEPTH) return undefined\n\n if (ts.isIdentifier(resolved)) {\n const valueExpr = resolveIdentifierExpression(resolved, ctx, depth + 1)\n if (!valueExpr) return undefined\n return evaluateBranchExpression(valueExpr, ctx, depth + 1)\n }\n\n if (!ts.isCallExpression(resolved)) return undefined\n\n const call = resolved\n if (ts.isIdentifier(call.expression) && call.expression.text === 'resource') {\n const firstArg = call.arguments[0]\n if (!firstArg || !ts.isStringLiteralLike(firstArg)) {\n ctx.unsupportedShapeSeen = true\n return undefined\n }\n return { base: normalizeResourceBase(firstArg.text), leaves: [] }\n }\n\n if (!ts.isPropertyAccessExpression(call.expression)) {\n ctx.unsupportedShapeSeen = true\n return undefined\n }\n\n const owner = call.expression.expression\n const method = call.expression.name.text\n const branch = evaluateBranchExpression(owner, ctx, depth + 1)\n if (!branch) return undefined\n\n if (method === 'with') return branch\n\n if (HTTP_METHODS.has(method)) {\n const cfgExpression = call.arguments[0]\n const schemas = extractSchemaExpressions(cfgExpression, ctx, depth + 1)\n const nextLeaf: EvaluatedLeaf = {\n method,\n path: branch.base,\n definitionNode: call.expression.name,\n schemas,\n }\n return {\n ...branch,\n leaves: [...branch.leaves, nextLeaf],\n }\n }\n\n if (method === 'sub') {\n const mountedLeaves = call.arguments.flatMap((arg) =>\n evaluateLeavesFromExpression(arg, ctx, depth + 1),\n )\n const prefixed = mountedLeaves.map((leaf) => ({\n ...leaf,\n path: joinPaths(branch.base, leaf.path),\n }))\n return {\n ...branch,\n leaves: [...branch.leaves, ...prefixed],\n }\n }\n\n ctx.unsupportedShapeSeen = true\n return undefined\n}\n\nfunction expressionKey(expression: ts.Expression) {\n const source = expression.getSourceFile()\n return `${path.resolve(source.fileName)}:${expression.getStart(source)}:${expression.getEnd()}:${expression.kind}`\n}\n\nfunction evaluateLeavesFromExpression(\n expression: ts.Expression,\n ctx: EvalContext,\n depth = 0,\n): EvaluatedLeaf[] {\n const resolved = unwrapExpression(expression)\n markFile(ctx, resolved.getSourceFile())\n\n const key = expressionKey(resolved)\n if (ctx.activeExpressionKeys.has(key)) return []\n if (depth > MAX_RECURSION_DEPTH) return []\n ctx.activeExpressionKeys.add(key)\n\n try {\n if (ts.isIdentifier(resolved)) {\n const valueExpr = resolveIdentifierExpression(resolved, ctx, depth + 1)\n if (!valueExpr) return []\n return evaluateLeavesFromExpression(valueExpr, ctx, depth + 1)\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n if (isAllAccess(resolved)) {\n return evaluateLeavesFromExpression(resolved.expression, ctx, depth + 1)\n }\n const refExpr = resolvePropertyExpression(resolved, ctx, depth + 1)\n if (refExpr) {\n return evaluateLeavesFromExpression(refExpr, ctx, depth + 1)\n }\n return []\n }\n\n if (ts.isArrayLiteralExpression(resolved)) {\n const leaves: EvaluatedLeaf[] = []\n for (const element of resolved.elements) {\n if (ts.isSpreadElement(element)) {\n leaves.push(...evaluateLeavesFromExpression(element.expression, ctx, depth + 1))\n continue\n }\n leaves.push(...evaluateLeavesFromExpression(element as ts.Expression, ctx, depth + 1))\n }\n return leaves\n }\n\n if (ts.isCallExpression(resolved)) {\n if (ts.isIdentifier(resolved.expression)) {\n const callName = resolved.expression.text\n if (callName === 'finalize') {\n const arg = resolved.arguments[0]\n if (!arg) return []\n return evaluateLeavesFromExpression(arg, ctx, depth + 1)\n }\n if (callName === 'mergeArrays') {\n return resolved.arguments.flatMap((arg) =>\n evaluateLeavesFromExpression(arg, ctx, depth + 1),\n )\n }\n }\n\n if (ts.isPropertyAccessExpression(resolved.expression)) {\n const prop = resolved.expression.name.text\n if (prop === 'done') {\n const branch = evaluateBranchExpression(\n resolved.expression.expression,\n ctx,\n depth + 1,\n )\n return branch?.leaves ?? []\n }\n }\n\n const refExpr = evaluateExpressionReference(resolved, ctx, depth + 1)\n if (refExpr) return evaluateLeavesFromExpression(refExpr, ctx, depth + 1)\n\n ctx.unsupportedShapeSeen = true\n return []\n }\n\n const branch = evaluateBranchExpression(resolved, ctx, depth + 1)\n if (branch) return branch.leaves\n\n ctx.unsupportedShapeSeen = true\n return []\n } finally {\n ctx.activeExpressionKeys.delete(key)\n }\n}\n\nfunction resolveSchemaMetadata(\n expression: ts.Expression,\n ctx: EvalContext,\n): SchemaSourceMetadata {\n const resolved = unwrapExpression(expression)\n\n if (ts.isIdentifier(resolved)) {\n const symbol = resolveSymbolFromNode(resolved, ctx)\n const declaration = symbol?.declarations?.[0]\n const locationNode = declaration\n ? ts.isVariableDeclaration(declaration)\n ? declaration.name\n : declaration\n : resolved\n\n const sourceName =\n declaration && ts.isVariableDeclaration(declaration) && ts.isIdentifier(declaration.name)\n ? declaration.name.text\n : resolved.text\n\n return {\n ...toLocation(locationNode),\n sourceName,\n tag: declaration ? undefined : '<anonymous>',\n }\n }\n\n if (ts.isPropertyAccessExpression(resolved) || ts.isElementAccessExpression(resolved)) {\n return {\n ...toLocation(resolved),\n sourceName: trimPreview(resolved.getText()),\n tag: '<expression>',\n }\n }\n\n return {\n ...toLocation(resolved),\n sourceName: trimPreview(resolved.getText()),\n tag: '<inline>',\n }\n}\n\nfunction parseTsConfig(cwd: string, tsconfigPath?: string) {\n const resolvedTsconfig = tsconfigPath\n ? path.resolve(cwd, tsconfigPath)\n : ts.findConfigFile(cwd, ts.sys.fileExists, 'tsconfig.json')\n if (!resolvedTsconfig) {\n return undefined\n }\n\n const read = ts.readConfigFile(resolvedTsconfig, ts.sys.readFile)\n if (read.error) {\n throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, '\\n'))\n }\n const parsed = ts.parseJsonConfigFileContent(\n read.config,\n ts.sys,\n path.dirname(resolvedTsconfig),\n undefined,\n resolvedTsconfig,\n )\n const nonEmptyInputErrors = parsed.errors.filter((entry) => entry.code !== 18003)\n if (nonEmptyInputErrors.length > 0) {\n throw new Error(\n nonEmptyInputErrors\n .map((entry) => ts.flattenDiagnosticMessageText(entry.messageText, '\\n'))\n .join('\\n'),\n )\n }\n\n return { resolvedTsconfig, parsed }\n}\n\nfunction createProgramWithFallback(parsed: ts.ParsedCommandLine, moduleFileAbs: string) {\n const base = ts.createProgram({\n rootNames: parsed.fileNames,\n options: parsed.options,\n })\n\n if (findSourceFile(base, moduleFileAbs)) {\n return base\n }\n\n const rootNames = Array.from(new Set([...parsed.fileNames, moduleFileAbs]))\n return ts.createProgram({ rootNames, options: parsed.options })\n}\n\nexport function extractLeafSourceByAst({\n modulePath,\n exportName,\n tsconfigPath,\n cwd = process.cwd(),\n}: ExtractLeafSourceByAstOptions): ExtractLeafSourceByAstResult {\n const parsedConfig = parseTsConfig(cwd, tsconfigPath)\n if (!parsedConfig) {\n return {\n sourceByLeaf: {},\n reason: 'module_not_in_program',\n stats: { visitedSymbols: 0, visitedFiles: 0, unresolvedReferences: 0 },\n }\n }\n\n const moduleAbs = path.resolve(cwd, modulePath)\n const program = createProgramWithFallback(parsedConfig.parsed, moduleAbs)\n const checker = program.getTypeChecker()\n const moduleFile = findSourceFile(program, moduleAbs)\n if (!moduleFile) {\n return {\n sourceByLeaf: {},\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason: 'module_not_in_program',\n stats: { visitedSymbols: 0, visitedFiles: 0, unresolvedReferences: 0 },\n }\n }\n\n const exportedExpression = resolveExportExpression(moduleFile, exportName, checker)\n if (!exportedExpression) {\n return {\n sourceByLeaf: {},\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason: 'export_not_found',\n stats: { visitedSymbols: 0, visitedFiles: 1, unresolvedReferences: 0 },\n }\n }\n\n const ctx: EvalContext = {\n checker,\n activeExpressionKeys: new Set<string>(),\n activeSymbols: new Set<string>(),\n visitedSymbolKeys: new Set<string>(),\n visitedFilePaths: new Set<string>([path.resolve(moduleFile.fileName)]),\n unresolvedReferences: 0,\n unsupportedShapeSeen: false,\n }\n\n const evaluatedLeaves = evaluateLeavesFromExpression(exportedExpression, ctx, 0)\n\n const sourceByLeaf: LeafSourceByKey = {}\n for (const leaf of evaluatedLeaves) {\n const key = buildLeafKey(leaf.method, leaf.path)\n const definition = {\n ...toLocation(leaf.definitionNode),\n symbolName: getNearestVariableName(leaf.definitionNode),\n }\n ctx.visitedFilePaths.add(definition.file)\n\n const schemas: Partial<Record<SchemaKey, SchemaSourceMetadata>> = {}\n for (const schemaKey of SCHEMA_KEYS) {\n const schemaExpression = leaf.schemas[schemaKey]\n if (!schemaExpression) continue\n const schemaMeta = resolveSchemaMetadata(schemaExpression, ctx)\n ctx.visitedFilePaths.add(schemaMeta.file)\n schemas[schemaKey] = schemaMeta\n }\n\n sourceByLeaf[key] = { definition, schemas }\n }\n\n const reason: SourceExtractionReason | undefined =\n Object.keys(sourceByLeaf).length > 0\n ? undefined\n : ctx.unsupportedShapeSeen\n ? 'unsupported_expression_shape'\n : 'resolved_zero_leaves'\n\n return {\n sourceByLeaf,\n tsconfigPath: parsedConfig.resolvedTsconfig,\n reason,\n stats: {\n visitedSymbols: ctx.visitedSymbolKeys.size,\n visitedFiles: ctx.visitedFilePaths.size,\n unresolvedReferences: ctx.unresolvedReferences,\n },\n }\n}\n","import type { RRRoutesChangeSet } from '../diff/types'\nimport type { RRRoutesCheckpointSummary } from '../checkpoint/types'\nimport type { RRRoutesSnapshot } from '../snapshot/types'\n\nexport const RRROUTES_BAKED_PAYLOAD_MARKER =\n '<!--__RRROUTES_INSPECTOR_BAKED_PAYLOAD__-->'\n\nexport type RRRoutesBakedInspectorPayload = {\n kind: 'rrroutes-inspector-baked'\n snapshot: RRRoutesSnapshot\n checkpoints: readonly RRRoutesCheckpointSummary[]\n changeSets: readonly RRRoutesChangeSet[]\n}\n\nexport function createBakedInspectorPayload(args: {\n snapshot: RRRoutesSnapshot\n checkpoints?: readonly RRRoutesCheckpointSummary[]\n changeSets?: readonly RRRoutesChangeSet[]\n}): RRRoutesBakedInspectorPayload {\n return {\n kind: 'rrroutes-inspector-baked',\n snapshot: args.snapshot,\n checkpoints: args.checkpoints ?? [],\n changeSets: args.changeSets ?? [],\n }\n}\n\nexport function escapeBakedPayload(payload: unknown): string {\n return JSON.stringify(payload)\n .replace(/<\\//g, '<\\\\/')\n .replace(/<!--/g, '<\\\\!--')\n .replace(/\\u2028/g, '\\\\u2028')\n .replace(/\\u2029/g, '\\\\u2029')\n}\n\nexport function injectBakedInspectorPayload(\n html: string,\n payload: unknown,\n options: {\n marker?: string\n globalName?: string\n scriptId?: string\n } = {},\n): string {\n const marker = options.marker ?? RRROUTES_BAKED_PAYLOAD_MARKER\n const globalName = options.globalName ?? '__RRROUTES_INSPECTOR_PAYLOAD'\n const scriptId = options.scriptId ?? 'rrroutes-inspector-baked-payload'\n const script = `${marker}\\n<script id=\"${scriptId}\">window.${globalName} = ${escapeBakedPayload(payload)};</script>`\n if (html.includes(marker)) return html.replace(marker, script)\n if (html.includes('</body>'))\n return html.replace('</body>', `${script}\\n</body>`)\n return `${script}\\n${html}`\n}\n","import path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport {\n exportFinalizedLeaves,\n type ExportFinalizedLeavesInput,\n} from './exportFinalizedLeaves'\n\nexport type FinalizedLeavesCliArgs = {\n modulePath: string\n exportName: string\n outFile: string\n withSource: boolean\n tsconfigPath?: string\n}\n\nexport function parseFinalizedLeavesCliArgs(argv: string[]): FinalizedLeavesCliArgs {\n const args = new Map<string, string>()\n let withSource = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const key = argv[i]\n if (key === '--') continue\n if (!key.startsWith('--')) continue\n if (key === '--with-source') {\n withSource = true\n continue\n }\n const value = argv[i + 1]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${key}`)\n }\n args.set(key, value)\n i += 1\n }\n\n const modulePath = args.get('--module')\n if (!modulePath) {\n throw new Error('Missing required --module argument')\n }\n\n return {\n modulePath,\n exportName: args.get('--export') ?? 'leaves',\n outFile: args.get('--out') ?? 'finalized-leaves.export.json',\n withSource,\n tsconfigPath: args.get('--tsconfig') ?? undefined,\n }\n}\n\nexport async function loadFinalizedLeavesInput({\n modulePath,\n exportName,\n}: FinalizedLeavesCliArgs): Promise<ExportFinalizedLeavesInput> {\n const resolvedModule = path.resolve(process.cwd(), modulePath)\n const mod = await import(pathToFileURL(resolvedModule).href)\n const value = (mod[exportName] ??\n (mod.default && (mod.default as Record<string, unknown>)[exportName])) as\n | ExportFinalizedLeavesInput\n | undefined\n\n if (!value) {\n throw new Error(`Export \"${exportName}\" not found in module: ${resolvedModule}`)\n }\n\n return value\n}\n\nexport async function runExportFinalizedLeavesCli(argv: string[]) {\n const args = parseFinalizedLeavesCliArgs(argv)\n const input = await loadFinalizedLeavesInput(args)\n const payload = await exportFinalizedLeaves(input, {\n outFile: args.outFile,\n includeSource: args.withSource,\n tsconfigPath: args.tsconfigPath,\n sourceModulePath: args.modulePath,\n sourceExportName: args.exportName,\n })\n\n return {\n payload,\n outFile: path.resolve(args.outFile),\n }\n}\n","import fs from 'node:fs/promises'\nimport os from 'node:os'\nimport path from 'node:path'\nimport crypto from 'node:crypto'\nimport { execFile as execFileCallback, spawn } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { pathToFileURL } from 'node:url'\nimport ts from 'typescript'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport {\n exportFinalizedLeaves,\n type ExportFinalizedLeavesOptions,\n type FinalizedLeavesExport,\n type WriteFinalizedLeavesExportOptions,\n} from './exportFinalizedLeaves'\nimport type { FlatSchemaEntry, FlatSchemaMap } from './flattenSchema'\nimport { injectBakedInspectorPayload } from './files/baked-payload'\nimport { diffRRRoutesSnapshots } from './diff/diff-snapshots'\nimport type { RRRoutesChangeSet } from './diff/types'\nimport { hashCanonicalValue } from './snapshot/hash'\nimport type { RRRoutesSnapshot } from './snapshot/types'\n\nconst execFile = promisify(execFileCallback)\n\nconst CHANGESET_CFG_FIELDS = [\n 'summary',\n 'description',\n 'tags',\n 'deprecated',\n 'stability',\n 'docsGroup',\n 'docsHidden',\n 'feed',\n] as const\n\nconst SCHEMA_SECTIONS = ['params', 'query', 'body', 'output'] as const\nconst MODULE_EXTENSIONS = [\n '.ts',\n '.tsx',\n '.mts',\n '.cts',\n '.js',\n '.mjs',\n '.cjs',\n] as const\nconst COMPILE_CACHE_VERSION = 'v2'\n\ntype ChangelogSchemaSection = (typeof SCHEMA_SECTIONS)[number]\n\ntype SourceSchemaKey =\n | 'paramsSchema'\n | 'querySchema'\n | 'bodySchema'\n | 'outputSchema'\n\nconst SOURCE_KEY_BY_SECTION: Record<ChangelogSchemaSection, SourceSchemaKey> = {\n params: 'paramsSchema',\n query: 'querySchema',\n body: 'bodySchema',\n output: 'outputSchema',\n}\n\ntype RouteCfgSubset = Partial<\n Record<(typeof CHANGESET_CFG_FIELDS)[number], unknown>\n>\n\ntype SourceIdentity = {\n id: string\n displayName: string\n file?: string\n line?: number\n column?: number\n tag?: string\n sourceName?: string\n}\n\ntype RouteSnapshot = {\n key: string\n method: string\n path: string\n cfg: RouteCfgSubset\n flatSchema: FlatSchemaMap\n sourceBySection: Partial<Record<ChangelogSchemaSection, SourceIdentity>>\n}\n\ntype SourceObjectSectionSnapshot = Record<string, string[]>\n\ntype SourceObjectSnapshot = {\n id: string\n displayName: string\n routeKeys: string[]\n sections: Record<ChangelogSchemaSection, SourceObjectSectionSnapshot>\n}\n\ntype CommitSnapshot = {\n commit: ChangelogCommit\n routesByKey: Record<string, RouteSnapshot>\n sourceObjectsById: Record<string, SourceObjectSnapshot>\n missing?: boolean\n unresolvedModule?: boolean\n fallbackReason?: 'module_unresolved' | 'snapshot_error'\n fallbackError?: string\n}\n\ntype DiffOp = 'added' | 'removed' | 'changed'\n\nexport type SchemaPathDelta = {\n path: string\n op: DiffOp\n before?: FlatSchemaEntry\n after?: FlatSchemaEntry\n}\n\nexport type RouteCfgFieldDelta = {\n field: (typeof CHANGESET_CFG_FIELDS)[number]\n before?: unknown\n after?: unknown\n}\n\nexport type SourceSchemaPathDelta = {\n section: ChangelogSchemaSection\n path: string\n op: DiffOp\n before?: string[]\n after?: string[]\n}\n\nexport type ChangelogCommit = {\n sha: string\n authorDate: string\n authorName: string\n subject: string\n}\n\nexport type RouteChangeType =\n | 'route_added'\n | 'route_removed'\n | 'schema_changed'\n | 'cfg_changed'\n\nexport type SourceObjectChangeType =\n | 'source_object_added'\n | 'source_object_removed'\n | 'source_schema_changed'\n\nexport type RouteChangeEvent = {\n type: RouteChangeType\n commitSha: string\n routeKey: string\n method?: string\n path?: string\n schemaDiff?: SchemaPathDelta[]\n cfgDiff?: RouteCfgFieldDelta[]\n}\n\nexport type SourceObjectChangeEvent = {\n type: SourceObjectChangeType\n commitSha: string\n sourceObjectId: string\n displayName: string\n impactedRoutes: string[]\n schemaDiff?: SourceSchemaPathDelta[]\n routeAdded?: string[]\n routeRemoved?: string[]\n}\n\nexport type ChangelogRollups = {\n route: Record<RouteChangeType, number>\n sourceObject: Record<SourceObjectChangeType, number>\n byCommit: Record<string, { routeEvents: number; sourceEvents: number }>\n}\n\nexport type FinalizedLeavesChangelogExport = {\n kind: 'finalized-leaves-changelog'\n _meta: {\n generatedAt: string\n description: string\n modulePath: string\n exportName: string\n from: string\n to: string\n selectedCommitCount: number\n unresolvedModuleCommits?: string[]\n snapshotFallbacks?: Array<{\n sha: string\n reason: 'module_unresolved' | 'snapshot_error'\n error?: string\n }>\n }\n commits: ChangelogCommit[]\n byRoute: Record<string, RouteChangeEvent[]>\n bySourceObject: Record<string, SourceObjectChangeEvent[]>\n rollups: ChangelogRollups\n /** Canonical durable transitions used by checkpoints and direct comparisons. */\n changeSets?: RRRoutesChangeSet[]\n}\n\nexport type ExportFinalizedLeavesChangelogOptions = {\n modulePath: string\n exportName?: string\n tsconfigPath?: string\n from?: string\n to?: string\n outFile?: string\n htmlFile?: string\n viewerTemplateFile?: string\n openOnFinish?: boolean\n includeSource?: boolean\n handlers?: ExportFinalizedLeavesOptions['handlers']\n log?: (message: string) => void\n cacheDir?: string\n noCache?: boolean\n}\n\nfunction normalizePath(p: string) {\n return p.replace(/\\\\/g, '/')\n}\n\nfunction stableStringify(value: unknown): string {\n return JSON.stringify(value, (_key, v) => {\n if (v && typeof v === 'object' && !Array.isArray(v)) {\n const sorted = Object.entries(v as Record<string, unknown>)\n .sort(([a], [b]) => a.localeCompare(b))\n .reduce<Record<string, unknown>>((acc, [k, inner]) => {\n acc[k] = inner\n return acc\n }, {})\n return sorted\n }\n return v\n })\n}\n\nfunction sanitizeCfgValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.slice().sort((a, b) => String(a).localeCompare(String(b)))\n }\n return value\n}\n\nfunction toCfgSubset(cfg: Record<string, unknown>): RouteCfgSubset {\n const out: RouteCfgSubset = {}\n for (const field of CHANGESET_CFG_FIELDS) {\n const value = sanitizeCfgValue(cfg[field])\n if (value !== undefined) {\n out[field] = value\n }\n }\n return out\n}\n\nfunction entrySignature(entry: FlatSchemaEntry): string {\n return stableStringify({\n type: entry.type,\n nullable: Boolean(entry.nullable),\n optional: Boolean(entry.optional),\n literal: entry.literal,\n })\n}\n\nfunction semverToTuple(tag: string): {\n major: number\n minor: number\n patch: number\n prerelease: string\n} | null {\n const match = tag.match(\n /^v?(\\d+)\\.(\\d+)\\.(\\d+)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/,\n )\n if (!match) return null\n return {\n major: Number(match[1]),\n minor: Number(match[2]),\n patch: Number(match[3]),\n prerelease: match[4] ?? '',\n }\n}\n\nfunction compareSemverTags(a: string, b: string) {\n const av = semverToTuple(a)\n const bv = semverToTuple(b)\n if (!av && !bv) return 0\n if (!av) return -1\n if (!bv) return 1\n if (av.major !== bv.major) return av.major - bv.major\n if (av.minor !== bv.minor) return av.minor - bv.minor\n if (av.patch !== bv.patch) return av.patch - bv.patch\n if (!av.prerelease && bv.prerelease) return 1\n if (av.prerelease && !bv.prerelease) return -1\n return av.prerelease.localeCompare(bv.prerelease)\n}\n\nasync function runGit(cwd: string, args: string[]) {\n const { stdout } = await execFile('git', args, { cwd })\n return stdout.trim()\n}\n\nasync function resolveCommit(cwd: string, rev: string) {\n return runGit(cwd, ['rev-parse', '--verify', `${rev}^{commit}`])\n}\n\nasync function findLastReachableSemverTag(cwd: string, to: string) {\n const tagsRaw = await runGit(cwd, ['tag', '--merged', to])\n const tags = tagsRaw\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .filter((tag) => semverToTuple(tag) !== null)\n\n if (tags.length === 0) {\n return undefined\n }\n\n tags.sort(compareSemverTags)\n return tags[tags.length - 1]\n}\n\nasync function findDefaultFromCommit(cwd: string, toCommit: string) {\n const tag = await findLastReachableSemverTag(cwd, toCommit)\n if (tag) {\n return resolveCommit(cwd, tag)\n }\n\n const root = await runGit(cwd, ['rev-list', '--max-parents=0', toCommit])\n const rootCommit = root\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)[0]\n if (!rootCommit) {\n throw new Error(\n 'Failed to resolve a baseline commit for changelog generation.',\n )\n }\n return rootCommit\n}\n\nasync function resolveCommitWindow(cwd: string, from?: string, to?: string) {\n const toCommit = await resolveCommit(cwd, to ?? 'HEAD')\n const fromCommit = from\n ? await resolveCommit(cwd, from)\n : await findDefaultFromCommit(cwd, toCommit)\n\n return { from: fromCommit, to: toCommit }\n}\n\nasync function resolveCommitPath(\n cwd: string,\n fromCommit: string,\n toCommit: string,\n) {\n if (fromCommit === toCommit) {\n return [toCommit]\n }\n\n const pathRaw = await runGit(cwd, [\n 'rev-list',\n '--reverse',\n '--ancestry-path',\n `${fromCommit}..${toCommit}`,\n ])\n const commits = pathRaw\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n\n return [fromCommit, ...commits]\n}\n\nfunction modulePathStem(modulePath: string) {\n const normalized = normalizePath(modulePath).replace(/^\\/+/, '')\n for (const ext of MODULE_EXTENSIONS) {\n if (normalized.endsWith(ext)) {\n return normalized.slice(0, -ext.length)\n }\n }\n return normalized\n}\n\nfunction extensionVariants(pathLike: string) {\n const stem = modulePathStem(pathLike)\n return MODULE_EXTENSIONS.map((ext) => `${stem}${ext}`)\n}\n\nasync function buildModulePathCandidates(\n repoRoot: string,\n toCommit: string,\n requestedModuleRel: string,\n) {\n const requested = normalizePath(requestedModuleRel).replace(/^\\/+/, '')\n const out: string[] = []\n const seen = new Set<string>()\n\n const pushCandidate = (value: string) => {\n const normalized = normalizePath(value).replace(/^\\/+/, '')\n if (!normalized) return\n if (seen.has(normalized)) return\n seen.add(normalized)\n out.push(normalized)\n }\n\n pushCandidate(requested)\n extensionVariants(requested).forEach(pushCandidate)\n\n const history = await runGit(repoRoot, [\n 'log',\n '--follow',\n '--name-only',\n '--format=',\n toCommit,\n '--',\n requested,\n ])\n\n history\n .split('\\n')\n .map((item) => item.trim())\n .filter(Boolean)\n .forEach((candidate) => {\n pushCandidate(candidate)\n extensionVariants(candidate).forEach(pushCandidate)\n })\n\n return out\n}\n\nasync function commitHasPath(\n repoRoot: string,\n commitSha: string,\n candidatePath: string,\n) {\n try {\n await execFile('git', ['cat-file', '-e', `${commitSha}:${candidatePath}`], {\n cwd: repoRoot,\n })\n return true\n } catch {\n return false\n }\n}\n\nasync function resolveModulePathForCommit(\n repoRoot: string,\n commitSha: string,\n candidates: readonly string[],\n) {\n for (const candidate of candidates) {\n if (await commitHasPath(repoRoot, commitSha, candidate)) {\n return candidate\n }\n }\n return undefined\n}\n\nfunction parentDirectories(relativePath: string) {\n const clean = normalizePath(relativePath).replace(/^\\/+/, '')\n const dir = path.posix.dirname(clean)\n if (!dir || dir === '.') return []\n\n const parts = dir.split('/')\n const out: string[] = []\n for (let i = parts.length; i > 0; i -= 1) {\n out.push(parts.slice(0, i).join('/'))\n }\n return out\n}\n\nfunction buildRelevantConfigFiles(\n moduleCandidates: readonly string[],\n tsconfigRel?: string,\n) {\n const dirs = new Set<string>()\n for (const moduleRel of moduleCandidates) {\n parentDirectories(moduleRel).forEach((item) => dirs.add(item))\n }\n if (tsconfigRel) {\n parentDirectories(tsconfigRel).forEach((item) => dirs.add(item))\n dirs.add(path.posix.dirname(normalizePath(tsconfigRel)))\n }\n\n const files = new Set<string>(['pnpm-workspace.yaml'])\n for (const dir of dirs) {\n if (!dir || dir === '.') continue\n files.add(`${dir}/package.json`)\n files.add(`${dir}/tsconfig.json`)\n }\n\n return files\n}\n\nasync function commitTouchedRelevantPaths(\n cwd: string,\n commit: string,\n moduleCandidates: readonly string[],\n tsconfigRel?: string,\n) {\n const changed = await runGit(cwd, [\n 'show',\n '--pretty=format:',\n '--name-only',\n '--diff-filter=ACMRTUXB',\n commit,\n ])\n\n const changedFiles = changed\n .split('\\n')\n .map((item) => normalizePath(item.trim()).replace(/^\\/+/, ''))\n .filter(Boolean)\n\n const moduleFiles = Array.from(\n new Set(\n moduleCandidates.map((item) => normalizePath(item).replace(/^\\/+/, '')),\n ),\n )\n const moduleDirs = Array.from(\n new Set(\n moduleFiles\n .map((item) =>\n normalizePath(path.posix.dirname(item)).replace(/^\\/+/, ''),\n )\n .filter((item) => item && item !== '.'),\n ),\n )\n const tsconfigFile = tsconfigRel\n ? normalizePath(tsconfigRel).replace(/^\\/+/, '')\n : undefined\n const configFiles = buildRelevantConfigFiles(moduleFiles, tsconfigFile)\n\n return changedFiles.some((file) => {\n if (moduleFiles.includes(file)) return true\n for (const moduleDir of moduleDirs) {\n if (file === moduleDir || file.startsWith(`${moduleDir}/`)) {\n return true\n }\n }\n if (tsconfigFile && file === tsconfigFile) return true\n return configFiles.has(file)\n })\n}\n\nasync function filterCommits(\n cwd: string,\n commits: string[],\n moduleCandidates: readonly string[],\n tsconfigRel?: string,\n) {\n if (commits.length <= 1) {\n return commits\n }\n\n const keep = [commits[0]]\n for (let i = 1; i < commits.length; i += 1) {\n const commit = commits[i]\n if (\n await commitTouchedRelevantPaths(\n cwd,\n commit,\n moduleCandidates,\n tsconfigRel,\n )\n ) {\n keep.push(commit)\n }\n }\n\n const tip = commits[commits.length - 1]\n if (!keep.includes(tip)) {\n keep.push(tip)\n }\n\n return keep\n}\n\nasync function getCommitMetadata(\n cwd: string,\n commit: string,\n): Promise<ChangelogCommit> {\n const out = await runGit(cwd, [\n 'show',\n '-s',\n '--format=%H%x1f%aI%x1f%an%x1f%s',\n commit,\n ])\n const [sha, authorDate, authorName, subject] = out.split('\\x1f')\n if (!sha || !authorDate || !authorName) {\n throw new Error(`Unable to read commit metadata for ${commit}`)\n }\n\n return {\n sha,\n authorDate,\n authorName,\n subject: subject ?? '',\n }\n}\n\nfunction buildSourceIdentity(\n section: ChangelogSchemaSection,\n value: Record<string, unknown>,\n): SourceIdentity {\n const sourceName =\n typeof value.sourceName === 'string' ? value.sourceName : undefined\n const tag = typeof value.tag === 'string' ? value.tag : undefined\n const file = typeof value.file === 'string' ? value.file : undefined\n const line = typeof value.line === 'number' ? value.line : undefined\n const column = typeof value.column === 'number' ? value.column : undefined\n\n const fallbackName = sourceName ?? tag ?? section\n const suffix = file\n ? `${file}:${line ?? 1}:${column ?? 1}`\n : `${section}:unknown`\n\n return {\n id: sourceName ?? `${fallbackName}@${suffix}`,\n displayName: sourceName ?? `${fallbackName} (${suffix})`,\n sourceName,\n tag,\n file,\n line,\n column,\n }\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object'\n ? (value as Record<string, unknown>)\n : {}\n}\n\nfunction toRouteSnapshots(\n payload: FinalizedLeavesExport,\n): Record<string, RouteSnapshot> {\n const routes: Record<string, RouteSnapshot> = {}\n\n for (const leaf of payload.leaves) {\n const flatSchema = payload.schemaFlatByLeaf[leaf.key] ?? {}\n const cfg = toCfgSubset(asRecord(leaf.cfg as unknown))\n const sourceLeaf = payload.sourceByLeaf?.[leaf.key]\n const sourceSchemas = sourceLeaf?.schemas\n\n const sourceBySection: Partial<\n Record<ChangelogSchemaSection, SourceIdentity>\n > = {}\n for (const section of SCHEMA_SECTIONS) {\n const schemaKey = SOURCE_KEY_BY_SECTION[section]\n const sectionSource = sourceSchemas?.[schemaKey]\n if (!sectionSource || typeof sectionSource !== 'object') continue\n sourceBySection[section] = buildSourceIdentity(\n section,\n sectionSource as Record<string, unknown>,\n )\n }\n\n routes[leaf.key] = {\n key: leaf.key,\n method: String(leaf.method).toUpperCase(),\n path: leaf.path,\n cfg,\n flatSchema,\n sourceBySection,\n }\n }\n\n return routes\n}\n\nfunction sectionPathEntries(\n flatSchema: FlatSchemaMap,\n section: ChangelogSchemaSection,\n) {\n return Object.entries(flatSchema).filter(\n ([schemaPath]) =>\n schemaPath === section ||\n schemaPath.startsWith(`${section}.`) ||\n schemaPath.startsWith(`${section}[]`),\n )\n}\n\nfunction toSourceObjectSnapshots(routesByKey: Record<string, RouteSnapshot>) {\n const working = new Map<\n string,\n {\n id: string\n displayName: string\n routeKeys: Set<string>\n sections: Record<ChangelogSchemaSection, Map<string, Set<string>>>\n }\n >()\n\n for (const route of Object.values(routesByKey)) {\n for (const section of SCHEMA_SECTIONS) {\n const sourceIdentity = route.sourceBySection[section]\n if (!sourceIdentity) continue\n\n const entries = sectionPathEntries(route.flatSchema, section)\n if (entries.length === 0) continue\n\n const existing = working.get(sourceIdentity.id) ?? {\n id: sourceIdentity.id,\n displayName: sourceIdentity.displayName,\n routeKeys: new Set<string>(),\n sections: {\n params: new Map<string, Set<string>>(),\n query: new Map<string, Set<string>>(),\n body: new Map<string, Set<string>>(),\n output: new Map<string, Set<string>>(),\n },\n }\n\n existing.routeKeys.add(route.key)\n for (const [schemaPath, schemaEntry] of entries) {\n const sectionMap = existing.sections[section]\n const signatures = sectionMap.get(schemaPath) ?? new Set<string>()\n signatures.add(entrySignature(schemaEntry))\n sectionMap.set(schemaPath, signatures)\n }\n\n working.set(sourceIdentity.id, existing)\n }\n }\n\n const out: Record<string, SourceObjectSnapshot> = {}\n for (const [id, item] of working.entries()) {\n const sections: Record<\n ChangelogSchemaSection,\n SourceObjectSectionSnapshot\n > = {\n params: {},\n query: {},\n body: {},\n output: {},\n }\n\n for (const section of SCHEMA_SECTIONS) {\n for (const [schemaPath, signatures] of item.sections[section].entries()) {\n sections[section][schemaPath] = Array.from(signatures).sort()\n }\n }\n\n out[id] = {\n id,\n displayName: item.displayName,\n routeKeys: Array.from(item.routeKeys).sort(),\n sections,\n }\n }\n\n return out\n}\n\nfunction diffRouteSchemas(\n before: FlatSchemaMap,\n after: FlatSchemaMap,\n): SchemaPathDelta[] {\n const paths = new Set([...Object.keys(before), ...Object.keys(after)])\n const out: SchemaPathDelta[] = []\n\n for (const schemaPath of Array.from(paths).sort()) {\n const prev = before[schemaPath]\n const next = after[schemaPath]\n\n if (!prev && next) {\n out.push({ path: schemaPath, op: 'added', after: next })\n continue\n }\n if (prev && !next) {\n out.push({ path: schemaPath, op: 'removed', before: prev })\n continue\n }\n if (!prev || !next) continue\n\n if (entrySignature(prev) !== entrySignature(next)) {\n out.push({ path: schemaPath, op: 'changed', before: prev, after: next })\n }\n }\n\n return out\n}\n\nfunction diffRouteCfg(\n before: RouteCfgSubset,\n after: RouteCfgSubset,\n): RouteCfgFieldDelta[] {\n const out: RouteCfgFieldDelta[] = []\n\n for (const field of CHANGESET_CFG_FIELDS) {\n const prev = before[field]\n const next = after[field]\n if (stableStringify(prev) !== stableStringify(next)) {\n out.push({\n field,\n before: prev,\n after: next,\n })\n }\n }\n\n return out\n}\n\nfunction flattenSourceSections(snapshot: SourceObjectSnapshot) {\n const map = new Map<string, string[]>()\n\n for (const section of SCHEMA_SECTIONS) {\n const entries = snapshot.sections[section]\n for (const [schemaPath, signatures] of Object.entries(entries)) {\n map.set(`${section}:${schemaPath}`, signatures)\n }\n }\n\n return map\n}\n\nfunction emptySourceSnapshotLike(\n snapshot: SourceObjectSnapshot,\n): SourceObjectSnapshot {\n return {\n id: snapshot.id,\n displayName: snapshot.displayName,\n routeKeys: [],\n sections: {\n params: {},\n query: {},\n body: {},\n output: {},\n },\n }\n}\n\nfunction diffSourceSchemas(\n before: SourceObjectSnapshot,\n after: SourceObjectSnapshot,\n): SourceSchemaPathDelta[] {\n const prev = flattenSourceSections(before)\n const next = flattenSourceSections(after)\n const keys = new Set([...prev.keys(), ...next.keys()])\n const out: SourceSchemaPathDelta[] = []\n\n for (const key of Array.from(keys).sort()) {\n const prevSignatures = prev.get(key)\n const nextSignatures = next.get(key)\n const [section, ...rest] = key.split(':')\n const schemaPath = rest.join(':')\n\n if (!prevSignatures && nextSignatures) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'added',\n after: nextSignatures,\n })\n continue\n }\n\n if (prevSignatures && !nextSignatures) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'removed',\n before: prevSignatures,\n })\n continue\n }\n\n if (!prevSignatures || !nextSignatures) continue\n\n if (stableStringify(prevSignatures) !== stableStringify(nextSignatures)) {\n out.push({\n section: section as ChangelogSchemaSection,\n path: schemaPath,\n op: 'changed',\n before: prevSignatures,\n after: nextSignatures,\n })\n }\n }\n\n return out\n}\n\nfunction routeRecordByKey(events: RouteChangeEvent[]) {\n const out: Record<string, RouteChangeEvent[]> = {}\n for (const event of events) {\n out[event.routeKey] ??= []\n out[event.routeKey].push(event)\n }\n return out\n}\n\nfunction sourceRecordById(events: SourceObjectChangeEvent[]) {\n const out: Record<string, SourceObjectChangeEvent[]> = {}\n for (const event of events) {\n out[event.sourceObjectId] ??= []\n out[event.sourceObjectId].push(event)\n }\n return out\n}\n\nfunction buildRollups(\n routeEvents: RouteChangeEvent[],\n sourceEvents: SourceObjectChangeEvent[],\n commits: ChangelogCommit[],\n): ChangelogRollups {\n const route: Record<RouteChangeType, number> = {\n route_added: 0,\n route_removed: 0,\n schema_changed: 0,\n cfg_changed: 0,\n }\n const sourceObject: Record<SourceObjectChangeType, number> = {\n source_object_added: 0,\n source_object_removed: 0,\n source_schema_changed: 0,\n }\n\n for (const event of routeEvents) {\n route[event.type] += 1\n }\n\n for (const event of sourceEvents) {\n sourceObject[event.type] += 1\n }\n\n const byCommit: Record<\n string,\n { routeEvents: number; sourceEvents: number }\n > = {}\n for (const commit of commits) {\n byCommit[commit.sha] = { routeEvents: 0, sourceEvents: 0 }\n }\n\n for (const event of routeEvents) {\n byCommit[event.commitSha] ??= { routeEvents: 0, sourceEvents: 0 }\n byCommit[event.commitSha].routeEvents += 1\n }\n for (const event of sourceEvents) {\n byCommit[event.commitSha] ??= { routeEvents: 0, sourceEvents: 0 }\n byCommit[event.commitSha].sourceEvents += 1\n }\n\n return {\n route,\n sourceObject,\n byCommit,\n }\n}\n\nasync function loadChangelogInput(modulePath: string, exportName: string) {\n const mod = await import(`${pathToFileURL(modulePath).href}?v=${Date.now()}`)\n const value = (mod[exportName] ??\n (mod.default &&\n (mod.default as Record<string, unknown>)[exportName])) as unknown\n\n if (!value) {\n throw new Error(`Export \"${exportName}\" not found in module: ${modulePath}`)\n }\n\n return value\n}\n\nasync function ensureWorktreeDependencies(\n repoRoot: string,\n worktreeDir: string,\n) {\n const rootNodeModules = path.join(repoRoot, 'node_modules')\n const worktreeNodeModules = path.join(worktreeDir, 'node_modules')\n\n try {\n await fs.access(rootNodeModules)\n } catch {\n throw new Error(\n `Missing dependencies at ${rootNodeModules}. Run install in the repository root before changelog export.`,\n )\n }\n\n try {\n await fs.lstat(worktreeNodeModules)\n return\n } catch {\n // create symlink below\n }\n\n await fs.symlink(rootNodeModules, worktreeNodeModules, 'junction')\n}\n\nasync function pathExists(filePath: string) {\n try {\n await fs.access(filePath)\n return true\n } catch {\n return false\n }\n}\n\nfunction isTypeScriptModule(modulePath: string) {\n const ext = path.extname(modulePath).toLowerCase()\n return ext === '.ts' || ext === '.tsx' || ext === '.mts' || ext === '.cts'\n}\n\nfunction isJavaScriptModule(modulePath: string) {\n const ext = path.extname(modulePath).toLowerCase()\n return ext === '.js' || ext === '.mjs' || ext === '.cjs'\n}\n\nasync function resolveSnapshotTsconfig(\n worktreeDir: string,\n modulePath: string,\n tsconfigOverride?: string,\n) {\n if (tsconfigOverride) {\n const resolved = path.resolve(worktreeDir, tsconfigOverride)\n if (!(await pathExists(resolved))) {\n throw new Error(`tsconfig not found: ${resolved}`)\n }\n return resolved\n }\n\n let current = path.dirname(modulePath)\n const normalizedRoot = normalizePath(path.resolve(worktreeDir))\n\n // Walk upward from module directory to worktree root.\n while (true) {\n const candidate = path.join(current, 'tsconfig.json')\n if (await pathExists(candidate)) {\n return candidate\n }\n\n const parent = path.dirname(current)\n if (parent === current) break\n if (!normalizePath(parent).startsWith(normalizedRoot)) break\n current = parent\n }\n\n throw new Error(\n `Unable to resolve tsconfig for TypeScript module: ${modulePath}. Pass --tsconfig to override.`,\n )\n}\n\nfunction toEmittedModulePath(moduleRel: string) {\n const normalized = normalizePath(moduleRel)\n if (normalized.endsWith('.mts')) return normalized.slice(0, -4) + '.mjs'\n if (normalized.endsWith('.cts')) return normalized.slice(0, -4) + '.cjs'\n if (normalized.endsWith('.tsx')) return normalized.slice(0, -4) + '.js'\n if (normalized.endsWith('.ts')) return normalized.slice(0, -3) + '.js'\n return normalized\n}\n\nfunction buildCompileCacheKey(\n commitSha: string,\n moduleRel: string,\n tsconfigKeyPath: string,\n) {\n return crypto\n .createHash('sha1')\n .update(COMPILE_CACHE_VERSION)\n .update('\\n')\n .update(commitSha)\n .update('\\n')\n .update(normalizePath(moduleRel))\n .update('\\n')\n .update(normalizePath(tsconfigKeyPath))\n .digest('hex')\n}\n\nasync function collectFilesRecursive(rootDir: string): Promise<string[]> {\n const files: string[] = []\n\n const walk = async (dir: string): Promise<void> => {\n const entries = await fs.readdir(dir, { withFileTypes: true })\n for (const entry of entries) {\n const target = path.join(dir, entry.name)\n if (entry.isDirectory()) {\n await walk(target)\n continue\n }\n if (entry.isFile()) {\n files.push(target)\n }\n }\n }\n\n if (await pathExists(rootDir)) {\n await walk(rootDir)\n }\n\n return files\n}\n\nfunction suffixMatchScore(candidate: string, wanted: string) {\n const left = normalizePath(candidate).split('/')\n const right = normalizePath(wanted).split('/')\n let score = 0\n\n while (score < left.length && score < right.length) {\n const a = left[left.length - 1 - score]\n const b = right[right.length - 1 - score]\n if (a !== b) break\n score += 1\n }\n\n return score\n}\n\nasync function resolveEmittedEntryPath(emitRoot: string, moduleRel: string) {\n const expected = path.resolve(emitRoot, toEmittedModulePath(moduleRel))\n if (await pathExists(expected)) {\n return expected\n }\n\n const wantedRel = toEmittedModulePath(moduleRel)\n const wantedBase = path.posix.basename(normalizePath(wantedRel))\n const files = await collectFilesRecursive(emitRoot)\n const candidates = files.filter(\n (file) => path.posix.basename(normalizePath(file)) === wantedBase,\n )\n\n if (candidates.length === 0) {\n return undefined\n }\n\n candidates.sort(\n (a, b) => suffixMatchScore(b, wantedRel) - suffixMatchScore(a, wantedRel),\n )\n return candidates[0]\n}\n\nasync function compileSnapshotEntry(options: {\n worktreeDir: string\n moduleRel: string\n modulePath: string\n tsconfigPath: string\n commitSha: string\n cacheRoot: string\n noCache?: boolean\n log?: (message: string) => void\n}) {\n const log = options.log ?? (() => undefined)\n const relativeTsconfigPath = normalizePath(\n path.relative(options.worktreeDir, options.tsconfigPath),\n )\n const tsconfigKeyPath =\n relativeTsconfigPath.startsWith('..') ||\n path.isAbsolute(relativeTsconfigPath)\n ? normalizePath(options.tsconfigPath)\n : relativeTsconfigPath\n const cacheKey = buildCompileCacheKey(\n options.commitSha,\n options.moduleRel,\n tsconfigKeyPath,\n )\n const emitRoot = path.join(options.cacheRoot, cacheKey, 'dist')\n let emittedEntry = await resolveEmittedEntryPath(emitRoot, options.moduleRel)\n\n if (!options.noCache && emittedEntry && (await pathExists(emittedEntry))) {\n log(`[changelog] compile cache hit: ${options.commitSha.slice(0, 12)}`)\n return emittedEntry\n }\n\n log(\n `[changelog] compile cache ${options.noCache ? 'disabled' : 'miss'}: ${options.commitSha.slice(0, 12)}`,\n )\n await fs\n .rm(path.join(options.cacheRoot, cacheKey), {\n recursive: true,\n force: true,\n })\n .catch(() => undefined)\n await fs.mkdir(emitRoot, { recursive: true })\n\n const readResult = ts.readConfigFile(options.tsconfigPath, ts.sys.readFile)\n if (readResult.error) {\n throw new Error(\n ts.flattenDiagnosticMessageText(readResult.error.messageText, '\\n'),\n )\n }\n\n const parsed = ts.parseJsonConfigFileContent(\n readResult.config,\n ts.sys,\n path.dirname(options.tsconfigPath),\n )\n\n const compilerOptions: ts.CompilerOptions = {\n ...parsed.options,\n noEmit: false,\n declaration: false,\n declarationMap: false,\n sourceMap: false,\n inlineSourceMap: false,\n inlineSources: false,\n composite: false,\n incremental: false,\n tsBuildInfoFile: undefined,\n outDir: emitRoot,\n }\n\n const program = ts.createProgram([options.modulePath], compilerOptions)\n const emitResult = program.emit()\n\n const diagnostics = ts\n .getPreEmitDiagnostics(program)\n .concat(emitResult.diagnostics)\n .filter((diagnostic) => diagnostic.category === ts.DiagnosticCategory.Error)\n\n if (diagnostics.length > 0) {\n const host: ts.FormatDiagnosticsHost = {\n getCanonicalFileName: (fileName) => fileName,\n getCurrentDirectory: () => options.worktreeDir,\n getNewLine: () => '\\n',\n }\n const message = ts.formatDiagnosticsWithColorAndContext(\n diagnostics.slice(0, 20),\n host,\n )\n throw new Error(\n `TypeScript snapshot compile failed for ${options.moduleRel} at ${options.commitSha.slice(0, 12)}:\\n${message}`,\n )\n }\n\n emittedEntry = await resolveEmittedEntryPath(emitRoot, options.moduleRel)\n if (!emittedEntry || !(await pathExists(emittedEntry))) {\n throw new Error(\n `Compiled snapshot entry was not emitted for ${options.moduleRel} under ${emitRoot}. Check module/tsconfig compatibility.`,\n )\n }\n\n log(`[changelog] compiled snapshot entry: ${emittedEntry}`)\n return emittedEntry\n}\n\nasync function loadSnapshotExport(options: {\n entryPath: string\n exportName: string\n}) {\n return loadChangelogInput(options.entryPath, options.exportName)\n}\n\nasync function createSnapshot(\n repoRoot: string,\n moduleCandidates: readonly string[],\n exportName: string,\n commit: ChangelogCommit,\n tempRoot: string,\n tsconfigRel?: string,\n exportOptions?: Pick<\n ExportFinalizedLeavesChangelogOptions,\n 'handlers' | 'cacheDir' | 'noCache'\n >,\n log?: (message: string) => void,\n): Promise<CommitSnapshot> {\n const worktreeDir = path.join(tempRoot, `wt-${commit.sha.slice(0, 12)}`)\n await runGit(repoRoot, [\n 'worktree',\n 'add',\n '--detach',\n worktreeDir,\n commit.sha,\n ])\n\n try {\n try {\n await ensureWorktreeDependencies(repoRoot, worktreeDir)\n const resolvedModuleRel = await resolveModulePathForCommit(\n repoRoot,\n commit.sha,\n moduleCandidates,\n )\n\n if (!resolvedModuleRel) {\n log?.(\n `[changelog] unresolved module for commit ${commit.sha.slice(0, 12)}; using empty snapshot`,\n )\n return {\n commit,\n routesByKey: {},\n sourceObjectsById: {},\n unresolvedModule: true,\n fallbackReason: 'module_unresolved',\n }\n }\n\n log?.(\n `[changelog] resolved module for commit ${commit.sha.slice(0, 12)}: ${resolvedModuleRel}`,\n )\n const modulePath = path.resolve(worktreeDir, resolvedModuleRel)\n\n let snapshotRuntimePath = modulePath\n let resolvedTsconfigPath: string | undefined\n\n if (isTypeScriptModule(modulePath)) {\n resolvedTsconfigPath = await resolveSnapshotTsconfig(\n worktreeDir,\n modulePath,\n tsconfigRel,\n )\n log?.(`[changelog] using tsconfig: ${resolvedTsconfigPath}`)\n\n const compileCacheRoot = path.resolve(\n exportOptions?.cacheDir ??\n path.join(os.tmpdir(), 'rrroutes-export-changelog-cache'),\n )\n snapshotRuntimePath = await compileSnapshotEntry({\n worktreeDir,\n moduleRel: resolvedModuleRel,\n modulePath,\n tsconfigPath: resolvedTsconfigPath,\n commitSha: commit.sha,\n cacheRoot: compileCacheRoot,\n noCache: exportOptions?.noCache,\n log,\n })\n } else if (!isJavaScriptModule(modulePath)) {\n throw new Error(\n `Unsupported module extension for changelog snapshots: ${modulePath}`,\n )\n }\n\n const input = await loadSnapshotExport({\n entryPath: snapshotRuntimePath,\n exportName,\n })\n\n const payload = await exportFinalizedLeaves(input as never, {\n includeSource: true,\n sourceModulePath: modulePath,\n sourceExportName: exportName,\n tsconfigPath:\n resolvedTsconfigPath ??\n (tsconfigRel ? path.resolve(worktreeDir, tsconfigRel) : undefined),\n handlers: exportOptions?.handlers,\n })\n\n const routesByKey = toRouteSnapshots(payload)\n const sourceObjectsById = toSourceObjectSnapshots(routesByKey)\n\n return {\n commit,\n routesByKey,\n sourceObjectsById,\n }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n log?.(\n `[changelog] snapshot failed for ${commit.sha.slice(0, 12)}; using empty snapshot. ${message}`,\n )\n return {\n commit,\n routesByKey: {},\n sourceObjectsById: {},\n missing: true,\n fallbackReason: 'snapshot_error',\n fallbackError: message,\n }\n }\n } finally {\n await runGit(repoRoot, [\n 'worktree',\n 'remove',\n '--force',\n worktreeDir,\n ]).catch(() => undefined)\n await fs\n .rm(worktreeDir, { recursive: true, force: true })\n .catch(() => undefined)\n }\n}\n\nfunction toCanonicalGitSnapshot(snapshot: CommitSnapshot): RRRoutesSnapshot {\n const routes = Object.fromEntries(\n Object.entries(snapshot.routesByKey).map(([routeKey, route]) => [\n routeKey,\n {\n routeKey,\n method: route.method,\n path: route.path,\n contract: {\n serializedLeaf: {\n key: routeKey,\n method: route.method.toLowerCase(),\n path: route.path,\n cfg: { ...route.cfg, schemas: {} },\n },\n schemaFlat: route.flatSchema,\n source: route.sourceBySection,\n fingerprint: hashCanonicalValue({\n cfg: route.cfg,\n schema: route.flatSchema,\n }),\n },\n clients: [],\n sockets: [],\n status: {\n client: 'unbound',\n server: 'unavailable',\n socket: 'none',\n },\n },\n ]),\n )\n const snapshotHash = hashCanonicalValue(routes)\n return {\n schemaVersion: 1,\n meta: {\n capturedAt: snapshot.commit.authorDate,\n snapshotHash,\n commit: snapshot.commit.sha,\n packageVersions: {},\n },\n capabilities: {\n contract: true,\n client: false,\n server: false,\n socket: false,\n live: false,\n source: true,\n },\n routes,\n clients: {},\n servers: {},\n sockets: {},\n diagnostics: [],\n } as unknown as RRRoutesSnapshot\n}\n\nfunction diffSnapshots(\n previous: CommitSnapshot,\n current: CommitSnapshot,\n): {\n routeEvents: RouteChangeEvent[]\n sourceEvents: SourceObjectChangeEvent[]\n changeSet: RRRoutesChangeSet\n} {\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n const changeSet = diffRRRoutesSnapshots(\n toCanonicalGitSnapshot(previous),\n toCanonicalGitSnapshot(current),\n {\n scope: 'git',\n trigger: {\n type: 'git',\n externalId: current.commit.sha,\n label: current.commit.subject,\n },\n createdAt: current.commit.authorDate,\n },\n )\n const canonicalRouteTypes = new Map<string, Set<string>>()\n for (const change of changeSet.changes) {\n if (change.layer !== 'contract' || !change.routeKey) continue\n const types = canonicalRouteTypes.get(change.routeKey) ?? new Set<string>()\n types.add(change.type)\n canonicalRouteTypes.set(change.routeKey, types)\n }\n\n const routeKeys = new Set([\n ...Object.keys(previous.routesByKey),\n ...Object.keys(current.routesByKey),\n ])\n\n for (const routeKey of Array.from(routeKeys).sort()) {\n const prevRoute = previous.routesByKey[routeKey]\n const nextRoute = current.routesByKey[routeKey]\n\n const canonicalTypes =\n canonicalRouteTypes.get(routeKey) ?? new Set<string>()\n\n if (!prevRoute && nextRoute && canonicalTypes.has('route_added')) {\n const schemaDiff = diffRouteSchemas({}, nextRoute.flatSchema)\n routeEvents.push({\n type: 'route_added',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n })\n continue\n }\n\n if (prevRoute && !nextRoute && canonicalTypes.has('route_removed')) {\n routeEvents.push({\n type: 'route_removed',\n commitSha: current.commit.sha,\n routeKey,\n method: prevRoute.method,\n path: prevRoute.path,\n })\n continue\n }\n\n if (!prevRoute || !nextRoute) continue\n\n const schemaDiff = diffRouteSchemas(\n prevRoute.flatSchema,\n nextRoute.flatSchema,\n )\n if (schemaDiff.length > 0 && canonicalTypes.has('schema_changed')) {\n routeEvents.push({\n type: 'schema_changed',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n schemaDiff,\n })\n }\n\n const cfgDiff = diffRouteCfg(prevRoute.cfg, nextRoute.cfg)\n if (\n cfgDiff.length > 0 &&\n ['cfg_changed', 'description_changed', 'files_changed'].some((type) =>\n canonicalTypes.has(type),\n )\n ) {\n routeEvents.push({\n type: 'cfg_changed',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\n cfgDiff,\n })\n }\n }\n\n const sourceKeys = new Set([\n ...Object.keys(previous.sourceObjectsById),\n ...Object.keys(current.sourceObjectsById),\n ])\n\n for (const sourceObjectId of Array.from(sourceKeys).sort()) {\n const prevSource = previous.sourceObjectsById[sourceObjectId]\n const nextSource = current.sourceObjectsById[sourceObjectId]\n\n if (!prevSource && nextSource) {\n const schemaDiff = diffSourceSchemas(\n emptySourceSnapshotLike(nextSource),\n nextSource,\n )\n sourceEvents.push({\n type: 'source_object_added',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n })\n continue\n }\n\n if (prevSource && !nextSource) {\n sourceEvents.push({\n type: 'source_object_removed',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: prevSource.displayName,\n impactedRoutes: prevSource.routeKeys,\n })\n continue\n }\n\n if (!prevSource || !nextSource) continue\n\n const schemaDiff = diffSourceSchemas(prevSource, nextSource)\n const prevRoutes = new Set(prevSource.routeKeys)\n const nextRoutes = new Set(nextSource.routeKeys)\n const routeAdded = Array.from(nextRoutes).filter(\n (routeKey) => !prevRoutes.has(routeKey),\n )\n const routeRemoved = Array.from(prevRoutes).filter(\n (routeKey) => !nextRoutes.has(routeKey),\n )\n\n if (\n schemaDiff.length > 0 ||\n routeAdded.length > 0 ||\n routeRemoved.length > 0\n ) {\n sourceEvents.push({\n type: 'source_schema_changed',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\n schemaDiff: schemaDiff.length > 0 ? schemaDiff : undefined,\n routeAdded: routeAdded.length > 0 ? routeAdded : undefined,\n routeRemoved: routeRemoved.length > 0 ? routeRemoved : undefined,\n })\n }\n }\n\n return {\n routeEvents,\n sourceEvents,\n changeSet,\n }\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(process.cwd(), 'tools/finalized-leaves-viewer.html'),\n path.resolve(\n process.cwd(),\n 'packages/export/tools/finalized-leaves-viewer.html',\n ),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(\n payload: FinalizedLeavesChangelogExport,\n outFile: string,\n) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesChangelogExport,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectBakedInspectorPayload(template, payload, {\n marker: '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->',\n globalName: '__FINALIZED_LEAVES_PAYLOAD',\n scriptId: 'finalized-leaves-baked-payload',\n })\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport async function writeFinalizedLeavesChangelogExport(\n payload: FinalizedLeavesChangelogExport,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n\nexport async function exportFinalizedLeavesChangelog(\n options: ExportFinalizedLeavesChangelogOptions,\n): Promise<FinalizedLeavesChangelogExport> {\n const log = options.log ?? (() => undefined)\n const cwd = process.cwd()\n log(`[changelog] resolving repository root from ${cwd}`)\n const repoRoot = await runGit(cwd, ['rev-parse', '--show-toplevel'])\n const modulePathAbsolute = path.resolve(cwd, options.modulePath)\n const modulePathRelative = normalizePath(\n path.relative(repoRoot, modulePathAbsolute),\n )\n\n if (modulePathRelative.startsWith('..')) {\n throw new Error('modulePath must resolve inside the git repository root.')\n }\n\n const tsconfigAbsolute = options.tsconfigPath\n ? path.resolve(cwd, options.tsconfigPath)\n : undefined\n const tsconfigRelative = tsconfigAbsolute\n ? normalizePath(path.relative(repoRoot, tsconfigAbsolute))\n : undefined\n\n if (tsconfigRelative && tsconfigRelative.startsWith('..')) {\n throw new Error('tsconfigPath must resolve inside the git repository root.')\n }\n\n const exportName = options.exportName ?? 'leaves'\n log('[changelog] resolving commit window')\n const window = await resolveCommitWindow(repoRoot, options.from, options.to)\n log(\n `[changelog] window: ${window.from.slice(0, 12)}..${window.to.slice(0, 12)}`,\n )\n const moduleCandidates = await buildModulePathCandidates(\n repoRoot,\n window.to,\n modulePathRelative,\n )\n log(`[changelog] module candidates discovered: ${moduleCandidates.length}`)\n const allCommits = await resolveCommitPath(repoRoot, window.from, window.to)\n log(`[changelog] commits in ancestry path: ${allCommits.length}`)\n const selectedCommitShas = await filterCommits(\n repoRoot,\n allCommits,\n moduleCandidates,\n tsconfigRelative,\n )\n log(`[changelog] commits after path filter: ${selectedCommitShas.length}`)\n\n if (selectedCommitShas.length === 0) {\n selectedCommitShas.push(window.to)\n log('[changelog] filter returned no commits, forcing tip commit inclusion')\n }\n\n const commits: ChangelogCommit[] = []\n log('[changelog] loading commit metadata')\n for (const commit of selectedCommitShas) {\n commits.push(await getCommitMetadata(repoRoot, commit))\n }\n\n const tempRoot = await fs.mkdtemp(\n path.join(os.tmpdir(), 'rrroutes-export-changelog-'),\n )\n log(`[changelog] temp workspace: ${tempRoot}`)\n try {\n const snapshots: CommitSnapshot[] = []\n const unresolvedModuleCommits: string[] = []\n const snapshotFallbacks: Array<{\n sha: string\n reason: 'module_unresolved' | 'snapshot_error'\n error?: string\n }> = []\n\n for (let index = 0; index < commits.length; index += 1) {\n const commit = commits[index]\n log(\n `[changelog] snapshot ${index + 1}/${commits.length}: ${commit.sha.slice(0, 12)} ${commit.subject}`,\n )\n snapshots.push(\n await createSnapshot(\n repoRoot,\n moduleCandidates,\n exportName,\n commit,\n tempRoot,\n tsconfigRelative,\n options,\n log,\n ),\n )\n const lastSnapshot = snapshots[snapshots.length - 1]\n if (lastSnapshot?.unresolvedModule) {\n unresolvedModuleCommits.push(commit.sha)\n }\n if (lastSnapshot?.fallbackReason) {\n snapshotFallbacks.push({\n sha: commit.sha,\n reason: lastSnapshot.fallbackReason,\n error: lastSnapshot.fallbackError,\n })\n }\n }\n\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n const changeSets: RRRoutesChangeSet[] = []\n\n log('[changelog] diffing successful snapshots')\n let previousSnapshot: CommitSnapshot | undefined\n for (const snapshot of snapshots) {\n if (snapshot.missing) {\n continue\n }\n if (!previousSnapshot) {\n previousSnapshot = snapshot\n continue\n }\n const {\n routeEvents: nextRouteEvents,\n sourceEvents: nextSourceEvents,\n changeSet,\n } = diffSnapshots(previousSnapshot, snapshot)\n routeEvents.push(...nextRouteEvents)\n sourceEvents.push(...nextSourceEvents)\n changeSets.push(changeSet)\n previousSnapshot = snapshot\n }\n log(\n `[changelog] diff complete: route events=${routeEvents.length}, source events=${sourceEvents.length}`,\n )\n\n const payload: FinalizedLeavesChangelogExport = {\n kind: 'finalized-leaves-changelog',\n _meta: {\n generatedAt: new Date().toISOString(),\n description:\n 'Git-history changelog for RRRoutes finalized leaves with route-level and source-object schema diffs.',\n modulePath: options.modulePath,\n exportName,\n from: window.from,\n to: window.to,\n selectedCommitCount: commits.length,\n unresolvedModuleCommits:\n unresolvedModuleCommits.length > 0\n ? unresolvedModuleCommits\n : undefined,\n snapshotFallbacks:\n snapshotFallbacks.length > 0 ? snapshotFallbacks : undefined,\n },\n commits,\n byRoute: routeRecordByKey(routeEvents),\n bySourceObject: sourceRecordById(sourceEvents),\n rollups: buildRollups(routeEvents, sourceEvents, commits),\n changeSets,\n }\n\n if (options.outFile || options.htmlFile) {\n log('[changelog] writing output artifacts')\n await writeFinalizedLeavesChangelogExport(payload, {\n outFile: options.outFile,\n htmlFile: options.htmlFile,\n viewerTemplateFile: options.viewerTemplateFile,\n openOnFinish: options.openOnFinish,\n })\n }\n log('[changelog] done')\n\n return payload\n } finally {\n await fs\n .rm(tempRoot, { recursive: true, force: true })\n .catch(() => undefined)\n log('[changelog] cleaned temp workspace')\n }\n}\n\nexport const __private = {\n resolveCommitWindow,\n resolveCommitPath,\n filterCommits,\n buildModulePathCandidates,\n resolveModulePathForCommit,\n resolveSnapshotTsconfig,\n toEmittedModulePath,\n buildCompileCacheKey,\n compileSnapshotEntry,\n loadSnapshotExport,\n toRouteSnapshots,\n toSourceObjectSnapshots,\n diffSnapshots,\n buildSourceIdentity,\n}\n","import type { JsonValue, RRRoutesSnapshot } from './types'\n\nfunction compareJson(left: JsonValue, right: JsonValue): number {\n return JSON.stringify(left).localeCompare(JSON.stringify(right))\n}\n\nfunction canonicalizeValue(\n value: unknown,\n key?: string,\n): JsonValue | undefined {\n if (\n value === undefined ||\n typeof value === 'function' ||\n typeof value === 'symbol'\n ) {\n return undefined\n }\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return value\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : null\n }\n if (typeof value === 'bigint') return String(value)\n if (value instanceof Date) return value.toISOString()\n if (Array.isArray(value)) {\n const array = value\n .map((item) => canonicalizeValue(item))\n .filter((item): item is JsonValue => item !== undefined)\n if (key === 'tags' || key === 'events' || key === 'eventNames') {\n return array.slice().sort(compareJson)\n }\n return array\n }\n if (typeof value !== 'object') return undefined\n\n const out: Record<string, JsonValue> = {}\n for (const property of Object.keys(value as object).sort()) {\n const child = canonicalizeValue(\n (value as Record<string, unknown>)[property],\n property,\n )\n if (child !== undefined) out[property] = child\n }\n return out\n}\n\nexport function canonicalizeJson(value: unknown): JsonValue {\n return canonicalizeValue(value) ?? null\n}\n\nexport function canonicalSnapshotStructure(\n snapshot: RRRoutesSnapshot,\n options: { includeLive?: boolean } = {},\n): JsonValue {\n const sockets = Object.fromEntries(\n Object.entries(snapshot.sockets).map(([identity, socket]) => [\n identity,\n options.includeLive ? socket : { ...socket, live: undefined },\n ]),\n )\n return canonicalizeJson({\n ...snapshot,\n meta: {\n ...snapshot.meta,\n capturedAt: undefined,\n snapshotHash: undefined,\n },\n capabilities: {\n ...snapshot.capabilities,\n live: false,\n },\n sockets,\n })\n}\n\nexport function stableStringify(value: unknown): string {\n return JSON.stringify(canonicalizeJson(value))\n}\n","import { createHash } from 'node:crypto'\nimport { canonicalSnapshotStructure, stableStringify } from './canonicalize'\nimport type { RRRoutesSnapshot } from './types'\n\nexport function hashCanonicalValue(value: unknown): string {\n return createHash('sha256').update(stableStringify(value)).digest('hex')\n}\n\nexport function hashRRRoutesSnapshot(\n snapshot: RRRoutesSnapshot,\n options: { includeLive?: boolean } = {},\n): string {\n return hashCanonicalValue(canonicalSnapshotStructure(snapshot, options))\n}\n","import type { RouteKey } from '@emeryld/rrroutes-contract'\nimport { canonicalizeJson, stableStringify } from '../snapshot/canonicalize'\nimport { hashCanonicalValue } from '../snapshot/hash'\nimport type {\n ClientAugmentInspection,\n ClientRouteInspection,\n ClientSocketConnectionInspection,\n JsonValue,\n MiddlewareInspection,\n RRRoutesSnapshot,\n ServerRouteInspection,\n} from '../snapshot/types'\nimport type {\n DiffOptions,\n FieldChange,\n RRRoutesChange,\n RRRoutesChangeLayer,\n RRRoutesChangeSet,\n RRRoutesChangeSeverity,\n RRRoutesChangeSummary,\n RRRoutesChangeType,\n} from './types'\n\nfunction same(left: unknown, right: unknown): boolean {\n return stableStringify(left) === stableStringify(right)\n}\n\nfunction severityFor(type: RRRoutesChangeType): RRRoutesChangeSeverity {\n switch (type) {\n case 'route_removed':\n case 'client_binding_removed':\n case 'client_resource_removed':\n case 'server_controller_unregistered':\n case 'server_endpoint_disabled':\n case 'socket_runtime_removed':\n case 'socket_contract_event_removed':\n return 'breaking'\n case 'schema_changed':\n case 'cfg_changed':\n case 'client_binding_target_changed':\n case 'client_build_options_changed':\n case 'client_augment_changed':\n case 'client_augment_reordered':\n case 'client_socket_connection_changed':\n case 'server_controller_changed':\n case 'server_middleware_changed':\n case 'server_middleware_reordered':\n case 'server_output_validation_changed':\n case 'socket_payload_schema_changed':\n case 'socket_binding_changed':\n case 'socket_room_strategy_changed':\n case 'socket_cache_reducer_changed':\n case 'socket_heartbeat_configuration_changed':\n return 'behavioral'\n case 'route_added':\n case 'client_resource_added':\n case 'client_binding_added':\n case 'client_binding_enabled':\n case 'client_augment_added':\n case 'client_socket_connection_added':\n case 'server_controller_registered':\n case 'server_endpoint_enabled':\n case 'server_middleware_added':\n case 'socket_runtime_added':\n case 'socket_contract_event_added':\n case 'socket_handler_added':\n return 'non-breaking'\n case 'route_id_changed':\n case 'description_changed':\n case 'files_changed':\n case 'source_changed':\n case 'client_binding_disabled':\n case 'client_augment_removed':\n case 'client_socket_connection_removed':\n case 'server_middleware_removed':\n case 'socket_handler_removed':\n return 'informational'\n }\n}\n\ntype ChangeInput = Omit<RRRoutesChange, 'id' | 'severity'> & {\n severity?: RRRoutesChangeSeverity\n}\n\nfunction makeChange(input: ChangeInput): RRRoutesChange {\n const before =\n input.before === undefined ? undefined : canonicalizeJson(input.before)\n const after =\n input.after === undefined ? undefined : canonicalizeJson(input.after)\n const base = {\n ...input,\n before,\n after,\n severity: input.severity ?? severityFor(input.type),\n }\n return {\n ...base,\n id: hashCanonicalValue(base),\n }\n}\n\nfunction fieldChanges(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n fields: readonly string[],\n): FieldChange[] {\n return fields.flatMap((field) =>\n same(before[field], after[field])\n ? []\n : [\n {\n field,\n before: canonicalizeJson(before[field]),\n after: canonicalizeJson(after[field]),\n },\n ],\n )\n}\n\nfunction diffContract(\n before: RRRoutesSnapshot,\n after: RRRoutesSnapshot,\n): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const keys = new Set([\n ...Object.keys(before.routes),\n ...Object.keys(after.routes),\n ])\n for (const routeKey of Array.from(keys).sort() as RouteKey[]) {\n const previous = before.routes[routeKey]\n const next = after.routes[routeKey]\n if (!previous && next) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'route_added',\n routeKey,\n entityId: routeKey,\n after: next.contract.serializedLeaf as unknown as JsonValue,\n }),\n )\n continue\n }\n if (previous && !next) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'route_removed',\n routeKey,\n entityId: routeKey,\n before: previous.contract.serializedLeaf as unknown as JsonValue,\n }),\n )\n continue\n }\n if (!previous || !next) continue\n if (previous.id !== next.id) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'route_id_changed',\n routeKey,\n entityId: routeKey,\n before: previous.id,\n after: next.id,\n }),\n )\n }\n if (!same(previous.contract.schemaFlat, next.contract.schemaFlat)) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'schema_changed',\n routeKey,\n entityId: routeKey,\n before: previous.contract.schemaFlat as unknown as JsonValue,\n after: next.contract.schemaFlat as unknown as JsonValue,\n }),\n )\n }\n const previousCfg = previous.contract.serializedLeaf.cfg\n const nextCfg = next.contract.serializedLeaf.cfg\n if (previousCfg.description !== nextCfg.description) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'description_changed',\n routeKey,\n entityId: routeKey,\n before: previousCfg.description,\n after: nextCfg.description,\n }),\n )\n }\n if (!same(previousCfg.bodyFiles, nextCfg.bodyFiles)) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'files_changed',\n routeKey,\n entityId: routeKey,\n before: previousCfg.bodyFiles as unknown as JsonValue,\n after: nextCfg.bodyFiles as unknown as JsonValue,\n }),\n )\n }\n const cfgFields = [\n 'summary',\n 'docsGroup',\n 'tags',\n 'deprecated',\n 'stability',\n 'docsHidden',\n 'docsMeta',\n 'feed',\n ] as const\n const fields = fieldChanges(\n previousCfg as unknown as Record<string, unknown>,\n nextCfg as unknown as Record<string, unknown>,\n cfgFields,\n )\n if (fields.length > 0) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'cfg_changed',\n routeKey,\n entityId: routeKey,\n before: previousCfg as unknown as JsonValue,\n after: nextCfg as unknown as JsonValue,\n changedFields: fields,\n }),\n )\n }\n if (!same(previous.contract.source, next.contract.source)) {\n changes.push(\n makeChange({\n layer: 'contract',\n type: 'source_changed',\n routeKey,\n entityId: routeKey,\n before: previous.contract.source as unknown as JsonValue,\n after: next.contract.source as unknown as JsonValue,\n }),\n )\n }\n }\n return changes\n}\n\nfunction diffOrderedEntities<\n T extends { identity: string; order: number },\n>(args: {\n before: readonly T[]\n after: readonly T[]\n layer: RRRoutesChangeLayer\n routeKey?: RouteKey\n added: RRRoutesChangeType\n removed: RRRoutesChangeType\n changed: RRRoutesChangeType\n reordered: RRRoutesChangeType\n}): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const previous = new Map(args.before.map((item) => [item.identity, item]))\n const next = new Map(args.after.map((item) => [item.identity, item]))\n const identities = new Set([...previous.keys(), ...next.keys()])\n for (const identity of Array.from(identities).sort()) {\n const left = previous.get(identity)\n const right = next.get(identity)\n if (!left && right) {\n changes.push(\n makeChange({\n layer: args.layer,\n type: args.added,\n routeKey: args.routeKey,\n entityId: identity,\n after: right as unknown as JsonValue,\n }),\n )\n } else if (left && !right) {\n changes.push(\n makeChange({\n layer: args.layer,\n type: args.removed,\n routeKey: args.routeKey,\n entityId: identity,\n before: left as unknown as JsonValue,\n }),\n )\n } else if (left && right) {\n const leftWithoutOrder = { ...left, order: undefined }\n const rightWithoutOrder = { ...right, order: undefined }\n if (!same(leftWithoutOrder, rightWithoutOrder)) {\n changes.push(\n makeChange({\n layer: args.layer,\n type: args.changed,\n routeKey: args.routeKey,\n entityId: identity,\n before: left as unknown as JsonValue,\n after: right as unknown as JsonValue,\n }),\n )\n } else if (left.order !== right.order) {\n changes.push(\n makeChange({\n layer: args.layer,\n type: args.reordered,\n routeKey: args.routeKey,\n entityId: identity,\n before: left.order,\n after: right.order,\n }),\n )\n }\n }\n }\n return changes\n}\n\nfunction allBindings(\n snapshot: RRRoutesSnapshot,\n): Map<string, ClientRouteInspection> {\n const map = new Map<string, ClientRouteInspection>()\n for (const client of Object.values(snapshot.clients)) {\n for (const binding of client.bindings)\n map.set(binding.bindingIdentity, binding)\n }\n return map\n}\n\nfunction diffClientSocketConnections(args: {\n before: readonly ClientSocketConnectionInspection[]\n after: readonly ClientSocketConnectionInspection[]\n routeKey: RouteKey\n}): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const previous = new Map(args.before.map((item) => [item.identity, item]))\n const next = new Map(args.after.map((item) => [item.identity, item]))\n const identities = new Set([...previous.keys(), ...next.keys()])\n\n for (const identity of Array.from(identities).sort()) {\n const left = previous.get(identity)\n const right = next.get(identity)\n if (!left && right) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_socket_connection_added',\n routeKey: args.routeKey,\n entityId: identity,\n after: right as unknown as JsonValue,\n }),\n )\n continue\n }\n if (left && !right) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_socket_connection_removed',\n routeKey: args.routeKey,\n entityId: identity,\n before: left as unknown as JsonValue,\n }),\n )\n continue\n }\n if (!left || !right) continue\n\n const leftConnection = {\n id: left.id,\n name: left.name,\n events: left.events,\n order: left.order,\n identityStability: left.identityStability,\n }\n const rightConnection = {\n id: right.id,\n name: right.name,\n events: right.events,\n order: right.order,\n identityStability: right.identityStability,\n }\n if (!same(leftConnection, rightConnection)) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_socket_connection_changed',\n routeKey: args.routeKey,\n entityId: identity,\n before: leftConnection as unknown as JsonValue,\n after: rightConnection as unknown as JsonValue,\n }),\n )\n }\n if (!same(left.roomStrategy, right.roomStrategy)) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_room_strategy_changed',\n routeKey: args.routeKey,\n entityId: identity,\n before: left.roomStrategy,\n after: right.roomStrategy,\n }),\n )\n }\n if (!same(left.cacheReducers, right.cacheReducers)) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_cache_reducer_changed',\n routeKey: args.routeKey,\n entityId: identity,\n before: left.cacheReducers,\n after: right.cacheReducers,\n }),\n )\n }\n }\n return changes\n}\n\nfunction diffClients(\n before: RRRoutesSnapshot,\n after: RRRoutesSnapshot,\n): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const resourceIds = new Set([\n ...Object.keys(before.clients),\n ...Object.keys(after.clients),\n ])\n for (const identity of Array.from(resourceIds).sort()) {\n if (!before.clients[identity] && after.clients[identity]) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_resource_added',\n entityId: identity,\n after: after.clients[identity] as unknown as JsonValue,\n }),\n )\n } else if (before.clients[identity] && !after.clients[identity]) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_resource_removed',\n entityId: identity,\n before: before.clients[identity] as unknown as JsonValue,\n }),\n )\n }\n }\n\n const previous = allBindings(before)\n const next = allBindings(after)\n const identities = new Set([...previous.keys(), ...next.keys()])\n for (const identity of Array.from(identities).sort()) {\n const left = previous.get(identity)\n const right = next.get(identity)\n if (!left && right) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_binding_added',\n routeKey: right.routeKey,\n entityId: identity,\n after: right as unknown as JsonValue,\n }),\n )\n continue\n }\n if (left && !right) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_binding_removed',\n routeKey: left.routeKey,\n entityId: identity,\n before: left as unknown as JsonValue,\n }),\n )\n continue\n }\n if (!left || !right) continue\n if (left.routeKey !== right.routeKey) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_binding_target_changed',\n routeKey: right.routeKey,\n entityId: identity,\n before: left.routeKey,\n after: right.routeKey,\n }),\n )\n }\n if (left.enabled !== right.enabled) {\n changes.push(\n makeChange({\n layer: 'client',\n type: right.enabled\n ? 'client_binding_enabled'\n : 'client_binding_disabled',\n routeKey: right.routeKey,\n entityId: identity,\n before: left.enabled,\n after: right.enabled,\n }),\n )\n }\n if (!same(left.build, right.build)) {\n changes.push(\n makeChange({\n layer: 'client',\n type: 'client_build_options_changed',\n routeKey: right.routeKey,\n entityId: identity,\n before: left.build as unknown as JsonValue,\n after: right.build as unknown as JsonValue,\n }),\n )\n }\n changes.push(\n ...diffOrderedEntities<ClientAugmentInspection>({\n before: left.augments,\n after: right.augments,\n layer: 'client',\n routeKey: right.routeKey,\n added: 'client_augment_added',\n removed: 'client_augment_removed',\n changed: 'client_augment_changed',\n reordered: 'client_augment_reordered',\n }),\n )\n changes.push(\n ...diffClientSocketConnections({\n before: left.socketConnections,\n after: right.socketConnections,\n routeKey: right.routeKey,\n }),\n )\n }\n return changes\n}\n\nfunction routeServerMap(\n snapshot: RRRoutesSnapshot,\n): Map<RouteKey, ServerRouteInspection> {\n const map = new Map<RouteKey, ServerRouteInspection>()\n for (const [routeKey, route] of Object.entries(snapshot.routes) as [\n RouteKey,\n (typeof snapshot.routes)[RouteKey],\n ][]) {\n if (route.server) map.set(routeKey, route.server)\n }\n return map\n}\n\nfunction diffServers(\n before: RRRoutesSnapshot,\n after: RRRoutesSnapshot,\n): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const previous = routeServerMap(before)\n const next = routeServerMap(after)\n const keys = new Set([...previous.keys(), ...next.keys()])\n for (const routeKey of Array.from(keys).sort()) {\n const left = previous.get(routeKey)\n const right = next.get(routeKey)\n if ((!left || !left.registered) && right?.registered) {\n changes.push(\n makeChange({\n layer: 'server',\n type: 'server_controller_registered',\n routeKey,\n entityId: right.controllerId ?? routeKey,\n after: right as unknown as JsonValue,\n }),\n )\n continue\n }\n if (left?.registered && (!right || !right.registered)) {\n changes.push(\n makeChange({\n layer: 'server',\n type: 'server_controller_unregistered',\n routeKey,\n entityId: left.controllerId ?? routeKey,\n before: left as unknown as JsonValue,\n }),\n )\n continue\n }\n if (!left || !right || !left.registered || !right.registered) continue\n if (left.enabled !== right.enabled) {\n changes.push(\n makeChange({\n layer: 'server',\n type: right.enabled\n ? 'server_endpoint_enabled'\n : 'server_endpoint_disabled',\n routeKey,\n entityId: right.controllerId ?? routeKey,\n before: left.enabled,\n after: right.enabled,\n }),\n )\n }\n if (\n left.controllerId !== right.controllerId ||\n left.controllerName !== right.controllerName\n ) {\n changes.push(\n makeChange({\n layer: 'server',\n type: 'server_controller_changed',\n routeKey,\n entityId: right.controllerId ?? routeKey,\n before: {\n id: left.controllerId ?? null,\n name: left.controllerName ?? null,\n },\n after: {\n id: right.controllerId ?? null,\n name: right.controllerName ?? null,\n },\n }),\n )\n }\n changes.push(\n ...diffOrderedEntities<MiddlewareInspection>({\n before: left.before,\n after: right.before,\n layer: 'server',\n routeKey,\n added: 'server_middleware_added',\n removed: 'server_middleware_removed',\n changed: 'server_middleware_changed',\n reordered: 'server_middleware_reordered',\n }),\n )\n if (left.validateOutput !== right.validateOutput) {\n changes.push(\n makeChange({\n layer: 'server',\n type: 'server_output_validation_changed',\n routeKey,\n entityId: right.controllerId ?? routeKey,\n before: left.validateOutput,\n after: right.validateOutput,\n }),\n )\n }\n }\n return changes\n}\n\nfunction diffSockets(\n before: RRRoutesSnapshot,\n after: RRRoutesSnapshot,\n): RRRoutesChange[] {\n const changes: RRRoutesChange[] = []\n const identities = new Set([\n ...Object.keys(before.sockets),\n ...Object.keys(after.sockets),\n ])\n for (const identity of Array.from(identities).sort()) {\n const left = before.sockets[identity]\n const right = after.sockets[identity]\n if (!left && right) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_runtime_added',\n entityId: identity,\n after: right as unknown as JsonValue,\n }),\n )\n continue\n }\n if (left && !right) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_runtime_removed',\n entityId: identity,\n before: left as unknown as JsonValue,\n }),\n )\n continue\n }\n if (!left || !right) continue\n const eventNames = new Set([\n ...Object.keys(left.contract.events),\n ...Object.keys(right.contract.events),\n ])\n for (const eventName of Array.from(eventNames).sort()) {\n const previousEvent = left.contract.events[eventName]\n const nextEvent = right.contract.events[eventName]\n const eventIdentity = `${identity}:event:${eventName}`\n if (!previousEvent && nextEvent) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_contract_event_added',\n entityId: eventIdentity,\n after: nextEvent as unknown as JsonValue,\n }),\n )\n } else if (previousEvent && !nextEvent) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_contract_event_removed',\n entityId: eventIdentity,\n before: previousEvent as unknown as JsonValue,\n }),\n )\n } else if (\n previousEvent &&\n nextEvent &&\n !same(previousEvent.schema, nextEvent.schema)\n ) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_payload_schema_changed',\n entityId: eventIdentity,\n before: previousEvent.schema as unknown as JsonValue,\n after: nextEvent.schema as unknown as JsonValue,\n }),\n )\n }\n }\n if (!same(left.configuration.heartbeat, right.configuration.heartbeat)) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_heartbeat_configuration_changed',\n entityId: identity,\n before: left.configuration.heartbeat,\n after: right.configuration.heartbeat,\n }),\n )\n }\n const previousHandlers = new Map(\n left.configuration.handlers.map((handler) => [handler.identity, handler]),\n )\n const nextHandlers = new Map(\n right.configuration.handlers.map((handler) => [handler.identity, handler]),\n )\n for (const handlerIdentity of Array.from(\n new Set([...previousHandlers.keys(), ...nextHandlers.keys()]),\n ).sort()) {\n const previousHandler = previousHandlers.get(handlerIdentity)\n const nextHandler = nextHandlers.get(handlerIdentity)\n if (!previousHandler && nextHandler) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_handler_added',\n entityId: handlerIdentity,\n after: nextHandler as unknown as JsonValue,\n }),\n )\n } else if (previousHandler && !nextHandler) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_handler_removed',\n entityId: handlerIdentity,\n before: previousHandler as unknown as JsonValue,\n }),\n )\n } else if (\n previousHandler &&\n nextHandler &&\n !same(previousHandler, nextHandler)\n ) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_handler_removed',\n entityId: handlerIdentity,\n before: previousHandler as unknown as JsonValue,\n }),\n makeChange({\n layer: 'socket',\n type: 'socket_handler_added',\n entityId: handlerIdentity,\n after: nextHandler as unknown as JsonValue,\n }),\n )\n }\n }\n const previousBindings = new Map(\n left.bindings.map((binding) => [binding.identity, binding]),\n )\n const nextBindings = new Map(\n right.bindings.map((binding) => [binding.identity, binding]),\n )\n for (const bindingIdentity of Array.from(\n new Set([...previousBindings.keys(), ...nextBindings.keys()]),\n ).sort()) {\n const previousBinding = previousBindings.get(bindingIdentity)\n const nextBinding = nextBindings.get(bindingIdentity)\n if (!same(previousBinding, nextBinding)) {\n changes.push(\n makeChange({\n layer: 'socket',\n type: 'socket_binding_changed',\n routeKey: nextBinding?.routeKey ?? previousBinding?.routeKey,\n entityId: bindingIdentity,\n before: previousBinding as unknown as JsonValue,\n after: nextBinding as unknown as JsonValue,\n }),\n )\n }\n }\n }\n return changes\n}\n\nfunction summarize(changes: readonly RRRoutesChange[]): RRRoutesChangeSummary {\n const byLayer: RRRoutesChangeSummary['byLayer'] = {\n contract: 0,\n client: 0,\n server: 0,\n socket: 0,\n }\n const bySeverity: RRRoutesChangeSummary['bySeverity'] = {\n breaking: 0,\n behavioral: 0,\n 'non-breaking': 0,\n informational: 0,\n }\n const byType: RRRoutesChangeSummary['byType'] = {}\n for (const change of changes) {\n byLayer[change.layer] += 1\n bySeverity[change.severity] += 1\n byType[change.type] = (byType[change.type] ?? 0) + 1\n }\n return { total: changes.length, byLayer, bySeverity, byType }\n}\n\nexport function diffRRRoutesSnapshots(\n before: RRRoutesSnapshot,\n after: RRRoutesSnapshot,\n options: DiffOptions = {},\n): RRRoutesChangeSet {\n const changes = [\n ...diffContract(before, after),\n ...diffClients(before, after),\n ...diffServers(before, after),\n ...diffSockets(before, after),\n ].sort((left, right) => {\n const route = (left.routeKey ?? '').localeCompare(right.routeKey ?? '')\n if (route !== 0) return route\n const layer = left.layer.localeCompare(right.layer)\n if (layer !== 0) return layer\n const type = left.type.localeCompare(right.type)\n return type !== 0 ? type : left.entityId.localeCompare(right.entityId)\n })\n const scope = options.scope ?? 'default'\n const trigger = options.trigger ?? { type: 'manual' }\n const transition = {\n scope,\n from: before.meta.snapshotHash,\n to: after.meta.snapshotHash,\n }\n return {\n id: hashCanonicalValue(transition),\n scope,\n createdAt: options.createdAt ?? new Date().toISOString(),\n from: {\n snapshotHash: before.meta.snapshotHash,\n capturedAt: before.meta.capturedAt,\n checkpointId: options.fromCheckpointId,\n },\n to: {\n snapshotHash: after.meta.snapshotHash,\n capturedAt: after.meta.capturedAt,\n checkpointId: options.toCheckpointId,\n },\n trigger,\n summary: summarize(changes),\n changes,\n }\n}\n\nexport const createSnapshotChangeSet = diffRRRoutesSnapshots\n","import path from 'node:path'\nimport {\n exportFinalizedLeavesChangelog,\n type ExportFinalizedLeavesChangelogOptions,\n} from './exportFinalizedLeaves.changelog'\n\nexport type FinalizedLeavesChangelogCliArgs = {\n modulePath: string\n exportName: string\n outFile: string\n htmlFile?: string\n tsconfigPath?: string\n from?: string\n to?: string\n cacheDir?: string\n noCache: boolean\n}\n\nexport function parseFinalizedLeavesChangelogCliArgs(\n argv: string[],\n): FinalizedLeavesChangelogCliArgs {\n const args = new Map<string, string>()\n let noCache = false\n\n for (let i = 0; i < argv.length; i += 1) {\n const key = argv[i]\n if (key === '--') continue\n if (!key.startsWith('--')) continue\n if (key === '--with-source') {\n continue\n }\n if (key === '--no-cache') {\n noCache = true\n continue\n }\n const value = argv[i + 1]\n if (!value || value.startsWith('--')) {\n throw new Error(`Missing value for ${key}`)\n }\n args.set(key, value)\n i += 1\n }\n\n const modulePath = args.get('--module')\n if (!modulePath) {\n throw new Error('Missing required --module argument')\n }\n\n return {\n modulePath,\n exportName: args.get('--export') ?? 'leaves',\n outFile: args.get('--out') ?? 'finalized-leaves.changelog.json',\n htmlFile: args.get('--html') ?? undefined,\n tsconfigPath: args.get('--tsconfig') ?? undefined,\n from: args.get('--from') ?? undefined,\n to: args.get('--to') ?? undefined,\n cacheDir: args.get('--cache-dir') ?? undefined,\n noCache,\n }\n}\n\nexport async function runExportFinalizedLeavesChangelogCli(argv: string[]) {\n const args = parseFinalizedLeavesChangelogCliArgs(argv)\n const log = (message: string) => {\n process.stdout.write(`${message}\\n`)\n }\n const options: ExportFinalizedLeavesChangelogOptions = {\n modulePath: args.modulePath,\n exportName: args.exportName,\n outFile: args.outFile,\n htmlFile: args.htmlFile,\n tsconfigPath: args.tsconfigPath,\n from: args.from,\n to: args.to,\n includeSource: true,\n cacheDir: args.cacheDir,\n noCache: args.noCache,\n log,\n }\n\n log('[changelog-cli] starting changelog export')\n const payload = await exportFinalizedLeavesChangelog(options)\n log('[changelog-cli] changelog export completed')\n\n return {\n payload,\n outFile: path.resolve(args.outFile),\n htmlFile: args.htmlFile ? path.resolve(args.htmlFile) : undefined,\n }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { spawn } from 'node:child_process'\nimport { DEFAULT_VIEWER_TEMPLATE } from './defaultViewerTemplate'\nimport type {\n FinalizedLeavesExport,\n WriteFinalizedLeavesExportOptions,\n} from './exportFinalizedLeaves'\nimport type { FinalizedLeavesChangelogExport } from './exportFinalizedLeaves.changelog'\nimport { injectBakedInspectorPayload } from './files/baked-payload'\n\nexport type FinalizedLeavesViewerBundleMeta = {\n generatedAt: string\n description: string\n}\n\nexport type FinalizedLeavesViewerBundle = {\n kind: 'finalized-leaves-bundle'\n _meta: FinalizedLeavesViewerBundleMeta\n leavesPayload: FinalizedLeavesExport\n changelogPayload: FinalizedLeavesChangelogExport\n}\n\nexport type BuildFinalizedLeavesViewerBundleInput = {\n leavesPayload: FinalizedLeavesExport\n changelogPayload: FinalizedLeavesChangelogExport\n}\n\nasync function resolveViewerTemplatePath(viewerTemplateFile?: string) {\n if (viewerTemplateFile) {\n const resolved = path.resolve(viewerTemplateFile)\n await fs.access(resolved)\n return resolved\n }\n\n const candidates = [\n path.resolve(\n process.cwd(),\n 'node_modules/@emeryld/rrroutes-export/tools/finalized-leaves-viewer.html',\n ),\n path.resolve(process.cwd(), 'tools/finalized-leaves-viewer.html'),\n path.resolve(\n process.cwd(),\n 'packages/export/tools/finalized-leaves-viewer.html',\n ),\n ]\n\n for (const candidate of candidates) {\n try {\n await fs.access(candidate)\n return candidate\n } catch {\n // try next\n }\n }\n\n return undefined\n}\n\nasync function writeJsonExport(\n payload: FinalizedLeavesViewerBundle,\n outFile: string,\n) {\n const resolved = path.resolve(outFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(payload, null, 2)}\\n`, 'utf8')\n return resolved\n}\n\nasync function writeBakedHtmlExport(\n payload: FinalizedLeavesViewerBundle,\n htmlFile: string,\n viewerTemplateFile?: string,\n) {\n const templatePath = await resolveViewerTemplatePath(viewerTemplateFile)\n const template = templatePath\n ? await fs.readFile(templatePath, 'utf8')\n : DEFAULT_VIEWER_TEMPLATE\n const baked = injectBakedInspectorPayload(template, payload, {\n marker: '<!--__FINALIZED_LEAVES_BAKED_PAYLOAD__-->',\n globalName: '__FINALIZED_LEAVES_PAYLOAD',\n scriptId: 'finalized-leaves-baked-payload',\n })\n\n const resolved = path.resolve(htmlFile)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, baked, 'utf8')\n return resolved\n}\n\nasync function openHtmlInBrowser(filePath: string) {\n const resolved = path.resolve(filePath)\n const platform = process.platform\n\n if (platform === 'darwin') {\n spawn('open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n return\n }\n if (platform === 'win32') {\n spawn('cmd', ['/c', 'start', '', resolved], {\n detached: true,\n stdio: 'ignore',\n }).unref()\n return\n }\n spawn('xdg-open', [resolved], { detached: true, stdio: 'ignore' }).unref()\n}\n\nexport function buildFinalizedLeavesViewerBundle(\n input: BuildFinalizedLeavesViewerBundleInput,\n): FinalizedLeavesViewerBundle {\n return {\n kind: 'finalized-leaves-bundle',\n _meta: {\n generatedAt: new Date().toISOString(),\n description:\n 'Unified viewer bundle including finalized leaves snapshot and changelog timeline payloads.',\n },\n leavesPayload: input.leavesPayload,\n changelogPayload: input.changelogPayload,\n }\n}\n\nexport async function writeFinalizedLeavesViewerBundle(\n payload: FinalizedLeavesViewerBundle,\n outFileOrOptions: string | WriteFinalizedLeavesExportOptions,\n) {\n const options: WriteFinalizedLeavesExportOptions =\n typeof outFileOrOptions === 'string'\n ? { outFile: outFileOrOptions }\n : outFileOrOptions\n\n const written: { outFile?: string; htmlFile?: string } = {}\n\n if (options.outFile) {\n written.outFile = await writeJsonExport(payload, options.outFile)\n }\n if (options.htmlFile) {\n written.htmlFile = await writeBakedHtmlExport(\n payload,\n options.htmlFile,\n options.viewerTemplateFile,\n )\n }\n if (options.openOnFinish) {\n if (!written.htmlFile) {\n throw new Error(\n 'openOnFinish requires htmlFile. Provide htmlFile to open the baked viewer.',\n )\n }\n await openHtmlInBrowser(written.htmlFile)\n }\n\n return written\n}\n","import { routeKeyOf } from '@emeryld/rrroutes-contract'\nimport { InspectionDiagnostics } from '../inspection/diagnostics'\nimport { inspectClients } from '../inspection/inspect-clients'\nimport { inspectContractRoutes } from '../inspection/inspect-contract'\nimport { inspectServer } from '../inspection/inspect-server'\nimport { inspectSockets } from '../inspection/inspect-sockets'\nimport { joinRouteInspections } from '../inspection/join-routes'\nimport { normalizeClientsInput } from '../inspection/normalize-clients'\nimport { normalizeRoutesInput } from '../inspection/normalize-routes'\nimport { normalizeSocketsInput } from '../inspection/normalize-sockets'\nimport { hashRRRoutesSnapshot } from './hash'\nimport type {\n CreateRRRoutesExportRuntimeOptions,\n InspectOptions,\n RRRoutesSnapshot,\n} from './types'\n\nexport async function buildRRRoutesSnapshot(\n options: CreateRRRoutesExportRuntimeOptions,\n inspectOptions: InspectOptions = {},\n): Promise<RRRoutesSnapshot> {\n const diagnostics = new InspectionDiagnostics()\n const leaves = normalizeRoutesInput(options.allRoutes)\n const seen = new Set<string>()\n for (const leaf of leaves) {\n const routeKey = routeKeyOf(leaf.method, leaf.path)\n if (seen.has(routeKey)) {\n diagnostics.add({\n code: 'DUPLICATE_ROUTE_KEY',\n severity: 'error',\n entity: { routeKey },\n message:\n 'Multiple contract leaves resolve to the same canonical method + path identity.',\n })\n }\n seen.add(routeKey)\n }\n\n const includeSource =\n inspectOptions.includeSource ?? options.source?.include ?? false\n const includeLive = inspectOptions.includeLive ?? false\n const [contract, clients, server, sockets] = await Promise.all([\n inspectContractRoutes(leaves, options.source, includeSource),\n Promise.resolve(\n inspectClients(\n normalizeClientsInput(options.endpointClient, options.allClients),\n diagnostics,\n ),\n ),\n Promise.resolve(inspectServer(options.server, diagnostics)),\n Promise.resolve(\n inspectSockets(\n normalizeSocketsInput(options.sockets),\n includeLive,\n diagnostics,\n ),\n ),\n ])\n\n const diagnosticItems = diagnostics.list({\n includeInfo: options.diagnostics?.includeInfo,\n })\n const routes = joinRouteInspections({\n contract: contract.routes,\n clients: clients.byRoute,\n server: server.byRoute,\n servers: server.servers,\n serverSupplied: Boolean(options.server),\n diagnostics: diagnosticItems,\n })\n diagnosticItems.sort((left, right) => left.code.localeCompare(right.code))\n\n const snapshot: RRRoutesSnapshot = {\n schemaVersion: 1,\n meta: {\n capturedAt: new Date().toISOString(),\n snapshotHash: '',\n ...options.meta,\n packageVersions: {},\n sourceExtraction: contract.sourceExtraction,\n },\n capabilities: {\n contract: true,\n client: Boolean(options.endpointClient || options.allClients),\n server: Boolean(options.server),\n socket: Boolean(options.sockets),\n live: includeLive,\n source: includeSource,\n },\n routes,\n clients: clients.clients,\n servers: server.servers,\n sockets,\n diagnostics: diagnosticItems,\n }\n snapshot.meta.snapshotHash = hashRRRoutesSnapshot(snapshot)\n return snapshot\n}\n","import type { InspectionDiagnostic } from '../snapshot/types'\n\nexport class InspectionDiagnostics {\n readonly #items: InspectionDiagnostic[] = []\n\n add(diagnostic: InspectionDiagnostic): void {\n this.#items.push(diagnostic)\n }\n\n list(options: { includeInfo?: boolean } = {}): InspectionDiagnostic[] {\n const items =\n options.includeInfo === false\n ? this.#items.filter((item) => item.severity !== 'info')\n : this.#items\n return items.slice().sort((left, right) => {\n const byCode = left.code.localeCompare(right.code)\n if (byCode !== 0) return byCode\n return JSON.stringify(left.entity ?? {}).localeCompare(\n JSON.stringify(right.entity ?? {}),\n )\n })\n }\n}\n","import {\n routeKeyOf,\n type AnyLeafLowProfile,\n type RouteKey,\n} from '@emeryld/rrroutes-contract'\nimport type {\n ClientAugmentInspection,\n ClientResourceInspection,\n ClientRouteInspection,\n ClientSocketConnectionInspection,\n IdentityStability,\n} from '../snapshot/types'\nimport type { InspectionDiagnostics } from './diagnostics'\nimport {\n looksLikeClientEndpoint,\n type NormalizedClientInput,\n} from './normalize-clients'\nimport {\n asRecord,\n optionalBoolean,\n optionalString,\n readNativeInspection,\n} from './native'\nimport {\n serializeClientBuildOptions,\n serializeSelectedMetadata,\n} from './serializable'\n\ntype NativeEndpoint = {\n leaf: AnyLeafLowProfile\n id?: string\n name?: string\n enabled: boolean\n built: boolean\n buildOptions?: unknown\n augments: readonly Record<PropertyKey, unknown>[]\n socketConnections: readonly Record<PropertyKey, unknown>[]\n complete: boolean\n}\n\ntype NativeBinding = {\n id?: string\n publicName: string\n enabled?: boolean\n endpoint: NativeEndpoint\n}\n\ntype NativeResource = {\n id?: string\n name?: string\n bindings: readonly NativeBinding[]\n}\n\nfunction isLeaf(value: unknown): value is AnyLeafLowProfile {\n const record = asRecord(value)\n return Boolean(\n record &&\n typeof record.method === 'string' &&\n typeof record.path === 'string' &&\n record.cfg &&\n typeof record.cfg === 'object',\n )\n}\n\nfunction endpointFrom(value: unknown): NativeEndpoint | undefined {\n const descriptor = readNativeInspection(value)\n if (descriptor?.kind === 'client-endpoint' && isLeaf(descriptor.leaf)) {\n return {\n leaf: descriptor.leaf,\n id: optionalString(descriptor.id),\n name: optionalString(descriptor.name),\n enabled: optionalBoolean(descriptor.enabled) ?? true,\n built: optionalBoolean(descriptor.built) ?? true,\n buildOptions: descriptor.buildOptions,\n augments: Array.isArray(descriptor.augments)\n ? descriptor.augments\n .map(asRecord)\n .filter((item): item is Record<PropertyKey, unknown> =>\n Boolean(item),\n )\n : [],\n socketConnections: Array.isArray(descriptor.socketConnections)\n ? descriptor.socketConnections\n .map(asRecord)\n .filter((item): item is Record<PropertyKey, unknown> =>\n Boolean(item),\n )\n : [],\n complete: true,\n }\n }\n\n const record = asRecord(value)\n if (!record || !isLeaf(record.leaf)) return undefined\n return {\n leaf: record.leaf,\n enabled: true,\n built: true,\n augments: [],\n socketConnections: [],\n complete: false,\n }\n}\n\nfunction bindingsFromDescriptor(\n descriptor: Record<PropertyKey, unknown>,\n): NativeResource | undefined {\n if (descriptor.kind === 'client-resource') {\n const bindings = Array.isArray(descriptor.bindings)\n ? descriptor.bindings.flatMap((value, index): NativeBinding[] => {\n const binding = asRecord(value)\n const endpoint =\n endpointFromInspectionRecord(binding?.endpoint) ??\n endpointFrom(binding?.endpoint)\n if (!binding || !endpoint) return []\n return [\n {\n id: optionalString(binding.id),\n publicName:\n optionalString(binding.publicName) ??\n endpoint.name ??\n `endpoint-${index}`,\n enabled: optionalBoolean(binding.enabled),\n endpoint,\n },\n ]\n })\n : []\n return {\n id: optionalString(descriptor.id),\n name: optionalString(descriptor.name),\n bindings,\n }\n }\n\n if (descriptor.kind === 'endpoint-client') {\n const endpoints = Array.isArray(descriptor.endpoints)\n ? descriptor.endpoints\n : []\n return {\n name: 'Endpoint client',\n bindings: endpoints.flatMap((value, index): NativeBinding[] => {\n const endpoint = endpointFromInspectionRecord(value)\n if (!endpoint) return []\n return [\n {\n id: endpoint.id,\n publicName:\n endpoint.name ??\n endpoint.id ??\n routeKeyOf(endpoint.leaf.method, endpoint.leaf.path),\n enabled: endpoint.enabled,\n endpoint,\n },\n ]\n }),\n }\n }\n return undefined\n}\n\nfunction endpointFromInspectionRecord(\n value: unknown,\n): NativeEndpoint | undefined {\n const record = asRecord(value)\n if (!record || record.kind !== 'client-endpoint' || !isLeaf(record.leaf)) {\n return undefined\n }\n return {\n leaf: record.leaf,\n id: optionalString(record.id),\n name: optionalString(record.name),\n enabled: optionalBoolean(record.enabled) ?? true,\n built: optionalBoolean(record.built) ?? true,\n buildOptions: record.buildOptions,\n augments: Array.isArray(record.augments)\n ? record.augments\n .map(asRecord)\n .filter((item): item is Record<PropertyKey, unknown> => Boolean(item))\n : [],\n socketConnections: Array.isArray(record.socketConnections)\n ? record.socketConnections\n .map(asRecord)\n .filter((item): item is Record<PropertyKey, unknown> => Boolean(item))\n : [],\n complete: true,\n }\n}\n\nfunction resourceFrom(input: NormalizedClientInput): NativeResource {\n const descriptor = readNativeInspection(input.value)\n const native = descriptor ? bindingsFromDescriptor(descriptor) : undefined\n if (native) return native\n\n if (looksLikeClientEndpoint(input.value)) {\n const endpoint = endpointFrom(input.value)\n return {\n bindings: endpoint\n ? [\n {\n id: endpoint.id,\n publicName: endpoint.name ?? endpoint.id ?? 'endpoint',\n enabled: endpoint.enabled,\n endpoint,\n },\n ]\n : [],\n }\n }\n\n return {\n bindings: Object.entries(input.value).flatMap(\n ([publicName, value]): NativeBinding[] => {\n const endpoint = endpointFrom(value)\n return endpoint ? [{ publicName, endpoint }] : []\n },\n ),\n }\n}\n\nfunction inspectAugments(\n descriptors: readonly Record<PropertyKey, unknown>[],\n bindingIdentity: string,\n): ClientAugmentInspection[] {\n return descriptors.map((descriptor, index) => {\n const id = optionalString(descriptor.id)\n return {\n identity: id ?? `${bindingIdentity}:augment:${index}`,\n id,\n name: optionalString(descriptor.name),\n kind: optionalString(descriptor.kind),\n options: serializeSelectedMetadata(descriptor.options),\n order: index,\n identityStability: id ? 'stable' : 'positional',\n }\n })\n}\n\nfunction inspectSocketConnections(\n descriptors: readonly Record<PropertyKey, unknown>[],\n bindingIdentity: string,\n): ClientSocketConnectionInspection[] {\n return descriptors.map((descriptor, index) => {\n const id = optionalString(descriptor.id)\n return {\n identity: id ?? `${bindingIdentity}:socket:${index}`,\n id,\n name: optionalString(descriptor.name),\n events: Array.isArray(descriptor.events)\n ? descriptor.events\n .filter((item): item is string => typeof item === 'string')\n .sort()\n : [],\n roomStrategy: serializeSelectedMetadata(descriptor.roomStrategy),\n cacheReducers: Array.isArray(descriptor.cacheReducers)\n ? descriptor.cacheReducers\n .map((item) => serializeSelectedMetadata(item))\n .filter(\n (item): item is NonNullable<typeof item> => item !== undefined,\n )\n : [],\n order: index,\n identityStability: id ? 'stable' : 'positional',\n }\n })\n}\n\nexport type ClientInspectionResult = {\n clients: Readonly<Record<string, ClientResourceInspection>>\n byRoute: Readonly<Record<RouteKey, readonly ClientRouteInspection[]>>\n}\n\nexport function inspectClients(\n inputs: readonly NormalizedClientInput[],\n diagnostics: InspectionDiagnostics,\n): ClientInspectionResult {\n const clients: Record<string, ClientResourceInspection> = {}\n const byRoute = {} as Record<RouteKey, ClientRouteInspection[]>\n\n for (const input of inputs) {\n const resource = resourceFrom(input)\n const identity =\n resource.id ?? input.registeredName ?? `client-${input.index}`\n const resourceStability: IdentityStability =\n resource.id || input.registeredName ? 'stable' : 'positional'\n const seenPublicNames = new Map<string, number>()\n\n const bindings = resource.bindings.map((binding, index) => {\n const routeKey = routeKeyOf(\n binding.endpoint.leaf.method,\n binding.endpoint.leaf.path,\n )\n const seen = seenPublicNames.get(binding.publicName) ?? 0\n seenPublicNames.set(binding.publicName, seen + 1)\n const publicName =\n seen === 0 ? binding.publicName : `${binding.publicName}-${index}`\n const bindingIdentity = binding.id ?? `${identity}:${publicName}`\n const buildOptions = serializeClientBuildOptions(\n binding.endpoint.buildOptions,\n )\n const pagination = buildOptions.pagination\n const inspected: ClientRouteInspection = {\n clientId: identity,\n clientName: resource.name ?? input.registeredName,\n bindingId: binding.id,\n bindingIdentity,\n publicName,\n routeKey,\n enabled: binding.enabled ?? binding.endpoint.enabled,\n built: binding.endpoint.built,\n build: {\n feed: Boolean(binding.endpoint.leaf.cfg.feed),\n singleton: buildOptions.singleton === true,\n many: Boolean(buildOptions.many),\n pagination,\n options: buildOptions,\n },\n augments: inspectAugments(binding.endpoint.augments, bindingIdentity),\n socketConnections: inspectSocketConnections(\n binding.endpoint.socketConnections,\n bindingIdentity,\n ),\n identityStability: binding.id || seen === 0 ? 'stable' : 'positional',\n }\n\n if (!binding.endpoint.complete) {\n diagnostics.add({\n code: 'CLIENT_AUGMENT_DETAILS_UNAVAILABLE',\n severity: 'info',\n entity: { routeKey, client: identity },\n message:\n 'The endpoint was detected, but augment descriptors were not exposed.',\n })\n }\n byRoute[routeKey] ??= []\n byRoute[routeKey].push(inspected)\n return inspected\n })\n\n clients[identity] = {\n identity,\n id: resource.id,\n name: resource.name ?? input.registeredName,\n identityStability: resourceStability,\n bindings,\n }\n if (resourceStability === 'positional') {\n diagnostics.add({\n code: 'CLIENT_IDENTITY_POSITIONAL',\n severity: 'info',\n entity: { client: identity },\n message:\n 'Client identity uses its array position and may change after reordering.',\n })\n }\n }\n\n for (const bindings of Object.values(byRoute)) {\n bindings.sort((left, right) =>\n left.bindingIdentity.localeCompare(right.bindingIdentity),\n )\n }\n return { clients, byRoute }\n}\n","import { RRROUTES_INSPECTION } from '@emeryld/rrroutes-contract'\n\nexport function asRecord(\n value: unknown,\n): Record<PropertyKey, unknown> | undefined {\n return typeof value === 'object' && value !== null\n ? (value as Record<PropertyKey, unknown>)\n : undefined\n}\n\nexport function readNativeInspection(\n value: unknown,\n): Record<PropertyKey, unknown> | undefined {\n const record = asRecord(value)\n if (!record) return undefined\n const inspect = record[RRROUTES_INSPECTION]\n if (typeof inspect !== 'function') return undefined\n try {\n return asRecord(inspect.call(value))\n } catch {\n return undefined\n }\n}\n\nexport function optionalString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nexport function optionalBoolean(value: unknown): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n","import type {\n SupportedClientsInput,\n SupportedEndpointClient,\n} from '../snapshot/types'\nimport { readNativeInspection } from './native'\n\nexport type NormalizedClientInput = {\n value: object\n registeredName?: string\n index: number\n}\n\nexport function normalizeClientsInput(\n endpointClient?: SupportedEndpointClient,\n allClients?: SupportedClientsInput,\n): readonly NormalizedClientInput[] {\n const out: NormalizedClientInput[] = []\n if (endpointClient) {\n out.push({\n value: endpointClient,\n registeredName: 'endpointClient',\n index: 0,\n })\n }\n if (!allClients) return out\n\n if (Array.isArray(allClients)) {\n const offset = out.length\n allClients.forEach((value, index) =>\n out.push({ value, index: offset + index }),\n )\n return out\n }\n\n const offset = out.length\n Object.entries(allClients).forEach(([registeredName, value], index) => {\n out.push({ value, registeredName, index: offset + index })\n })\n return out\n}\n\nexport function looksLikeClientEndpoint(value: unknown): boolean {\n const native = readNativeInspection(value)\n if (native?.kind === 'client-endpoint') return true\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'leaf' in value &&\n (value as { leaf?: unknown }).leaf,\n )\n}\n","import type { JsonValue } from '../snapshot/types'\n\nconst MAX_METADATA_DEPTH = 8\n\nexport function serializeSelectedMetadata(\n value: unknown,\n depth = 0,\n): JsonValue | undefined {\n if (depth > MAX_METADATA_DEPTH || value === undefined) return undefined\n if (\n value === null ||\n typeof value === 'string' ||\n typeof value === 'boolean'\n ) {\n return value\n }\n if (typeof value === 'number') return Number.isFinite(value) ? value : null\n if (typeof value === 'bigint') return String(value)\n if (value instanceof Date) return value.toISOString()\n if (Array.isArray(value)) {\n return value\n .map((item) => serializeSelectedMetadata(item, depth + 1))\n .filter((item): item is JsonValue => item !== undefined)\n }\n if (typeof value !== 'object') return undefined\n\n const out: Record<string, JsonValue> = {}\n for (const key of Object.keys(value as object).sort()) {\n const child = serializeSelectedMetadata(\n (value as Record<string, unknown>)[key],\n depth + 1,\n )\n if (child !== undefined) out[key] = child\n }\n return out\n}\n\nconst CLIENT_BUILD_OPTION_FIELDS = [\n 'enabled',\n 'staleTime',\n 'gcTime',\n 'retry',\n 'retryDelay',\n 'refetchInterval',\n 'refetchOnMount',\n 'refetchOnWindowFocus',\n 'refetchOnReconnect',\n 'singleton',\n 'splitPageSize',\n 'splitPageSizeParam',\n 'pagination',\n 'feed',\n 'many',\n] as const\n\nexport function serializeClientBuildOptions(\n value: unknown,\n): Record<string, JsonValue> {\n if (!value || typeof value !== 'object') return {}\n const source = value as Record<string, unknown>\n const out: Record<string, JsonValue> = {}\n for (const field of CLIENT_BUILD_OPTION_FIELDS) {\n const selected = serializeSelectedMetadata(source[field])\n if (selected !== undefined) out[field] = selected\n }\n return out\n}\n","import type { AnyLeafLowProfile, RouteKey } from '@emeryld/rrroutes-contract'\nimport { routeKeyOf } from '@emeryld/rrroutes-contract'\nimport { exportFinalizedLeaves } from '../exportFinalizedLeaves'\nimport { hashCanonicalValue } from '../snapshot/hash'\nimport type {\n ContractRouteInspection,\n SourceInspectionOptions,\n} from '../snapshot/types'\n\nexport type ContractInspectionResult = {\n routes: Readonly<Record<RouteKey, ContractRouteInspection>>\n sourceExtraction?: Awaited<\n ReturnType<typeof exportFinalizedLeaves>\n >['_meta']['sourceExtraction']\n}\n\nexport async function inspectContractRoutes(\n leaves: readonly AnyLeafLowProfile[],\n source: SourceInspectionOptions | undefined,\n includeSource: boolean,\n): Promise<ContractInspectionResult> {\n const exported = await exportFinalizedLeaves(leaves, {\n includeSource: includeSource && (source?.include ?? true),\n sourceModulePath: source?.modulePath,\n sourceExportName: source?.exportName,\n tsconfigPath: source?.tsconfigPath,\n })\n const routes = {} as Record<RouteKey, ContractRouteInspection>\n\n for (const serializedLeaf of exported.leaves) {\n const routeKey = routeKeyOf(serializedLeaf.method, serializedLeaf.path)\n const schemaFlat = exported.schemaFlatByLeaf[routeKey] ?? {}\n routes[routeKey] = {\n serializedLeaf,\n schemaFlat,\n source: exported.sourceByLeaf?.[routeKey],\n fingerprint: hashCanonicalValue({ serializedLeaf, schemaFlat }),\n }\n }\n\n return {\n routes,\n sourceExtraction: exported._meta.sourceExtraction,\n }\n}\n","import type { AnyLeafLowProfile, RouteKey } from '@emeryld/rrroutes-contract'\nimport type {\n MiddlewareInspection,\n ServerRouteInspection,\n ServerRuntimeInspection,\n SupportedServerInput,\n} from '../snapshot/types'\nimport type { InspectionDiagnostics } from './diagnostics'\nimport {\n asRecord,\n optionalBoolean,\n optionalString,\n readNativeInspection,\n} from './native'\n\nfunction isLeaf(value: unknown): value is AnyLeafLowProfile {\n const record = asRecord(value)\n return Boolean(\n record &&\n typeof record.method === 'string' &&\n typeof record.path === 'string' &&\n record.cfg &&\n typeof record.cfg === 'object',\n )\n}\n\nexport type ServerInspectionResult = {\n servers: Readonly<Record<string, ServerRuntimeInspection>>\n byRoute: Readonly<Record<RouteKey, ServerRouteInspection>>\n}\n\nexport function inspectServer(\n input: SupportedServerInput | undefined,\n diagnostics: InspectionDiagnostics,\n): ServerInspectionResult {\n if (!input)\n return {\n servers: {},\n byRoute: {} as Record<RouteKey, ServerRouteInspection>,\n }\n\n const descriptor = readNativeInspection(input)\n if (!descriptor || descriptor.kind !== 'server-runtime') {\n diagnostics.add({\n code: 'SERVER_REGISTRATION_DETAILS_UNAVAILABLE',\n severity: 'warning',\n entity: { server: 'server' },\n message:\n 'A server runtime was supplied, but it did not expose the RRRoutes inspection protocol.',\n })\n return {\n servers: {\n server: {\n identity: 'server',\n identityStability: 'stable',\n controllers: {} as Record<RouteKey, ServerRouteInspection>,\n middleware: { sanitizerCount: 0, preCtxCount: 0, postCtxCount: 0 },\n validateOutput: false,\n },\n },\n byRoute: {} as Record<RouteKey, ServerRouteInspection>,\n }\n }\n\n const id = optionalString(descriptor.id)\n const name = optionalString(descriptor.name)\n const identity = id ?? name ?? 'server'\n const nativeMiddleware = asRecord(descriptor.middleware)\n const middleware = {\n sanitizerCount:\n typeof nativeMiddleware?.sanitizerCount === 'number'\n ? nativeMiddleware.sanitizerCount\n : 0,\n preCtxCount:\n typeof nativeMiddleware?.preCtxCount === 'number'\n ? nativeMiddleware.preCtxCount\n : 0,\n postCtxCount:\n typeof nativeMiddleware?.postCtxCount === 'number'\n ? nativeMiddleware.postCtxCount\n : 0,\n }\n const validateOutput = optionalBoolean(descriptor.validateOutput) ?? false\n const controllers = {} as Record<RouteKey, ServerRouteInspection>\n\n for (const nativeValue of Array.isArray(descriptor.controllers)\n ? descriptor.controllers\n : []) {\n const native = asRecord(nativeValue)\n const routeKey = optionalString(native?.routeKey) as RouteKey | undefined\n if (!native || !routeKey || !isLeaf(native.leaf)) continue\n const controllerId = optionalString(native.id)\n const before: MiddlewareInspection[] = (\n Array.isArray(native.before) ? native.before : []\n ).flatMap((middlewareValue, index) => {\n const item = asRecord(middlewareValue)\n if (!item) return []\n const middlewareId = optionalString(item.id)\n return [\n {\n identity: middlewareId ?? `${routeKey}:before:${index}`,\n id: middlewareId,\n name: optionalString(item.name),\n order: index,\n identityStability: middlewareId ? 'stable' : 'positional',\n },\n ]\n })\n controllers[routeKey] = {\n routeKey,\n registered: true,\n enabled: optionalBoolean(native.enabled) ?? true,\n controllerId,\n controllerName: optionalString(native.name),\n before,\n middleware: {\n ...middleware,\n beforeCount: before.length,\n },\n validateOutput,\n multipart: Boolean(native.leaf.cfg.bodyFiles?.length),\n identityStability: 'stable',\n }\n for (const item of before) {\n if (item.identityStability === 'positional') {\n diagnostics.add({\n code: 'SERVER_MIDDLEWARE_IDENTITY_POSITIONAL',\n severity: 'info',\n entity: { routeKey, server: identity },\n message:\n 'Middleware identity uses its route-local position and may change after reordering.',\n })\n }\n }\n }\n\n return {\n servers: {\n [identity]: {\n identity,\n id,\n name,\n identityStability: 'stable',\n controllers,\n middleware,\n validateOutput,\n },\n },\n byRoute: controllers,\n }\n}\n","import type { RouteKey } from '@emeryld/rrroutes-contract'\nimport { introspectSchema } from '../schemaIntrospection'\nimport type {\n SocketBindingInspection,\n SocketContractEventInspection,\n SocketHandlerInspection,\n SocketLiveInspection,\n SocketRuntimeInspection,\n} from '../snapshot/types'\nimport type { InspectionDiagnostics } from './diagnostics'\nimport type { NormalizedSocketInput } from './normalize-sockets'\nimport {\n asRecord,\n optionalBoolean,\n optionalString,\n readNativeInspection,\n} from './native'\nimport { serializeSelectedMetadata } from './serializable'\n\nfunction toLiveInspection(value: unknown): SocketLiveInspection | undefined {\n const live = asRecord(value)\n if (!live) return undefined\n const routeSubscriptions = Array.isArray(live.leaves)\n ? live.leaves.flatMap(\n (\n leafValue,\n ): NonNullable<\n SocketLiveInspection['routeSubscriptions']\n >[number][] => {\n const leaf = asRecord(leafValue)\n const routeKey = optionalString(leaf?.leaf) as RouteKey | undefined\n if (!leaf || !routeKey) return []\n return [\n {\n routeKey,\n rooms: Array.isArray(leaf.rooms)\n ? leaf.rooms.flatMap((roomValue) => {\n const room = asRecord(roomValue)\n return room &&\n typeof room.room === 'string' &&\n typeof room.count === 'number'\n ? [{ room: room.room, count: room.count }]\n : []\n })\n : [],\n handlers: Array.isArray(leaf.handlers)\n ? leaf.handlers.flatMap((handlerValue) => {\n const handler = asRecord(handlerValue)\n return handler &&\n typeof handler.event === 'string' &&\n typeof handler.handlers === 'number'\n ? [{ event: handler.event, handlers: handler.handlers }]\n : []\n })\n : [],\n },\n ]\n },\n )\n : undefined\n\n return {\n connected: optionalBoolean(live.connected) ?? false,\n socketId: optionalString(live.socketId),\n namespace: optionalString(live.nsp),\n roomsCount:\n typeof live.roomsCount === 'number' ? live.roomsCount : undefined,\n totalHandlers:\n typeof live.totalHandlers === 'number' ? live.totalHandlers : undefined,\n rooms: Array.isArray(live.rooms)\n ? live.rooms.flatMap((roomValue) => {\n const room = asRecord(roomValue)\n return room &&\n typeof room.room === 'string' &&\n typeof room.count === 'number'\n ? [{ room: room.room, count: room.count }]\n : []\n })\n : undefined,\n handlers: Array.isArray(live.handlers)\n ? live.handlers.flatMap((handlerValue) => {\n const handler = asRecord(handlerValue)\n return handler &&\n typeof handler.event === 'string' &&\n typeof handler.handlers === 'number'\n ? [{ event: handler.event, handlers: handler.handlers }]\n : []\n })\n : undefined,\n routeSubscriptions,\n }\n}\n\nexport function inspectSockets(\n inputs: readonly NormalizedSocketInput[],\n includeLive: boolean,\n diagnostics: InspectionDiagnostics,\n): Readonly<Record<string, SocketRuntimeInspection>> {\n const sockets: Record<string, SocketRuntimeInspection> = {}\n for (const input of inputs) {\n const descriptor = readNativeInspection(input.value)\n const id = optionalString(descriptor?.id)\n const name = optionalString(descriptor?.name)\n const identity =\n id ?? input.registeredName ?? name ?? `socket-${input.index}`\n const stability =\n id || input.registeredName || name ? 'stable' : 'positional'\n const events = asRecord(descriptor?.events)\n const contractEvents: Record<string, SocketContractEventInspection> = {}\n const handlers: SocketHandlerInspection[] = (\n Array.isArray(descriptor?.handlers) ? descriptor.handlers : []\n ).flatMap((handlerValue, index) => {\n const handler = asRecord(handlerValue)\n const event = optionalString(handler?.event)\n if (!handler || !event) return []\n return [\n {\n identity: `${identity}:handler:${event}:${index}`,\n event,\n name: optionalString(handler.name),\n order:\n typeof handler.order === 'number' ? handler.order : index,\n identityStability: 'positional' as const,\n },\n ]\n })\n const bindings: SocketBindingInspection[] = (\n Array.isArray(descriptor?.bindings) ? descriptor.bindings : []\n ).flatMap((bindingValue, index) => {\n const binding = asRecord(bindingValue)\n const routeKey = optionalString(binding?.routeKey) as RouteKey | undefined\n if (!binding || !routeKey) return []\n return [\n {\n identity: `${identity}:binding:${routeKey}`,\n routeKey,\n eventNames: Array.isArray(binding.events)\n ? binding.events\n .filter((event): event is string => typeof event === 'string')\n .sort()\n : [],\n identityStability: 'stable' as const,\n },\n ]\n })\n\n for (const eventName of Object.keys(events ?? {}).sort()) {\n const event = asRecord(events?.[eventName])\n const message = event?.message\n contractEvents[eventName] = {\n identity: `${identity}:event:${eventName}`,\n name: eventName,\n schema:\n message && typeof message === 'object'\n ? introspectSchema(message as never)\n : undefined,\n }\n }\n\n if (!descriptor || descriptor.kind !== 'socket-runtime') {\n diagnostics.add({\n code: 'SOCKET_DETAILS_UNAVAILABLE',\n severity: 'info',\n entity: { socket: identity },\n message:\n 'A socket runtime was supplied, but it did not expose the RRRoutes inspection protocol.',\n })\n }\n if (stability === 'positional') {\n diagnostics.add({\n code: 'SOCKET_IDENTITY_POSITIONAL',\n severity: 'info',\n entity: { socket: identity },\n message:\n 'Socket identity uses its array position and may change after reordering.',\n })\n }\n\n sockets[identity] = {\n identity,\n id,\n name: name ?? input.registeredName,\n identityStability: stability,\n contract: { events: contractEvents },\n configuration: {\n heartbeat: serializeSelectedMetadata(descriptor?.heartbeat),\n reconnection: serializeSelectedMetadata(descriptor?.reconnection),\n system: serializeSelectedMetadata(descriptor?.config),\n handlers,\n },\n bindings,\n live: includeLive\n ? toLiveInspection(\n descriptor?.live ?? asRecord(input.value)?.statsSnapshot,\n )\n : undefined,\n }\n }\n return sockets\n}\n","import type { RouteKey } from '@emeryld/rrroutes-contract'\nimport type {\n ClientRouteInspection,\n ContractRouteInspection,\n InspectionDiagnostic,\n RouteInspection,\n RouteSocketInspection,\n ServerRouteInspection,\n ServerRuntimeInspection,\n} from '../snapshot/types'\n\nexport function joinRouteInspections(args: {\n contract: Readonly<Record<RouteKey, ContractRouteInspection>>\n clients: Readonly<Record<RouteKey, readonly ClientRouteInspection[]>>\n server: Readonly<Record<RouteKey, ServerRouteInspection>>\n servers: Readonly<Record<string, ServerRuntimeInspection>>\n serverSupplied: boolean\n diagnostics: InspectionDiagnostic[]\n}): Readonly<Record<RouteKey, RouteInspection>> {\n const routes = {} as Record<RouteKey, RouteInspection>\n const serverRuntime = Object.values(args.servers)[0]\n\n for (const routeKey of Object.keys(args.contract).sort() as RouteKey[]) {\n const contract = args.contract[routeKey]\n const clients = (args.clients[routeKey] ?? []).slice()\n const registeredServer = args.server[routeKey]\n const server =\n registeredServer ??\n (args.serverSupplied\n ? {\n routeKey,\n registered: false,\n enabled: false,\n before: [],\n middleware: {\n sanitizerCount: serverRuntime?.middleware.sanitizerCount ?? 0,\n preCtxCount: serverRuntime?.middleware.preCtxCount ?? 0,\n postCtxCount: serverRuntime?.middleware.postCtxCount ?? 0,\n beforeCount: 0,\n },\n validateOutput: serverRuntime?.validateOutput ?? false,\n multipart: Boolean(contract.serializedLeaf.cfg.bodyFiles?.length),\n identityStability: 'stable' as const,\n }\n : undefined)\n\n const sockets: RouteSocketInspection[] = clients.flatMap((client) =>\n client.socketConnections.map((connection) => ({\n identity: connection.identity,\n clientBindingIdentity: client.bindingIdentity,\n events: connection.events,\n roomStrategy: connection.roomStrategy,\n cacheReducers: connection.cacheReducers,\n identityStability: connection.identityStability,\n })),\n )\n\n routes[routeKey] = {\n routeKey,\n id: contract.serializedLeaf.id,\n method: contract.serializedLeaf.method.toUpperCase(),\n path: contract.serializedLeaf.path,\n contract,\n clients,\n server,\n sockets,\n status: {\n client:\n clients.length === 0\n ? 'unbound'\n : clients.some((client) => client.enabled)\n ? 'bound'\n : 'disabled',\n server: !args.serverSupplied\n ? 'unavailable'\n : !server?.registered\n ? 'missing'\n : server.enabled\n ? 'enabled'\n : 'disabled',\n socket: sockets.length > 0 ? 'configured' : 'none',\n },\n }\n }\n\n for (const routeKey of Object.keys(args.clients) as RouteKey[]) {\n if (args.contract[routeKey]) continue\n args.diagnostics.push({\n code: 'CLIENT_ROUTE_NOT_IN_CONTRACT_INPUT',\n severity: 'warning',\n entity: { routeKey },\n message:\n 'A client binding targets a route that was not present in allRoutes.',\n })\n }\n for (const routeKey of Object.keys(args.server) as RouteKey[]) {\n if (args.contract[routeKey]) continue\n args.diagnostics.push({\n code: 'SERVER_ROUTE_NOT_IN_CONTRACT_INPUT',\n severity: 'warning',\n entity: { routeKey },\n message:\n 'A server controller targets a route that was not present in allRoutes.',\n })\n }\n return routes\n}\n","import type { AnyLeafLowProfile } from '@emeryld/rrroutes-contract'\nimport type { SupportedRoutesInput } from '../snapshot/types'\n\nfunction hasAll(\n value: unknown,\n): value is { all: readonly AnyLeafLowProfile[] } {\n return Boolean(\n value &&\n typeof value === 'object' &&\n 'all' in value &&\n Array.isArray((value as { all?: unknown }).all),\n )\n}\n\nexport function normalizeRoutesInput(\n input: SupportedRoutesInput,\n): readonly AnyLeafLowProfile[] {\n if (Array.isArray(input)) return input\n if (hasAll(input)) return input.all\n throw new TypeError(\n 'allRoutes must be a finalized registry, RouteResource, or readonly leaf array.',\n )\n}\n","import type { SocketRuntime, SupportedSocketsInput } from '../snapshot/types'\nimport { readNativeInspection } from './native'\n\nexport type NormalizedSocketInput = {\n value: SocketRuntime\n registeredName?: string\n index: number\n}\n\nexport function normalizeSocketsInput(\n input?: SupportedSocketsInput,\n): readonly NormalizedSocketInput[] {\n if (!input) return []\n if (Array.isArray(input)) {\n return input.map((value, index) => ({ value, index }))\n }\n if (readNativeInspection(input)?.kind === 'socket-runtime') {\n return [{ value: input, index: 0 }]\n }\n if (\n 'statsSnapshot' in input ||\n ('on' in input && typeof (input as { on?: unknown }).on === 'function')\n ) {\n return [{ value: input, index: 0 }]\n }\n return Object.entries(input).map(([registeredName, value], index) => ({\n value,\n registeredName,\n index,\n }))\n}\n","import type { RRRoutesChangeSet } from '../diff/types'\nimport type {\n RRRoutesChangeSetSummary,\n RRRoutesCheckpoint,\n RRRoutesCheckpointSummary,\n} from '../checkpoint/types'\nimport type { InspectionStorage } from './types'\n\nfunction clone<T>(value: T): T {\n return structuredClone(value)\n}\n\nexport function createMemoryInspectionStorage(): InspectionStorage {\n const checkpoints = new Map<string, RRRoutesCheckpoint>()\n const activeByScope = new Map<string, string>()\n const changes = new Map<string, RRRoutesChangeSet>()\n\n return {\n checkpoints: {\n async get(id) {\n const value = checkpoints.get(id)\n return value ? clone(value) : undefined\n },\n async getActive(scope) {\n const id = activeByScope.get(scope)\n const value = id ? checkpoints.get(id) : undefined\n return value ? clone(value) : undefined\n },\n async list(scope) {\n return Array.from(checkpoints.values())\n .filter((checkpoint) => !scope || checkpoint.scope === scope)\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))\n .map(\n (checkpoint): RRRoutesCheckpointSummary => ({\n id: checkpoint.id,\n scope: checkpoint.scope,\n createdAt: checkpoint.createdAt,\n updatedAt: checkpoint.updatedAt,\n snapshotHash: checkpoint.snapshotHash,\n trigger: clone(checkpoint.trigger),\n expiresAt: checkpoint.expiresAt,\n active: activeByScope.get(checkpoint.scope) === checkpoint.id,\n }),\n )\n },\n async save(checkpoint) {\n checkpoints.set(checkpoint.id, clone(checkpoint))\n },\n async setActive(scope, checkpointId) {\n const checkpoint = checkpoints.get(checkpointId)\n if (!checkpoint || checkpoint.scope !== scope) {\n throw new Error(\n `Checkpoint ${checkpointId} does not belong to scope ${scope}.`,\n )\n }\n activeByScope.set(scope, checkpointId)\n },\n async delete(id) {\n checkpoints.delete(id)\n for (const [scope, activeId] of activeByScope) {\n if (activeId === id) activeByScope.delete(scope)\n }\n },\n },\n changes: {\n async get(id) {\n const value = changes.get(id)\n return value ? clone(value) : undefined\n },\n async findByTransition(scope, fromHash, toHash) {\n const value = Array.from(changes.values()).find(\n (changeSet) =>\n changeSet.scope === scope &&\n changeSet.from.snapshotHash === fromHash &&\n changeSet.to.snapshotHash === toHash,\n )\n return value ? clone(value) : undefined\n },\n async list(query = {}) {\n const values = Array.from(changes.values())\n .filter(\n (changeSet) => !query.scope || changeSet.scope === query.scope,\n )\n .sort((left, right) => right.createdAt.localeCompare(left.createdAt))\n const selected = query.limit ? values.slice(0, query.limit) : values\n return selected.map((changeSet): RRRoutesChangeSetSummary => {\n const { changes: _changes, ...summary } = changeSet\n return clone(summary)\n })\n },\n async save(changeSet) {\n changes.set(changeSet.id, clone(changeSet))\n },\n async delete(id) {\n changes.delete(id)\n },\n },\n }\n}\n","export class ScopeLock {\n readonly #tails = new Map<string, Promise<void>>()\n\n async run<T>(scope: string, action: () => Promise<T>): Promise<T> {\n const previous = this.#tails.get(scope) ?? Promise.resolve()\n let release!: () => void\n const current = new Promise<void>((resolve) => {\n release = resolve\n })\n this.#tails.set(scope, current)\n await previous\n try {\n return await action()\n } finally {\n release()\n if (this.#tails.get(scope) === current) this.#tails.delete(scope)\n }\n }\n}\n","import type { ChangeSetRetention, CheckpointRetention } from './types'\nimport type { InspectionStorage } from '../storage/types'\n\nexport async function applyCheckpointRetention(args: {\n storage: InspectionStorage\n scope: string\n activeId: string\n retention?: CheckpointRetention\n now?: number\n}): Promise<void> {\n if (!args.retention) return\n const summaries = await args.storage.checkpoints.list(args.scope)\n const now = args.now ?? Date.now()\n const deletions = new Set<string>()\n if (\n args.retention.type === 'duration' ||\n args.retention.type === 'combined'\n ) {\n for (const checkpoint of summaries) {\n if (\n checkpoint.id !== args.activeId &&\n now - Date.parse(checkpoint.updatedAt) > args.retention.maximumAgeMs\n ) {\n deletions.add(checkpoint.id)\n }\n }\n }\n if (args.retention.type === 'count' || args.retention.type === 'combined') {\n const retained = summaries.filter((item) => !deletions.has(item.id))\n for (const checkpoint of retained.slice(args.retention.maximum)) {\n if (checkpoint.id !== args.activeId) deletions.add(checkpoint.id)\n }\n }\n await Promise.all(\n Array.from(deletions).map((id) => args.storage.checkpoints.delete(id)),\n )\n}\n\nexport async function applyChangeSetRetention(args: {\n storage: InspectionStorage\n scope: string\n retention: ChangeSetRetention\n now?: number\n}): Promise<void> {\n if (args.retention.type === 'forever' || !args.storage.changes.delete) return\n const summaries = await args.storage.changes.list({ scope: args.scope })\n const now = args.now ?? Date.now()\n const deletions =\n args.retention.type === 'count'\n ? summaries.slice(args.retention.maximum)\n : (() => {\n const maximumAgeMs = args.retention.maximumAgeMs\n return summaries.filter(\n (item) => now - Date.parse(item.createdAt) > maximumAgeMs,\n )\n })()\n await Promise.all(\n deletions.map((item) => args.storage.changes.delete!(item.id)),\n )\n}\n","import { diffRRRoutesSnapshots } from '../diff/diff-snapshots'\nimport { hashCanonicalValue } from '../snapshot/hash'\nimport type { RRRoutesSnapshot } from '../snapshot/types'\nimport { createMemoryInspectionStorage } from '../storage/memory'\nimport type { InspectionStorage } from '../storage/types'\nimport { ScopeLock } from './lock'\nimport { applyChangeSetRetention, applyCheckpointRetention } from './retention'\nimport type {\n ChangeSetRetention,\n CheckpointAdvanceInput,\n CheckpointRetention,\n CheckpointService,\n RRRoutesCheckpoint,\n} from './types'\n\nexport type CreateCheckpointServiceOptions = {\n inspect: () => Promise<RRRoutesSnapshot>\n storage?: InspectionStorage\n scope?: string\n retention?: CheckpointRetention\n changeSetRetention?: ChangeSetRetention\n}\n\nexport function createCheckpointService(\n options: CreateCheckpointServiceOptions,\n): CheckpointService {\n const storage = options.storage ?? createMemoryInspectionStorage()\n const lock = new ScopeLock()\n const defaultScope = options.scope ?? 'default'\n const transaction = <T>(operation: () => Promise<T>) =>\n storage.transaction ? storage.transaction(operation) : operation()\n\n const createRecord = (\n scope: string,\n snapshot: RRRoutesSnapshot,\n trigger: NonNullable<CheckpointAdvanceInput['trigger']>,\n ): RRRoutesCheckpoint => {\n const now = new Date().toISOString()\n return {\n id: hashCanonicalValue({\n scope,\n snapshotHash: snapshot.meta.snapshotHash,\n now,\n }),\n scope,\n createdAt: now,\n updatedAt: now,\n snapshotHash: snapshot.meta.snapshotHash,\n snapshot,\n trigger,\n }\n }\n\n const service: CheckpointService = {\n async advance(input = {}) {\n const scope = input.scope ?? defaultScope\n const trigger = input.trigger ?? { type: 'manual' }\n return lock.run(scope, () => transaction(async () => {\n if (trigger.externalId) {\n const priorSummary = (await storage.checkpoints.list(scope)).find(\n (checkpoint) =>\n checkpoint.trigger.externalId === trigger.externalId,\n )\n if (priorSummary) {\n const checkpoint = await storage.checkpoints.get(priorSummary.id)\n if (checkpoint) {\n const changeSummary = (\n await storage.changes.list({ scope })\n ).find(\n (changeSet) =>\n changeSet.trigger.externalId === trigger.externalId,\n )\n const changeSet = changeSummary\n ? await storage.changes.get(changeSummary.id)\n : undefined\n return {\n status: 'idempotent_replay' as const,\n checkpoint,\n changeSet,\n }\n }\n }\n }\n const current = await options.inspect()\n const active = await storage.checkpoints.getActive(scope)\n if (!active) {\n const checkpoint = createRecord(scope, current, trigger)\n await storage.checkpoints.save(checkpoint)\n await storage.checkpoints.setActive(scope, checkpoint.id)\n return { status: 'baseline_created' as const, checkpoint }\n }\n if (active.snapshotHash === current.meta.snapshotHash) {\n return { status: 'no_changes' as const, checkpoint: active }\n }\n\n const duplicate = await storage.changes.findByTransition(\n scope,\n active.snapshotHash,\n current.meta.snapshotHash,\n )\n const checkpoint = createRecord(scope, current, trigger)\n const changeSet =\n duplicate ??\n diffRRRoutesSnapshots(active.snapshot, current, {\n scope,\n trigger,\n fromCheckpointId: active.id,\n toCheckpointId: checkpoint.id,\n })\n\n if (!duplicate) await storage.changes.save(changeSet)\n await storage.checkpoints.save(checkpoint)\n await storage.checkpoints.setActive(scope, checkpoint.id)\n await applyCheckpointRetention({\n storage,\n scope,\n activeId: checkpoint.id,\n retention: options.retention,\n })\n await applyChangeSetRetention({\n storage,\n scope,\n retention: options.changeSetRetention ?? { type: 'forever' },\n })\n return { status: 'advanced' as const, checkpoint, changeSet }\n }))\n },\n async create(input = {}) {\n const scope = input.scope ?? defaultScope\n const trigger = input.trigger ?? { type: 'manual' }\n return lock.run(scope, () => transaction(async () => {\n const checkpoint = createRecord(scope, await options.inspect(), trigger)\n await storage.checkpoints.save(checkpoint)\n await storage.checkpoints.setActive(scope, checkpoint.id)\n await applyCheckpointRetention({\n storage,\n scope,\n activeId: checkpoint.id,\n retention: options.retention,\n })\n return checkpoint\n }))\n },\n get: (id) => storage.checkpoints.get(id),\n getActive: (scope = defaultScope) => storage.checkpoints.getActive(scope),\n list: (scope) => storage.checkpoints.list(scope),\n async delete(id) {\n const checkpoint = await storage.checkpoints.get(id)\n if (!checkpoint) return\n const active = await storage.checkpoints.getActive(checkpoint.scope)\n if (active?.id === id) {\n throw new Error('The active checkpoint cannot be deleted.')\n }\n await storage.checkpoints.delete(id)\n },\n listChangeSets: (scope) => storage.changes.list({ scope }),\n getChangeSet: (id) => storage.changes.get(id),\n }\n return service\n}\n","import { randomUUID } from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { RRRoutesChangeSet } from '../diff/types'\nimport type {\n RRRoutesChangeSetSummary,\n RRRoutesCheckpoint,\n RRRoutesCheckpointSummary,\n} from '../checkpoint/types'\nimport type { InspectionStorage } from './types'\n\nexport type FileSystemInspectionStorageOptions = {\n directory: string\n}\n\nfunction encodeSegment(value: string): string {\n return Buffer.from(value, 'utf8').toString('base64url')\n}\n\nasync function exists(file: string): Promise<boolean> {\n try {\n await fs.access(file)\n return true\n } catch {\n return false\n }\n}\n\nasync function atomicWriteJson(file: string, value: unknown): Promise<void> {\n const directory = path.dirname(file)\n await fs.mkdir(directory, { recursive: true })\n const temporary = path.join(\n directory,\n `.${path.basename(file)}.${randomUUID()}.tmp`,\n )\n const handle = await fs.open(temporary, 'wx')\n try {\n await handle.writeFile(`${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n await handle.sync()\n } finally {\n await handle.close()\n }\n await fs.rename(temporary, file)\n try {\n const directoryHandle = await fs.open(directory, 'r')\n try {\n await directoryHandle.sync()\n } finally {\n await directoryHandle.close()\n }\n } catch {\n // Directory fsync is not supported by every platform/filesystem.\n }\n}\n\nasync function readJson<T>(file: string): Promise<T | undefined> {\n try {\n return JSON.parse(await fs.readFile(file, 'utf8')) as T\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\n throw error\n }\n}\n\nasync function listJsonFiles(directory: string): Promise<string[]> {\n if (!(await exists(directory))) return []\n const out: string[] = []\n const visit = async (current: string): Promise<void> => {\n for (const entry of await fs.readdir(current, { withFileTypes: true })) {\n const resolved = path.join(current, entry.name)\n if (entry.isDirectory()) await visit(resolved)\n else if (entry.isFile() && entry.name.endsWith('.json'))\n out.push(resolved)\n }\n }\n await visit(directory)\n return out.sort()\n}\n\nexport function createFileSystemInspectionStorage(\n options: FileSystemInspectionStorageOptions,\n): InspectionStorage {\n const root = path.resolve(options.directory)\n const checkpointRoot = path.join(root, 'checkpoints')\n const changeRoot = path.join(root, 'changes')\n const checkpointFile = (scope: string, id: string) =>\n path.join(\n checkpointRoot,\n encodeSegment(scope),\n `checkpoint-${encodeSegment(id)}.json`,\n )\n const activeFile = (scope: string) =>\n path.join(checkpointRoot, encodeSegment(scope), 'active.json')\n const changeFile = (changeSet: RRRoutesChangeSet) => {\n const date = new Date(changeSet.createdAt)\n const year = String(date.getUTCFullYear()).padStart(4, '0')\n const month = String(date.getUTCMonth() + 1).padStart(2, '0')\n return path.join(\n changeRoot,\n encodeSegment(changeSet.scope),\n year,\n month,\n `${encodeSegment(changeSet.id)}.json`,\n )\n }\n\n const findCheckpoint = async (id: string) => {\n const files = (await listJsonFiles(checkpointRoot)).filter(\n (file) => path.basename(file) !== 'active.json',\n )\n for (const file of files) {\n const checkpoint = await readJson<RRRoutesCheckpoint>(file)\n if (checkpoint?.id === id) return checkpoint\n }\n return undefined\n }\n\n const findChangeSet = async (id: string) => {\n for (const file of await listJsonFiles(changeRoot)) {\n const changeSet = await readJson<RRRoutesChangeSet>(file)\n if (changeSet?.id === id) return changeSet\n }\n return undefined\n }\n\n return {\n checkpoints: {\n get: findCheckpoint,\n async getActive(scope) {\n const pointer = await readJson<{ checkpointId: string }>(\n activeFile(scope),\n )\n return pointer ? findCheckpoint(pointer.checkpointId) : undefined\n },\n async list(scope) {\n const files = (await listJsonFiles(checkpointRoot)).filter(\n (file) => path.basename(file) !== 'active.json',\n )\n const activeIds = new Map<string, string>()\n const values: RRRoutesCheckpoint[] = []\n for (const file of files) {\n const checkpoint = await readJson<RRRoutesCheckpoint>(file)\n if (!checkpoint || (scope && checkpoint.scope !== scope)) continue\n values.push(checkpoint)\n if (!activeIds.has(checkpoint.scope)) {\n const pointer = await readJson<{ checkpointId: string }>(\n activeFile(checkpoint.scope),\n )\n if (pointer) activeIds.set(checkpoint.scope, pointer.checkpointId)\n }\n }\n return values\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt))\n .map((checkpoint): RRRoutesCheckpointSummary => {\n const { snapshot: _snapshot, ...summary } = checkpoint\n return {\n ...summary,\n active: activeIds.get(checkpoint.scope) === checkpoint.id,\n }\n })\n },\n async save(checkpoint) {\n await atomicWriteJson(\n checkpointFile(checkpoint.scope, checkpoint.id),\n checkpoint,\n )\n },\n async setActive(scope, checkpointId) {\n const checkpoint = await findCheckpoint(checkpointId)\n if (!checkpoint || checkpoint.scope !== scope) {\n throw new Error(\n `Checkpoint ${checkpointId} does not belong to scope ${scope}.`,\n )\n }\n await atomicWriteJson(activeFile(scope), { checkpointId })\n },\n async delete(id) {\n const checkpoint = await findCheckpoint(id)\n if (!checkpoint) return\n const file = checkpointFile(checkpoint.scope, checkpoint.id)\n await fs.unlink(file).catch((error: NodeJS.ErrnoException) => {\n if (error.code !== 'ENOENT') throw error\n })\n },\n },\n changes: {\n get: findChangeSet,\n async findByTransition(scope, fromHash, toHash) {\n for (const file of await listJsonFiles(\n path.join(changeRoot, encodeSegment(scope)),\n )) {\n const changeSet = await readJson<RRRoutesChangeSet>(file)\n if (\n changeSet?.scope === scope &&\n changeSet.from.snapshotHash === fromHash &&\n changeSet.to.snapshotHash === toHash\n ) {\n return changeSet\n }\n }\n return undefined\n },\n async list(query = {}) {\n const directory = query.scope\n ? path.join(changeRoot, encodeSegment(query.scope))\n : changeRoot\n const values: RRRoutesChangeSet[] = []\n for (const file of await listJsonFiles(directory)) {\n const changeSet = await readJson<RRRoutesChangeSet>(file)\n if (changeSet && (!query.scope || changeSet.scope === query.scope)) {\n values.push(changeSet)\n }\n }\n const selected = values\n .sort((left, right) => right.createdAt.localeCompare(left.createdAt))\n .slice(0, query.limit ?? values.length)\n return selected.map((changeSet): RRRoutesChangeSetSummary => {\n const { changes: _changes, ...summary } = changeSet\n return summary\n })\n },\n async save(changeSet) {\n const existing = await this.findByTransition(\n changeSet.scope,\n changeSet.from.snapshotHash,\n changeSet.to.snapshotHash,\n )\n if (existing) return\n await atomicWriteJson(changeFile(changeSet), changeSet)\n },\n async delete(id) {\n const changeSet = await findChangeSet(id)\n if (!changeSet) return\n await fs\n .unlink(changeFile(changeSet))\n .catch((error: NodeJS.ErrnoException) => {\n if (error.code !== 'ENOENT') throw error\n })\n },\n },\n }\n}\n","import type { RRRoutesChangeSet } from '../diff/types'\nimport type {\n RRRoutesChangeSetSummary,\n RRRoutesCheckpoint,\n RRRoutesCheckpointSummary,\n} from '../checkpoint/types'\nimport type { InspectionStorage } from './types'\n\nexport interface SQLiteStatementLike {\n run(...parameters: unknown[]): unknown\n get(...parameters: unknown[]): unknown\n all(...parameters: unknown[]): unknown\n}\n\n/** Compatible with node:sqlite DatabaseSync and better-sqlite3 databases. */\nexport interface SQLiteDatabaseLike {\n exec(sql: string): unknown\n prepare(sql: string): SQLiteStatementLike\n}\n\nexport type SQLiteInspectionStorageOptions = {\n database: SQLiteDatabaseLike\n}\n\ntype JsonRow = { json: string }\n\nfunction readRow<T>(row: unknown): T | undefined {\n if (\n !row ||\n typeof row !== 'object' ||\n typeof (row as JsonRow).json !== 'string'\n ) {\n return undefined\n }\n return JSON.parse((row as JsonRow).json) as T\n}\n\nfunction readRows<T>(rows: unknown): T[] {\n return Array.isArray(rows)\n ? rows.flatMap((row) => {\n const value = readRow<T>(row)\n return value ? [value] : []\n })\n : []\n}\n\nexport function createSQLiteInspectionStorage(\n options: SQLiteInspectionStorageOptions,\n): InspectionStorage {\n const database = options.database\n database.exec(`\n PRAGMA foreign_keys = ON;\n CREATE TABLE IF NOT EXISTS rrroutes_checkpoints (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n updated_at TEXT NOT NULL,\n json TEXT NOT NULL\n );\n CREATE INDEX IF NOT EXISTS rrroutes_checkpoints_scope_updated\n ON rrroutes_checkpoints(scope, updated_at DESC);\n CREATE TABLE IF NOT EXISTS rrroutes_active_checkpoints (\n scope TEXT PRIMARY KEY,\n checkpoint_id TEXT NOT NULL REFERENCES rrroutes_checkpoints(id)\n );\n CREATE TABLE IF NOT EXISTS rrroutes_change_sets (\n id TEXT PRIMARY KEY,\n scope TEXT NOT NULL,\n from_hash TEXT NOT NULL,\n to_hash TEXT NOT NULL,\n created_at TEXT NOT NULL,\n json TEXT NOT NULL,\n UNIQUE(scope, from_hash, to_hash)\n );\n CREATE INDEX IF NOT EXISTS rrroutes_changes_scope_created\n ON rrroutes_change_sets(scope, created_at DESC);\n `)\n\n const getCheckpoint = database.prepare(\n 'SELECT json FROM rrroutes_checkpoints WHERE id = ?',\n )\n const storage: InspectionStorage = {\n async transaction<T>(operation: () => Promise<T>): Promise<T> {\n database.exec('BEGIN IMMEDIATE')\n try {\n const result = await operation()\n database.exec('COMMIT')\n return result\n } catch (error) {\n database.exec('ROLLBACK')\n throw error\n }\n },\n checkpoints: {\n async get(id) {\n return readRow<RRRoutesCheckpoint>(getCheckpoint.get(id))\n },\n async getActive(scope) {\n const statement = database.prepare(`\n SELECT checkpoint.json AS json\n FROM rrroutes_active_checkpoints active\n JOIN rrroutes_checkpoints checkpoint ON checkpoint.id = active.checkpoint_id\n WHERE active.scope = ?\n `)\n return readRow<RRRoutesCheckpoint>(statement.get(scope))\n },\n async list(scope) {\n const rows = scope\n ? database\n .prepare(\n 'SELECT json FROM rrroutes_checkpoints WHERE scope = ? ORDER BY updated_at DESC',\n )\n .all(scope)\n : database\n .prepare(\n 'SELECT json FROM rrroutes_checkpoints ORDER BY updated_at DESC',\n )\n .all()\n const activeRows = database\n .prepare(\n 'SELECT scope, checkpoint_id FROM rrroutes_active_checkpoints',\n )\n .all() as Array<{ scope: string; checkpoint_id: string }>\n const active = new Map(\n Array.isArray(activeRows)\n ? activeRows.map((row) => [row.scope, row.checkpoint_id] as const)\n : [],\n )\n return readRows<RRRoutesCheckpoint>(rows).map(\n (checkpoint): RRRoutesCheckpointSummary => {\n const { snapshot: _snapshot, ...summary } = checkpoint\n return {\n ...summary,\n active: active.get(checkpoint.scope) === checkpoint.id,\n }\n },\n )\n },\n async save(checkpoint) {\n database\n .prepare(\n `\n INSERT INTO rrroutes_checkpoints(id, scope, updated_at, json)\n VALUES (?, ?, ?, ?)\n ON CONFLICT(id) DO UPDATE SET\n scope = excluded.scope,\n updated_at = excluded.updated_at,\n json = excluded.json\n `,\n )\n .run(\n checkpoint.id,\n checkpoint.scope,\n checkpoint.updatedAt,\n JSON.stringify(checkpoint),\n )\n },\n async setActive(scope, checkpointId) {\n const checkpoint = readRow<RRRoutesCheckpoint>(\n getCheckpoint.get(checkpointId),\n )\n if (!checkpoint || checkpoint.scope !== scope) {\n throw new Error(\n `Checkpoint ${checkpointId} does not belong to scope ${scope}.`,\n )\n }\n database\n .prepare(\n `\n INSERT INTO rrroutes_active_checkpoints(scope, checkpoint_id)\n VALUES (?, ?)\n ON CONFLICT(scope) DO UPDATE SET checkpoint_id = excluded.checkpoint_id\n `,\n )\n .run(scope, checkpointId)\n },\n async delete(id) {\n database\n .prepare('DELETE FROM rrroutes_checkpoints WHERE id = ?')\n .run(id)\n },\n },\n changes: {\n async get(id) {\n return readRow<RRRoutesChangeSet>(\n database\n .prepare('SELECT json FROM rrroutes_change_sets WHERE id = ?')\n .get(id),\n )\n },\n async findByTransition(scope, fromHash, toHash) {\n return readRow<RRRoutesChangeSet>(\n database\n .prepare(\n `\n SELECT json FROM rrroutes_change_sets\n WHERE scope = ? AND from_hash = ? AND to_hash = ?\n `,\n )\n .get(scope, fromHash, toHash),\n )\n },\n async list(query = {}) {\n const rows = query.scope\n ? database\n .prepare(\n `\n SELECT json FROM rrroutes_change_sets\n WHERE scope = ? ORDER BY created_at DESC LIMIT ?\n `,\n )\n .all(query.scope, query.limit ?? -1)\n : database\n .prepare(\n `\n SELECT json FROM rrroutes_change_sets\n ORDER BY created_at DESC LIMIT ?\n `,\n )\n .all(query.limit ?? -1)\n return readRows<RRRoutesChangeSet>(rows).map(\n (changeSet): RRRoutesChangeSetSummary => {\n const { changes: _changes, ...summary } = changeSet\n return summary\n },\n )\n },\n async save(changeSet) {\n database\n .prepare(\n `\n INSERT OR IGNORE INTO rrroutes_change_sets(\n id, scope, from_hash, to_hash, created_at, json\n ) VALUES (?, ?, ?, ?, ?, ?)\n `,\n )\n .run(\n changeSet.id,\n changeSet.scope,\n changeSet.from.snapshotHash,\n changeSet.to.snapshotHash,\n changeSet.createdAt,\n JSON.stringify(changeSet),\n )\n },\n async delete(id) {\n database\n .prepare('DELETE FROM rrroutes_change_sets WHERE id = ?')\n .run(id)\n },\n },\n }\n return storage\n}\n","import type { RouteKey } from '@emeryld/rrroutes-contract'\nimport type { CheckpointTrigger } from '../diff/types'\nimport type {\n HttpHandler,\n InspectorHttpOptions,\n InspectorMutationAction,\n InspectorRuntimeLike,\n} from './types'\n\nfunction json(value: unknown, status = 200): Response {\n return Response.json(value, {\n status,\n headers: {\n 'cache-control': 'no-store, max-age=0',\n 'content-type': 'application/json; charset=utf-8',\n 'x-content-type-options': 'nosniff',\n },\n })\n}\n\nasync function overview(\n snapshot: Awaited<ReturnType<InspectorRuntimeLike['inspect']>>,\n runtime: InspectorRuntimeLike,\n) {\n const routes = Object.values(snapshot.routes)\n const clientBindings = Object.values(snapshot.clients).flatMap(\n (client) => client.bindings,\n )\n const [activeCheckpoint, latestChangeSet] = await Promise.all([\n runtime.checkpoints.getActive(),\n runtime.checkpoints.listChangeSets().then((items) => items[0]),\n ])\n return {\n totalRoutes: routes.length,\n contractOnlyRoutes: routes.filter(\n (route) =>\n route.clients.length === 0 && route.status.server !== 'enabled',\n ).length,\n clientBoundRoutes: routes.filter((route) => route.clients.length > 0)\n .length,\n serverRegisteredRoutes: routes.filter((route) => route.server?.registered)\n .length,\n disabledServerRoutes: routes.filter(\n (route) => route.server?.registered && !route.server.enabled,\n ).length,\n routesMissingServerController: routes.filter(\n (route) => route.status.server === 'missing',\n ).length,\n clientBindings: clientBindings.length,\n augments: clientBindings.reduce(\n (total, binding) => total + binding.augments.length,\n 0,\n ),\n routeSocketConnections: clientBindings.reduce(\n (total, binding) => total + binding.socketConnections.length,\n 0,\n ),\n socketContractEvents: Object.values(snapshot.sockets).reduce(\n (total, socket) => total + Object.keys(socket.contract.events).length,\n 0,\n ),\n serverBeforeMiddleware: routes.reduce(\n (total, route) => total + (route.server?.before.length ?? 0),\n 0,\n ),\n activeCheckpoint: activeCheckpoint\n ? {\n id: activeCheckpoint.id,\n scope: activeCheckpoint.scope,\n snapshotHash: activeCheckpoint.snapshotHash,\n updatedAt: activeCheckpoint.updatedAt,\n }\n : undefined,\n latestChangeSet,\n diagnostics: snapshot.diagnostics.length,\n }\n}\n\nasync function readMutationBody(\n request: Request,\n maximum: number,\n): Promise<Record<string, unknown>> {\n const contentLength = Number(request.headers.get('content-length') ?? '0')\n if (contentLength > maximum) throw new Error('REQUEST_BODY_TOO_LARGE')\n const text = await request.text()\n if (new TextEncoder().encode(text).byteLength > maximum) {\n throw new Error('REQUEST_BODY_TOO_LARGE')\n }\n if (!text) return {}\n const value = JSON.parse(text) as unknown\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('REQUEST_BODY_INVALID')\n }\n return value as Record<string, unknown>\n}\n\nexport function createInspectorHttpHandler(\n runtime: InspectorRuntimeLike,\n options: InspectorHttpOptions = {},\n): HttpHandler {\n const mutationOptions = options.mutations\n const authorizeRead = async (request: Request) =>\n !options.authorize || (await options.authorize({ request, action: 'read' }))\n const authorizeMutation = async (\n request: Request,\n action: InspectorMutationAction,\n ) =>\n mutationOptions !== false &&\n mutationOptions?.enabled === true &&\n (!mutationOptions.authorize ||\n (await mutationOptions.authorize({ request, action })))\n\n return async (request) => {\n try {\n if (!(await authorizeRead(request))) {\n return json(\n { error: { code: 'FORBIDDEN', message: 'Access denied.' } },\n 403,\n )\n }\n const url = new URL(request.url)\n const pathname = url.pathname.replace(/\\/$/, '') || '/'\n const method = request.method.toUpperCase()\n const snapshot = async () =>\n runtime.inspect({ includeLive: options.includeLive ?? false })\n\n if (method === 'GET' && pathname === '/api/meta') {\n const value = await snapshot()\n return json({ meta: value.meta, capabilities: value.capabilities })\n }\n if (method === 'GET' && pathname === '/api/snapshot')\n return json(await snapshot())\n if (method === 'GET' && pathname === '/api/overview')\n return json(await overview(await snapshot(), runtime))\n if (method === 'GET' && pathname === '/api/routes') {\n return json(Object.values((await snapshot()).routes))\n }\n if (method === 'GET' && pathname.startsWith('/api/routes/')) {\n const routeKey = decodeURIComponent(\n pathname.slice('/api/routes/'.length),\n ) as RouteKey\n const route = (await snapshot()).routes[routeKey]\n return route\n ? json(route)\n : json(\n { error: { code: 'NOT_FOUND', message: 'Route not found.' } },\n 404,\n )\n }\n if (method === 'GET' && pathname === '/api/clients') {\n return json((await snapshot()).clients)\n }\n if (method === 'GET' && pathname.startsWith('/api/clients/')) {\n const id = decodeURIComponent(pathname.slice('/api/clients/'.length))\n const client = (await snapshot()).clients[id]\n return client\n ? json(client)\n : json(\n { error: { code: 'NOT_FOUND', message: 'Client not found.' } },\n 404,\n )\n }\n if (method === 'GET' && pathname === '/api/servers')\n return json((await snapshot()).servers)\n if (method === 'GET' && pathname === '/api/sockets')\n return json((await snapshot()).sockets)\n if (method === 'GET' && pathname === '/api/checkpoints')\n return json(await runtime.checkpoints.list())\n if (method === 'GET' && pathname === '/api/changes')\n return json(await runtime.checkpoints.listChangeSets())\n if (method === 'GET' && pathname.startsWith('/api/changes/')) {\n const id = decodeURIComponent(pathname.slice('/api/changes/'.length))\n const changeSet = await runtime.checkpoints.getChangeSet(id)\n return changeSet\n ? json(changeSet)\n : json(\n {\n error: { code: 'NOT_FOUND', message: 'Change set not found.' },\n },\n 404,\n )\n }\n\n if (method === 'POST' && pathname === '/api/checkpoints') {\n if (!(await authorizeMutation(request, 'checkpoint.create'))) {\n return json(\n {\n error: {\n code: 'MUTATIONS_DISABLED',\n message: 'Inspector mutations are disabled.',\n },\n },\n 403,\n )\n }\n const body = await readMutationBody(\n request,\n options.maxMutationBodyBytes ?? 16_384,\n )\n return json(\n await runtime.checkpoints.create({\n scope: typeof body.scope === 'string' ? body.scope : undefined,\n trigger: body.trigger as CheckpointTrigger | undefined,\n }),\n 201,\n )\n }\n if (method === 'POST' && pathname === '/api/checkpoints/advance') {\n if (!(await authorizeMutation(request, 'checkpoint.advance'))) {\n return json(\n {\n error: {\n code: 'MUTATIONS_DISABLED',\n message: 'Inspector mutations are disabled.',\n },\n },\n 403,\n )\n }\n const body = await readMutationBody(\n request,\n options.maxMutationBodyBytes ?? 16_384,\n )\n const idempotencyKey =\n request.headers.get('idempotency-key') ?? undefined\n const trigger =\n body.trigger && typeof body.trigger === 'object'\n ? {\n ...(body.trigger as CheckpointTrigger),\n externalId:\n (body.trigger as CheckpointTrigger).externalId ??\n idempotencyKey,\n }\n : { type: 'api', externalId: idempotencyKey }\n return json(\n await runtime.checkpoints.advance({\n scope: typeof body.scope === 'string' ? body.scope : undefined,\n trigger,\n }),\n )\n }\n if (method === 'DELETE' && pathname.startsWith('/api/checkpoints/')) {\n if (!(await authorizeMutation(request, 'checkpoint.delete'))) {\n return json(\n {\n error: {\n code: 'MUTATIONS_DISABLED',\n message: 'Inspector mutations are disabled.',\n },\n },\n 403,\n )\n }\n const id = decodeURIComponent(\n pathname.slice('/api/checkpoints/'.length),\n )\n await runtime.checkpoints.delete(id)\n return new Response(null, {\n status: 204,\n headers: { 'cache-control': 'no-store' },\n })\n }\n\n return json(\n {\n error: {\n code: 'NOT_FOUND',\n message: 'Inspector endpoint not found.',\n },\n },\n 404,\n )\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n if (message === 'REQUEST_BODY_TOO_LARGE') {\n return json(\n {\n error: {\n code: message,\n message: 'Mutation body exceeds the configured limit.',\n },\n },\n 413,\n )\n }\n if (message === 'REQUEST_BODY_INVALID' || error instanceof SyntaxError) {\n return json(\n {\n error: {\n code: 'REQUEST_BODY_INVALID',\n message: 'Mutation body must be a JSON object.',\n },\n },\n 400,\n )\n }\n return json({ error: { code: 'INSPECTOR_ERROR', message } }, 500)\n }\n }\n}\n","import { createRequire } from 'node:module'\nimport type { RequestHandler, Router } from 'express'\nimport { createInspectorHttpHandler } from '../http/handler'\nimport type { InspectorHttpOptions, InspectorRuntimeLike } from '../http/types'\n\nexport type InspectorExpressOptions = InspectorHttpOptions & {\n runtime: InspectorRuntimeLike\n}\n\nfunction loadExpress(): typeof import('express') {\n const require = createRequire(`${process.cwd()}/package.json`)\n const loaded = require('express') as\n | typeof import('express')\n | { default: typeof import('express') }\n return 'default' in loaded ? loaded.default : loaded\n}\n\nexport function createExpressRouter(options: InspectorExpressOptions): Router {\n const express = loadExpress()\n const router = express.Router()\n const limit = options.maxMutationBodyBytes ?? 16_384\n router.use(express.json({ limit }))\n const handler = createInspectorHttpHandler(options.runtime, options)\n const bridge: RequestHandler = async (req, res, next) => {\n try {\n const headers = new Headers()\n for (const [name, raw] of Object.entries(req.headers)) {\n if (Array.isArray(raw))\n raw.forEach((value) => headers.append(name, value))\n else if (raw !== undefined) headers.set(name, raw)\n }\n const method = req.method.toUpperCase()\n const body =\n method === 'GET' || method === 'HEAD' || req.body === undefined\n ? undefined\n : JSON.stringify(req.body)\n const request = new Request(`http://rrroutes.local${req.url}`, {\n method,\n headers,\n body,\n })\n const response = await handler(request)\n response.headers.forEach((value, name) => res.setHeader(name, value))\n res.status(response.status)\n const bytes = new Uint8Array(await response.arrayBuffer())\n res.send(Buffer.from(bytes))\n } catch (error) {\n next(error)\n }\n }\n router.use(bridge)\n return router\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { RRRoutesChangeSet } from '../diff/types'\nimport type { RRRoutesSnapshot } from '../snapshot/types'\n\nasync function writeJson(file: string, value: unknown): Promise<void> {\n const resolved = path.resolve(file)\n await fs.mkdir(path.dirname(resolved), { recursive: true })\n await fs.writeFile(resolved, `${JSON.stringify(value, null, 2)}\\n`, 'utf8')\n}\n\nexport type WriteSnapshotOptions = {\n outFile: string\n}\n\nexport type WriteChangeSetOptions = {\n outFile: string\n}\n\nexport async function writeRRRoutesSnapshot(\n snapshot: RRRoutesSnapshot,\n options: WriteSnapshotOptions,\n): Promise<void> {\n await writeJson(options.outFile, snapshot)\n}\n\nexport async function writeRRRoutesChangeSet(\n changeSet: RRRoutesChangeSet,\n options: WriteChangeSetOptions,\n): Promise<void> {\n await writeJson(options.outFile, changeSet)\n}\n","import type { CheckpointService } from './checkpoint/types'\nimport { createCheckpointService } from './checkpoint/service'\nimport { diffRRRoutesSnapshots } from './diff/diff-snapshots'\nimport type { DiffOptions, RRRoutesChangeSet } from './diff/types'\nimport {\n writeRRRoutesChangeSet,\n writeRRRoutesSnapshot,\n type WriteChangeSetOptions,\n type WriteSnapshotOptions,\n} from './files/write'\nimport {\n createExpressRouter,\n type InspectorExpressOptions,\n} from './adapters/express'\nimport { createInspectorHttpHandler } from './http/handler'\nimport type { HttpHandler, InspectorHttpOptions } from './http/types'\nimport { buildRRRoutesSnapshot } from './snapshot/build'\nimport type {\n CreateRRRoutesExportRuntimeOptions,\n InspectOptions,\n RRRoutesSnapshot,\n} from './snapshot/types'\n\nexport interface RRRoutesExportRuntime {\n inspect(options?: InspectOptions): Promise<RRRoutesSnapshot>\n diff(\n before: RRRoutesSnapshot,\n after?: RRRoutesSnapshot,\n options?: DiffOptions,\n ): Promise<RRRoutesChangeSet>\n checkpoints: CheckpointService\n createHttpHandler(options?: InspectorHttpOptions): HttpHandler\n createExpressRouter(\n options?: Omit<InspectorExpressOptions, 'runtime'>,\n ): ReturnType<typeof createExpressRouter>\n writeSnapshot(options: WriteSnapshotOptions): Promise<RRRoutesSnapshot>\n writeChangeSet(\n changeSet: RRRoutesChangeSet,\n options: WriteChangeSetOptions,\n ): Promise<void>\n}\n\nexport function createRRRoutesExportRuntime(\n options: CreateRRRoutesExportRuntimeOptions,\n): RRRoutesExportRuntime {\n const inspect = (inspectOptions?: InspectOptions) =>\n buildRRRoutesSnapshot(options, inspectOptions)\n const checkpoints = createCheckpointService({\n inspect: () => inspect({ includeLive: false }),\n storage: options.storage,\n scope: options.checkpoints?.scope,\n retention: options.checkpoints?.retention,\n changeSetRetention: options.checkpoints?.changeSetRetention,\n })\n const runtime: RRRoutesExportRuntime = {\n inspect,\n async diff(before, after, diffOptions) {\n return diffRRRoutesSnapshots(\n before,\n after ?? (await inspect()),\n diffOptions,\n )\n },\n checkpoints,\n createHttpHandler(httpOptions) {\n return createInspectorHttpHandler(runtime, httpOptions)\n },\n createExpressRouter(expressOptions = {}) {\n return createExpressRouter({ runtime, ...expressOptions })\n },\n async writeSnapshot(writeOptions) {\n const snapshot = await inspect()\n await writeRRRoutesSnapshot(snapshot, writeOptions)\n return snapshot\n },\n writeChangeSet,\n }\n return runtime\n}\n\nasync function writeChangeSet(\n changeSet: RRRoutesChangeSet,\n writeOptions: WriteChangeSetOptions,\n): Promise<void> {\n await writeRRRoutesChangeSet(changeSet, writeOptions)\n}\n","import path from 'node:path'\nimport { pathToFileURL } from 'node:url'\nimport type { RRRoutesExportRuntime } from '../runtime'\n\nexport function parseCliFlags(argv: readonly string[]): Map<string, string> {\n const flags = new Map<string, string>()\n for (let index = 0; index < argv.length; index += 1) {\n const flag = argv[index]\n if (!flag?.startsWith('--')) continue\n const value = argv[index + 1]\n if (!value || value.startsWith('--')) {\n flags.set(flag, 'true')\n continue\n }\n flags.set(flag, value)\n index += 1\n }\n return flags\n}\n\nexport async function loadExportRuntime(args: {\n modulePath: string\n exportName?: string\n}): Promise<RRRoutesExportRuntime> {\n const resolved = path.resolve(args.modulePath)\n const module = await import(pathToFileURL(resolved).href)\n const exportName = args.exportName ?? 'rrroutesExport'\n const value = module[exportName] ?? module.default?.[exportName]\n if (!value || typeof value.inspect !== 'function' || !value.checkpoints) {\n throw new Error(\n `Export \"${exportName}\" in ${resolved} is not an RRRoutes export runtime.`,\n )\n }\n return value as RRRoutesExportRuntime\n}\n\nexport function requiredFlag(flags: Map<string, string>, name: string): string {\n const value = flags.get(name)\n if (!value || value === 'true')\n throw new Error(`Missing required ${name} argument.`)\n return value\n}\n","import path from 'node:path'\nimport { loadExportRuntime, parseCliFlags, requiredFlag } from './runtime'\n\nexport async function runSnapshotCli(argv: readonly string[]) {\n const flags = parseCliFlags(argv)\n const runtime = await loadExportRuntime({\n modulePath: requiredFlag(flags, '--module'),\n exportName: flags.get('--export'),\n })\n const outFile = flags.get('--out') ?? 'rrroutes.snapshot.json'\n const snapshot = await runtime.writeSnapshot({ outFile })\n return { snapshot, outFile: path.resolve(outFile) }\n}\n","import fs from 'node:fs/promises'\nimport path from 'node:path'\nimport type { RRRoutesSnapshot } from '../snapshot/types'\nimport { loadExportRuntime, parseCliFlags, requiredFlag } from './runtime'\n\nexport async function runChangesCli(argv: readonly string[]) {\n const flags = parseCliFlags(argv)\n const runtime = await loadExportRuntime({\n modulePath: requiredFlag(flags, '--module'),\n exportName: flags.get('--export'),\n })\n const beforeFile = requiredFlag(flags, '--before')\n const before = JSON.parse(\n await fs.readFile(path.resolve(beforeFile), 'utf8'),\n ) as RRRoutesSnapshot\n const changeSet = await runtime.diff(before, undefined, {\n scope: flags.get('--scope'),\n trigger: { type: 'cli' },\n })\n const outFile = flags.get('--out') ?? 'rrroutes.changes.json'\n await runtime.writeChangeSet(changeSet, { outFile })\n return { changeSet, outFile: path.resolve(outFile) }\n}\n","import { loadExportRuntime, parseCliFlags, requiredFlag } from './runtime'\n\nexport async function runCheckpointCli(argv: readonly string[]) {\n const [action = 'advance', ...rest] = argv\n const flags = parseCliFlags(rest)\n const runtime = await loadExportRuntime({\n modulePath: requiredFlag(flags, '--module'),\n exportName: flags.get('--export'),\n })\n const scope = flags.get('--scope')\n if (action === 'advance') {\n return runtime.checkpoints.advance({ scope, trigger: { type: 'cli' } })\n }\n if (action === 'create') {\n return runtime.checkpoints.create({ scope, trigger: { type: 'cli' } })\n }\n throw new Error(`Unsupported checkpoint action: ${action}`)\n}\n","import { createRequire } from 'node:module'\nimport type { Server } from 'node:http'\nimport type { Express } from 'express'\nimport { loadExportRuntime, parseCliFlags, requiredFlag } from './runtime'\n\nexport async function runInspectorServeCli(\n argv: readonly string[],\n): Promise<{ app: Express; server: Server; port: number }> {\n const loaded = createRequire(`${process.cwd()}/package.json`)('express') as\n | typeof import('express')\n | { default: typeof import('express') }\n const express = 'default' in loaded ? loaded.default : loaded\n const flags = parseCliFlags(argv)\n const runtime = await loadExportRuntime({\n modulePath: requiredFlag(flags, '--module'),\n exportName: flags.get('--export'),\n })\n const port = Number(flags.get('--port') ?? '4310')\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n throw new Error('--port must be an integer between 1 and 65535.')\n }\n const app = express()\n app.use('/', runtime.createExpressRouter())\n const server = await new Promise<ReturnType<typeof app.listen>>((resolve) => {\n const listening = app.listen(port, () => resolve(listening))\n })\n return { app, server, port }\n}\n"],"mappings":"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","names":["path","path","branch","path","path","path","fs","path","spawn","pathToFileURL","ts","stableStringify","path","pathToFileURL","fs","ts","schemaDiff","resolveViewerTemplatePath","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","spawn","path","path","fs","path","spawn","resolveViewerTemplatePath","path","fs","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","spawn","routeKeyOf","asRecord","offset","asRecord","routeKeyOf","routeKeyOf","isLeaf","asRecord","asRecord","routeKeyOf","checkpoint","changeSet","fs","path","require","fs","path","path","pathToFileURL","path","path","fs","path","fs","path","createRequire","createRequire"]}
|