@emeryld/rrroutes-export 1.0.6 → 1.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +18 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +18 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["export * from './schemaIntrospection'\nexport * from './serializeLeafContract'\nexport * from './flattenSchema'\nexport * from './exportFinalizedLeaves'\nexport * from './exportFinalizedLeaves.cli'\nexport * from './exportFinalizedLeaves.changelog'\nexport * from './exportFinalizedLeaves.changelog.cli'\nexport * from './defaultViewerTemplate'\nexport * from './extractLeafSourceByAst'\n","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>Finalized Leaves 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>Finalized Leaves 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 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 { execFile as execFileCallback, spawn } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { pathToFileURL } from 'node:url'\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\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}\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 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 }\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}\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 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(moduleRel: string, tsconfigRel?: string) {\n const dirs = new Set(parentDirectories(moduleRel))\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 moduleRel: 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 moduleFile = normalizePath(moduleRel).replace(/^\\/+/, '')\n const moduleDir = normalizePath(path.posix.dirname(moduleFile)).replace(/^\\/+/, '')\n const tsconfigFile = tsconfigRel\n ? normalizePath(tsconfigRel).replace(/^\\/+/, '')\n : undefined\n const configFiles = buildRelevantConfigFiles(moduleFile, tsconfigFile)\n\n return changedFiles.some((file) => {\n if (file === moduleFile) return true\n if (moduleDir && moduleDir !== '.' && (file === moduleDir || file.startsWith(`${moduleDir}/`))) {\n return true\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 moduleRel: 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, moduleRel, 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%s', commit])\n const [sha, authorDate, subject] = out.split('\\x1f')\n if (!sha || !authorDate) {\n throw new Error(`Unable to read commit metadata for ${commit}`)\n }\n\n return {\n sha,\n authorDate,\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 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 createSnapshot(\n repoRoot: string,\n moduleRel: string,\n exportName: string,\n commit: ChangelogCommit,\n tempRoot: string,\n tsconfigRel?: string,\n exportOptions?: Pick<ExportFinalizedLeavesChangelogOptions, 'handlers'>,\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 const modulePath = path.resolve(worktreeDir, moduleRel)\n const tsconfigPath = tsconfigRel ? path.resolve(worktreeDir, tsconfigRel) : undefined\n const input = await loadChangelogInput(modulePath, exportName)\n\n const payload = await exportFinalizedLeaves(input as never, {\n includeSource: true,\n sourceModulePath: modulePath,\n sourceExportName: exportName,\n tsconfigPath,\n ...exportOptions,\n })\n\n const routesByKey = toRouteSnapshots(payload)\n const sourceObjectsById = toSourceObjectSnapshots(routesByKey)\n\n return {\n commit,\n routesByKey,\n sourceObjectsById,\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 routeEvents.push({\n type: 'route_added',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\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 sourceEvents.push({\n type: 'source_object_added',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\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 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 modulePathRelative,\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\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 modulePathRelative,\n exportName,\n commit,\n tempRoot,\n tsconfigRelative,\n options,\n ),\n )\n }\n\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n\n log('[changelog] diffing adjacent snapshots')\n for (let i = 1; i < snapshots.length; i += 1) {\n const { routeEvents: nextRouteEvents, sourceEvents: nextSourceEvents } = diffSnapshots(\n snapshots[i - 1],\n snapshots[i],\n )\n routeEvents.push(...nextRouteEvents)\n sourceEvents.push(...nextSourceEvents)\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 },\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 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}\n\nexport function parseFinalizedLeavesChangelogCliArgs(\n argv: string[],\n): FinalizedLeavesChangelogCliArgs {\n const args = new Map<string, string>()\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 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 }\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 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"],"mappings":"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","names":["path","import_node_path","path","ts","exports","branch","path","fs","import_node_path","path","import_promises","import_node_path","import_node_child_process","import_node_url","execFileCallback","path","fs","BAKED_PAYLOAD_MARKER","escapePayloadForInlineScript","injectPayloadIntoViewerHtml","resolveViewerTemplatePath","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","os","import_node_path","path"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../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"],"sourcesContent":["export * from './schemaIntrospection'\nexport * from './serializeLeafContract'\nexport * from './flattenSchema'\nexport * from './exportFinalizedLeaves'\nexport * from './exportFinalizedLeaves.cli'\nexport * from './exportFinalizedLeaves.changelog'\nexport * from './exportFinalizedLeaves.changelog.cli'\nexport * from './defaultViewerTemplate'\nexport * from './extractLeafSourceByAst'\n","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>Finalized Leaves 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>Finalized Leaves 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 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 { execFile as execFileCallback, spawn } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { pathToFileURL } from 'node:url'\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\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}\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 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 }\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}\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 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(moduleRel: string, tsconfigRel?: string) {\n const dirs = new Set(parentDirectories(moduleRel))\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 moduleRel: 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 moduleFile = normalizePath(moduleRel).replace(/^\\/+/, '')\n const moduleDir = normalizePath(path.posix.dirname(moduleFile)).replace(/^\\/+/, '')\n const tsconfigFile = tsconfigRel\n ? normalizePath(tsconfigRel).replace(/^\\/+/, '')\n : undefined\n const configFiles = buildRelevantConfigFiles(moduleFile, tsconfigFile)\n\n return changedFiles.some((file) => {\n if (file === moduleFile) return true\n if (moduleDir && moduleDir !== '.' && (file === moduleDir || file.startsWith(`${moduleDir}/`))) {\n return true\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 moduleRel: 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, moduleRel, 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%s', commit])\n const [sha, authorDate, subject] = out.split('\\x1f')\n if (!sha || !authorDate) {\n throw new Error(`Unable to read commit metadata for ${commit}`)\n }\n\n return {\n sha,\n authorDate,\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 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 createSnapshot(\n repoRoot: string,\n moduleRel: string,\n exportName: string,\n commit: ChangelogCommit,\n tempRoot: string,\n tsconfigRel?: string,\n exportOptions?: Pick<ExportFinalizedLeavesChangelogOptions, 'handlers'>,\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 await ensureWorktreeDependencies(repoRoot, worktreeDir)\n const modulePath = path.resolve(worktreeDir, moduleRel)\n const tsconfigPath = tsconfigRel ? path.resolve(worktreeDir, tsconfigRel) : undefined\n const input = await loadChangelogInput(modulePath, exportName)\n\n const payload = await exportFinalizedLeaves(input as never, {\n includeSource: true,\n sourceModulePath: modulePath,\n sourceExportName: exportName,\n tsconfigPath,\n ...exportOptions,\n })\n\n const routesByKey = toRouteSnapshots(payload)\n const sourceObjectsById = toSourceObjectSnapshots(routesByKey)\n\n return {\n commit,\n routesByKey,\n sourceObjectsById,\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 routeEvents.push({\n type: 'route_added',\n commitSha: current.commit.sha,\n routeKey,\n method: nextRoute.method,\n path: nextRoute.path,\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 sourceEvents.push({\n type: 'source_object_added',\n commitSha: current.commit.sha,\n sourceObjectId,\n displayName: nextSource.displayName,\n impactedRoutes: nextSource.routeKeys,\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 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 modulePathRelative,\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\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 modulePathRelative,\n exportName,\n commit,\n tempRoot,\n tsconfigRelative,\n options,\n ),\n )\n }\n\n const routeEvents: RouteChangeEvent[] = []\n const sourceEvents: SourceObjectChangeEvent[] = []\n\n log('[changelog] diffing adjacent snapshots')\n for (let i = 1; i < snapshots.length; i += 1) {\n const { routeEvents: nextRouteEvents, sourceEvents: nextSourceEvents } = diffSnapshots(\n snapshots[i - 1],\n snapshots[i],\n )\n routeEvents.push(...nextRouteEvents)\n sourceEvents.push(...nextSourceEvents)\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 },\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 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}\n\nexport function parseFinalizedLeavesChangelogCliArgs(\n argv: string[],\n): FinalizedLeavesChangelogCliArgs {\n const args = new Map<string, string>()\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 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 }\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 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"],"mappings":"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","names":["path","import_node_path","path","ts","exports","branch","path","fs","import_node_path","path","import_promises","import_node_path","import_node_child_process","import_node_url","execFileCallback","path","fs","BAKED_PAYLOAD_MARKER","escapePayloadForInlineScript","injectPayloadIntoViewerHtml","resolveViewerTemplatePath","writeJsonExport","writeBakedHtmlExport","openHtmlInBrowser","os","import_node_path","path"]}
|