craftar 0.6.2 → 0.7.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.
@@ -0,0 +1,238 @@
1
+ import { SECTION_NAME } from "../schema/index.js";
2
+ import { substitute } from "./resolve.js";
3
+ import { placeholders } from "./extract.js";
4
+ import { stripBom, toLf } from "./text.js";
5
+ /**
6
+ * Sections (spec 11): a block of an ingredient body between two marker lines whose content is the
7
+ * default, replaced or emptied by a profile or a workspace. Pure — the Forge and import sides call
8
+ * these with text they read themselves.
9
+ *
10
+ * <!-- craftar:section <name> -->
11
+ * …default…
12
+ * <!-- /craftar:section -->
13
+ *
14
+ * The grammar is line-based and not Markdown-aware (Ruling 10): a marker is a whole line starting at
15
+ * column 0, single spaces between its tokens, trailing spaces or tabs tolerated. A line that starts
16
+ * like one and is not one is an error (a near miss); an indented marker is literal text.
17
+ */
18
+ const OPEN = /^<!-- craftar:section (\S+) -->[ \t]*$/;
19
+ const CLOSE = /^<!-- \/craftar:section -->[ \t]*$/;
20
+ const NEAR = /^<!--[ \t]*\/?[ \t]*craftar:section/;
21
+ /** What a line is to the grammar: an opener (with its name), a closer, a near miss, or text (null). */
22
+ export function markerLine(line) {
23
+ const l = line.endsWith("\n") ? line.slice(0, -1) : line;
24
+ const open = OPEN.exec(l);
25
+ if (open && SECTION_NAME.test(open[1]))
26
+ return { kind: "open", name: open[1] };
27
+ if (CLOSE.test(l))
28
+ return { kind: "close" };
29
+ if (NEAR.test(l))
30
+ return { kind: "near" };
31
+ return null;
32
+ }
33
+ /** A marker problem, with the Forge-relative file and 1-based line it names. */
34
+ export class SectionMarkerError extends Error {
35
+ file;
36
+ line;
37
+ problem;
38
+ constructor(file, line, problem) {
39
+ super(`section markers in ${file}:${line}: ${problem}`);
40
+ this.file = file;
41
+ this.line = line;
42
+ this.problem = problem;
43
+ this.name = "SectionMarkerError";
44
+ }
45
+ }
46
+ /** Lines that keep their terminator; the last one may have none. */
47
+ function linesOf(text) {
48
+ const out = [];
49
+ let at = 0;
50
+ while (at < text.length) {
51
+ const nl = text.indexOf("\n", at);
52
+ const end = nl === -1 ? text.length : nl + 1;
53
+ out.push(text.slice(at, end));
54
+ at = end;
55
+ }
56
+ return out;
57
+ }
58
+ /**
59
+ * Parse `text` (spec 11 §6.1). `label` is the Forge-relative file the errors name; `ref`, the
60
+ * ingredient the duplicate-name message names (defaults to `label`). Works on `toLf(stripBom(text))`.
61
+ */
62
+ export function parseSections(text, label, ref = label) {
63
+ const lines = linesOf(toLf(stripBom(text)));
64
+ const segments = [];
65
+ const sections = [];
66
+ const seen = new Map();
67
+ let outside = "";
68
+ let open = null;
69
+ lines.forEach((line, i) => {
70
+ const n = i + 1;
71
+ const m = markerLine(line);
72
+ if (m === null) {
73
+ if (open)
74
+ open.body += line;
75
+ else
76
+ outside += line;
77
+ return;
78
+ }
79
+ if (m.kind === "near") {
80
+ throw new SectionMarkerError(label, n, `malformed section marker — expected "<!-- craftar:section <name> -->" or "<!-- /craftar:section -->"`);
81
+ }
82
+ if (m.kind === "open") {
83
+ if (open)
84
+ throw new SectionMarkerError(label, n, `section ${m.name} opens inside section ${open.name} (line ${open.line})`);
85
+ const prev = seen.get(m.name);
86
+ if (prev !== undefined)
87
+ throw new SectionMarkerError(label, n, `section ${m.name} is declared twice in ${ref} (also ${label}:${prev})`);
88
+ seen.set(m.name, n);
89
+ segments.push({ text: outside });
90
+ outside = "";
91
+ open = { name: m.name, line: n, body: "" };
92
+ return;
93
+ }
94
+ if (!open)
95
+ throw new SectionMarkerError(label, n, "a closing marker with no open section");
96
+ const s = { name: open.name, default: open.body, line: open.line };
97
+ segments.push(s);
98
+ sections.push(s);
99
+ open = null;
100
+ });
101
+ if (open) {
102
+ const o = open;
103
+ throw new SectionMarkerError(label, o.line, `section ${o.name} is never closed`);
104
+ }
105
+ segments.push({ text: outside });
106
+ // Always text, then section and text alternately: O0 [s1] O1 … [sn] On (spec 11 §6.2).
107
+ return { file: label, segments, sections };
108
+ }
109
+ /** A name declared once per ingredient, across its files too (Ruling 11). Throws naming the second declaration. */
110
+ export function checkDeclaredOnce(ref, files) {
111
+ const first = new Map();
112
+ for (const f of files) {
113
+ for (const s of f.sections) {
114
+ const prev = first.get(s.name);
115
+ if (prev !== undefined)
116
+ throw new SectionMarkerError(f.file, s.line, `section ${s.name} is declared twice in ${ref} (also ${prev})`);
117
+ first.set(s.name, `${f.file}:${s.line}`);
118
+ }
119
+ }
120
+ }
121
+ /** A section value as it is inserted (spec 11 §6.2): LF, and one final newline unless it is empty. */
122
+ export function canonicalValue(v) {
123
+ const lf = toLf(v);
124
+ return lf !== "" && !lf.endsWith("\n") ? lf + "\n" : lf;
125
+ }
126
+ /**
127
+ * The file with every section replaced by its value in `values`, or by its default when `values`
128
+ * has none, and every marker line removed (spec 11 §6.2). Substitution comes after, by the caller.
129
+ */
130
+ export function expandSections(parsed, values) {
131
+ let out = "";
132
+ for (const s of parsed.segments) {
133
+ if ("text" in s)
134
+ out += s.text;
135
+ else
136
+ out += values && Object.hasOwn(values, s.name) ? canonicalValue(values[s.name]) : s.default;
137
+ }
138
+ return out;
139
+ }
140
+ /** The 1-based line of the first column-0 marker or near miss in `text`, or null (the output guard, §6.6). */
141
+ export function firstMarkerLine(text) {
142
+ const lines = linesOf(text);
143
+ for (let i = 0; i < lines.length; i++)
144
+ if (markerLine(lines[i]) !== null)
145
+ return i + 1;
146
+ return null;
147
+ }
148
+ /**
149
+ * Infer the open sections of one file from the source (spec 11 §6.8). Outside text is rendered
150
+ * with `map`; a section `fixed` sets (the workspace's value) is fixed text too; every other section
151
+ * is a gap that starts at a line start and is empty or ends with a newline. Exactly one assignment
152
+ * must spell the source. Not proved here — the caller renders with the result and compares.
153
+ */
154
+ export function inferSections(parsed, source, fixed, map) {
155
+ const src = toLf(stripBom(source));
156
+ const pieces = [];
157
+ for (const s of parsed.segments) {
158
+ if ("text" in s)
159
+ pieces.push({ fixed: substitute(s.text, map) });
160
+ else if (Object.hasOwn(fixed, s.name))
161
+ pieces.push({ fixed: substitute(canonicalValue(fixed[s.name]), map), ws: s.name });
162
+ else
163
+ pieces.push({ gap: s.name });
164
+ }
165
+ const atLineStart = (pos) => pos === 0 || src[pos - 1] === "\n";
166
+ const found = [];
167
+ const dead = new Set();
168
+ let far = { pos: -1, ws: undefined };
169
+ const walk = (i, pos, assigned) => {
170
+ if (found.length >= 2)
171
+ return true;
172
+ const key = `${i}:${pos}`;
173
+ if (dead.has(key))
174
+ return false;
175
+ let ok = false;
176
+ if (i === pieces.length) {
177
+ if (pos === src.length) {
178
+ found.push({ ...assigned });
179
+ ok = true;
180
+ }
181
+ else if (pos > far.pos)
182
+ far = { pos, ws: undefined };
183
+ }
184
+ else {
185
+ const p = pieces[i];
186
+ if ("fixed" in p) {
187
+ if (src.startsWith(p.fixed, pos))
188
+ ok = walk(i + 1, pos + p.fixed.length, assigned);
189
+ else {
190
+ let common = 0;
191
+ while (common < p.fixed.length && src[pos + common] === p.fixed[common])
192
+ common++;
193
+ if (pos + common > far.pos)
194
+ far = { pos: pos + common, ws: p.ws };
195
+ }
196
+ }
197
+ else if (atLineStart(pos)) {
198
+ for (let end = pos; end <= src.length; end++) {
199
+ if (end !== pos && src[end - 1] !== "\n")
200
+ continue;
201
+ assigned[p.gap] = src.slice(pos, end);
202
+ if (walk(i + 1, end, assigned))
203
+ ok = true;
204
+ delete assigned[p.gap];
205
+ if (found.length >= 2)
206
+ break;
207
+ }
208
+ }
209
+ }
210
+ if (!ok)
211
+ dead.add(key);
212
+ return ok;
213
+ };
214
+ walk(0, 0, {});
215
+ if (found.length === 0) {
216
+ if (far.ws !== undefined)
217
+ return { fallback: "F11", reason: `section ${far.ws} of ${parsed.file} is set by the workspace and the source differs there` };
218
+ const line = src.slice(0, Math.max(0, far.pos)).split("\n").length;
219
+ return { fallback: "F11", reason: `the text outside the sections of ${parsed.file} differs (line ${line})` };
220
+ }
221
+ if (found.length > 1) {
222
+ const [a, b] = found;
223
+ const differ = Object.keys(a).filter((k) => a[k] !== b[k]);
224
+ return { fallback: "F12", reason: `section inference ambiguous in ${parsed.file}: ${differ.join(", ")}` };
225
+ }
226
+ const values = found[0];
227
+ for (const s of parsed.sections) {
228
+ if (!Object.hasOwn(values, s.name))
229
+ continue;
230
+ if (firstMarkerLine(values[s.name]) !== null)
231
+ return { fallback: "F13", reason: `section ${s.name} would hold a section marker` };
232
+ const k = placeholders(values[s.name]).find((x) => Object.hasOwn(map, x));
233
+ if (k !== undefined)
234
+ return { fallback: "F13", reason: `section ${s.name} would cite {{${k}}}, which this profile renders` };
235
+ }
236
+ return { values };
237
+ }
238
+ //# sourceMappingURL=sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sections.js","sourceRoot":"","sources":["../../src/core/sections.ts"],"names":[],"mappings":"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"}
package/dist/core/sync.js CHANGED
@@ -1,10 +1,12 @@
1
1
  import { promises as fs } from "node:fs";
2
2
  import path from "node:path";
3
3
  import YAML from "yaml";
4
- import { loadForge, exists } from "./forge.js";
5
- import { resolve, substitute, paramsFor } from "./resolve.js";
4
+ import { loadForge, exists, listFiles, FORGE_MANIFEST } from "./forge.js";
5
+ import { resolve, substitute, paramsFor, sectionKey, sectionsFor } from "./resolve.js";
6
6
  import { hashNormalized, stripBom, toLf } from "./text.js";
7
7
  import { deepMerge } from "./merge.js";
8
+ import { canonicalValue, checkDeclaredOnce, expandSections, firstMarkerLine, markerLine, parseSections } from "./sections.js";
9
+ import { placeholders, substitutedFile } from "./extract.js";
8
10
  import { LockSchema, WorkspaceConfigSchema } from "../schema/index.js";
9
11
  import { claudeCode } from "../emitters/claude-code.js";
10
12
  import { kiro } from "../emitters/kiro.js";
@@ -20,8 +22,13 @@ export async function loadWorkspace(root) {
20
22
  throw new Error(`${WORKSPACE_FILE} not found in ${root} — run \`craftar import --workspace "${root}" --from claude-code --forge <dir> --profile <name> --write-config\` to create it`);
21
23
  const base = YAML.parse(await fs.readFile(file, "utf8")) ?? {};
22
24
  const localFile = path.join(root, LOCAL_FILE);
23
- const local = (await exists(localFile)) ? YAML.parse(await fs.readFile(localFile, "utf8")) ?? {} : {};
24
- const config = WorkspaceConfigSchema.parse(deepMerge(base, local));
25
+ const hasLocal = await exists(localFile);
26
+ const local = hasLocal ? YAML.parse(await fs.readFile(localFile, "utf8")) ?? {} : {};
27
+ const parsed = WorkspaceConfigSchema.safeParse(deepMerge(base, local));
28
+ // Named, as a Forge file is: a wrong-shape `overrides.sections` key fails here (spec 11 §5.2).
29
+ if (!parsed.success)
30
+ throw new Error(`invalid ${WORKSPACE_FILE}${hasLocal ? ` (merged with ${LOCAL_FILE})` : ""}: ${parsed.error.message}`);
31
+ const config = parsed.data;
25
32
  const forgeRoot = /^[a-z]+:\/\/|^git@/.test(config.forge) ? config.forge : path.resolve(root, config.forge);
26
33
  if (!(await exists(forgeRoot)))
27
34
  throw new Error(`Forge not found at ${forgeRoot} (remote Forges are not supported yet — clone it and point \`forge:\` at the path)`);
@@ -43,12 +50,123 @@ export async function resolveForge(opts) {
43
50
  }
44
51
  return (await loadWorkspace(root)).forge;
45
52
  }
53
+ /** A path as the Forge names it: relative to its root, POSIX separators. */
54
+ function forgeRel(forge, abs) {
55
+ return path.relative(forge.root, abs).split(path.sep).join("/");
56
+ }
57
+ /** `profile <p>` or `the workspace`: the strongest layer that sets section `name` of `key` (Ruling 15). */
58
+ function layerOf(resolution, key, name) {
59
+ const has = (m) => Object.hasOwn(m, key) && Object.hasOwn(m[key], name);
60
+ if (has(resolution.sectionLayers.workspace))
61
+ return "workspace";
62
+ if (has(resolution.sectionLayers.profile))
63
+ return "profile";
64
+ return "default";
65
+ }
66
+ function layerLabel(resolution, layer) {
67
+ return layer === "workspace" ? "the workspace" : `profile ${resolution.profile.name}`;
68
+ }
69
+ /**
70
+ * The section pass of `plan()` (spec 11 §6.6 steps 1–5): parse every admitted file of every resolved
71
+ * ingredient (a malformed marker throws, whichever targets resolve), warn on marker lines in files
72
+ * not every target renders, fail a `schema: 1` Forge that holds a marker (Ruling 7/21), and warn on
73
+ * section values that apply to nothing.
74
+ */
75
+ async function sectionPass(forge, resolution, warnings) {
76
+ const parsed = new Map(); // abs path → parse
77
+ const declared = new Map(); // section key → names declared by resolved ingredients
78
+ const byRef = new Map();
79
+ let firstMarker = null;
80
+ for (const ing of resolution.ingredients) {
81
+ const key = sectionKey(ing.meta);
82
+ const names = declared.get(key) ?? new Set();
83
+ declared.set(key, names);
84
+ if (ing.meta.type === "mcp")
85
+ continue; // no file, so no marker: a value keyed mcp/<name> is warned below
86
+ const files = [];
87
+ for (const rel of await listFiles(ing.dir)) {
88
+ if (rel === "ingredient.yaml")
89
+ continue;
90
+ const abs = path.join(ing.dir, rel);
91
+ if (substitutedFile(ing.meta, rel)) {
92
+ const p = parseSections(await fs.readFile(abs, "utf8"), forgeRel(forge, abs), ing.ref);
93
+ parsed.set(abs, p);
94
+ files.push({ rel, p });
95
+ if (p.sections.length && firstMarker === null)
96
+ firstMarker = `${p.file}:${p.sections[0].line}`;
97
+ }
98
+ else {
99
+ // A file not every target renders as text keeps its markers; one, whatever its extension, is warned, never dropped
100
+ // silently. Every marker form contains "craftar:section", so a file without it is not decoded.
101
+ const bytes = await fs.readFile(abs);
102
+ if (bytes.includes("craftar:section") && toLf(stripBom(bytes.toString("utf8"))).split("\n").some((l) => markerLine(l) !== null)) {
103
+ warnings.push(`${ing.ref} ${rel}: section markers are read only in files every target renders as text — copied with them`);
104
+ }
105
+ }
106
+ }
107
+ checkDeclaredOnce(ing.ref, files.map((f) => f.p));
108
+ const list = [];
109
+ for (const { rel, p } of files) {
110
+ for (const s of p.sections) {
111
+ names.add(s.name);
112
+ list.push({ file: rel, name: s.name, layer: layerOf(resolution, key, s.name) });
113
+ }
114
+ }
115
+ if (list.length)
116
+ byRef.set(ing.ref, list);
117
+ }
118
+ // The schema gate (Ruling 7, §6.14): only the bodies this workspace resolves, after every parse error.
119
+ if (firstMarker !== null && forge.manifest.schema === 1) {
120
+ throw new Error(`${FORGE_MANIFEST} declares schema: 1, but ${firstMarker} holds a section marker — set schema: 2 in ${FORGE_MANIFEST}, ` +
121
+ `so that craftar 0.6.2 and older refuse this Forge instead of emitting the markers`);
122
+ }
123
+ // Values that apply to nothing (Ruling 12): an unknown key always; an unknown name only on a resolved key.
124
+ const forgeKeys = new Set([...forge.ingredients.values()].map((i) => sectionKey(i.meta)));
125
+ const said = new Set();
126
+ const say = (w) => {
127
+ if (!said.has(w))
128
+ warnings.push(w);
129
+ said.add(w);
130
+ };
131
+ for (const [key, values] of Object.entries(resolution.sections)) {
132
+ for (const name of Object.keys(values)) {
133
+ const layer = layerLabel(resolution, layerOf(resolution, key, name));
134
+ if (!forgeKeys.has(key))
135
+ say(`section key ${key} in ${layer} names no ingredient in the Forge`);
136
+ else if (declared.has(key) && !declared.get(key).has(name))
137
+ say(`${layer} sets section ${name} of ${key}, which has no such marker`);
138
+ }
139
+ }
140
+ return { parsed, byRef };
141
+ }
142
+ /**
143
+ * The output guard (spec 11 §6.6 step 6, Ruling 19): a rendered admitted file never holds a marker
144
+ * line. When one does, it came from a value; name the first value that carries one.
145
+ */
146
+ function guardOutput(ing, file, out, p, resolution, params) {
147
+ const line = firstMarkerLine(out);
148
+ if (line === null)
149
+ return;
150
+ const key = sectionKey(ing.meta);
151
+ const values = sectionsFor(ing, resolution);
152
+ let from = "a section or param value";
153
+ const section = p.sections.find((s) => Object.hasOwn(values, s.name) && firstMarkerLine(substitute(canonicalValue(values[s.name]), params)) !== null);
154
+ if (section)
155
+ from = `${layerLabel(resolution, layerOf(resolution, key, section.name))}, section ${section.name}`;
156
+ else {
157
+ const k = placeholders(expandSections(p, values)).find((x) => Object.hasOwn(params, x) && /<!--[ \t]*\/?[ \t]*craftar:section/.test(String(params[x])));
158
+ if (k !== undefined)
159
+ from = `param ${k}`;
160
+ }
161
+ throw new Error(`${ing.ref} ${file}: the rendered text holds a section marker on line ${line} (from ${from}) — a value cannot open or close a section`);
162
+ }
46
163
  export async function plan(ws) {
47
164
  const resolution = resolve(ws.forge, ws.config);
48
165
  const warnings = [...resolution.warnings];
49
166
  if (resolution.targets.length === 0) {
50
167
  warnings.push("no targets resolved — nothing will be emitted and every file in craftar.lock becomes an orphan (an empty list in craftar.local.yaml replaces the workspace's)");
51
168
  }
169
+ const sections = await sectionPass(ws.forge, resolution, warnings);
52
170
  /** Unresolved placeholder → refs of the ingredients citing it. */
53
171
  const missingParams = new Map();
54
172
  const ctx = {
@@ -64,9 +182,19 @@ export async function plan(ws) {
64
182
  }
65
183
  },
66
184
  async text(ing, file) {
67
- const raw = await fs.readFile(path.join(ing.dir, file), "utf8");
185
+ const abs = path.join(ing.dir, file);
186
+ const raw = await fs.readFile(abs, "utf8");
68
187
  const missing = new Set();
69
- const out = substitute(toLf(stripBom(raw)), paramsFor(ing, resolution), missing);
188
+ const params = paramsFor(ing, resolution);
189
+ // Sections first, then params (spec 11 §6.4), in admitted files only (§6.5).
190
+ const parsed = substitutedFile(ing.meta, file) ? sections.parsed.get(abs) : null;
191
+ // Every admitted file of a resolved ingredient was parsed and gated in the section pass; a miss here would skip the schema gate.
192
+ if (parsed === undefined)
193
+ throw new Error(`internal: ${forgeRel(ws.forge, abs)} was not parsed by the section pass`);
194
+ const expanded = parsed ? expandSections(parsed, sectionsFor(ing, resolution)) : toLf(stripBom(raw));
195
+ const out = substitute(expanded, params, missing);
196
+ if (parsed)
197
+ guardOutput(ing, file, out, parsed, resolution, params);
70
198
  for (const key of missing)
71
199
  missingParams.set(key, (missingParams.get(key) ?? new Set()).add(ing.ref));
72
200
  return out;
@@ -98,7 +226,7 @@ export async function plan(ws) {
98
226
  warnings.push(`two ingredients write ${f.path}: ${prev} and ${f.ingredient} (last wins)`);
99
227
  seen.set(f.path, f.ingredient);
100
228
  }
101
- return { resolution, files: dedupeLastWins(files), warnings };
229
+ return { resolution, files: dedupeLastWins(files), warnings, sections: sections.byRef };
102
230
  }
103
231
  function dedupeLastWins(files) {
104
232
  const m = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/core/sync.ts"],"names":[],"mappings":"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"}
@@ -4,6 +4,7 @@ import { placeholders, substitutedFile } from "./extract.js";
4
4
  import { fingerprintOf } from "./fingerprint.js";
5
5
  import { parseYaml } from "./forge.js";
6
6
  import { substitute } from "./resolve.js";
7
+ import { checkDeclaredOnce, expandSections, parseSections, SectionMarkerError } from "./sections.js";
7
8
  import { stripBom, toLf } from "./text.js";
8
9
  /**
9
10
  * Template-aware import (spec 10): compare a workspace source with the Forge base as sync would
@@ -24,23 +25,53 @@ export function renderMap(meta, profileParams, workspaceParams) {
24
25
  out[k] = v;
25
26
  return out;
26
27
  }
27
- /** An ingredient directory as the comparison sees it: its validated metadata and its files, admitted ones as normalized text. */
28
- export async function readBase(dir, io) {
28
+ /**
29
+ * Read a base. Every admitted text is parsed for section markers; a malformed one, or a name
30
+ * declared twice across the ingredient's files, is I12 (spec 11 §4.5). `forgeRoot`, when given,
31
+ * makes the file the error names Forge-relative.
32
+ */
33
+ export async function readBase(dir, io, forgeRoot) {
29
34
  const metaFile = path.join(dir, "ingredient.yaml");
30
35
  const meta = parseYaml(metaFile, await io.readText(metaFile), IngredientSchema);
31
36
  const texts = new Map();
32
37
  const bytes = new Map();
33
- for (const rel of await io.list(dir)) {
34
- if (rel === "ingredient.yaml")
35
- continue;
36
- if (substitutedFile(meta, rel))
37
- texts.set(rel, norm(await io.readText(path.join(dir, rel))));
38
- else
39
- bytes.set(rel, await io.readBytes(path.join(dir, rel)));
38
+ const parsed = new Map();
39
+ const label = (rel) => (forgeRoot ? path.relative(forgeRoot, path.join(dir, rel)) : path.join(dir, rel)).split(path.sep).join("/");
40
+ try {
41
+ for (const rel of await io.list(dir)) {
42
+ if (rel === "ingredient.yaml")
43
+ continue;
44
+ if (substitutedFile(meta, rel)) {
45
+ const text = norm(await io.readText(path.join(dir, rel)));
46
+ texts.set(rel, text);
47
+ parsed.set(rel, parseSections(text, label(rel), `${meta.type}/${meta.name}`));
48
+ }
49
+ else
50
+ bytes.set(rel, await io.readBytes(path.join(dir, rel)));
51
+ }
52
+ checkDeclaredOnce(`${meta.type}/${meta.name}`, [...parsed.values()]);
40
53
  }
41
- return { meta, texts, bytes, metaFile };
54
+ catch (e) {
55
+ if (e instanceof SectionMarkerError)
56
+ throw new Error(`import: ${e.file}:${e.line}: ${e.problem} — fix the Forge and re-run`);
57
+ throw e;
58
+ }
59
+ return { meta, texts, bytes, metaFile, parsed };
60
+ }
61
+ /** The names of the sections a base declares, across its admitted files. */
62
+ export function sectionNames(base) {
63
+ return [...base.parsed.values()].flatMap((p) => p.sections.map((s) => s.name));
64
+ }
65
+ /** The base's admitted texts with their sections expanded by `values` (spec 11 §6.2) — what sync substitutes into. */
66
+ export function expandedTexts(base, values = {}) {
67
+ const out = new Map();
68
+ for (const [rel, text] of base.texts) {
69
+ const p = base.parsed.get(rel);
70
+ out.set(rel, p ? expandSections(p, values) : text);
71
+ }
72
+ return out;
42
73
  }
43
- /** The keys every admitted file of a base cites (`C(X)`). */
74
+ /** The keys every admitted file of a base cites (`C(X)`); pass `expandedTexts` for what the importing profile renders (spec 11 §6.7). */
44
75
  export function citedKeys(texts) {
45
76
  const out = new Set();
46
77
  for (const t of texts.values())
@@ -50,14 +81,15 @@ export function citedKeys(texts) {
50
81
  }
51
82
  /**
52
83
  * The fingerprint of a base rendered through `map` (spec 10 §6.2): its metadata without `params`
53
- * (a workspace cannot express a declaration), admitted files substituted exactly as `ctx.text`
54
- * does, every other file as bytes. With no declaration and nothing set, this is `fingerprintDir`.
84
+ * (a workspace cannot express a declaration), admitted files expanded with the section values
85
+ * `sections` and then substituted, exactly as `ctx.text` does (spec 11 §6.4, §6.7), every other file
86
+ * as bytes. With no declaration, no marker and nothing set, this is `fingerprintDir`.
55
87
  */
56
- export function renderedFingerprint(base, map) {
88
+ export function renderedFingerprint(base, map, sections = {}) {
57
89
  const meta = { ...base.meta };
58
90
  delete meta.params;
59
91
  const files = {};
60
- for (const [rel, text] of base.texts)
92
+ for (const [rel, text] of expandedTexts(base, sections))
61
93
  files[rel] = substitute(text, map);
62
94
  for (const [rel, b] of base.bytes)
63
95
  files[rel] = b;