@pie-element/cli 0.1.4-next.20261006160832 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/lib/docs/contracts.js +25 -123
- package/dist/lib/docs/contracts.js.map +1 -1
- package/dist/lib/docs/generator.js +81 -128
- package/dist/lib/docs/generator.js.map +1 -1
- package/dist/lib/docs/schema-properties.d.ts +10 -0
- package/dist/lib/docs/schema-properties.js +123 -0
- package/dist/lib/docs/schema-properties.js.map +1 -0
- package/dist/lib/docs/source-extractor.js +1 -1
- package/dist/lib/docs/source-extractor.js.map +1 -1
- package/dist/lib/docs/types.d.ts +10 -24
- package/dist/lib/docs/types.js.map +1 -1
- package/dist/lib/schemas/generate.d.ts +27 -0
- package/dist/lib/schemas/generate.js +101 -0
- package/dist/lib/schemas/generate.js.map +1 -0
- package/package.json +3 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/lib/docs/generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { loadPointerValue } from './source-extractor.js';\nimport type {\n PieDocsContract,\n PieDocsElementOutput,\n PieDocsPropertyMetadata,\n PieDocsProperty,\n PieDocsProperty as PieDocsPropertyContract,\n} from './types.js';\nimport type { PieDocsSourcePointer } from './types.js';\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\nconst inferType = (value: unknown): string => {\n if (value === null) return 'null';\n if (Array.isArray(value)) return 'array';\n switch (typeof value) {\n case 'string':\n case 'number':\n case 'boolean':\n return typeof value;\n case 'object':\n return 'object';\n default:\n return 'unknown';\n }\n};\n\nconst flattenProperties = (value: unknown, basePath = ''): PieDocsProperty[] => {\n if (isRecord(value)) {\n const keys = Object.keys(value).sort();\n if (keys.length === 0 && basePath) {\n return [{ path: basePath, type: 'object', required: false, defaultValue: {} }];\n }\n const flattened: PieDocsProperty[] = [];\n for (const key of keys) {\n const childPath = basePath ? `${basePath}.${key}` : key;\n flattened.push(...flattenProperties(value[key], childPath));\n }\n return flattened;\n }\n\n if (Array.isArray(value)) {\n return [\n {\n path: basePath,\n type: 'array',\n required: false,\n defaultValue: value,\n },\n ];\n }\n\n return [\n {\n path: basePath,\n type: inferType(value),\n required: false,\n defaultValue: value,\n },\n ];\n};\n\nconst escapeHtml = (value: string): string =>\n value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n .replaceAll('{', '{')\n .replaceAll('}', '}');\n\nconst formatInline = (value: unknown): string => {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n};\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') {\n return `<code>${escapeHtml(value)}</code>`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `<code>${String(value)}</code>`;\n }\n if (value === null) {\n return '<code>null</code>';\n }\n return `<code>${escapeHtml(JSON.stringify(value))}</code>`;\n};\n\nconst readSummary = async (packageDir: string, fallback?: string): Promise<string> => {\n const readmePath = join(packageDir, 'README.md');\n if (existsSync(readmePath)) {\n const readme = await readFile(readmePath, 'utf-8');\n const paragraph = readme\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith('#'))\n .find((line) => line.length > 20);\n if (paragraph) {\n return paragraph;\n }\n }\n return fallback || 'No summary provided.';\n};\n\nexport interface GenerateDocsOptions {\n outputDir: string;\n dryRun: boolean;\n check: boolean;\n}\n\nexport interface GenerateDocsResult {\n filesWritten: string[];\n filesChecked: string[];\n driftFiles: string[];\n outputs: PieDocsElementOutput[];\n}\n\n// Replace ISO-8601 timestamps with a fixed valid value so a post-normalization\n// JSON.parse still succeeds (the old `<normalized-timestamp>` placeholder was\n// not valid JSON, which forced a purely textual comparison).\nconst normalizeTimestamps = (content: string): string =>\n content.replace(/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/g, '0000-01-01T00:00:00.000Z');\n\n// Compare generated content to the checked-in artifact.\n// - For JSON files, parse both sides and compare by structural equality so\n// whitespace/formatting differences (e.g. after a biome format pass) do not\n// register as drift. HTML files fall back to text comparison with timestamps\n// normalized away.\nconst normalizeForCheck = (path: string, content: string): string => {\n const withoutTimestamps = normalizeTimestamps(content);\n if (path.endsWith('.json')) {\n try {\n return JSON.stringify(JSON.parse(withoutTimestamps));\n } catch {\n return withoutTimestamps;\n }\n }\n return withoutTimestamps;\n};\n\nconst loadValueWithFallback = async (\n packageDir: string,\n pointer: PieDocsSourcePointer,\n kind: 'pie' | 'config'\n): Promise<{ value: unknown; sourceLabel: string }> => {\n const fallbackPointers: PieDocsSourcePointer[] =\n kind === 'pie'\n ? [\n pointer,\n { file: 'src/controller/defaults.ts', path: 'model' },\n { file: 'src/controller/defaults.ts' },\n ]\n : [\n pointer,\n { file: 'src/author/defaultConfiguration.ts', path: 'configuration' },\n { file: 'src/author/defaults.ts', path: 'configuration' },\n { file: 'src/controller/defaults.ts', path: 'configuration' },\n { file: 'src/controller/defaults.ts' },\n ];\n\n let lastError: Error | undefined;\n for (const candidate of fallbackPointers) {\n if (!existsSync(join(packageDir, candidate.file))) {\n continue;\n }\n try {\n const value = await loadPointerValue(packageDir, candidate);\n return {\n value,\n sourceLabel: candidate.file + (candidate.path ? `#${candidate.path}` : ''),\n };\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (kind === 'config') {\n return { value: {}, sourceLabel: pointer.file + (pointer.path ? `#${pointer.path}` : '') };\n }\n\n throw lastError || new Error(`Unable to load ${kind} defaults from ${pointer.file}`);\n};\n\ninterface ResolvedViewDocs {\n view: string;\n pieProperties: PieDocsPropertyContract[];\n configProperties: PieDocsPropertyContract[];\n pieSource: string;\n configSource: string;\n}\n\nconst applyMetadata = (\n properties: PieDocsPropertyContract[],\n metadata?: Record<string, PieDocsPropertyMetadata>\n): PieDocsPropertyContract[] => {\n if (!metadata || Object.keys(metadata).length === 0) {\n return properties;\n }\n\n const byPath = new Map<string, PieDocsPropertyContract>(\n properties.map((p) => [p.path, { ...p }])\n );\n\n for (const [path, meta] of Object.entries(metadata)) {\n const current = byPath.get(path) || {\n path,\n type: meta.type || 'unknown',\n required: meta.required ?? false,\n };\n const merged: PieDocsPropertyContract = {\n ...current,\n ...(meta.type ? { type: meta.type } : {}),\n ...(meta.required !== undefined ? { required: meta.required } : {}),\n ...(meta.title ? { title: meta.title } : {}),\n ...(meta.description ? { description: meta.description } : {}),\n ...(meta.notes ? { notes: meta.notes } : {}),\n ...(meta.enum ? { enum: [...meta.enum] } : {}),\n ...(meta.minimum !== undefined ? { minimum: meta.minimum } : {}),\n ...(meta.maximum !== undefined ? { maximum: meta.maximum } : {}),\n ...(meta.minLength !== undefined ? { minLength: meta.minLength } : {}),\n ...(meta.maxLength !== undefined ? { maxLength: meta.maxLength } : {}),\n ...(meta.pattern ? { pattern: meta.pattern } : {}),\n ...(meta.itemType ? { itemType: meta.itemType } : {}),\n ...(meta.examples ? { examples: [...meta.examples] } : {}),\n };\n byPath.set(path, merged);\n }\n\n return Array.from(byPath.values()).sort((a, b) => a.path.localeCompare(b.path));\n};\n\nconst propertyFingerprint = (properties: PieDocsPropertyContract[]): string =>\n JSON.stringify(\n properties.map((p) => ({\n path: p.path,\n type: p.type,\n required: p.required,\n defaultValue: p.defaultValue,\n }))\n );\n\nconst renderPropertyHtml = (prop: PieDocsPropertyContract): string => {\n const rows: string[] = [];\n rows.push(`<li><strong>Type:</strong> <code>${escapeHtml(prop.type)}</code></li>`);\n rows.push(`<li><strong>Required:</strong> <code>${String(prop.required)}</code></li>`);\n if (prop.itemType) {\n rows.push(`<li><strong>Item Type:</strong> <code>${escapeHtml(prop.itemType)}</code></li>`);\n }\n if (prop.description) {\n rows.push(`<li><strong>Description:</strong> ${escapeHtml(prop.description)}</li>`);\n }\n if (prop.enum && prop.enum.length > 0) {\n rows.push(\n `<li><strong>Allowed values:</strong> ${prop.enum\n .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)\n .join(', ')}</li>`\n );\n }\n const constraints: string[] = [];\n if (prop.minimum !== undefined) constraints.push(`<code>minimum: ${prop.minimum}</code>`);\n if (prop.maximum !== undefined) constraints.push(`<code>maximum: ${prop.maximum}</code>`);\n if (prop.minLength !== undefined) constraints.push(`<code>minLength: ${prop.minLength}</code>`);\n if (prop.maxLength !== undefined) constraints.push(`<code>maxLength: ${prop.maxLength}</code>`);\n if (prop.pattern) constraints.push(`<code>pattern: ${escapeHtml(prop.pattern)}</code>`);\n if (constraints.length) {\n rows.push(`<li><strong>Constraints:</strong> ${constraints.join(', ')}</li>`);\n }\n rows.push(\n `<li><strong>Default:</strong> ${\n prop.defaultValue !== undefined ? formatValue(prop.defaultValue) : '<em>none</em>'\n }</li>`\n );\n if (prop.examples && prop.examples.length > 0) {\n rows.push(\n `<li><strong>Examples:</strong> ${prop.examples\n .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)\n .join(', ')}</li>`\n );\n }\n if (prop.notes) {\n rows.push(`<li><strong>Notes:</strong> ${escapeHtml(prop.notes)}</li>`);\n }\n\n return `\n <section class=\"doc-property\">\n <h3><code>${escapeHtml(prop.path)}</code></h3>\n <ul>\n ${rows.join('\\n ')}\n </ul>\n </section>`;\n};\n\nconst renderPropertiesSectionHtml = (\n title: string,\n source: string,\n properties: PieDocsPropertyContract[]\n): string => {\n if (properties.length === 0) {\n return `\n <section class=\"doc-section\">\n <h2>${escapeHtml(title)}</h2>\n <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>\n <p>No properties found.</p>\n </section>`;\n }\n\n return `\n <section class=\"doc-section\">\n <h2>${escapeHtml(title)}</h2>\n <p><strong>Source:</strong> <code>${escapeHtml(source)}</code></p>\n ${properties.map((prop) => renderPropertyHtml(prop)).join('\\n')}\n </section>`;\n};\n\nconst wrapHtmlPage = (title: string, body: string): string => `\n<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root { color-scheme: light dark; font-family: Inter, system-ui, sans-serif; }\n body { margin: 0; padding: 1.5rem; line-height: 1.55; }\n h1,h2,h3 { line-height: 1.25; }\n h1 { margin-top: 0; }\n code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n .doc-section { margin-bottom: 2rem; }\n .doc-property { margin: 0 0 1.25rem 0; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(128,128,128,.25); }\n ul { padding-left: 1.25rem; }\n .meta-list li { margin-bottom: .25rem; }\n </style>\n </head>\n <body>\n ${body}\n </body>\n</html>\n`;\n\nconst renderElementIndexHtml = (opts: {\n contract: PieDocsContract;\n summary: string;\n generatedAt: string;\n emittedViews: string[];\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} docs</h1>\n <section class=\"doc-section\">\n <h2>Overview</h2>\n <p>${escapeHtml(opts.summary)}</p>\n </section>\n <section class=\"doc-section\">\n <h2>Element Metadata</h2>\n <ul class=\"meta-list\">\n <li><strong>Element:</strong> <code>${escapeHtml(opts.contract.elementName)}</code></li>\n <li><strong>Package:</strong> <code>${escapeHtml(opts.contract.packageName)}</code></li>\n <li><strong>Framework:</strong> <code>${escapeHtml(opts.contract.framework)}</code></li>\n <li><strong>Generated:</strong> <code>${escapeHtml(opts.generatedAt)}</code></li>\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Supported Modes</h2>\n <ul class=\"meta-list\">\n ${(opts.contract.supportedModes || []).map((mode) => `<li>${escapeHtml(mode)}</li>`).join('')}\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Views</h2>\n <ul class=\"meta-list\">\n ${opts.emittedViews\n .map(\n (view) =>\n `<li><a href=\"./${encodeURIComponent(view)}.html\">${escapeHtml(view)}</a></li>`\n )\n .join('')}\n </ul>\n </section>\n `\n );\n\nconst renderViewHtml = (opts: {\n contract: PieDocsContract;\n view: string;\n pieSource: string;\n configSource: string;\n pieProperties: PieDocsPropertyContract[];\n configProperties: PieDocsPropertyContract[];\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} ${opts.view} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} / ${escapeHtml(opts.view)}</h1>\n ${renderPropertiesSectionHtml('Model Defaults', opts.pieSource, opts.pieProperties)}\n ${renderPropertiesSectionHtml(\n 'Authoring/Configuration Defaults',\n opts.configSource,\n opts.configProperties\n )}\n `\n );\n\nconst chooseViewDocs = (resolvedViews: ResolvedViewDocs[]): ResolvedViewDocs[] => {\n const map = new Map(resolvedViews.map((v) => [v.view, v]));\n const chosen: ResolvedViewDocs[] = [];\n\n const delivery = map.get('delivery');\n const author = map.get('author');\n const print = map.get('print');\n\n if (delivery) {\n chosen.push(delivery);\n }\n if (author) {\n chosen.push(author);\n }\n\n if (print) {\n const deliveryFingerprint = delivery\n ? `${propertyFingerprint(delivery.pieProperties)}|${propertyFingerprint(delivery.configProperties)}`\n : '';\n const printFingerprint = `${propertyFingerprint(print.pieProperties)}|${propertyFingerprint(print.configProperties)}`;\n const sourceDiffFromDelivery = delivery\n ? print.pieSource !== delivery.pieSource || print.configSource !== delivery.configSource\n : true;\n const sourceDiffFromAuthor = author\n ? print.pieSource !== author.pieSource || print.configSource !== author.configSource\n : true;\n const materiallyDifferent = !delivery || printFingerprint !== deliveryFingerprint;\n if (materiallyDifferent || sourceDiffFromDelivery || sourceDiffFromAuthor) {\n chosen.push(print);\n }\n }\n\n const extras = resolvedViews\n .filter((v) => !['delivery', 'author', 'print'].includes(v.view))\n .sort((a, b) => a.view.localeCompare(b.view));\n for (const extra of extras) {\n chosen.push(extra);\n }\n\n return chosen;\n};\n\nexport const generateDocsForContract = async (\n packageDir: string,\n contract: PieDocsContract,\n options: GenerateDocsOptions\n): Promise<GenerateDocsResult> => {\n const generatedAt = new Date().toISOString();\n const summary = await readSummary(packageDir, contract.summary);\n const filesWritten: string[] = [];\n const filesChecked: string[] = [];\n const driftFiles: string[] = [];\n const sourcesUsed = new Set<string>();\n\n const outputs: PieDocsElementOutput = {\n contract,\n packageDir,\n generatedAt,\n views: [],\n sourcesUsed: [],\n };\n\n const resolvedViews: ResolvedViewDocs[] = [];\n for (const view of contract.views) {\n const pieResolved = await loadValueWithFallback(packageDir, view.pie, 'pie');\n const configResolved = await loadValueWithFallback(packageDir, view.config, 'config');\n const pieProperties = applyMetadata(\n flattenProperties(pieResolved.value).sort((a, b) => a.path.localeCompare(b.path)),\n view.metadata?.pie\n );\n const configProperties = applyMetadata(\n flattenProperties(configResolved.value).sort((a, b) => a.path.localeCompare(b.path)),\n view.metadata?.config\n );\n\n resolvedViews.push({\n view: view.view,\n pieProperties,\n configProperties,\n pieSource: pieResolved.sourceLabel,\n configSource: configResolved.sourceLabel,\n });\n }\n\n const emittedViews = chooseViewDocs(resolvedViews);\n const elementOutputDir = join(options.outputDir, contract.elementName);\n const elementIndexPath = join(elementOutputDir, 'index.html');\n const elementIndexContent = renderElementIndexHtml({\n contract,\n summary,\n generatedAt,\n emittedViews: emittedViews.map((v) => v.view),\n });\n\n const manifest = {\n elementName: contract.elementName,\n packageName: contract.packageName,\n framework: contract.framework,\n generatedAt,\n summary,\n supportedModes: contract.supportedModes || [],\n views: emittedViews.map((view) => ({\n id: view.view,\n file: `${view.view}.html`,\n pieSource: view.pieSource,\n configSource: view.configSource,\n hasModelDefaults: view.pieProperties.length > 0,\n hasConfigDefaults: view.configProperties.length > 0,\n })),\n };\n\n const candidates: Array<{ path: string; content: string }> = [\n { path: elementIndexPath, content: elementIndexContent },\n {\n path: join(elementOutputDir, 'manifest.json'),\n content: `${JSON.stringify(manifest, null, 2)}\\n`,\n },\n ...emittedViews.map((view) => ({\n path: join(elementOutputDir, `${view.view}.html`),\n content: renderViewHtml({\n contract,\n view: view.view,\n pieSource: view.pieSource,\n configSource: view.configSource,\n pieProperties: view.pieProperties,\n configProperties: view.configProperties,\n }),\n })),\n ];\n\n for (const candidate of candidates) {\n filesChecked.push(candidate.path);\n if (options.check) {\n const existing = existsSync(candidate.path) ? await readFile(candidate.path, 'utf-8') : null;\n if (\n existing === null ||\n normalizeForCheck(candidate.path, existing) !==\n normalizeForCheck(candidate.path, candidate.content)\n ) {\n driftFiles.push(candidate.path);\n }\n continue;\n }\n\n if (!options.dryRun) {\n await mkdir(elementOutputDir, { recursive: true });\n await writeFile(candidate.path, candidate.content, 'utf-8');\n }\n filesWritten.push(candidate.path);\n }\n\n for (const view of emittedViews) {\n sourcesUsed.add(view.pieSource);\n sourcesUsed.add(view.configSource);\n outputs.views.push({\n view: view.view,\n pieProperties: view.pieProperties,\n configProperties: view.configProperties,\n });\n }\n\n outputs.sourcesUsed = Array.from(sourcesUsed).sort();\n\n return {\n filesWritten,\n filesChecked,\n driftFiles,\n outputs: [outputs],\n };\n};\n\nexport const toRelativePaths = (rootDir: string, paths: string[]): string[] =>\n paths.map((p) => relative(rootDir, p)).sort();\n"]}
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../src/lib/docs/generator.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport { join, relative } from 'node:path';\nimport { generateElementSchemas, type SchemaKind } from '../schemas/generate.js';\nimport { schemaDocs } from './schema-properties.js';\nimport { loadPointerValue } from './source-extractor.js';\nimport type {\n PieDocsContract,\n PieDocsElementOutput,\n PieDocsProperty,\n PieDocsSchemaDocs,\n PieDocsSourcePointer,\n} from './types.js';\n\nconst escapeHtml = (value: string): string =>\n value\n .replaceAll('&', '&')\n .replaceAll('<', '<')\n .replaceAll('>', '>')\n .replaceAll('\"', '"')\n .replaceAll(\"'\", ''')\n .replaceAll('{', '{')\n .replaceAll('}', '}');\n\nconst formatInline = (value: unknown): string => {\n if (typeof value === 'string') return value;\n return JSON.stringify(value);\n};\n\nconst formatValue = (value: unknown): string => {\n if (typeof value === 'string') {\n return `<code>${value === '' ? '\"\"' : escapeHtml(value)}</code>`;\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return `<code>${String(value)}</code>`;\n }\n if (value === null) {\n return '<code>null</code>';\n }\n return `<code>${escapeHtml(JSON.stringify(value))}</code>`;\n};\n\nconst readSummary = async (packageDir: string, fallback?: string): Promise<string> => {\n const readmePath = join(packageDir, 'README.md');\n if (existsSync(readmePath)) {\n const readme = await readFile(readmePath, 'utf-8');\n const paragraph = readme\n .split('\\n')\n .map((line) => line.trim())\n .filter((line) => line.length > 0 && !line.startsWith('#'))\n .find((line) => line.length > 20);\n if (paragraph) {\n return paragraph;\n }\n }\n return fallback || 'No summary provided.';\n};\n\nexport interface GenerateDocsOptions {\n outputDir: string;\n dryRun: boolean;\n check: boolean;\n}\n\nexport interface GenerateDocsResult {\n filesWritten: string[];\n filesChecked: string[];\n driftFiles: string[];\n outputs: PieDocsElementOutput[];\n}\n\n// Replace ISO-8601 timestamps with a fixed valid value so a post-normalization\n// JSON.parse still succeeds (the old `<normalized-timestamp>` placeholder was\n// not valid JSON, which forced a purely textual comparison).\nconst normalizeTimestamps = (content: string): string =>\n content.replace(/\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?Z/g, '0000-01-01T00:00:00.000Z');\n\n// Compare generated content to the checked-in artifact.\n// - For JSON files, parse both sides and compare by structural equality so\n// whitespace/formatting differences (e.g. after a biome format pass) do not\n// register as drift. HTML files fall back to text comparison with timestamps\n// normalized away.\nconst normalizeForCheck = (path: string, content: string): string => {\n const withoutTimestamps = normalizeTimestamps(content);\n if (path.endsWith('.json')) {\n try {\n return JSON.stringify(JSON.parse(withoutTimestamps));\n } catch {\n return withoutTimestamps;\n }\n }\n return withoutTimestamps;\n};\n\nconst loadValueWithFallback = async (\n packageDir: string,\n pointer: PieDocsSourcePointer,\n kind: 'pie' | 'config'\n): Promise<{ value: unknown; sourceLabel: string }> => {\n const fallbackPointers: PieDocsSourcePointer[] =\n kind === 'pie'\n ? [\n pointer,\n { file: 'src/controller/defaults.ts', path: 'model' },\n { file: 'src/controller/defaults.ts' },\n ]\n : [\n pointer,\n { file: 'src/author/defaultConfiguration.ts', path: 'configuration' },\n { file: 'src/author/defaults.ts', path: 'configuration' },\n { file: 'src/author/defaults.tsx', path: 'configuration' },\n { file: 'src/controller/defaults.ts', path: 'configuration' },\n ];\n\n let lastError: Error | undefined;\n for (const candidate of fallbackPointers) {\n if (!existsSync(join(packageDir, candidate.file))) {\n continue;\n }\n try {\n const value = await loadPointerValue(packageDir, candidate);\n return {\n value,\n sourceLabel: candidate.file + (candidate.path ? `#${candidate.path}` : ''),\n };\n } catch (error) {\n lastError = error as Error;\n }\n }\n\n if (kind === 'config') {\n return { value: {}, sourceLabel: pointer.file + (pointer.path ? `#${pointer.path}` : '') };\n }\n\n throw lastError || new Error(`Unable to load ${kind} defaults from ${pointer.file}`);\n};\n\ninterface ResolvedViewDocs {\n view: string;\n pieDocs: PieDocsSchemaDocs;\n configDocs: PieDocsSchemaDocs;\n pieSource: string;\n configSource: string;\n}\n\nconst propertyFingerprint = (properties: PieDocsProperty[]): string =>\n JSON.stringify(\n properties.map((p) => ({\n path: p.path,\n type: p.type,\n required: p.required,\n defaultValue: p.defaultValue,\n }))\n );\n\n// A type label names a documented type by its definition name; link those names to it.\nconst renderType = (type: string, anchor: (name: string) => string | undefined): string =>\n type\n .split(' | ')\n .map((member) => {\n const id = anchor(member);\n const code = `<code>${escapeHtml(member)}</code>`;\n return id ? `<a href=\"#${id}\">${code}</a>` : code;\n })\n .join(' | ');\n\nconst renderPropertyHtml = (\n prop: PieDocsProperty,\n heading: 'h3' | 'h4',\n anchor: (name: string) => string | undefined\n): string => {\n const rows: string[] = [];\n rows.push(`<li><strong>Type:</strong> ${renderType(prop.type, anchor)}</li>`);\n rows.push(`<li><strong>Required:</strong> <code>${String(prop.required)}</code></li>`);\n if (prop.itemType) {\n rows.push(`<li><strong>Item Type:</strong> ${renderType(prop.itemType, anchor)}</li>`);\n }\n if (prop.description) {\n rows.push(`<li><strong>Description:</strong> ${escapeHtml(prop.description)}</li>`);\n }\n if (prop.enum && prop.enum.length > 0) {\n rows.push(\n `<li><strong>Allowed values:</strong> ${prop.enum\n .map((v) => `<code>${escapeHtml(formatInline(v))}</code>`)\n .join(', ')}</li>`\n );\n }\n const constraints: string[] = [];\n if (prop.minimum !== undefined) constraints.push(`<code>minimum: ${prop.minimum}</code>`);\n if (prop.maximum !== undefined) constraints.push(`<code>maximum: ${prop.maximum}</code>`);\n if (prop.minLength !== undefined) constraints.push(`<code>minLength: ${prop.minLength}</code>`);\n if (prop.maxLength !== undefined) constraints.push(`<code>maxLength: ${prop.maxLength}</code>`);\n if (prop.pattern) constraints.push(`<code>pattern: ${escapeHtml(prop.pattern)}</code>`);\n if (constraints.length) {\n rows.push(`<li><strong>Constraints:</strong> ${constraints.join(', ')}</li>`);\n }\n rows.push(\n `<li><strong>Default:</strong> ${\n prop.defaultValue !== undefined ? formatValue(prop.defaultValue) : '<em>none</em>'\n }</li>`\n );\n\n return `\n <section class=\"doc-property\">\n <${heading}><code>${escapeHtml(prop.path)}</code></${heading}>\n <ul>\n ${rows.join('\\n ')}\n </ul>\n </section>`;\n};\n\nconst renderPropertiesSectionHtml = (opts: {\n title: string;\n schema?: string;\n defaults?: string;\n docs: PieDocsSchemaDocs;\n}): string => {\n const sources = [\n opts.schema && `<strong>Schema:</strong> <code>${escapeHtml(opts.schema)}</code>`,\n opts.defaults && `<strong>Defaults:</strong> <code>${escapeHtml(opts.defaults)}</code>`,\n ].filter(Boolean);\n // Each schema carries its own definitions, so anchors are scoped to the section.\n const prefix = opts.title.toLowerCase();\n const names = new Set(opts.docs.definitions.map((definition) => definition.name));\n const anchor = (name: string) =>\n names.has(name) ? `${prefix}-${encodeURIComponent(name)}` : undefined;\n const body =\n opts.docs.properties.length > 0\n ? opts.docs.properties.map((prop) => renderPropertyHtml(prop, 'h3', anchor)).join('\\n')\n : '<p>No properties found.</p>';\n const definitions = opts.docs.definitions\n .map(\n (definition) => `\n <section class=\"doc-definition\" id=\"${anchor(definition.name)}\">\n <h3>Type <code>${escapeHtml(definition.name)}</code></h3>\n ${definition.description ? `<p>${escapeHtml(definition.description)}</p>` : ''}\n ${definition.properties.map((prop) => renderPropertyHtml(prop, 'h4', anchor)).join('\\n')}\n </section>`\n )\n .join('\\n');\n\n return `\n <section class=\"doc-section\">\n <h2>${escapeHtml(opts.title)}</h2>\n ${sources.length > 0 ? `<p>${sources.join(' · ')}</p>` : ''}\n ${body}\n ${definitions}\n </section>`;\n};\n\nconst wrapHtmlPage = (title: string, body: string): string => `\n<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>${escapeHtml(title)}</title>\n <style>\n :root { color-scheme: light dark; font-family: Inter, system-ui, sans-serif; }\n body { margin: 0; padding: 1.5rem; line-height: 1.55; }\n h1,h2,h3 { line-height: 1.25; }\n h1 { margin-top: 0; }\n code { font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; }\n .doc-section { margin-bottom: 2rem; }\n .doc-property { margin: 0 0 1.25rem 0; padding-bottom: 0.5rem; border-bottom: 1px solid rgba(128,128,128,.25); }\n .doc-definition { margin: 1.5rem 0 0 0; padding-left: 1rem; border-left: 3px solid rgba(128,128,128,.35); }\n ul { padding-left: 1.25rem; }\n .meta-list li { margin-bottom: .25rem; }\n </style>\n </head>\n <body>\n ${body}\n </body>\n</html>\n`;\n\nconst renderElementIndexHtml = (opts: {\n contract: PieDocsContract;\n summary: string;\n generatedAt: string;\n emittedViews: string[];\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} docs</h1>\n <section class=\"doc-section\">\n <h2>Overview</h2>\n <p>${escapeHtml(opts.summary)}</p>\n </section>\n <section class=\"doc-section\">\n <h2>Element Metadata</h2>\n <ul class=\"meta-list\">\n <li><strong>Element:</strong> <code>${escapeHtml(opts.contract.elementName)}</code></li>\n <li><strong>Package:</strong> <code>${escapeHtml(opts.contract.packageName)}</code></li>\n <li><strong>Framework:</strong> <code>${escapeHtml(opts.contract.framework)}</code></li>\n <li><strong>Generated:</strong> <code>${escapeHtml(opts.generatedAt)}</code></li>\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Supported Modes</h2>\n <ul class=\"meta-list\">\n ${(opts.contract.supportedModes || []).map((mode) => `<li>${escapeHtml(mode)}</li>`).join('')}\n </ul>\n </section>\n <section class=\"doc-section\">\n <h2>Views</h2>\n <ul class=\"meta-list\">\n ${opts.emittedViews\n .map(\n (view) =>\n `<li><a href=\"./${encodeURIComponent(view)}.html\">${escapeHtml(view)}</a></li>`\n )\n .join('')}\n </ul>\n </section>\n `\n );\n\nconst schemaSpecifier = (contract: PieDocsContract, kind: SchemaKind) =>\n `${contract.packageName}/schemas/${kind}.schema.json`;\n\nconst renderViewHtml = (opts: {\n contract: PieDocsContract;\n view: ResolvedViewDocs;\n kinds: SchemaKind[];\n sessionDocs: PieDocsSchemaDocs;\n}): string =>\n wrapHtmlPage(\n `${opts.contract.elementName} ${opts.view.view} docs`,\n `\n <h1>${escapeHtml(opts.contract.elementName)} / ${escapeHtml(opts.view.view)}</h1>\n ${renderPropertiesSectionHtml({\n title: 'Model',\n schema: schemaSpecifier(opts.contract, 'model'),\n defaults: opts.view.pieSource,\n docs: opts.view.pieDocs,\n })}\n ${\n opts.kinds.includes('configuration')\n ? renderPropertiesSectionHtml({\n title: 'Configuration',\n schema: schemaSpecifier(opts.contract, 'configuration'),\n defaults: opts.view.configSource,\n docs: opts.view.configDocs,\n })\n : ''\n }\n ${renderPropertiesSectionHtml({\n title: 'Session',\n schema: schemaSpecifier(opts.contract, 'session'),\n docs: opts.sessionDocs,\n })}\n `\n );\n\nconst chooseViewDocs = (resolvedViews: ResolvedViewDocs[]): ResolvedViewDocs[] => {\n const map = new Map(resolvedViews.map((v) => [v.view, v]));\n const chosen: ResolvedViewDocs[] = [];\n\n const delivery = map.get('delivery');\n const author = map.get('author');\n const print = map.get('print');\n\n if (delivery) {\n chosen.push(delivery);\n }\n if (author) {\n chosen.push(author);\n }\n\n if (print) {\n const deliveryFingerprint = delivery\n ? `${propertyFingerprint(delivery.pieDocs.properties)}|${propertyFingerprint(delivery.configDocs.properties)}`\n : '';\n const printFingerprint = `${propertyFingerprint(print.pieDocs.properties)}|${propertyFingerprint(print.configDocs.properties)}`;\n const sourceDiffFromDelivery = delivery\n ? print.pieSource !== delivery.pieSource || print.configSource !== delivery.configSource\n : true;\n const sourceDiffFromAuthor = author\n ? print.pieSource !== author.pieSource || print.configSource !== author.configSource\n : true;\n const materiallyDifferent = !delivery || printFingerprint !== deliveryFingerprint;\n if (materiallyDifferent || sourceDiffFromDelivery || sourceDiffFromAuthor) {\n chosen.push(print);\n }\n }\n\n const extras = resolvedViews\n .filter((v) => !['delivery', 'author', 'print'].includes(v.view))\n .sort((a, b) => a.view.localeCompare(b.view));\n for (const extra of extras) {\n chosen.push(extra);\n }\n\n return chosen;\n};\n\nexport const generateDocsForContract = async (\n packageDir: string,\n contract: PieDocsContract,\n options: GenerateDocsOptions\n): Promise<GenerateDocsResult> => {\n const generatedAt = new Date().toISOString();\n const summary = await readSummary(packageDir, contract.summary);\n const filesWritten: string[] = [];\n const filesChecked: string[] = [];\n const driftFiles: string[] = [];\n const sourcesUsed = new Set<string>();\n\n const outputs: PieDocsElementOutput = {\n contract,\n packageDir,\n generatedAt,\n views: [],\n sourcesUsed: [],\n };\n\n // Property rows come from the schemas the package publishes, generated here from source so the\n // docs do not depend on the element having been built.\n const schemas = generateElementSchemas(packageDir);\n if (!schemas.model || !schemas.session) {\n throw new Error(`${contract.packageName} publishes no model or session schema to document`);\n }\n const kinds = Object.keys(schemas) as SchemaKind[];\n const sessionDocs = schemaDocs(schemas.session);\n\n const resolvedViews: ResolvedViewDocs[] = [];\n for (const view of contract.views) {\n const pieResolved = await loadValueWithFallback(packageDir, view.pie, 'pie');\n const configResolved = await loadValueWithFallback(packageDir, view.config, 'config');\n resolvedViews.push({\n view: view.view,\n pieDocs: schemaDocs(schemas.model, pieResolved.value),\n configDocs: schemaDocs(schemas.configuration, configResolved.value),\n pieSource: pieResolved.sourceLabel,\n configSource: configResolved.sourceLabel,\n });\n }\n\n const emittedViews = chooseViewDocs(resolvedViews);\n const elementOutputDir = join(options.outputDir, contract.elementName);\n const elementIndexPath = join(elementOutputDir, 'index.html');\n const elementIndexContent = renderElementIndexHtml({\n contract,\n summary,\n generatedAt,\n emittedViews: emittedViews.map((v) => v.view),\n });\n\n const manifest = {\n elementName: contract.elementName,\n packageName: contract.packageName,\n framework: contract.framework,\n generatedAt,\n summary,\n supportedModes: contract.supportedModes || [],\n views: emittedViews.map((view) => ({\n id: view.view,\n file: `${view.view}.html`,\n pieSource: view.pieSource,\n configSource: view.configSource,\n hasModelDefaults: view.pieDocs.properties.length > 0,\n hasConfigDefaults: view.configDocs.properties.length > 0,\n })),\n };\n\n const candidates: Array<{ path: string; content: string }> = [\n { path: elementIndexPath, content: elementIndexContent },\n {\n path: join(elementOutputDir, 'manifest.json'),\n content: `${JSON.stringify(manifest, null, 2)}\\n`,\n },\n ...emittedViews.map((view) => ({\n path: join(elementOutputDir, `${view.view}.html`),\n content: renderViewHtml({ contract, view, kinds, sessionDocs }),\n })),\n ];\n\n for (const candidate of candidates) {\n filesChecked.push(candidate.path);\n if (options.check) {\n const existing = existsSync(candidate.path) ? await readFile(candidate.path, 'utf-8') : null;\n if (\n existing === null ||\n normalizeForCheck(candidate.path, existing) !==\n normalizeForCheck(candidate.path, candidate.content)\n ) {\n driftFiles.push(candidate.path);\n }\n continue;\n }\n\n if (!options.dryRun) {\n await mkdir(elementOutputDir, { recursive: true });\n await writeFile(candidate.path, candidate.content, 'utf-8');\n }\n filesWritten.push(candidate.path);\n }\n\n for (const view of emittedViews) {\n sourcesUsed.add(view.pieSource);\n sourcesUsed.add(view.configSource);\n outputs.views.push({\n view: view.view,\n pieProperties: view.pieDocs.properties,\n configProperties: view.configDocs.properties,\n });\n }\n\n outputs.sourcesUsed = Array.from(sourcesUsed).sort();\n\n return {\n filesWritten,\n filesChecked,\n driftFiles,\n outputs: [outputs],\n };\n};\n\nexport const toRelativePaths = (rootDir: string, paths: string[]): string[] =>\n paths.map((p) => relative(rootDir, p)).sort();\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { PieDocsSchemaDocs } from './types.js';
|
|
2
|
+
type JsonSchema = Record<string, unknown>;
|
|
3
|
+
/**
|
|
4
|
+
* Documentation rows for one schema. A named object type is documented once, under
|
|
5
|
+
* `definitions`, and a property of that type names it; nested inline objects flatten to dot paths
|
|
6
|
+
* and the properties of inline array items to `<key>[].<property>`. A property's default is the
|
|
7
|
+
* value `defaults` holds at its path, falling back to the schema's `default`.
|
|
8
|
+
*/
|
|
9
|
+
export declare const schemaDocs: (schema: JsonSchema | undefined, defaults?: unknown) => PieDocsSchemaDocs;
|
|
10
|
+
export {};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
const isRecord = (value) => !!value && typeof value === 'object' && !Array.isArray(value);
|
|
2
|
+
// Generated schemas reference only their own `definitions`, as `#/definitions/<encoded name>`.
|
|
3
|
+
const definitionName = (ref) => decodeURIComponent(ref.replace('#/definitions/', ''));
|
|
4
|
+
const valueAt = (value, path) => {
|
|
5
|
+
let current = value;
|
|
6
|
+
for (const key of path) {
|
|
7
|
+
if (!isRecord(current))
|
|
8
|
+
return undefined;
|
|
9
|
+
current = current[key];
|
|
10
|
+
}
|
|
11
|
+
return current;
|
|
12
|
+
};
|
|
13
|
+
const byPath = (a, b) => a.path.localeCompare(b.path);
|
|
14
|
+
const NUMERIC_KEYWORDS = ['minimum', 'maximum', 'minLength', 'maxLength'];
|
|
15
|
+
/**
|
|
16
|
+
* Documentation rows for one schema. A named object type is documented once, under
|
|
17
|
+
* `definitions`, and a property of that type names it; nested inline objects flatten to dot paths
|
|
18
|
+
* and the properties of inline array items to `<key>[].<property>`. A property's default is the
|
|
19
|
+
* value `defaults` holds at its path, falling back to the schema's `default`.
|
|
20
|
+
*/
|
|
21
|
+
export const schemaDocs = (schema, defaults) => {
|
|
22
|
+
if (!schema)
|
|
23
|
+
return { properties: [], definitions: [] };
|
|
24
|
+
const definitions = (schema.definitions ?? {});
|
|
25
|
+
const isNamedObject = (name) => isRecord(definitions[name]?.properties);
|
|
26
|
+
const referenced = new Set();
|
|
27
|
+
// Follows `$ref`s through aliases, enums and unions; stops at a named object type.
|
|
28
|
+
const target = (node, seen) => {
|
|
29
|
+
let current = node;
|
|
30
|
+
while (typeof current.$ref === 'string') {
|
|
31
|
+
const name = definitionName(current.$ref);
|
|
32
|
+
if (!definitions[name] || isNamedObject(name) || seen.has(name))
|
|
33
|
+
break;
|
|
34
|
+
seen.add(name);
|
|
35
|
+
const { $ref: _ref, ...siblings } = current;
|
|
36
|
+
// The property's own JSDoc sits beside the `$ref` and wins over the definition's.
|
|
37
|
+
current = { ...definitions[name], ...siblings };
|
|
38
|
+
}
|
|
39
|
+
return current;
|
|
40
|
+
};
|
|
41
|
+
const typeLabel = (node, seen = new Set()) => {
|
|
42
|
+
const local = new Set(seen);
|
|
43
|
+
const resolved = target(node, local);
|
|
44
|
+
if (typeof resolved.$ref === 'string') {
|
|
45
|
+
const name = definitionName(resolved.$ref);
|
|
46
|
+
if (!isNamedObject(name))
|
|
47
|
+
return 'any';
|
|
48
|
+
referenced.add(name);
|
|
49
|
+
return name;
|
|
50
|
+
}
|
|
51
|
+
if (typeof resolved.type === 'string')
|
|
52
|
+
return resolved.type;
|
|
53
|
+
if (Array.isArray(resolved.type))
|
|
54
|
+
return resolved.type.join(' | ');
|
|
55
|
+
const members = (resolved.anyOf ?? resolved.oneOf);
|
|
56
|
+
if (members) {
|
|
57
|
+
return [...new Set(members.map((member) => typeLabel(member, local)))].join(' | ');
|
|
58
|
+
}
|
|
59
|
+
const values = resolved.enum ?? ('const' in resolved ? [resolved.const] : undefined);
|
|
60
|
+
if (Array.isArray(values)) {
|
|
61
|
+
return [...new Set(values.map((value) => (value === null ? 'null' : typeof value)))].join(' | ');
|
|
62
|
+
}
|
|
63
|
+
return 'any';
|
|
64
|
+
};
|
|
65
|
+
const rows = (object, path, values) => {
|
|
66
|
+
const properties = object.properties;
|
|
67
|
+
if (!properties)
|
|
68
|
+
return [];
|
|
69
|
+
const required = new Set(object.required ?? []);
|
|
70
|
+
return Object.entries(properties).flatMap(([key, property]) => {
|
|
71
|
+
const propertyPath = [...path, key];
|
|
72
|
+
const resolved = target(property, new Set());
|
|
73
|
+
const items = isRecord(resolved.items) ? target(resolved.items, new Set()) : undefined;
|
|
74
|
+
const inline = isRecord(resolved.properties);
|
|
75
|
+
const defaultValue = valueAt(values, propertyPath) ?? resolved.default;
|
|
76
|
+
const row = {
|
|
77
|
+
path: propertyPath.join('.'),
|
|
78
|
+
type: typeLabel(property),
|
|
79
|
+
required: required.has(key),
|
|
80
|
+
};
|
|
81
|
+
if (isRecord(resolved.items))
|
|
82
|
+
row.itemType = typeLabel(resolved.items);
|
|
83
|
+
if (typeof resolved.description === 'string')
|
|
84
|
+
row.description = resolved.description;
|
|
85
|
+
if (Array.isArray(resolved.enum))
|
|
86
|
+
row.enum = resolved.enum;
|
|
87
|
+
for (const keyword of NUMERIC_KEYWORDS) {
|
|
88
|
+
if (typeof resolved[keyword] === 'number')
|
|
89
|
+
row[keyword] = resolved[keyword];
|
|
90
|
+
}
|
|
91
|
+
if (typeof resolved.pattern === 'string')
|
|
92
|
+
row.pattern = resolved.pattern;
|
|
93
|
+
// An inline object carries no default of its own; its properties do.
|
|
94
|
+
if (defaultValue !== undefined && !inline)
|
|
95
|
+
row.defaultValue = defaultValue;
|
|
96
|
+
return [
|
|
97
|
+
row,
|
|
98
|
+
...(inline ? rows(resolved, propertyPath, values) : []),
|
|
99
|
+
...(items ? rows(items, [...path, `${key}[]`], undefined) : []),
|
|
100
|
+
];
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
const properties = rows(schema, [], defaults).sort(byPath);
|
|
104
|
+
// Documenting a type can name further types, so this runs until no new name appears.
|
|
105
|
+
const documented = [];
|
|
106
|
+
const done = new Set();
|
|
107
|
+
for (let pending = [...referenced]; pending.length > 0;) {
|
|
108
|
+
for (const name of pending) {
|
|
109
|
+
done.add(name);
|
|
110
|
+
const definition = definitions[name];
|
|
111
|
+
documented.push({
|
|
112
|
+
name,
|
|
113
|
+
...(typeof definition.description === 'string'
|
|
114
|
+
? { description: definition.description }
|
|
115
|
+
: {}),
|
|
116
|
+
properties: rows(definition, [], undefined).sort(byPath),
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
pending = [...referenced].filter((name) => !done.has(name));
|
|
120
|
+
}
|
|
121
|
+
return { properties, definitions: documented.sort((a, b) => a.name.localeCompare(b.name)) };
|
|
122
|
+
};
|
|
123
|
+
//# sourceMappingURL=schema-properties.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-properties.js","sourceRoot":"","sources":["../../../src/lib/docs/schema-properties.ts"],"names":[],"mappings":"AAIA,MAAM,QAAQ,GAAG,CAAC,KAAc,EAAoC,EAAE,CACpE,CAAC,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAEhE,+FAA+F;AAC/F,MAAM,cAAc,GAAG,CAAC,GAAW,EAAU,EAAE,CAC7C,kBAAkB,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAC;AAExD,MAAM,OAAO,GAAG,CAAC,KAAc,EAAE,IAAc,EAAW,EAAE;IAC1D,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,OAAO,SAAS,CAAC;QACzC,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,CAAmB,EAAE,CAAmB,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;AAE1F,MAAM,gBAAgB,GAAG,CAAC,SAAS,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,CAAU,CAAC;AAEnF;;;;;GAKG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAA8B,EAC9B,QAAkB,EACC,EAAE;IACrB,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;IAExD,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAA+B,CAAC;IAC7E,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAC;IAErC,mFAAmF;IACnF,MAAM,MAAM,GAAG,CAAC,IAAgB,EAAE,IAAiB,EAAc,EAAE;QACjE,IAAI,OAAO,GAAG,IAAI,CAAC;QACnB,OAAO,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAC1C,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,MAAM;YACvE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,CAAC;YAC5C,kFAAkF;YAClF,OAAO,GAAG,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC;QAClD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,IAAgB,EAAE,OAAO,IAAI,GAAG,EAAU,EAAU,EAAE;QACvE,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACrC,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,cAAc,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YAC3C,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAC;YACvC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,QAAQ,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC;QAC5D,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,CAAC,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAA6B,CAAC;QAC/E,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,IAAI,CAAC,OAAO,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QACrF,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC1B,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CACvF,KAAK,CACN,CAAC;QACJ,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,MAAM,IAAI,GAAG,CAAC,MAAkB,EAAE,IAAc,EAAE,MAAe,EAAqB,EAAE;QACtF,MAAM,UAAU,GAAG,MAAM,CAAC,UAAoD,CAAC;QAC/E,IAAI,CAAC,UAAU;YAAE,OAAO,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAE,MAAM,CAAC,QAAiC,IAAI,EAAE,CAAC,CAAC;QAE1E,OAAO,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE;YAC5D,MAAM,YAAY,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;YAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YACvF,MAAM,MAAM,GAAG,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAC7C,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC;YAEvE,MAAM,GAAG,GAAoB;gBAC3B,IAAI,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC;gBAC5B,IAAI,EAAE,SAAS,CAAC,QAAQ,CAAC;gBACzB,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;aAC5B,CAAC;YACF,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,GAAG,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,OAAO,QAAQ,CAAC,WAAW,KAAK,QAAQ;gBAAE,GAAG,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW,CAAC;YACrF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,GAAG,QAAQ,CAAC,IAA+B,CAAC;YACtF,KAAK,MAAM,OAAO,IAAI,gBAAgB,EAAE,CAAC;gBACvC,IAAI,OAAO,QAAQ,CAAC,OAAO,CAAC,KAAK,QAAQ;oBAAE,GAAG,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,OAAO,CAAW,CAAC;YACxF,CAAC;YACD,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ;gBAAE,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC;YACzE,qEAAqE;YACrE,IAAI,YAAY,KAAK,SAAS,IAAI,CAAC,MAAM;gBAAE,GAAG,CAAC,YAAY,GAAG,YAAY,CAAC;YAE3E,OAAO;gBACL,GAAG;gBACH,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACvD,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,GAAG,IAAI,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;aAChE,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAE3D,qFAAqF;IACrF,MAAM,UAAU,GAAwB,EAAE,CAAC;IAC3C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,IAAI,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,CAAC,GAAI,CAAC;QACzD,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACf,MAAM,UAAU,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;YACrC,UAAU,CAAC,IAAI,CAAC;gBACd,IAAI;gBACJ,GAAG,CAAC,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ;oBAC5C,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE;oBACzC,CAAC,CAAC,EAAE,CAAC;gBACP,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;aACzD,CAAC,CAAC;QACL,CAAC;QACD,OAAO,GAAG,CAAC,GAAG,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;AAC9F,CAAC,CAAC","sourcesContent":["import type { PieDocsDefinition, PieDocsProperty, PieDocsSchemaDocs } from './types.js';\n\ntype JsonSchema = Record<string, unknown>;\n\nconst isRecord = (value: unknown): value is Record<string, unknown> =>\n !!value && typeof value === 'object' && !Array.isArray(value);\n\n// Generated schemas reference only their own `definitions`, as `#/definitions/<encoded name>`.\nconst definitionName = (ref: string): string =>\n decodeURIComponent(ref.replace('#/definitions/', ''));\n\nconst valueAt = (value: unknown, path: string[]): unknown => {\n let current = value;\n for (const key of path) {\n if (!isRecord(current)) return undefined;\n current = current[key];\n }\n return current;\n};\n\nconst byPath = (a: { path: string }, b: { path: string }) => a.path.localeCompare(b.path);\n\nconst NUMERIC_KEYWORDS = ['minimum', 'maximum', 'minLength', 'maxLength'] as const;\n\n/**\n * Documentation rows for one schema. A named object type is documented once, under\n * `definitions`, and a property of that type names it; nested inline objects flatten to dot paths\n * and the properties of inline array items to `<key>[].<property>`. A property's default is the\n * value `defaults` holds at its path, falling back to the schema's `default`.\n */\nexport const schemaDocs = (\n schema: JsonSchema | undefined,\n defaults?: unknown\n): PieDocsSchemaDocs => {\n if (!schema) return { properties: [], definitions: [] };\n\n const definitions = (schema.definitions ?? {}) as Record<string, JsonSchema>;\n const isNamedObject = (name: string) => isRecord(definitions[name]?.properties);\n const referenced = new Set<string>();\n\n // Follows `$ref`s through aliases, enums and unions; stops at a named object type.\n const target = (node: JsonSchema, seen: Set<string>): JsonSchema => {\n let current = node;\n while (typeof current.$ref === 'string') {\n const name = definitionName(current.$ref);\n if (!definitions[name] || isNamedObject(name) || seen.has(name)) break;\n seen.add(name);\n const { $ref: _ref, ...siblings } = current;\n // The property's own JSDoc sits beside the `$ref` and wins over the definition's.\n current = { ...definitions[name], ...siblings };\n }\n return current;\n };\n\n const typeLabel = (node: JsonSchema, seen = new Set<string>()): string => {\n const local = new Set(seen);\n const resolved = target(node, local);\n if (typeof resolved.$ref === 'string') {\n const name = definitionName(resolved.$ref);\n if (!isNamedObject(name)) return 'any';\n referenced.add(name);\n return name;\n }\n if (typeof resolved.type === 'string') return resolved.type;\n if (Array.isArray(resolved.type)) return resolved.type.join(' | ');\n const members = (resolved.anyOf ?? resolved.oneOf) as JsonSchema[] | undefined;\n if (members) {\n return [...new Set(members.map((member) => typeLabel(member, local)))].join(' | ');\n }\n const values = resolved.enum ?? ('const' in resolved ? [resolved.const] : undefined);\n if (Array.isArray(values)) {\n return [...new Set(values.map((value) => (value === null ? 'null' : typeof value)))].join(\n ' | '\n );\n }\n return 'any';\n };\n\n const rows = (object: JsonSchema, path: string[], values: unknown): PieDocsProperty[] => {\n const properties = object.properties as Record<string, JsonSchema> | undefined;\n if (!properties) return [];\n const required = new Set((object.required as string[] | undefined) ?? []);\n\n return Object.entries(properties).flatMap(([key, property]) => {\n const propertyPath = [...path, key];\n const resolved = target(property, new Set());\n const items = isRecord(resolved.items) ? target(resolved.items, new Set()) : undefined;\n const inline = isRecord(resolved.properties);\n const defaultValue = valueAt(values, propertyPath) ?? resolved.default;\n\n const row: PieDocsProperty = {\n path: propertyPath.join('.'),\n type: typeLabel(property),\n required: required.has(key),\n };\n if (isRecord(resolved.items)) row.itemType = typeLabel(resolved.items);\n if (typeof resolved.description === 'string') row.description = resolved.description;\n if (Array.isArray(resolved.enum)) row.enum = resolved.enum as PieDocsProperty['enum'];\n for (const keyword of NUMERIC_KEYWORDS) {\n if (typeof resolved[keyword] === 'number') row[keyword] = resolved[keyword] as number;\n }\n if (typeof resolved.pattern === 'string') row.pattern = resolved.pattern;\n // An inline object carries no default of its own; its properties do.\n if (defaultValue !== undefined && !inline) row.defaultValue = defaultValue;\n\n return [\n row,\n ...(inline ? rows(resolved, propertyPath, values) : []),\n ...(items ? rows(items, [...path, `${key}[]`], undefined) : []),\n ];\n });\n };\n\n const properties = rows(schema, [], defaults).sort(byPath);\n\n // Documenting a type can name further types, so this runs until no new name appears.\n const documented: PieDocsDefinition[] = [];\n const done = new Set<string>();\n for (let pending = [...referenced]; pending.length > 0; ) {\n for (const name of pending) {\n done.add(name);\n const definition = definitions[name];\n documented.push({\n name,\n ...(typeof definition.description === 'string'\n ? { description: definition.description }\n : {}),\n properties: rows(definition, [], undefined).sort(byPath),\n });\n }\n pending = [...referenced].filter((name) => !done.has(name));\n }\n\n return { properties, definitions: documented.sort((a, b) => a.name.localeCompare(b.name)) };\n};\n"]}
|
|
@@ -193,7 +193,7 @@ export const loadPointerValue = async (packageDir, pointer) => {
|
|
|
193
193
|
throw new Error(`Pointer file does not exist: ${pointer.file}`);
|
|
194
194
|
}
|
|
195
195
|
const source = await readFile(filePath, 'utf-8');
|
|
196
|
-
const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true, ts.ScriptKind.TS);
|
|
196
|
+
const sourceFile = ts.createSourceFile(filePath, source, ts.ScriptTarget.Latest, true, filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS);
|
|
197
197
|
const scope = buildScope(sourceFile);
|
|
198
198
|
const exportName = pointer.exportName || 'default';
|
|
199
199
|
const exportValue = extractExportExpression(sourceFile, exportName, scope);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source-extractor.js","sourceRoot":"","sources":["../../../src/lib/docs/source-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport ts from 'typescript';\nimport type { PieDocsSourcePointer } from './types.js';\n\ntype EvaluationScope = Map<string, unknown>;\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nconst getPathValue = (value: unknown, path?: string): unknown => {\n if (!path || path.trim().length === 0) {\n return value;\n }\n const segments = path.split('.').map((s) => s.trim());\n let current: unknown = value;\n for (const segment of segments) {\n const record = asRecord(current);\n if (!record || !(segment in record)) {\n return undefined;\n }\n current = record[segment];\n }\n return current;\n};\n\nconst evaluateTemplate = (\n expr: ts.TemplateExpression | ts.NoSubstitutionTemplateLiteral,\n scope: EvaluationScope\n): unknown => {\n if (ts.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.text;\n }\n\n let result = expr.head.text;\n for (const span of expr.templateSpans) {\n const evalExpr = evaluateNode(span.expression, scope);\n if (evalExpr === undefined || evalExpr === null) {\n return undefined;\n }\n result += String(evalExpr) + span.literal.text;\n }\n return result;\n};\n\nconst evaluateObjectLiteral = (\n node: ts.ObjectLiteralExpression,\n scope: EvaluationScope\n): unknown => {\n const output: Record<string, unknown> = {};\n\n for (const property of node.properties) {\n if (ts.isPropertyAssignment(property)) {\n const key = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteral(property.name)\n ? property.name.text\n : ts.isNumericLiteral(property.name)\n ? property.name.text\n : undefined;\n if (!key) {\n continue;\n }\n const value = evaluateNode(property.initializer, scope);\n if (value !== undefined) {\n output[key] = value;\n }\n continue;\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n const value = scope.get(property.name.text);\n if (value !== undefined) {\n output[property.name.text] = value;\n }\n continue;\n }\n\n if (ts.isSpreadAssignment(property)) {\n const spreadValue = evaluateNode(property.expression, scope);\n const spreadRecord = asRecord(spreadValue);\n if (spreadRecord) {\n Object.assign(output, spreadRecord);\n }\n }\n }\n\n return output;\n};\n\nconst evaluateArrayLiteral = (node: ts.ArrayLiteralExpression, scope: EvaluationScope): unknown => {\n const output: unknown[] = [];\n for (const item of node.elements) {\n if (ts.isSpreadElement(item)) {\n const spreadValue = evaluateNode(item.expression, scope);\n if (Array.isArray(spreadValue)) {\n output.push(...spreadValue);\n }\n continue;\n }\n output.push(evaluateNode(item, scope));\n }\n return output;\n};\n\nconst evaluateNode = (node: ts.Expression, scope: EvaluationScope): unknown => {\n if (ts.isAsExpression(node) || ts.isSatisfiesExpression(node)) {\n return evaluateNode(node.expression, scope);\n }\n\n if (ts.isParenthesizedExpression(node)) {\n return evaluateNode(node.expression, scope);\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n return evaluateObjectLiteral(node, scope);\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n return evaluateArrayLiteral(node, scope);\n }\n\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n return node.text;\n }\n\n if (ts.isTemplateExpression(node)) {\n return evaluateTemplate(node, scope);\n }\n\n if (ts.isNumericLiteral(node)) {\n return Number(node.text);\n }\n\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return null;\n }\n\n if (ts.isIdentifier(node)) {\n return scope.get(node.text);\n }\n\n if (ts.isPrefixUnaryExpression(node)) {\n const value = evaluateNode(node.operand, scope);\n if (typeof value !== 'number') {\n return undefined;\n }\n switch (node.operator) {\n case ts.SyntaxKind.MinusToken:\n return -value;\n case ts.SyntaxKind.PlusToken:\n return value;\n default:\n return undefined;\n }\n }\n\n return undefined;\n};\n\nconst extractExportExpression = (\n sourceFile: ts.SourceFile,\n exportName: string,\n scope: EvaluationScope\n): unknown => {\n for (const statement of sourceFile.statements) {\n if (ts.isExportAssignment(statement) && exportName === 'default') {\n return evaluateNode(statement.expression, scope);\n }\n\n if (ts.isVariableStatement(statement)) {\n const hasExport = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!hasExport) {\n continue;\n }\n\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n continue;\n }\n if (declaration.name.text === exportName) {\n return evaluateNode(declaration.initializer, scope);\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst buildScope = (sourceFile: ts.SourceFile): EvaluationScope => {\n const scope: EvaluationScope = new Map();\n\n // Evaluate top-level const declarations. Multiple passes handle dependency order.\n for (let pass = 0; pass < 4; pass++) {\n let changed = false;\n for (const statement of sourceFile.statements) {\n if (!ts.isVariableStatement(statement)) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n continue;\n }\n const identifier = declaration.name.text;\n if (scope.has(identifier)) {\n continue;\n }\n const evaluated = evaluateNode(declaration.initializer, scope);\n if (evaluated !== undefined) {\n scope.set(identifier, evaluated);\n changed = true;\n }\n }\n }\n if (!changed) {\n break;\n }\n }\n\n return scope;\n};\n\nexport const loadPointerValue = async (\n packageDir: string,\n pointer: PieDocsSourcePointer\n): Promise<unknown> => {\n const filePath = join(packageDir, pointer.file);\n if (!existsSync(filePath)) {\n throw new Error(`Pointer file does not exist: ${pointer.file}`);\n }\n\n const source = await readFile(filePath, 'utf-8');\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n ts.ScriptKind.TS\n );\n const scope = buildScope(sourceFile);\n const exportName = pointer.exportName || 'default';\n const exportValue = extractExportExpression(sourceFile, exportName, scope);\n\n if (exportValue === undefined) {\n throw new Error(`Unable to evaluate export \"${exportName}\" from ${pointer.file}`);\n }\n\n const pathValue = getPathValue(exportValue, pointer.path);\n if (pathValue === undefined) {\n throw new Error(\n `Unable to resolve path \"${pointer.path}\" from export \"${exportName}\" in ${pointer.file}`\n );\n }\n return pathValue;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"source-extractor.js","sourceRoot":"","sources":["../../../src/lib/docs/source-extractor.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport { readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport ts from 'typescript';\nimport type { PieDocsSourcePointer } from './types.js';\n\ntype EvaluationScope = Map<string, unknown>;\n\nconst asRecord = (value: unknown): Record<string, unknown> | null =>\n value && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n\nconst getPathValue = (value: unknown, path?: string): unknown => {\n if (!path || path.trim().length === 0) {\n return value;\n }\n const segments = path.split('.').map((s) => s.trim());\n let current: unknown = value;\n for (const segment of segments) {\n const record = asRecord(current);\n if (!record || !(segment in record)) {\n return undefined;\n }\n current = record[segment];\n }\n return current;\n};\n\nconst evaluateTemplate = (\n expr: ts.TemplateExpression | ts.NoSubstitutionTemplateLiteral,\n scope: EvaluationScope\n): unknown => {\n if (ts.isNoSubstitutionTemplateLiteral(expr)) {\n return expr.text;\n }\n\n let result = expr.head.text;\n for (const span of expr.templateSpans) {\n const evalExpr = evaluateNode(span.expression, scope);\n if (evalExpr === undefined || evalExpr === null) {\n return undefined;\n }\n result += String(evalExpr) + span.literal.text;\n }\n return result;\n};\n\nconst evaluateObjectLiteral = (\n node: ts.ObjectLiteralExpression,\n scope: EvaluationScope\n): unknown => {\n const output: Record<string, unknown> = {};\n\n for (const property of node.properties) {\n if (ts.isPropertyAssignment(property)) {\n const key = ts.isIdentifier(property.name)\n ? property.name.text\n : ts.isStringLiteral(property.name)\n ? property.name.text\n : ts.isNumericLiteral(property.name)\n ? property.name.text\n : undefined;\n if (!key) {\n continue;\n }\n const value = evaluateNode(property.initializer, scope);\n if (value !== undefined) {\n output[key] = value;\n }\n continue;\n }\n\n if (ts.isShorthandPropertyAssignment(property)) {\n const value = scope.get(property.name.text);\n if (value !== undefined) {\n output[property.name.text] = value;\n }\n continue;\n }\n\n if (ts.isSpreadAssignment(property)) {\n const spreadValue = evaluateNode(property.expression, scope);\n const spreadRecord = asRecord(spreadValue);\n if (spreadRecord) {\n Object.assign(output, spreadRecord);\n }\n }\n }\n\n return output;\n};\n\nconst evaluateArrayLiteral = (node: ts.ArrayLiteralExpression, scope: EvaluationScope): unknown => {\n const output: unknown[] = [];\n for (const item of node.elements) {\n if (ts.isSpreadElement(item)) {\n const spreadValue = evaluateNode(item.expression, scope);\n if (Array.isArray(spreadValue)) {\n output.push(...spreadValue);\n }\n continue;\n }\n output.push(evaluateNode(item, scope));\n }\n return output;\n};\n\nconst evaluateNode = (node: ts.Expression, scope: EvaluationScope): unknown => {\n if (ts.isAsExpression(node) || ts.isSatisfiesExpression(node)) {\n return evaluateNode(node.expression, scope);\n }\n\n if (ts.isParenthesizedExpression(node)) {\n return evaluateNode(node.expression, scope);\n }\n\n if (ts.isObjectLiteralExpression(node)) {\n return evaluateObjectLiteral(node, scope);\n }\n\n if (ts.isArrayLiteralExpression(node)) {\n return evaluateArrayLiteral(node, scope);\n }\n\n if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {\n return node.text;\n }\n\n if (ts.isTemplateExpression(node)) {\n return evaluateTemplate(node, scope);\n }\n\n if (ts.isNumericLiteral(node)) {\n return Number(node.text);\n }\n\n if (node.kind === ts.SyntaxKind.TrueKeyword) {\n return true;\n }\n\n if (node.kind === ts.SyntaxKind.FalseKeyword) {\n return false;\n }\n\n if (node.kind === ts.SyntaxKind.NullKeyword) {\n return null;\n }\n\n if (ts.isIdentifier(node)) {\n return scope.get(node.text);\n }\n\n if (ts.isPrefixUnaryExpression(node)) {\n const value = evaluateNode(node.operand, scope);\n if (typeof value !== 'number') {\n return undefined;\n }\n switch (node.operator) {\n case ts.SyntaxKind.MinusToken:\n return -value;\n case ts.SyntaxKind.PlusToken:\n return value;\n default:\n return undefined;\n }\n }\n\n return undefined;\n};\n\nconst extractExportExpression = (\n sourceFile: ts.SourceFile,\n exportName: string,\n scope: EvaluationScope\n): unknown => {\n for (const statement of sourceFile.statements) {\n if (ts.isExportAssignment(statement) && exportName === 'default') {\n return evaluateNode(statement.expression, scope);\n }\n\n if (ts.isVariableStatement(statement)) {\n const hasExport = statement.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword);\n if (!hasExport) {\n continue;\n }\n\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n continue;\n }\n if (declaration.name.text === exportName) {\n return evaluateNode(declaration.initializer, scope);\n }\n }\n }\n }\n\n return undefined;\n};\n\nconst buildScope = (sourceFile: ts.SourceFile): EvaluationScope => {\n const scope: EvaluationScope = new Map();\n\n // Evaluate top-level const declarations. Multiple passes handle dependency order.\n for (let pass = 0; pass < 4; pass++) {\n let changed = false;\n for (const statement of sourceFile.statements) {\n if (!ts.isVariableStatement(statement)) {\n continue;\n }\n for (const declaration of statement.declarationList.declarations) {\n if (!ts.isIdentifier(declaration.name) || !declaration.initializer) {\n continue;\n }\n const identifier = declaration.name.text;\n if (scope.has(identifier)) {\n continue;\n }\n const evaluated = evaluateNode(declaration.initializer, scope);\n if (evaluated !== undefined) {\n scope.set(identifier, evaluated);\n changed = true;\n }\n }\n }\n if (!changed) {\n break;\n }\n }\n\n return scope;\n};\n\nexport const loadPointerValue = async (\n packageDir: string,\n pointer: PieDocsSourcePointer\n): Promise<unknown> => {\n const filePath = join(packageDir, pointer.file);\n if (!existsSync(filePath)) {\n throw new Error(`Pointer file does not exist: ${pointer.file}`);\n }\n\n const source = await readFile(filePath, 'utf-8');\n const sourceFile = ts.createSourceFile(\n filePath,\n source,\n ts.ScriptTarget.Latest,\n true,\n filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n );\n const scope = buildScope(sourceFile);\n const exportName = pointer.exportName || 'default';\n const exportValue = extractExportExpression(sourceFile, exportName, scope);\n\n if (exportValue === undefined) {\n throw new Error(`Unable to evaluate export \"${exportName}\" from ${pointer.file}`);\n }\n\n const pathValue = getPathValue(exportValue, pointer.path);\n if (pathValue === undefined) {\n throw new Error(\n `Unable to resolve path \"${pointer.path}\" from export \"${exportName}\" in ${pointer.file}`\n );\n }\n return pathValue;\n};\n"]}
|
package/dist/lib/docs/types.d.ts
CHANGED
|
@@ -4,31 +4,10 @@ export interface PieDocsSourcePointer {
|
|
|
4
4
|
exportName?: string;
|
|
5
5
|
path?: string;
|
|
6
6
|
}
|
|
7
|
-
export interface PieDocsPropertyMetadata {
|
|
8
|
-
title?: string;
|
|
9
|
-
description?: string;
|
|
10
|
-
notes?: string;
|
|
11
|
-
type?: string;
|
|
12
|
-
required?: boolean;
|
|
13
|
-
enum?: Array<string | number | boolean | null>;
|
|
14
|
-
minimum?: number;
|
|
15
|
-
maximum?: number;
|
|
16
|
-
minLength?: number;
|
|
17
|
-
maxLength?: number;
|
|
18
|
-
pattern?: string;
|
|
19
|
-
itemType?: string;
|
|
20
|
-
examples?: unknown[];
|
|
21
|
-
}
|
|
22
|
-
export interface PieDocsViewMetadata {
|
|
23
|
-
pie?: Record<string, PieDocsPropertyMetadata>;
|
|
24
|
-
config?: Record<string, PieDocsPropertyMetadata>;
|
|
25
|
-
}
|
|
26
7
|
export interface PieDocsViewContract {
|
|
27
8
|
view: string;
|
|
28
9
|
pie: PieDocsSourcePointer;
|
|
29
10
|
config: PieDocsSourcePointer;
|
|
30
|
-
description?: string;
|
|
31
|
-
metadata?: PieDocsViewMetadata;
|
|
32
11
|
}
|
|
33
12
|
export interface PieDocsContract {
|
|
34
13
|
elementName: string;
|
|
@@ -43,9 +22,7 @@ export interface PieDocsProperty {
|
|
|
43
22
|
type: string;
|
|
44
23
|
required: boolean;
|
|
45
24
|
defaultValue?: unknown;
|
|
46
|
-
title?: string;
|
|
47
25
|
description?: string;
|
|
48
|
-
notes?: string;
|
|
49
26
|
enum?: Array<string | number | boolean | null>;
|
|
50
27
|
minimum?: number;
|
|
51
28
|
maximum?: number;
|
|
@@ -53,7 +30,16 @@ export interface PieDocsProperty {
|
|
|
53
30
|
maxLength?: number;
|
|
54
31
|
pattern?: string;
|
|
55
32
|
itemType?: string;
|
|
56
|
-
|
|
33
|
+
}
|
|
34
|
+
/** A named object type a schema references, documented once. */
|
|
35
|
+
export interface PieDocsDefinition {
|
|
36
|
+
name: string;
|
|
37
|
+
description?: string;
|
|
38
|
+
properties: PieDocsProperty[];
|
|
39
|
+
}
|
|
40
|
+
export interface PieDocsSchemaDocs {
|
|
41
|
+
properties: PieDocsProperty[];
|
|
42
|
+
definitions: PieDocsDefinition[];
|
|
57
43
|
}
|
|
58
44
|
export interface PieDocsViewOutput {
|
|
59
45
|
view: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/docs/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PieElementFramework = 'react' | 'svelte';\n\nexport interface PieDocsSourcePointer {\n file: string;\n exportName?: string;\n path?: string;\n}\n\nexport interface
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/docs/types.ts"],"names":[],"mappings":"","sourcesContent":["export type PieElementFramework = 'react' | 'svelte';\n\nexport interface PieDocsSourcePointer {\n file: string;\n exportName?: string;\n path?: string;\n}\n\nexport interface PieDocsViewContract {\n view: string;\n pie: PieDocsSourcePointer;\n config: PieDocsSourcePointer;\n}\n\nexport interface PieDocsContract {\n elementName: string;\n packageName: string;\n framework: PieElementFramework;\n summary?: string;\n supportedModes?: string[];\n views: PieDocsViewContract[];\n}\n\nexport interface PieDocsProperty {\n path: string;\n type: string;\n required: boolean;\n defaultValue?: unknown;\n description?: string;\n enum?: Array<string | number | boolean | null>;\n minimum?: number;\n maximum?: number;\n minLength?: number;\n maxLength?: number;\n pattern?: string;\n itemType?: string;\n}\n\n/** A named object type a schema references, documented once. */\nexport interface PieDocsDefinition {\n name: string;\n description?: string;\n properties: PieDocsProperty[];\n}\n\nexport interface PieDocsSchemaDocs {\n properties: PieDocsProperty[];\n definitions: PieDocsDefinition[];\n}\n\nexport interface PieDocsViewOutput {\n view: string;\n pieProperties: PieDocsProperty[];\n configProperties: PieDocsProperty[];\n}\n\nexport interface PieDocsElementOutput {\n contract: PieDocsContract;\n packageDir: string;\n generatedAt: string;\n views: PieDocsViewOutput[];\n sourcesUsed: string[];\n}\n\nexport interface ElementPackageInfo {\n elementName: string;\n packageName: string;\n framework: PieElementFramework;\n packageDir: string;\n packageDescription?: string;\n exportsMap?: Record<string, unknown>;\n}\n"]}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON Schema generation for an element's contract types.
|
|
3
|
+
*
|
|
4
|
+
* An element declares its contract in `src/types.ts` as `<Name>Model`, `<Name>Configuration` and
|
|
5
|
+
* `<Name>Session`, where `<Name>` is the PascalCase package name. Which schemas it publishes is set
|
|
6
|
+
* by its `exports`: each `./schemas/<kind>.schema.json` entry is generated from the matching type.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SCHEMA_KINDS: readonly ["model", "configuration", "session"];
|
|
9
|
+
export type SchemaKind = (typeof SCHEMA_KINDS)[number];
|
|
10
|
+
type JsonSchema = Record<string, unknown>;
|
|
11
|
+
type ElementManifest = {
|
|
12
|
+
name: string;
|
|
13
|
+
version: string;
|
|
14
|
+
exports?: Record<string, unknown>;
|
|
15
|
+
};
|
|
16
|
+
export declare const schemaExportKey: (kind: SchemaKind) => string;
|
|
17
|
+
export declare const readElementManifest: (packageDir: string) => ElementManifest;
|
|
18
|
+
/** The schema kinds a package publishes, in `SCHEMA_KINDS` order. */
|
|
19
|
+
export declare const declaredSchemaKinds: (manifest: ElementManifest) => SchemaKind[];
|
|
20
|
+
/** `@pie-element/multiple-choice` → `MultipleChoice`. */
|
|
21
|
+
export declare const typeNamePrefix: (packageName: string) => string;
|
|
22
|
+
export declare const schemaTypeName: (packageName: string, kind: SchemaKind) => string;
|
|
23
|
+
/** Where the published schema resolves: the versioned file on jsDelivr. */
|
|
24
|
+
export declare const schemaId: (manifest: ElementManifest, kind: SchemaKind) => string;
|
|
25
|
+
/** Generates every schema the package at `packageDir` declares, keyed by kind. */
|
|
26
|
+
export declare const generateElementSchemas: (packageDir: string) => Partial<Record<SchemaKind, JsonSchema>>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { createGenerator } from 'ts-json-schema-generator';
|
|
4
|
+
/**
|
|
5
|
+
* JSON Schema generation for an element's contract types.
|
|
6
|
+
*
|
|
7
|
+
* An element declares its contract in `src/types.ts` as `<Name>Model`, `<Name>Configuration` and
|
|
8
|
+
* `<Name>Session`, where `<Name>` is the PascalCase package name. Which schemas it publishes is set
|
|
9
|
+
* by its `exports`: each `./schemas/<kind>.schema.json` entry is generated from the matching type.
|
|
10
|
+
*/
|
|
11
|
+
export const SCHEMA_KINDS = ['model', 'configuration', 'session'];
|
|
12
|
+
const TYPE_SUFFIX = {
|
|
13
|
+
model: 'Model',
|
|
14
|
+
configuration: 'Configuration',
|
|
15
|
+
session: 'Session',
|
|
16
|
+
};
|
|
17
|
+
// The authored model and configuration are closed at the root, as in the legacy schemas, so a
|
|
18
|
+
// misspelled top-level key fails validation. Nested objects and the session, which players and
|
|
19
|
+
// controllers write extra state into, stay open.
|
|
20
|
+
const CLOSED_ROOT = {
|
|
21
|
+
model: true,
|
|
22
|
+
configuration: true,
|
|
23
|
+
session: false,
|
|
24
|
+
};
|
|
25
|
+
export const schemaExportKey = (kind) => `./schemas/${kind}.schema.json`;
|
|
26
|
+
export const readElementManifest = (packageDir) => JSON.parse(readFileSync(join(packageDir, 'package.json'), 'utf-8'));
|
|
27
|
+
/** The schema kinds a package publishes, in `SCHEMA_KINDS` order. */
|
|
28
|
+
export const declaredSchemaKinds = (manifest) => SCHEMA_KINDS.filter((kind) => manifest.exports?.[schemaExportKey(kind)] !== undefined);
|
|
29
|
+
/** `@pie-element/multiple-choice` → `MultipleChoice`. */
|
|
30
|
+
export const typeNamePrefix = (packageName) => (packageName.split('/').pop() ?? packageName)
|
|
31
|
+
.split('-')
|
|
32
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
33
|
+
.join('');
|
|
34
|
+
export const schemaTypeName = (packageName, kind) => `${typeNamePrefix(packageName)}${TYPE_SUFFIX[kind]}`;
|
|
35
|
+
/** Where the published schema resolves: the versioned file on jsDelivr. */
|
|
36
|
+
export const schemaId = (manifest, kind) => `https://cdn.jsdelivr.net/npm/${manifest.name}@${manifest.version}/dist/schemas/${kind}.schema.json`;
|
|
37
|
+
// `@deprecated reason` arrives as a string; JSON Schema's `deprecated` is a boolean, so the reason
|
|
38
|
+
// moves into the description.
|
|
39
|
+
const normalizeDeprecated = (node) => {
|
|
40
|
+
if (Array.isArray(node)) {
|
|
41
|
+
for (const item of node)
|
|
42
|
+
normalizeDeprecated(item);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (!node || typeof node !== 'object')
|
|
46
|
+
return;
|
|
47
|
+
const schema = node;
|
|
48
|
+
if (typeof schema.deprecated === 'string') {
|
|
49
|
+
const reason = schema.deprecated.trim();
|
|
50
|
+
schema.description = [schema.description, reason && `Deprecated: ${reason}`]
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.join('\n\n');
|
|
53
|
+
schema.deprecated = true;
|
|
54
|
+
}
|
|
55
|
+
for (const value of Object.values(schema))
|
|
56
|
+
normalizeDeprecated(value);
|
|
57
|
+
};
|
|
58
|
+
// TypeScript reads `@scope/name` in a JSDoc comment as a tag and drops the description from there
|
|
59
|
+
// on, so a package name in a comment sits in backticks.
|
|
60
|
+
const assertNoBarePackageNames = (typesPath) => {
|
|
61
|
+
for (const [comment] of readFileSync(typesPath, 'utf-8').matchAll(/\/\*\*[\s\S]*?\*\//g)) {
|
|
62
|
+
const bare = comment.replace(/`[^`]*`/g, '').match(/(?:^|\s)(@[\w-]+\/[\w-]+)/);
|
|
63
|
+
if (bare) {
|
|
64
|
+
throw new Error(`${typesPath}: wrap ${bare[1]} in backticks; JSDoc reads it as a tag`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
/** Generates every schema the package at `packageDir` declares, keyed by kind. */
|
|
69
|
+
export const generateElementSchemas = (packageDir) => {
|
|
70
|
+
const manifest = readElementManifest(packageDir);
|
|
71
|
+
const kinds = declaredSchemaKinds(manifest);
|
|
72
|
+
if (kinds.length === 0)
|
|
73
|
+
return {};
|
|
74
|
+
const typesPath = join(packageDir, 'src/types.ts');
|
|
75
|
+
if (!existsSync(typesPath)) {
|
|
76
|
+
throw new Error(`${manifest.name} declares schema exports but has no src/types.ts`);
|
|
77
|
+
}
|
|
78
|
+
assertNoBarePackageNames(typesPath);
|
|
79
|
+
const generator = createGenerator({
|
|
80
|
+
path: typesPath,
|
|
81
|
+
tsconfig: join(packageDir, 'tsconfig.json'),
|
|
82
|
+
expose: 'export',
|
|
83
|
+
topRef: false,
|
|
84
|
+
jsDoc: 'extended',
|
|
85
|
+
skipTypeCheck: true,
|
|
86
|
+
additionalProperties: true,
|
|
87
|
+
});
|
|
88
|
+
const schemas = {};
|
|
89
|
+
for (const kind of kinds) {
|
|
90
|
+
const { $schema, ...body } = generator.createSchema(schemaTypeName(manifest.name, kind));
|
|
91
|
+
normalizeDeprecated(body);
|
|
92
|
+
schemas[kind] = {
|
|
93
|
+
$schema,
|
|
94
|
+
$id: schemaId(manifest, kind),
|
|
95
|
+
...body,
|
|
96
|
+
...(CLOSED_ROOT[kind] ? { additionalProperties: false } : {}),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return schemas;
|
|
100
|
+
};
|
|
101
|
+
//# sourceMappingURL=generate.js.map
|