@superbee/core 0.1.3 → 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.
@@ -0,0 +1,63 @@
1
+ import type { OkfDocument } from "./types.js";
2
+ import type { ValidationWarning } from "./validation.js";
3
+ /** One recipe file: a path relative to the recipe root (posix), with its UTF-8 text. */
4
+ export interface RecipeFile {
5
+ path: string;
6
+ bytes: string;
7
+ }
8
+ /** One portable, content-free View carried by a recipe package. */
9
+ export interface RecipePage {
10
+ /** The `type: View` registry document installed under `views-registry/` (or the legacy `pages-registry/` location). */
11
+ registry: OkfDocument;
12
+ /** The self-contained HTML blob key declared by the registry document. */
13
+ entry: string;
14
+ /** UTF-8 HTML bytes written to `entry`. */
15
+ html: string;
16
+ }
17
+ /** One portable, content-free operating reference carried by a recipe package. */
18
+ export interface RecipeReference {
19
+ /** A `type: Reference` document installed under `references/`. */
20
+ doc: OkfDocument;
21
+ }
22
+ /** Parsed recipe definitions. Parsing does not install, authorize or execute these assets. */
23
+ export interface LoadedRecipe {
24
+ id: string;
25
+ title: string;
26
+ version: string;
27
+ summary: string;
28
+ /** One-line user-outcome phrasing for session offers; the manifest's `offer`, else the title. */
29
+ offer: string;
30
+ /** Caller-supplied provenance label; never resolved or fetched by the parser. */
31
+ source: string;
32
+ /** Convention docs, ids under `conventions/`. `timestamp` is stamped at APPLY, not here. */
33
+ docs: OkfDocument[];
34
+ /** Optional View definitions installed with the conventions; never Kind instances. */
35
+ pages: RecipePage[];
36
+ /** Optional operating references installed with the definitions; never project instances. */
37
+ references: RecipeReference[];
38
+ /** Present only for packages opting into the strict portable definitions-only contract. */
39
+ contentPolicy?: "definitions-only";
40
+ /** The `type` values this recipe's conventions govern (derived at parse, for the receipt). */
41
+ governs: string[];
42
+ /** Non-fatal (skipped-malformed doc / reserved manifest key / etc). Never silently dropped. */
43
+ warnings: ValidationWarning[];
44
+ }
45
+ export type RecipeErrorCode = "RECIPE_NOT_FOUND" | "RECIPE_MALFORMED" | "RECIPE_EMPTY" | "RECIPE_UNSAFE_PATH";
46
+ export interface RecipeError {
47
+ code: RecipeErrorCode;
48
+ message: string;
49
+ }
50
+ export type LoadResult = {
51
+ ok: true;
52
+ recipe: LoadedRecipe;
53
+ } | {
54
+ ok: false;
55
+ error: RecipeError;
56
+ };
57
+ /**
58
+ * Parse and validate caller-supplied recipe files without I/O or installation.
59
+ * Structural recipe errors return a failed LoadResult; malformed YAML throws
60
+ * MalformedDocumentError, as in the shared document codec.
61
+ */
62
+ export declare function parseRecipeFiles(files: RecipeFile[], source: string): LoadResult;
63
+ //# sourceMappingURL=recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAYzD,wFAAwF;AACxF,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,mEAAmE;AACnE,MAAM,WAAW,UAAU;IACzB,uHAAuH;IACvH,QAAQ,EAAE,WAAW,CAAC;IACtB,0EAA0E;IAC1E,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,kFAAkF;AAClF,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,GAAG,EAAE,WAAW,CAAC;CAClB;AAED,8FAA8F;AAC9F,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,iGAAiG;IACjG,KAAK,EAAE,MAAM,CAAC;IACd,iFAAiF;IACjF,MAAM,EAAE,MAAM,CAAC;IACf,4FAA4F;IAC5F,IAAI,EAAE,WAAW,EAAE,CAAC;IACpB,sFAAsF;IACtF,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,6FAA6F;IAC7F,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,2FAA2F;IAC3F,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,8FAA8F;IAC9F,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,+FAA+F;IAC/F,QAAQ,EAAE,iBAAiB,EAAE,CAAC;CAC/B;AAED,MAAM,MAAM,eAAe,GAAG,kBAAkB,GAAG,kBAAkB,GAAG,cAAc,GAAG,oBAAoB,CAAC;AAE9G,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,eAAe,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,UAAU,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,YAAY,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,WAAW,CAAA;CAAE,CAAC;AA6LhG;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,UAAU,CAwShF"}
@@ -0,0 +1,463 @@
1
+ // The ONE pure recipe parse+validate+materialize pipeline. Sources only acquire RecipeFile[];
2
+ // everything downstream of that byte boundary is distribution-neutral and branches on content,
3
+ // never on whether the files came from built-in constants, a folder, or a future source adapter.
4
+ import { parseMarkdown } from "./frontmatter.js";
5
+ import { parseConventionDoc, CONVENTIONS_PREFIX, CONVENTION_TYPE } from "./kinds.js";
6
+ import { conceptIdFromPath, assertSafeConceptId, isReservedFile } from "./paths.js";
7
+ import { declaredAccessValue, isAnyEntryKey, isAnyRegistryId, isPageTypeName, PAGE_ENTRY_PREFIX, PAGE_REGISTRY_PREFIX, VIEW_ENTRY_PREFIX, VIEW_REGISTRY_PREFIX, } from "./page.js";
8
+ /** Reserved manifest keys are surfaced as warnings, not applied or silently ignored. */
9
+ const RESERVED_MANIFEST_KEYS = ["composes", "seeds", "requires"];
10
+ function nonEmptyString(v) {
11
+ return typeof v === "string" ? v.trim() : "";
12
+ }
13
+ function isRecord(value) {
14
+ return typeof value === "object" && value !== null && !Array.isArray(value);
15
+ }
16
+ const REFERENCE_SEGMENT = /^[A-Za-z0-9._-]+$/;
17
+ function isSafeRecipeReferencePath(value) {
18
+ if (!value.startsWith("references/") || !value.endsWith(".md") || /[\\%?#]/.test(value))
19
+ return false;
20
+ const segments = value.slice("references/".length).split("/");
21
+ return segments.every((segment) => !segment.startsWith(".") && REFERENCE_SEGMENT.test(segment));
22
+ }
23
+ function parseReferenceDeclarations(manifest, recipeId, source) {
24
+ if (manifest.references === undefined)
25
+ return { ok: true, references: [] };
26
+ if (manifest.content_policy !== "definitions-only") {
27
+ return {
28
+ ok: false,
29
+ error: {
30
+ code: "RECIPE_MALFORMED",
31
+ message: `recipe '${recipeId}' at '${source}' declares references but does not declare ` +
32
+ "'content_policy: definitions-only', which is required for portable assets",
33
+ },
34
+ };
35
+ }
36
+ if (!Array.isArray(manifest.references)) {
37
+ return {
38
+ ok: false,
39
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}': 'references' must be a list` },
40
+ };
41
+ }
42
+ const references = [];
43
+ const targets = new Set();
44
+ for (const [index, value] of manifest.references.entries()) {
45
+ if (typeof value !== "string" || value === "") {
46
+ return {
47
+ ok: false,
48
+ error: {
49
+ code: "RECIPE_MALFORMED",
50
+ message: `recipe '${recipeId}': references[${index}] must be a non-empty path`,
51
+ },
52
+ };
53
+ }
54
+ if (!isSafeRecipeReferencePath(value)) {
55
+ return {
56
+ ok: false,
57
+ error: {
58
+ code: "RECIPE_UNSAFE_PATH",
59
+ message: `recipe '${recipeId}': Reference '${value}' must be a .md file under 'references/'`,
60
+ },
61
+ };
62
+ }
63
+ const id = conceptIdFromPath(value);
64
+ try {
65
+ assertSafeConceptId(id);
66
+ }
67
+ catch {
68
+ return {
69
+ ok: false,
70
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${recipeId}' contains an unsafe Reference path` },
71
+ };
72
+ }
73
+ if (isReservedFile(value)) {
74
+ return {
75
+ ok: false,
76
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${recipeId}' contains a reserved filename: '${value}'` },
77
+ };
78
+ }
79
+ const target = id.toLowerCase();
80
+ if (targets.has(target)) {
81
+ return {
82
+ ok: false,
83
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}' declares duplicate Reference '${value}'` },
84
+ };
85
+ }
86
+ targets.add(target);
87
+ references.push({ path: value, id });
88
+ }
89
+ return { ok: true, references };
90
+ }
91
+ function parsePageDeclarations(manifest, recipeId, source) {
92
+ if (manifest.pages === undefined)
93
+ return { ok: true, pages: [] };
94
+ if (manifest.content_policy !== "definitions-only") {
95
+ return {
96
+ ok: false,
97
+ error: {
98
+ code: "RECIPE_MALFORMED",
99
+ message: `recipe '${recipeId}' at '${source}' declares pages but does not declare ` +
100
+ "'content_policy: definitions-only', which is required for portable assets",
101
+ },
102
+ };
103
+ }
104
+ if (!Array.isArray(manifest.pages)) {
105
+ return {
106
+ ok: false,
107
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}': 'pages' must be a list` },
108
+ };
109
+ }
110
+ const pages = [];
111
+ const registries = new Set();
112
+ const entries = new Set();
113
+ for (const [index, value] of manifest.pages.entries()) {
114
+ if (!isRecord(value)) {
115
+ return {
116
+ ok: false,
117
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${recipeId}': pages[${index}] must be a map` },
118
+ };
119
+ }
120
+ const registry = typeof value.registry === "string" ? value.registry : "";
121
+ const entry = typeof value.entry === "string" ? value.entry : "";
122
+ if (!registry || !entry) {
123
+ return {
124
+ ok: false,
125
+ error: {
126
+ code: "RECIPE_MALFORMED",
127
+ message: `recipe '${recipeId}': pages[${index}] requires non-empty 'registry' and 'entry' paths`,
128
+ },
129
+ };
130
+ }
131
+ if ((!registry.startsWith(VIEW_REGISTRY_PREFIX) && !registry.startsWith(PAGE_REGISTRY_PREFIX)) || !registry.endsWith(".md")) {
132
+ return {
133
+ ok: false,
134
+ error: {
135
+ code: "RECIPE_UNSAFE_PATH",
136
+ message: `recipe '${recipeId}': View registry '${registry}' must be a .md file under '${VIEW_REGISTRY_PREFIX}' (or legacy '${PAGE_REGISTRY_PREFIX}')`,
137
+ },
138
+ };
139
+ }
140
+ if ((!entry.startsWith(VIEW_ENTRY_PREFIX) && !entry.startsWith(PAGE_ENTRY_PREFIX)) || !entry.endsWith(".html")) {
141
+ return {
142
+ ok: false,
143
+ error: {
144
+ code: "RECIPE_UNSAFE_PATH",
145
+ message: `recipe '${recipeId}': View entry '${entry}' must be a .html file under '${VIEW_ENTRY_PREFIX}' (or legacy '${PAGE_ENTRY_PREFIX}')`,
146
+ },
147
+ };
148
+ }
149
+ const registryId = registry.slice(0, -3);
150
+ if (!isAnyRegistryId(registryId) || !isAnyEntryKey(entry) || isReservedFile(registry)) {
151
+ return {
152
+ ok: false,
153
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${recipeId}' contains an unsafe View path` },
154
+ };
155
+ }
156
+ const registryTarget = registryId.toLowerCase();
157
+ const entryTarget = entry.toLowerCase();
158
+ if (registries.has(registryTarget) || entries.has(entryTarget)) {
159
+ return {
160
+ ok: false,
161
+ error: {
162
+ code: "RECIPE_MALFORMED",
163
+ message: `recipe '${recipeId}' declares a duplicate View registry or entry at pages[${index}]`,
164
+ },
165
+ };
166
+ }
167
+ registries.add(registryTarget);
168
+ entries.add(entryTarget);
169
+ pages.push({ registry, registryId, entry });
170
+ }
171
+ return { ok: true, pages };
172
+ }
173
+ /**
174
+ * Parse and validate caller-supplied recipe files without I/O or installation.
175
+ * Structural recipe errors return a failed LoadResult; malformed YAML throws
176
+ * MalformedDocumentError, as in the shared document codec.
177
+ */
178
+ export function parseRecipeFiles(files, source) {
179
+ const manifestFile = files.find((f) => f.path === "recipe.md");
180
+ if (!manifestFile) {
181
+ return {
182
+ ok: false,
183
+ error: { code: "RECIPE_MALFORMED", message: `recipe at '${source}' is missing its required recipe.md manifest` },
184
+ };
185
+ }
186
+ const { frontmatter: manifest } = parseMarkdown(manifestFile.bytes);
187
+ if (manifest.type !== "Recipe") {
188
+ return {
189
+ ok: false,
190
+ error: {
191
+ code: "RECIPE_MALFORMED",
192
+ message: `recipe at '${source}': recipe.md must declare 'type: Recipe' (got '${String(manifest.type)}')`,
193
+ },
194
+ };
195
+ }
196
+ const id = nonEmptyString(manifest.id);
197
+ const title = nonEmptyString(manifest.title);
198
+ const version = nonEmptyString(manifest.version);
199
+ const summary = nonEmptyString(manifest.summary);
200
+ const missing = [
201
+ !id && "id",
202
+ !title && "title",
203
+ !version && "version",
204
+ !summary && "summary",
205
+ ].filter((v) => Boolean(v));
206
+ if (missing.length > 0) {
207
+ return {
208
+ ok: false,
209
+ error: {
210
+ code: "RECIPE_MALFORMED",
211
+ message: `recipe at '${source}': recipe.md is missing required non-empty field(s): ${missing.join(", ")}`,
212
+ },
213
+ };
214
+ }
215
+ const contentPolicy = manifest.content_policy;
216
+ if (contentPolicy !== undefined && contentPolicy !== "definitions-only") {
217
+ return {
218
+ ok: false,
219
+ error: {
220
+ code: "RECIPE_MALFORMED",
221
+ message: `recipe '${id}' at '${source}' has unsupported content_policy '${String(contentPolicy)}'`,
222
+ },
223
+ };
224
+ }
225
+ const pageDeclarations = parsePageDeclarations(manifest, id, source);
226
+ if (!pageDeclarations.ok)
227
+ return pageDeclarations;
228
+ const referenceDeclarations = parseReferenceDeclarations(manifest, id, source);
229
+ if (!referenceDeclarations.ok)
230
+ return referenceDeclarations;
231
+ const declaredPageFiles = new Set(pageDeclarations.pages.flatMap((page) => [page.registry, page.entry]));
232
+ const declaredReferenceFiles = new Set(referenceDeclarations.references.map((reference) => reference.path));
233
+ const warnings = [];
234
+ for (const key of RESERVED_MANIFEST_KEYS) {
235
+ if (key in manifest) {
236
+ warnings.push({
237
+ code: "RECIPE_MANIFEST_RESERVED_KEY",
238
+ message: `recipe '${id}' declares '${key}:' in recipe.md, which this version does not apply (reserved for a future composition surface) — it is declared but NOT applied, not silently ignored.`,
239
+ field: key,
240
+ severity: "warning",
241
+ });
242
+ }
243
+ }
244
+ const docs = [];
245
+ const governsSeen = new Map(); // governs -> the doc id that first declared it
246
+ const governsList = [];
247
+ for (const file of files) {
248
+ if (file.path === "recipe.md")
249
+ continue;
250
+ if (!file.path.startsWith(CONVENTIONS_PREFIX)) {
251
+ if (declaredPageFiles.has(file.path))
252
+ continue;
253
+ if (declaredReferenceFiles.has(file.path))
254
+ continue;
255
+ if (contentPolicy === "definitions-only") {
256
+ return {
257
+ ok: false,
258
+ error: {
259
+ code: "RECIPE_UNSAFE_PATH",
260
+ message: `recipe '${id}' violates definitions-only policy with undeclared file '${file.path}'`,
261
+ },
262
+ };
263
+ }
264
+ // Backward compatibility: the historical filesystem source never acquired files outside
265
+ // recipe.md + conventions/, so legacy packages may continue carrying ignored README/assets.
266
+ continue;
267
+ }
268
+ const conceptId = conceptIdFromPath(file.path);
269
+ try {
270
+ assertSafeConceptId(conceptId);
271
+ }
272
+ catch {
273
+ return {
274
+ ok: false,
275
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${id}' contains an unsafe path '${file.path}'` },
276
+ };
277
+ }
278
+ if (isReservedFile(file.path)) {
279
+ return {
280
+ ok: false,
281
+ error: { code: "RECIPE_UNSAFE_PATH", message: `recipe '${id}' contains a reserved filename: '${file.path}'` },
282
+ };
283
+ }
284
+ const { frontmatter, body } = parseMarkdown(file.bytes);
285
+ const doc = { id: conceptId, frontmatter, body };
286
+ // Mirror loadKinds' own skip-with-warning semantics (a doc that is not `type: Convention`, or
287
+ // has an empty `governs`, is not a kind declaration at all) WITHOUT seeding a backend.
288
+ if (frontmatter.type !== CONVENTION_TYPE) {
289
+ if (contentPolicy === "definitions-only") {
290
+ return {
291
+ ok: false,
292
+ error: {
293
+ code: "RECIPE_MALFORMED",
294
+ message: `recipe '${id}': '${doc.id}' must declare 'type: ${CONVENTION_TYPE}'`,
295
+ },
296
+ };
297
+ }
298
+ warnings.push({
299
+ code: "KIND_CONVENTION_MALFORMED",
300
+ message: `recipe '${id}': skipped '${doc.id}' (type '${String(frontmatter.type)}', expected '${CONVENTION_TYPE}').`,
301
+ field: doc.id,
302
+ severity: "warning",
303
+ });
304
+ continue;
305
+ }
306
+ const governs = nonEmptyString(frontmatter.governs);
307
+ if (!governs) {
308
+ if (contentPolicy === "definitions-only") {
309
+ return {
310
+ ok: false,
311
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${id}': '${doc.id}' needs a non-empty 'governs'` },
312
+ };
313
+ }
314
+ warnings.push({
315
+ code: "KIND_CONVENTION_MALFORMED",
316
+ message: `recipe '${id}': skipped '${doc.id}' (missing or empty 'governs' field).`,
317
+ field: doc.id,
318
+ severity: "warning",
319
+ });
320
+ continue;
321
+ }
322
+ if (contentPolicy === "definitions-only") {
323
+ const parsed = parseConventionDoc(doc);
324
+ if (!parsed.ok || parsed.warnings.length > 0) {
325
+ const reasons = [!parsed.ok ? parsed.reason : "", ...parsed.warnings.map((warning) => warning.message)].filter(Boolean);
326
+ return {
327
+ ok: false,
328
+ error: {
329
+ code: "RECIPE_MALFORMED",
330
+ message: `recipe '${id}': invalid Convention '${doc.id}': ${reasons.join("; ")}`,
331
+ },
332
+ };
333
+ }
334
+ }
335
+ // Self-duplicate governs WITHIN this recipe is a malformed recipe —
336
+ // NOT a skip-with-warning, since it means the recipe's own conventions disagree about a type
337
+ // it declares governing twice.
338
+ if (governsSeen.has(governs)) {
339
+ return {
340
+ ok: false,
341
+ error: {
342
+ code: "RECIPE_MALFORMED",
343
+ message: `recipe '${id}' declares '${governs}' twice ('${governsSeen.get(governs)}' and '${doc.id}')`,
344
+ },
345
+ };
346
+ }
347
+ governsSeen.set(governs, doc.id);
348
+ governsList.push(governs);
349
+ docs.push(doc);
350
+ }
351
+ if (docs.length === 0) {
352
+ return {
353
+ ok: false,
354
+ error: { code: "RECIPE_EMPTY", message: `recipe '${id}' at '${source}' declares zero valid convention docs` },
355
+ };
356
+ }
357
+ const pages = [];
358
+ for (const declaration of pageDeclarations.pages) {
359
+ const registryFile = files.find((file) => file.path === declaration.registry);
360
+ const entryFile = files.find((file) => file.path === declaration.entry);
361
+ if (!registryFile || !entryFile) {
362
+ const missingPath = !registryFile ? declaration.registry : declaration.entry;
363
+ return {
364
+ ok: false,
365
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${id}' is missing declared View file '${missingPath}'` },
366
+ };
367
+ }
368
+ if (entryFile.bytes.trim() === "") {
369
+ return {
370
+ ok: false,
371
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${id}': View entry '${declaration.entry}' is empty` },
372
+ };
373
+ }
374
+ const { frontmatter, body } = parseMarkdown(registryFile.bytes);
375
+ if (!isPageTypeName(frontmatter.type)) {
376
+ return {
377
+ ok: false,
378
+ error: {
379
+ code: "RECIPE_MALFORMED",
380
+ message: `recipe '${id}': '${declaration.registry}' must declare 'type: View' (the legacy 'type: Page' no longer registers)`,
381
+ },
382
+ };
383
+ }
384
+ if (!nonEmptyString(frontmatter.title)) {
385
+ return {
386
+ ok: false,
387
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${id}': '${declaration.registry}' needs a title` },
388
+ };
389
+ }
390
+ const access = declaredAccessValue(frontmatter);
391
+ if (access !== "none" && access !== "bundle-read" && access !== "bundle-propose") {
392
+ return {
393
+ ok: false,
394
+ error: {
395
+ code: "RECIPE_MALFORMED",
396
+ message: `recipe '${id}': '${declaration.registry}' needs access: none, access: bundle-read, or access: bundle-propose (the legacy 'bridge:' spelling is no longer read)`,
397
+ },
398
+ };
399
+ }
400
+ if (frontmatter.entry !== declaration.entry) {
401
+ return {
402
+ ok: false,
403
+ error: {
404
+ code: "RECIPE_MALFORMED",
405
+ message: `recipe '${id}': '${declaration.registry}' entry '${String(frontmatter.entry)}' ` +
406
+ `does not match manifest entry '${declaration.entry}'`,
407
+ },
408
+ };
409
+ }
410
+ pages.push({
411
+ registry: { id: declaration.registryId, frontmatter, body },
412
+ entry: declaration.entry,
413
+ html: entryFile.bytes,
414
+ });
415
+ }
416
+ const references = [];
417
+ for (const declaration of referenceDeclarations.references) {
418
+ const referenceFile = files.find((file) => file.path === declaration.path);
419
+ if (!referenceFile) {
420
+ return {
421
+ ok: false,
422
+ error: {
423
+ code: "RECIPE_MALFORMED",
424
+ message: `recipe '${id}' is missing declared Reference file '${declaration.path}'`,
425
+ },
426
+ };
427
+ }
428
+ const { frontmatter, body } = parseMarkdown(referenceFile.bytes);
429
+ if (frontmatter.type !== "Reference") {
430
+ return {
431
+ ok: false,
432
+ error: {
433
+ code: "RECIPE_MALFORMED",
434
+ message: `recipe '${id}': '${declaration.path}' must declare 'type: Reference'`,
435
+ },
436
+ };
437
+ }
438
+ if (!nonEmptyString(frontmatter.title)) {
439
+ return {
440
+ ok: false,
441
+ error: { code: "RECIPE_MALFORMED", message: `recipe '${id}': '${declaration.path}' needs a title` },
442
+ };
443
+ }
444
+ references.push({ doc: { id: declaration.id, frontmatter, body } });
445
+ }
446
+ const recipe = {
447
+ id,
448
+ title,
449
+ version,
450
+ summary,
451
+ offer: nonEmptyString(manifest.offer) || title,
452
+ source,
453
+ docs,
454
+ pages,
455
+ references,
456
+ governs: governsList,
457
+ warnings,
458
+ };
459
+ if (contentPolicy === "definitions-only")
460
+ recipe.contentPolicy = contentPolicy;
461
+ return { ok: true, recipe };
462
+ }
463
+ //# sourceMappingURL=recipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.js","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@superbee/core",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "type": "module",
5
5
  "description": "OKF store engine — bundle I/O, cross-links, derived backlinks, freshness, and versioned writes.",
6
6
  "license": "Apache-2.0",
@@ -25,6 +25,10 @@
25
25
  "types": "./dist/engine.d.ts",
26
26
  "default": "./dist/engine.js"
27
27
  },
28
+ "./recipes": {
29
+ "types": "./dist/recipes.d.ts",
30
+ "default": "./dist/recipes.js"
31
+ },
28
32
  "./kinds": {
29
33
  "types": "./dist/kinds.d.ts",
30
34
  "default": "./dist/kinds.js"