@x12i/made-easy 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +57 -2
  3. package/dist/analysis.d.ts +19 -0
  4. package/dist/analysis.d.ts.map +1 -0
  5. package/dist/analysis.js +90 -0
  6. package/dist/analysis.js.map +1 -0
  7. package/dist/build.d.ts +36 -0
  8. package/dist/build.d.ts.map +1 -0
  9. package/dist/build.js +260 -0
  10. package/dist/build.js.map +1 -0
  11. package/dist/contracts/api.d.ts +447 -0
  12. package/dist/contracts/api.d.ts.map +1 -0
  13. package/dist/contracts/api.js +152 -0
  14. package/dist/contracts/api.js.map +1 -0
  15. package/dist/contracts/blocks.d.ts +221 -0
  16. package/dist/contracts/blocks.d.ts.map +1 -0
  17. package/dist/contracts/blocks.js +392 -0
  18. package/dist/contracts/blocks.js.map +1 -0
  19. package/dist/contracts/diagnostics.d.ts +111 -0
  20. package/dist/contracts/diagnostics.d.ts.map +1 -0
  21. package/dist/contracts/diagnostics.js +122 -0
  22. package/dist/contracts/diagnostics.js.map +1 -0
  23. package/dist/contracts/index.d.ts +11 -0
  24. package/dist/contracts/index.d.ts.map +1 -0
  25. package/dist/contracts/index.js +11 -0
  26. package/dist/contracts/index.js.map +1 -0
  27. package/dist/contracts/json-schema.d.ts +5 -0
  28. package/dist/contracts/json-schema.d.ts.map +1 -0
  29. package/dist/contracts/json-schema.js +41 -0
  30. package/dist/contracts/json-schema.js.map +1 -0
  31. package/dist/contracts/recipe.d.ts +535 -0
  32. package/dist/contracts/recipe.d.ts.map +1 -0
  33. package/dist/contracts/recipe.js +380 -0
  34. package/dist/contracts/recipe.js.map +1 -0
  35. package/dist/contracts/schemas.d.ts +413 -0
  36. package/dist/contracts/schemas.d.ts.map +1 -0
  37. package/dist/contracts/schemas.js +205 -0
  38. package/dist/contracts/schemas.js.map +1 -0
  39. package/dist/draft.d.ts +157 -0
  40. package/dist/draft.d.ts.map +1 -0
  41. package/dist/draft.js +254 -0
  42. package/dist/draft.js.map +1 -0
  43. package/dist/emit-assets.d.ts +2 -0
  44. package/dist/emit-assets.d.ts.map +1 -0
  45. package/dist/emit-assets.js +27 -0
  46. package/dist/emit-assets.js.map +1 -0
  47. package/dist/index.d.ts +25 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +30 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/markdown-doc.d.ts +59 -0
  52. package/dist/markdown-doc.d.ts.map +1 -0
  53. package/dist/markdown-doc.js +187 -0
  54. package/dist/markdown-doc.js.map +1 -0
  55. package/dist/model.d.ts +54 -0
  56. package/dist/model.d.ts.map +1 -0
  57. package/dist/model.js +244 -0
  58. package/dist/model.js.map +1 -0
  59. package/dist/normalize.d.ts +63 -0
  60. package/dist/normalize.d.ts.map +1 -0
  61. package/dist/normalize.js +54 -0
  62. package/dist/normalize.js.map +1 -0
  63. package/dist/npm.d.ts +24 -0
  64. package/dist/npm.d.ts.map +1 -0
  65. package/dist/npm.js +51 -0
  66. package/dist/npm.js.map +1 -0
  67. package/dist/render/blocks.d.ts +17 -0
  68. package/dist/render/blocks.d.ts.map +1 -0
  69. package/dist/render/blocks.js +384 -0
  70. package/dist/render/blocks.js.map +1 -0
  71. package/dist/render/brief.d.ts +77 -0
  72. package/dist/render/brief.d.ts.map +1 -0
  73. package/dist/render/brief.js +62 -0
  74. package/dist/render/brief.js.map +1 -0
  75. package/dist/render/context.d.ts +43 -0
  76. package/dist/render/context.d.ts.map +1 -0
  77. package/dist/render/context.js +88 -0
  78. package/dist/render/context.js.map +1 -0
  79. package/dist/render/html.d.ts +19 -0
  80. package/dist/render/html.d.ts.map +1 -0
  81. package/dist/render/html.js +178 -0
  82. package/dist/render/html.js.map +1 -0
  83. package/dist/render/markdown-out.d.ts +11 -0
  84. package/dist/render/markdown-out.d.ts.map +1 -0
  85. package/dist/render/markdown-out.js +121 -0
  86. package/dist/render/markdown-out.js.map +1 -0
  87. package/dist/render/pdf.d.ts +23 -0
  88. package/dist/render/pdf.d.ts.map +1 -0
  89. package/dist/render/pdf.js +138 -0
  90. package/dist/render/pdf.js.map +1 -0
  91. package/dist/render/prose.d.ts +15 -0
  92. package/dist/render/prose.d.ts.map +1 -0
  93. package/dist/render/prose.js +110 -0
  94. package/dist/render/prose.js.map +1 -0
  95. package/dist/scaffold.d.ts +13 -0
  96. package/dist/scaffold.d.ts.map +1 -0
  97. package/dist/scaffold.js +393 -0
  98. package/dist/scaffold.js.map +1 -0
  99. package/dist/sdk.d.ts +56 -0
  100. package/dist/sdk.d.ts.map +1 -0
  101. package/dist/sdk.js +238 -0
  102. package/dist/sdk.js.map +1 -0
  103. package/dist/source.d.ts +57 -0
  104. package/dist/source.d.ts.map +1 -0
  105. package/dist/source.js +289 -0
  106. package/dist/source.js.map +1 -0
  107. package/dist/theme/book.d.ts +10 -0
  108. package/dist/theme/book.d.ts.map +1 -0
  109. package/dist/theme/book.js +198 -0
  110. package/dist/theme/book.js.map +1 -0
  111. package/dist/util.d.ts +14 -0
  112. package/dist/util.d.ts.map +1 -0
  113. package/dist/util.js +69 -0
  114. package/dist/util.js.map +1 -0
  115. package/dist/validate.d.ts +36 -0
  116. package/dist/validate.d.ts.map +1 -0
  117. package/dist/validate.js +986 -0
  118. package/dist/validate.js.map +1 -0
  119. package/dist/verify.d.ts +35 -0
  120. package/dist/verify.d.ts.map +1 -0
  121. package/dist/verify.js +112 -0
  122. package/dist/verify.js.map +1 -0
  123. package/dist/version.d.ts +3 -0
  124. package/dist/version.d.ts.map +1 -0
  125. package/dist/version.js +4 -0
  126. package/dist/version.js.map +1 -0
  127. package/dist/yamlfile.d.ts +22 -0
  128. package/dist/yamlfile.d.ts.map +1 -0
  129. package/dist/yamlfile.js +129 -0
  130. package/dist/yamlfile.js.map +1 -0
  131. package/package.json +64 -4
  132. package/recipes/index.json +282 -0
  133. package/recipes/shared-1.0.0.json +456 -0
  134. package/schemas/artifact.v1.json +36 -0
  135. package/schemas/assets.v1.json +61 -0
  136. package/schemas/block.v1.json +27 -0
  137. package/schemas/blocks/brief.v1.json +20 -0
  138. package/schemas/blocks/callout.v1.json +25 -0
  139. package/schemas/blocks/code.v1.json +21 -0
  140. package/schemas/blocks/decision.v1.json +80 -0
  141. package/schemas/blocks/evidence-comparison.v1.json +33 -0
  142. package/schemas/blocks/example.v1.json +52 -0
  143. package/schemas/blocks/figure.v1.json +22 -0
  144. package/schemas/blocks/human-action.v1.json +42 -0
  145. package/schemas/blocks/job-map.v1.json +170 -0
  146. package/schemas/blocks/pause.v1.json +25 -0
  147. package/schemas/blocks/reference-profile.v1.json +41 -0
  148. package/schemas/blocks/review-checklist.v1.json +19 -0
  149. package/schemas/blocks/table.v1.json +59 -0
  150. package/schemas/brief.v1.json +157 -0
  151. package/schemas/build-request.v1.json +173 -0
  152. package/schemas/build-result.v1.json +171 -0
  153. package/schemas/checks.v1.json +149 -0
  154. package/schemas/create-request.v1.json +47 -0
  155. package/schemas/diagnostic.v1.json +50 -0
  156. package/schemas/draft-request.v1.json +196 -0
  157. package/schemas/guide.v1.json +172 -0
  158. package/schemas/job.v1.json +107 -0
  159. package/schemas/preview-request.v1.json +153 -0
  160. package/schemas/preview-result.v1.json +84 -0
  161. package/schemas/problem.v1.json +78 -0
  162. package/schemas/recipe-definition.v1.json +673 -0
  163. package/schemas/source-ref.v1.json +111 -0
  164. package/schemas/sources.v1.json +158 -0
  165. package/schemas/validate-request.v1.json +135 -0
  166. package/schemas/validate-result.v1.json +110 -0
  167. package/schemas/verification.v1.json +77 -0
  168. package/themes/book/1.0.0/theme.css +190 -0
  169. package/themes/book/1.0.0/theme.json +5 -0
@@ -0,0 +1,121 @@
1
+ import { stringify } from 'yaml';
2
+ import { entriesOf, guideTitle } from '../model.js';
3
+ import { renderBlockMarkdown } from './blocks.js';
4
+ import { buildBriefDocument } from './brief.js';
5
+ import { makeContext } from './context.js';
6
+ import { REF_PATTERN } from '../markdown-doc.js';
7
+ function mapOutsideFences(source, fn) {
8
+ let fence;
9
+ return source
10
+ .split('\n')
11
+ .map((l) => {
12
+ const m = /^ {0,3}(`{3,}|~{3,})/.exec(l);
13
+ if (m) {
14
+ if (!fence)
15
+ fence = m[1][0].repeat(m[1].length);
16
+ else if (m[1][0] === fence[0] && m[1].length >= fence.length)
17
+ fence = undefined;
18
+ return l;
19
+ }
20
+ return fence ? l : fn(l);
21
+ })
22
+ .join('\n');
23
+ }
24
+ function lowerProse(source, shift) {
25
+ return mapOutsideFences(source, (l) => l
26
+ .replace(/^(#{1,6})([ \t]+.*?)(?:[ \t]+\{#[A-Za-z0-9][A-Za-z0-9_-]*\})?[ \t]*$/, (_m, hashes, rest) => `${'#'.repeat(Math.min(6, hashes.length + shift))}${rest}`)
27
+ .replace(new RegExp(REF_PATTERN.source, 'g'), (_raw, kind, id, anchor) => `\`${kind}:${id}${anchor ?? ''}\``));
28
+ }
29
+ export function renderEntryMarkdown(entry, ctx, shift) {
30
+ const body = entry.nodes
31
+ .map((n) => (n.kind === 'markdown' ? lowerProse(n.source, shift) : renderBlockMarkdown(n, ctx)))
32
+ .filter((s) => s.trim() !== '')
33
+ .join('\n\n');
34
+ const heading = entry.hasChapterHeading ? '' : `${'#'.repeat(Math.min(6, 1 + shift))} ${entry.title}\n\n`;
35
+ return `${heading}${body}`;
36
+ }
37
+ /** A whole track as plain Markdown with pinned revision metadata (operator/reference.md for the operator track). */
38
+ export function renderTrackMarkdown(model, track) {
39
+ const guide = model.guide;
40
+ const ctx = makeContext(model, { page: track, standalone: true });
41
+ const pins = (model.brief?.operatorReference?.entries ?? []).map((p) => ({
42
+ id: p.id,
43
+ digest: entriesOf(model, 'operator').find((e) => e.id === p.id)?.digest ?? p.digest ?? '',
44
+ }));
45
+ const title = `${guideTitle(guide)}${track === 'operator' ? ' \u2014 Operator reference' : ''}`;
46
+ const front = stringify({
47
+ guide: guide.guideId,
48
+ job: guide.jobId,
49
+ title,
50
+ track,
51
+ revision: model.revision,
52
+ referenceRevision: model.referenceRevision,
53
+ pinnedEntries: pins,
54
+ }).trimEnd();
55
+ const parts = entriesOf(model, track).map((e) => renderEntryMarkdown(e, ctx, 1));
56
+ return `---\n${front}\n---\n\n# ${title}\n\n> Reference revision \`${model.referenceRevision.slice(7, 19)}\` \u00B7 guide \`${guide.guideId}\`\n\n${parts.join('\n\n')}\n`;
57
+ }
58
+ export function renderReferenceMarkdown(model) {
59
+ return renderTrackMarkdown(model, 'operator');
60
+ }
61
+ const bullet = (xs) => (xs.length ? xs.map((x) => `- ${x}`).join('\n') : '- _none_');
62
+ function inputsMd(values, tick) {
63
+ return values.length
64
+ ? values.map((v) => `- **${v.label}** (\`${v.id}\`): ${v.value ? (tick ? `\`${v.value}\`` : v.value) : '_no value_'}`).join('\n')
65
+ : '- _none_';
66
+ }
67
+ /** brief.md: printable worked brief, blank template and review checklist. */
68
+ export function renderBriefMarkdown(doc) {
69
+ const shared = (d) => `
70
+ **Goal:** ${d.outcome}
71
+
72
+ ### Authority
73
+ **May read**
74
+ ${bullet(d.authority.reads)}
75
+
76
+ **May change**
77
+ ${bullet(d.authority.changes)}
78
+
79
+ ### Limits
80
+ ${bullet(d.limits)}
81
+
82
+ ### Pause rules
83
+ ${d.pauseRules.length ? d.pauseRules.map((p) => `- **${p.id}** \u2014 Pause when: ${p.trigger} Decision owner: ${p.owner}. May continue: ${p.mayContinue} Resume when: ${p.resumeWhen}`).join('\n') : '- _none_'}
84
+
85
+ ### Acceptance checks
86
+ ${d.acceptanceChecks.length ? d.acceptanceChecks.map((c) => `- **${c.id}** \u2014 ${c.observable} Pass when: ${c.passCondition} If missing: ${c.onMissing} If contradictory: ${c.onContradictory}`).join('\n') : '- _none_'}
87
+
88
+ ### Return
89
+ ${d.reportBack.length ? d.reportBack.map((r) => `- **${r.label}** (\`${r.id}\`)${r.description ? ` \u2014 ${r.description}` : ''}`).join('\n') : '- _none_'}
90
+ `;
91
+ return `# ${doc.title} \u2014 Operator brief
92
+
93
+ Job \`${doc.jobId}\` \u00B7 revision \`${doc.revision.slice(7, 19)}\` \u00B7 operator reference \`${doc.referenceRevision.slice(7, 19)}\`
94
+
95
+ ## Blank template
96
+
97
+ Fill in the inputs, then give the whole brief to the operator.
98
+
99
+ ### Inputs
100
+ ${inputsMd(doc.template.inputs, true)}
101
+ ${shared(doc)}
102
+ ## Worked brief
103
+
104
+ ### Inputs
105
+ ${inputsMd(doc.worked.inputs, false)}
106
+ ${shared(doc)}
107
+ ## Operator reference (pinned)
108
+
109
+ Reference revision \`${doc.referenceRevision}\`
110
+
111
+ ${doc.operatorReference.entries.length ? doc.operatorReference.entries.map((e) => `- ${e.title} (\`${e.path}\`, \`${e.digest.slice(7, 19)}\`)`).join('\n') : '- _none_'}
112
+
113
+ ## Review checklist
114
+
115
+ ${doc.checklist.length ? doc.checklist.map((c) => `- [ ] **${c.id}** \u2014 ${c.text} (pass when: ${c.passCondition})`).join('\n') : '- _none_'}
116
+ `;
117
+ }
118
+ export function renderBriefJson(model) {
119
+ return `${JSON.stringify(buildBriefDocument(model), null, 2)}\n`;
120
+ }
121
+ //# sourceMappingURL=markdown-out.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown-out.js","sourceRoot":"","sources":["../../src/render/markdown-out.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { Diagnostic, Paper } from '../contracts/index.js';
2
+ export interface PdfOptions {
3
+ paper: Paper;
4
+ title: string;
5
+ /** Left footer text, e.g. reference revision and bundle path. */
6
+ footer: string;
7
+ draft: boolean;
8
+ executablePath?: string;
9
+ signal?: AbortSignal;
10
+ }
11
+ export interface PdfOutput {
12
+ ok: boolean;
13
+ bytes?: Uint8Array;
14
+ pages?: number;
15
+ browser?: string;
16
+ diagnostics: Diagnostic[];
17
+ }
18
+ export declare function findBrowser(explicit?: string): string | undefined;
19
+ export declare function renderPdfDocuments(jobs: {
20
+ html: string;
21
+ options: PdfOptions;
22
+ }[], executablePath?: string): Promise<PdfOutput[]>;
23
+ //# sourceMappingURL=pdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.d.ts","sourceRoot":"","sources":["../../src/render/pdf.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AAG/D,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,KAAK,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;CACtB;AAED,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,KAAK,CAAC,EAAE,UAAU,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,UAAU,EAAE,CAAC;CAC3B;AAID,wBAAgB,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0BjE;AAoBD,wBAAsB,kBAAkB,CACtC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,UAAU,CAAA;CAAE,EAAE,EAC7C,cAAc,CAAC,EAAE,MAAM,GACtB,OAAO,CAAC,SAAS,EAAE,CAAC,CAyGtB"}
@@ -0,0 +1,138 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { delimiter, join } from 'node:path';
3
+ import { escapeHtml } from '../util.js';
4
+ const ENV_VARS = ['MADE_EASY_BROWSER', 'REPORTIC_BROWSER', 'CHROME_PATH', 'PUPPETEER_EXECUTABLE_PATH'];
5
+ export function findBrowser(explicit) {
6
+ const candidates = [];
7
+ if (explicit)
8
+ candidates.push(explicit);
9
+ for (const v of ENV_VARS)
10
+ if (process.env[v])
11
+ candidates.push(process.env[v]);
12
+ if (process.platform === 'win32') {
13
+ const roots = [process.env['PROGRAMFILES'], process.env['PROGRAMFILES(X86)'], process.env['LOCALAPPDATA']].filter(Boolean);
14
+ for (const r of roots) {
15
+ candidates.push(join(r, 'Google', 'Chrome', 'Application', 'chrome.exe'), join(r, 'Microsoft', 'Edge', 'Application', 'msedge.exe'), join(r, 'Chromium', 'Application', 'chrome.exe'));
16
+ }
17
+ }
18
+ else if (process.platform === 'darwin') {
19
+ candidates.push('/Applications/Google Chrome.app/Contents/MacOS/Google Chrome', '/Applications/Microsoft Edge.app/Contents/MacOS/Microsoft Edge', '/Applications/Chromium.app/Contents/MacOS/Chromium');
20
+ }
21
+ else {
22
+ const dirs = (process.env['PATH'] ?? '').split(delimiter);
23
+ for (const name of ['google-chrome', 'google-chrome-stable', 'chromium', 'chromium-browser', 'microsoft-edge', 'microsoft-edge-stable']) {
24
+ for (const d of dirs)
25
+ candidates.push(join(d, name));
26
+ }
27
+ }
28
+ return candidates.find((c) => c && existsSync(c));
29
+ }
30
+ const PAPER_CONTENT_HEIGHT_PX = { A4: 960, Letter: 940 };
31
+ export async function renderPdfDocuments(jobs, executablePath) {
32
+ const noBrowser = (message) => jobs.map(() => ({
33
+ ok: false,
34
+ diagnostics: [{ code: 'PDF_BROWSER_NOT_FOUND', severity: 'error', path: 'pdf', message }],
35
+ }));
36
+ const exe = findBrowser(executablePath);
37
+ if (!exe) {
38
+ return noBrowser('No Chromium-based browser was found. Install Chrome, Edge or Chromium and set MADE_EASY_BROWSER to its executable path, or build HTML only with --formats html.');
39
+ }
40
+ let pw;
41
+ try {
42
+ const specifier = 'playwright-core';
43
+ pw = (await import(specifier));
44
+ }
45
+ catch {
46
+ return noBrowser('PDF output needs the optional peer dependency playwright-core. Run "npm install playwright-core" next to @x12i/made-easy, or build HTML only with --formats html.');
47
+ }
48
+ let browser;
49
+ try {
50
+ browser = await pw.chromium.launch({ executablePath: exe, headless: true, args: ['--no-sandbox', '--disable-dev-shm-usage', '--disable-gpu'] });
51
+ }
52
+ catch (e) {
53
+ return noBrowser(`The browser at ${exe} could not be started: ${e.message.split('\n')[0]}. Check MADE_EASY_BROWSER.`);
54
+ }
55
+ const results = [];
56
+ try {
57
+ for (const job of jobs) {
58
+ const diagnostics = [];
59
+ const blocked = [];
60
+ try {
61
+ job.options.signal?.throwIfAborted();
62
+ const context = await browser.newContext({ javaScriptEnabled: false, offline: true, acceptDownloads: false, serviceWorkers: 'block' });
63
+ await context.route('**/*', async (route) => {
64
+ const url = route.request().url();
65
+ if (url.startsWith('data:') || url === 'about:blank')
66
+ await route.continue();
67
+ else {
68
+ blocked.push(url);
69
+ await route.abort();
70
+ }
71
+ });
72
+ const page = await context.newPage();
73
+ await page.setContent(job.html, { waitUntil: 'load' });
74
+ await page.emulateMedia({ media: 'print' });
75
+ const limit = PAPER_CONTENT_HEIGHT_PX[job.options.paper];
76
+ const tall = await page.evaluate((max) => {
77
+ const out = [];
78
+ for (const el of Array.from(document.querySelectorAll('.block, .result, figure, tr'))) {
79
+ const cs = getComputedStyle(el);
80
+ if (cs.breakInside === 'avoid' && el.getBoundingClientRect().height > max) {
81
+ out.push(el.id || el.className || el.tagName);
82
+ }
83
+ }
84
+ return out;
85
+ }, limit);
86
+ for (const id of tall) {
87
+ diagnostics.push({
88
+ code: 'PDF_LAYOUT_OVERFLOW',
89
+ severity: 'warning',
90
+ path: 'pdf',
91
+ message: `Block "${id}" is taller than one page; it breaks across pages.`,
92
+ });
93
+ }
94
+ const e = escapeHtml;
95
+ const footer = `<div style="font:8px system-ui,Arial,sans-serif;color:#555;width:100%;padding:0 16mm;display:flex;justify-content:space-between;gap:8px"><span style="overflow:hidden;white-space:nowrap;text-overflow:ellipsis;max-width:80%">${e(job.options.footer)}</span><span style="white-space:nowrap">Page <span class="pageNumber"></span> of <span class="totalPages"></span></span></div>`;
96
+ const header = `<div style="font:8px system-ui,Arial,sans-serif;color:${job.options.draft ? '#8a1c1c' : '#555'};width:100%;padding:0 16mm;display:flex;justify-content:space-between"><span>${e(job.options.title)}</span><span>${job.options.draft ? 'DRAFT \u2014 not for publication' : ''}</span></div>`;
97
+ const buffer = await page.pdf({
98
+ format: job.options.paper,
99
+ printBackground: true,
100
+ displayHeaderFooter: true,
101
+ headerTemplate: header,
102
+ footerTemplate: footer,
103
+ margin: { top: '20mm', bottom: '20mm', left: '16mm', right: '16mm' },
104
+ tagged: true,
105
+ outline: true,
106
+ });
107
+ const bytes = new Uint8Array(buffer);
108
+ const pages = (Buffer.from(bytes).toString('latin1').match(/\/Type\s*\/Page\b/g) ?? []).length;
109
+ if (blocked.length) {
110
+ diagnostics.push({
111
+ code: 'PDF_NETWORK_BLOCKED',
112
+ severity: 'error',
113
+ path: 'pdf',
114
+ message: `The renderer blocked ${blocked.length} network request(s): ${[...new Set(blocked)].slice(0, 3).join(', ')}`,
115
+ });
116
+ results.push({ ok: false, diagnostics });
117
+ }
118
+ else {
119
+ results.push({ ok: true, bytes, pages, browser: `chromium ${browser.version()}`, diagnostics });
120
+ }
121
+ }
122
+ catch (e) {
123
+ diagnostics.push({
124
+ code: 'PDF_RENDER_FAILED',
125
+ severity: 'error',
126
+ path: 'pdf',
127
+ message: `PDF rendering failed: ${e.message.split('\n')[0]}`,
128
+ });
129
+ results.push({ ok: false, diagnostics });
130
+ }
131
+ }
132
+ }
133
+ finally {
134
+ await browser.close().catch(() => undefined);
135
+ }
136
+ return results;
137
+ }
138
+ //# sourceMappingURL=pdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pdf.js","sourceRoot":"","sources":["../../src/render/pdf.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAoBxC,MAAM,QAAQ,GAAG,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,aAAa,EAAE,2BAA2B,CAAC,CAAC;AAEvG,MAAM,UAAU,WAAW,CAAC,QAAiB;IAC3C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,IAAI,QAAQ;QAAE,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACxC,KAAK,MAAM,CAAC,IAAI,QAAQ;QAAE,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YAAE,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAE,CAAC,CAAC;IAC/E,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAa,CAAC;QACvI,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,UAAU,CAAC,IAAI,CACb,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,YAAY,CAAC,EACxD,IAAI,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,EAAE,aAAa,EAAE,YAAY,CAAC,EACzD,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,aAAa,EAAE,YAAY,CAAC,CACjD,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzC,UAAU,CAAC,IAAI,CACb,8DAA8D,EAC9D,gEAAgE,EAChE,oDAAoD,CACrD,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC1D,KAAK,MAAM,IAAI,IAAI,CAAC,eAAe,EAAE,sBAAsB,EAAE,UAAU,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,uBAAuB,CAAC,EAAE,CAAC;YACxI,KAAK,MAAM,CAAC,IAAI,IAAI;gBAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,uBAAuB,GAA0B,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC;AAkBhF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,IAA6C,EAC7C,cAAuB;IAEvB,MAAM,SAAS,GAAG,CAAC,OAAe,EAAe,EAAE,CACjD,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC;QACd,EAAE,EAAE,KAAK;QACT,WAAW,EAAE,CAAC,EAAE,IAAI,EAAE,uBAAuB,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;KAC1F,CAAC,CAAC,CAAC;IACN,MAAM,GAAG,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IACxC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,SAAS,CACd,iKAAiK,CAClK,CAAC;IACJ,CAAC;IACD,IAAI,EAA+D,CAAC;IACpE,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,iBAAiB,CAAC;QACpC,EAAE,GAAG,CAAC,MAAM,MAAM,CAAC,SAAS,CAAC,CAAc,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CACd,mKAAmK,CACpK,CAAC;IACJ,CAAC;IACD,IAAI,OAAkB,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,cAAc,EAAE,yBAAyB,EAAE,eAAe,CAAC,EAAE,CAAC,CAAC;IAClJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,SAAS,CAAC,kBAAkB,GAAG,0BAA2B,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,4BAA4B,CAAC,CAAC;IACnI,CAAC;IACD,MAAM,OAAO,GAAgB,EAAE,CAAC;IAChC,IAAI,CAAC;QACH,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,WAAW,GAAiB,EAAE,CAAC;YACrC,MAAM,OAAO,GAAa,EAAE,CAAC;YAC7B,IAAI,CAAC;gBACH,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAC;gBACrC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,UAAU,CAAC,EAAE,iBAAiB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC;gBACvI,MAAM,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC1C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,CAAC;oBAClC,IAAI,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,GAAG,KAAK,aAAa;wBAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,CAAC;yBACxE,CAAC;wBACJ,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBAClB,MAAM,KAAK,CAAC,KAAK,EAAE,CAAC;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;gBACrC,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,CAAC;gBACvD,MAAM,IAAI,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;gBAC5C,MAAM,KAAK,GAAG,uBAAuB,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;gBACzD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAW,EAAE,EAAE;oBAC/C,MAAM,GAAG,GAAa,EAAE,CAAC;oBACzB,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC;wBACtF,MAAM,EAAE,GAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;wBAChC,IAAI,EAAE,CAAC,WAAW,KAAK,OAAO,IAAI,EAAE,CAAC,qBAAqB,EAAE,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;4BAC1E,GAAG,CAAC,IAAI,CAAE,EAAkB,CAAC,EAAE,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;wBACjE,CAAC;oBACH,CAAC;oBACD,OAAO,GAAG,CAAC;gBACb,CAAC,EAAE,KAAK,CAAC,CAAC;gBACV,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;oBACtB,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,SAAS;wBACnB,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,UAAU,EAAE,oDAAoD;qBAC1E,CAAC,CAAC;gBACL,CAAC;gBACD,MAAM,CAAC,GAAG,UAAU,CAAC;gBACrB,MAAM,MAAM,GAAG,kOAAkO,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,gIAAgI,CAAC;gBACvY,MAAM,MAAM,GAAG,yDAAyD,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,gFAAgF,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,gBAAgB,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,kCAAkC,CAAC,CAAC,CAAC,EAAE,eAAe,CAAC;gBAC7S,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC;oBAC5B,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAK;oBACzB,eAAe,EAAE,IAAI;oBACrB,mBAAmB,EAAE,IAAI;oBACzB,cAAc,EAAE,MAAM;oBACtB,cAAc,EAAE,MAAM;oBACtB,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;oBACpE,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,IAAI;iBACd,CAAC,CAAC;gBACH,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;gBACrC,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,oBAAoB,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAC/F,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;oBACnB,WAAW,CAAC,IAAI,CAAC;wBACf,IAAI,EAAE,qBAAqB;wBAC3B,QAAQ,EAAE,OAAO;wBACjB,IAAI,EAAE,KAAK;wBACX,OAAO,EAAE,wBAAwB,OAAO,CAAC,MAAM,wBAAwB,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;qBACtH,CAAC,CAAC;oBACH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,YAAY,OAAO,CAAC,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;gBAClG,CAAC;YACH,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,WAAW,CAAC,IAAI,CAAC;oBACf,IAAI,EAAE,mBAAmB;oBACzB,QAAQ,EAAE,OAAO;oBACjB,IAAI,EAAE,KAAK;oBACX,OAAO,EAAE,yBAA0B,CAAW,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE;iBACxE,CAAC,CAAC;gBACH,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3C,CAAC;QACH,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type RenderContext } from './context.js';
2
+ /** Remove trailing `{#anchor}` from ATX headings outside fenced code. */
3
+ export declare function stripHeadingAnchors(source: string): string;
4
+ export interface ProseOptions {
5
+ /** Heading ids in document order, `<entry>--<anchor>`. */
6
+ headingIds?: string[];
7
+ /** Added to authored heading levels (authored h1 becomes the chapter title). */
8
+ levelShift?: number;
9
+ inline?: boolean;
10
+ }
11
+ /** Post-process rendered HTML: replace [[kind:id]] refs and [[TODO:]] placeholders outside code. */
12
+ export declare function decorate(html: string, ctx: RenderContext): string;
13
+ export declare function renderProse(source: string, ctx: RenderContext, options?: ProseOptions): string;
14
+ export declare function renderInline(text: string | undefined, ctx: RenderContext): string;
15
+ //# sourceMappingURL=prose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prose.d.ts","sourceRoot":"","sources":["../../src/render/prose.ts"],"names":[],"mappings":"AAGA,OAAO,EAAc,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAc9D,yEAAyE;AACzE,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAe1D;AAED,MAAM,WAAW,YAAY;IAC3B,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,gFAAgF;IAChF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,oGAAoG;AACpG,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAoBjE;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,aAAa,EAAE,OAAO,GAAE,YAAiB,GAAG,MAAM,CAyClG;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CAGjF"}
@@ -0,0 +1,110 @@
1
+ import { Marked } from 'marked';
2
+ import { REF_PATTERN, PLACEHOLDER_PATTERN } from '../markdown-doc.js';
3
+ import { escapeHtml } from '../util.js';
4
+ import { resolveRef } from './context.js';
5
+ const SAFE_SCHEME = /^(https?:|mailto:|#)/i;
6
+ const ANY_SCHEME = /^[a-z][a-z0-9+.-]*:/i;
7
+ function safeHref(href) {
8
+ const h = href.trim();
9
+ if (SAFE_SCHEME.test(h))
10
+ return h;
11
+ if (ANY_SCHEME.test(h))
12
+ return undefined;
13
+ if (h.startsWith('//'))
14
+ return undefined;
15
+ return h;
16
+ }
17
+ /** Remove trailing `{#anchor}` from ATX headings outside fenced code. */
18
+ export function stripHeadingAnchors(source) {
19
+ let fence;
20
+ return source
21
+ .split('\n')
22
+ .map((l) => {
23
+ const m = /^ {0,3}(`{3,}|~{3,})/.exec(l);
24
+ if (m) {
25
+ if (!fence)
26
+ fence = m[1][0].repeat(m[1].length);
27
+ else if (m[1][0] === fence[0] && m[1].length >= fence.length)
28
+ fence = undefined;
29
+ return l;
30
+ }
31
+ if (fence)
32
+ return l;
33
+ return l.replace(/^(#{1,6}[ \t]+.*?)[ \t]+\{#[A-Za-z0-9][A-Za-z0-9_-]*\}[ \t]*$/, '$1');
34
+ })
35
+ .join('\n');
36
+ }
37
+ /** Post-process rendered HTML: replace [[kind:id]] refs and [[TODO:]] placeholders outside code. */
38
+ export function decorate(html, ctx) {
39
+ const parts = html.split(/(<pre[\s\S]*?<\/pre>|<code[\s\S]*?<\/code>)/);
40
+ return parts
41
+ .map((part, i) => {
42
+ if (i % 2 === 1)
43
+ return part;
44
+ return part
45
+ .replace(new RegExp(REF_PATTERN.source, 'g'), (raw, kind, id, anchor) => {
46
+ const r = resolveRef(ctx, kind, id, anchor?.slice(1));
47
+ if (!r)
48
+ return `<span class="ref ref-unresolved" title="Unresolved reference">${escapeHtml(raw)}</span>`;
49
+ const title = r.title ? ` title="${escapeHtml(r.title)}"` : '';
50
+ return r.href
51
+ ? `<a class="ref ref-${kind}" href="${escapeHtml(r.href)}"${title}>${escapeHtml(r.label)}</a>`
52
+ : `<span class="ref ref-${kind}"${title}>${escapeHtml(r.label)}</span>`;
53
+ })
54
+ .replace(new RegExp(PLACEHOLDER_PATTERN.source, 'g'), (raw) => {
55
+ const text = raw.slice(2, -2);
56
+ return `<mark class="placeholder" title="Placeholder to complete before release">${escapeHtml(text)}</mark>`;
57
+ });
58
+ })
59
+ .join('');
60
+ }
61
+ export function renderProse(source, ctx, options = {}) {
62
+ const ids = [...(options.headingIds ?? [])];
63
+ const shift = options.levelShift ?? 1;
64
+ const marked = new Marked({ gfm: true, breaks: false });
65
+ marked.use({
66
+ renderer: {
67
+ html(token) {
68
+ return escapeHtml(token.text);
69
+ },
70
+ heading(token) {
71
+ const level = Math.min(6, token.depth + shift);
72
+ const id = ids.shift();
73
+ const text = this.parser.parseInline(token.tokens);
74
+ return `<h${level}${id ? ` id="${escapeHtml(id)}"` : ''}>${text}${id ? ` <a class="anchor" href="#${escapeHtml(id)}" aria-label="Link to this section">#</a>` : ''}</h${level}>\n`;
75
+ },
76
+ link(token) {
77
+ const text = this.parser.parseInline(token.tokens);
78
+ const href = safeHref(token.href);
79
+ if (!href)
80
+ return text;
81
+ const external = /^https?:/i.test(href);
82
+ return `<a href="${escapeHtml(href)}"${token.title ? ` title="${escapeHtml(token.title)}"` : ''}${external ? ' rel="noopener noreferrer"' : ''}>${text}</a>`;
83
+ },
84
+ image(token) {
85
+ const asset = ctx.assetByPath.get(token.href) ?? ctx.assetByPath.get(token.href.replace(/^\.\//, ''));
86
+ const src = asset ? ctx.assetSrc(asset) : undefined;
87
+ if (!asset || !src)
88
+ return `<span class="missing-image">${escapeHtml(token.text)}</span>`;
89
+ const alt = asset.decorative ? '' : (asset.alt ?? token.text);
90
+ return `<img src="${escapeHtml(src)}" alt="${escapeHtml(alt)}" loading="lazy">`;
91
+ },
92
+ code(token) {
93
+ const lang = (token.lang ?? '').split(/\s+/)[0]?.replace(/[^A-Za-z0-9_+-]/g, '') ?? '';
94
+ return `<pre class="code" tabindex="0"><code${lang ? ` class="language-${lang}"` : ''}>${escapeHtml(token.text)}</code></pre>\n`;
95
+ },
96
+ },
97
+ });
98
+ const cleaned = stripHeadingAnchors(source);
99
+ const html = options.inline ? marked.parseInline(cleaned) : marked.parse(cleaned);
100
+ const wrapped = html
101
+ .replace(/<table>/g, '<div class="table-wrap" role="region" tabindex="0" aria-label="Table"><table>')
102
+ .replace(/<\/table>/g, '</table></div>');
103
+ return decorate(wrapped, ctx);
104
+ }
105
+ export function renderInline(text, ctx) {
106
+ if (!text)
107
+ return '';
108
+ return renderProse(text, ctx, { inline: true });
109
+ }
110
+ //# sourceMappingURL=prose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prose.js","sourceRoot":"","sources":["../../src/render/prose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { type CreateGuideRequest } from './contracts/index.js';
2
+ export interface CreatedGuide {
3
+ guideId: string;
4
+ recipe: string;
5
+ /** Bundle files by relative path (UTF-8 text). */
6
+ files: Record<string, string>;
7
+ revision: string;
8
+ }
9
+ /** Scaffold a complete two-track bundle from a recipe, without any model. */
10
+ export declare function scaffoldGuide(input: CreateGuideRequest): Omit<CreatedGuide, 'revision'>;
11
+ /** Create a bundle and report its revision, computed by the same reader every adapter uses. */
12
+ export declare function createGuide(input: CreateGuideRequest): Promise<CreatedGuide>;
13
+ //# sourceMappingURL=scaffold.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,kBAAkB,EAExB,MAAM,sBAAsB,CAAC;AAM9B,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,QAAQ,EAAE,MAAM,CAAC;CAClB;AA2RD,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,UAAU,CAAC,CAgKvF;AAED,+FAA+F;AAC/F,wBAAsB,WAAW,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAIlF"}