@caelo-cms/shared 0.10.72 → 0.11.1

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 (204) hide show
  1. package/dist/ai-tools.d.ts +103 -142
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +79 -167
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/build-page.d.ts +115 -35
  6. package/dist/build-page.d.ts.map +1 -1
  7. package/dist/build-page.js +31 -12
  8. package/dist/build-page.js.map +1 -1
  9. package/dist/content.d.ts +214 -102
  10. package/dist/content.d.ts.map +1 -1
  11. package/dist/content.js +219 -84
  12. package/dist/content.js.map +1 -1
  13. package/dist/css-scope-scan.js +1 -1
  14. package/dist/css-var-aliases.d.ts +20 -0
  15. package/dist/css-var-aliases.d.ts.map +1 -0
  16. package/dist/css-var-aliases.js +95 -0
  17. package/dist/css-var-aliases.js.map +1 -0
  18. package/dist/css-var-scan.d.ts +0 -16
  19. package/dist/css-var-scan.d.ts.map +1 -1
  20. package/dist/css-var-scan.js +24 -0
  21. package/dist/css-var-scan.js.map +1 -1
  22. package/dist/edit-markers.d.ts +41 -5
  23. package/dist/edit-markers.d.ts.map +1 -1
  24. package/dist/edit-markers.js +47 -50
  25. package/dist/edit-markers.js.map +1 -1
  26. package/dist/escaped-line-breaks.d.ts +44 -0
  27. package/dist/escaped-line-breaks.d.ts.map +1 -0
  28. package/dist/escaped-line-breaks.js +203 -0
  29. package/dist/escaped-line-breaks.js.map +1 -0
  30. package/dist/index.d.ts +4 -1
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/interactions.js +6 -6
  35. package/dist/interactions.js.map +1 -1
  36. package/dist/link-canonicalise.d.ts.map +1 -1
  37. package/dist/link-canonicalise.js +7 -1
  38. package/dist/link-canonicalise.js.map +1 -1
  39. package/dist/link-refs.d.ts +1 -1
  40. package/dist/link-refs.js +3 -3
  41. package/dist/lists/address.d.ts +34 -0
  42. package/dist/lists/address.d.ts.map +1 -0
  43. package/dist/lists/address.js +43 -0
  44. package/dist/lists/address.js.map +1 -0
  45. package/dist/lists/default-types.d.ts +22 -0
  46. package/dist/lists/default-types.d.ts.map +1 -0
  47. package/dist/lists/default-types.js +127 -0
  48. package/dist/lists/default-types.js.map +1 -0
  49. package/dist/lists/fields.d.ts +152 -0
  50. package/dist/lists/fields.d.ts.map +1 -0
  51. package/dist/lists/fields.js +259 -0
  52. package/dist/lists/fields.js.map +1 -0
  53. package/dist/lists/index.d.ts +14 -0
  54. package/dist/lists/index.d.ts.map +1 -0
  55. package/dist/lists/index.js +15 -0
  56. package/dist/lists/index.js.map +1 -0
  57. package/dist/lists/item-attr.d.ts +26 -0
  58. package/dist/lists/item-attr.d.ts.map +1 -0
  59. package/dist/lists/item-attr.js +31 -0
  60. package/dist/lists/item-attr.js.map +1 -0
  61. package/dist/lists/items.d.ts +105 -0
  62. package/dist/lists/items.d.ts.map +1 -0
  63. package/dist/lists/items.js +304 -0
  64. package/dist/lists/items.js.map +1 -0
  65. package/dist/lists/list-type.d.ts +401 -0
  66. package/dist/lists/list-type.d.ts.map +1 -0
  67. package/dist/lists/list-type.js +275 -0
  68. package/dist/lists/list-type.js.map +1 -0
  69. package/dist/lists/model.d.ts +14 -0
  70. package/dist/lists/model.d.ts.map +1 -0
  71. package/dist/lists/model.js +15 -0
  72. package/dist/lists/model.js.map +1 -0
  73. package/dist/lists/page-type.d.ts +115 -0
  74. package/dist/lists/page-type.d.ts.map +1 -0
  75. package/dist/lists/page-type.js +66 -0
  76. package/dist/lists/page-type.js.map +1 -0
  77. package/dist/lists/refs.d.ts +13 -0
  78. package/dist/lists/refs.d.ts.map +1 -0
  79. package/dist/lists/refs.js +18 -0
  80. package/dist/lists/refs.js.map +1 -0
  81. package/dist/lists/render-data.d.ts +123 -0
  82. package/dist/lists/render-data.d.ts.map +1 -0
  83. package/dist/lists/render-data.js +3 -0
  84. package/dist/lists/render-data.js.map +1 -0
  85. package/dist/lists/render-deps.d.ts +69 -0
  86. package/dist/lists/render-deps.d.ts.map +1 -0
  87. package/dist/lists/render-deps.js +93 -0
  88. package/dist/lists/render-deps.js.map +1 -0
  89. package/dist/lists/resolve-values.d.ts +63 -0
  90. package/dist/lists/resolve-values.d.ts.map +1 -0
  91. package/dist/lists/resolve-values.js +181 -0
  92. package/dist/lists/resolve-values.js.map +1 -0
  93. package/dist/lists/resolve.d.ts +119 -0
  94. package/dist/lists/resolve.d.ts.map +1 -0
  95. package/dist/lists/resolve.js +970 -0
  96. package/dist/lists/resolve.js.map +1 -0
  97. package/dist/lists/scope.d.ts +81 -0
  98. package/dist/lists/scope.d.ts.map +1 -0
  99. package/dist/lists/scope.js +3 -0
  100. package/dist/lists/scope.js.map +1 -0
  101. package/dist/markup-structure.d.ts +8 -0
  102. package/dist/markup-structure.d.ts.map +1 -1
  103. package/dist/markup-structure.js +2 -0
  104. package/dist/markup-structure.js.map +1 -1
  105. package/dist/media.d.ts +1 -1
  106. package/dist/nested-module-render.d.ts +38 -20
  107. package/dist/nested-module-render.d.ts.map +1 -1
  108. package/dist/nested-module-render.js +156 -31
  109. package/dist/nested-module-render.js.map +1 -1
  110. package/dist/page-log.d.ts +1 -1
  111. package/dist/preview-compose.d.ts +24 -21
  112. package/dist/preview-compose.d.ts.map +1 -1
  113. package/dist/preview-compose.js +34 -118
  114. package/dist/preview-compose.js.map +1 -1
  115. package/dist/redirect-plan.d.ts +13 -0
  116. package/dist/redirect-plan.d.ts.map +1 -1
  117. package/dist/redirect-plan.js +22 -0
  118. package/dist/redirect-plan.js.map +1 -1
  119. package/dist/seo.d.ts +21 -0
  120. package/dist/seo.d.ts.map +1 -1
  121. package/dist/seo.js +32 -0
  122. package/dist/seo.js.map +1 -1
  123. package/dist/source-text-transport.d.ts +43 -0
  124. package/dist/source-text-transport.d.ts.map +1 -0
  125. package/dist/source-text-transport.js +79 -0
  126. package/dist/source-text-transport.js.map +1 -0
  127. package/dist/template-engine.d.ts +44 -31
  128. package/dist/template-engine.d.ts.map +1 -1
  129. package/dist/template-engine.js +75 -174
  130. package/dist/template-engine.js.map +1 -1
  131. package/dist/template-sections.d.ts +69 -0
  132. package/dist/template-sections.d.ts.map +1 -0
  133. package/dist/template-sections.js +436 -0
  134. package/dist/template-sections.js.map +1 -0
  135. package/dist/version.d.ts +2 -2
  136. package/dist/version.d.ts.map +1 -1
  137. package/dist/version.js +1 -1
  138. package/dist/version.js.map +1 -1
  139. package/package.json +8 -1
  140. package/src/__tests__/redos-hardening.test.ts +51 -16
  141. package/src/ai-tools-add-module-modes.test.ts +51 -1
  142. package/src/ai-tools.test.ts +7 -10
  143. package/src/ai-tools.ts +90 -180
  144. package/src/bug-intake.test.ts +1 -1
  145. package/src/build-page.test.ts +34 -3
  146. package/src/build-page.ts +34 -11
  147. package/src/content.test.ts +137 -4
  148. package/src/content.ts +230 -85
  149. package/src/css-scope-scan.ts +1 -1
  150. package/src/css-var-aliases.test.ts +61 -0
  151. package/src/css-var-aliases.ts +109 -0
  152. package/src/css-var-scan.ts +9 -0
  153. package/src/edit-markers.test.ts +37 -21
  154. package/src/edit-markers.ts +52 -20
  155. package/src/escaped-line-breaks.ts +221 -0
  156. package/src/index.ts +4 -1
  157. package/src/interactions.ts +6 -6
  158. package/src/link-canonicalise.test.ts +36 -6
  159. package/src/link-canonicalise.ts +6 -1
  160. package/src/link-refs.test.ts +67 -42
  161. package/src/link-refs.ts +3 -3
  162. package/src/lists/address.ts +75 -0
  163. package/src/lists/default-types.ts +141 -0
  164. package/src/lists/fields.ts +286 -0
  165. package/src/lists/index.ts +16 -0
  166. package/src/lists/item-attr.test.ts +36 -0
  167. package/src/lists/item-attr.ts +49 -0
  168. package/src/lists/items.ts +402 -0
  169. package/src/lists/list-fixtures.test.ts +308 -0
  170. package/src/lists/list-type.ts +306 -0
  171. package/src/lists/lists.test.ts +328 -0
  172. package/src/lists/model.ts +16 -0
  173. package/src/lists/page-type.ts +71 -0
  174. package/src/lists/refs.ts +21 -0
  175. package/src/lists/render-data.ts +134 -0
  176. package/src/lists/render-deps.test.ts +132 -0
  177. package/src/lists/render-deps.ts +147 -0
  178. package/src/lists/resolve-values.ts +224 -0
  179. package/src/lists/resolve.test.ts +472 -0
  180. package/src/lists/resolve.ts +1246 -0
  181. package/src/lists/scope.ts +69 -0
  182. package/src/lists-compose-parity.test.ts +262 -0
  183. package/src/markup-structure.ts +10 -0
  184. package/src/nested-module-render.test.ts +147 -74
  185. package/src/nested-module-render.ts +120 -48
  186. package/src/preview-compose.test.ts +55 -19
  187. package/src/preview-compose.ts +59 -154
  188. package/src/redirect-plan.test.ts +25 -0
  189. package/src/redirect-plan.ts +24 -0
  190. package/src/seo.test.ts +58 -0
  191. package/src/seo.ts +49 -0
  192. package/src/source-text-transport.test.ts +158 -0
  193. package/src/source-text-transport.ts +81 -0
  194. package/src/template-engine-lists.test.ts +608 -0
  195. package/src/template-engine.test.ts +62 -80
  196. package/src/template-engine.ts +102 -245
  197. package/src/template-sections.ts +514 -0
  198. package/src/version.ts +1 -1
  199. package/dist/structured-sets.d.ts +0 -70
  200. package/dist/structured-sets.d.ts.map +0 -1
  201. package/dist/structured-sets.js +0 -92
  202. package/dist/structured-sets.js.map +0 -1
  203. package/src/structured-sets.ts +0 -114
  204. package/src/template-engine-data-lists.test.ts +0 -90
@@ -0,0 +1,79 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Decoding of whole-value transport encodings around AI tool arguments that
4
+ * carry source text (module / template / layout html, css, js).
5
+ *
6
+ * The model sometimes encodes a long markup string as a whole before it
7
+ * sends it: as a CDATA section (`unwrapCdataEnvelope`), as a JSON string
8
+ * literal (`"<footer class=\"x\">…"`), HTML-escaped (`&lt;main&gt;…`), or
9
+ * with its line breaks string-escaped (`{\n color: red;\n}`, see
10
+ * `escaped-line-breaks.ts`).
11
+ * Each is an encoding of a value the caller did supply, never content:
12
+ * a JSON string literal is not valid markup, CSS or JS as a whole, and
13
+ * markup without a single `<` but with `&lt;tag` has no element at all.
14
+ * Refusing them cost a tool round-trip each time (e2e-livedit runs of
15
+ * PR #1121 and #1143); describing them in every tool cost tokens on every
16
+ * call and still did not stop them. So the boundary decodes them, once,
17
+ * here. Anything not clearly a whole-value encoding is left untouched and
18
+ * the op validator still refuses it (shared `content.ts`), which also
19
+ * keeps human and import writes strict. This is input normalisation, not
20
+ * a fallback for missing data (CLAUDE.md §2).
21
+ */
22
+ import { decodeEscapedLineBreaks } from "./escaped-line-breaks.js";
23
+ import { unwrapCdataEnvelope } from "./strip-cdata.js";
24
+ /**
25
+ * The body of a whole-value JSON string literal, or the input unchanged.
26
+ * Only decoded when the literal carries an escape (`\"`, `\n`, `\t`, `\\`,
27
+ * `\/`, `\u…`): a bare `"use strict"` stays as it is.
28
+ */
29
+ export function decodeJsonEncodedSource(value) {
30
+ if (typeof value !== "string")
31
+ return value;
32
+ const t = value.trim();
33
+ if (t.length < 2 || !t.startsWith('"') || !t.endsWith('"'))
34
+ return value;
35
+ if (!/\\["ntr\\/u]/.test(t))
36
+ return value;
37
+ try {
38
+ const decoded = JSON.parse(t);
39
+ return typeof decoded === "string" ? decoded : value;
40
+ }
41
+ catch {
42
+ return value;
43
+ }
44
+ }
45
+ const ENTITIES = {
46
+ "&lt;": "<",
47
+ "&gt;": ">",
48
+ "&quot;": '"',
49
+ "&#34;": '"',
50
+ "&#39;": "'",
51
+ "&#x27;": "'",
52
+ "&apos;": "'",
53
+ };
54
+ /**
55
+ * Markup sent HTML-escaped as a whole, decoded once; the input unchanged
56
+ * otherwise. "As a whole" = no raw `<` anywhere and at least one escaped
57
+ * tag (`&lt;div`, `&lt;/div`) — the same test the op's refusal uses.
58
+ * `&amp;` is decoded last, so an entity the author meant (`&amp;nbsp;`
59
+ * sent for `&nbsp;`) comes out as the author wrote it.
60
+ */
61
+ export function decodeHtmlEscapedSource(value) {
62
+ if (typeof value !== "string")
63
+ return value;
64
+ if (value.includes("<") || !/&lt;\/?[a-zA-Z]/.test(value))
65
+ return value;
66
+ return value
67
+ .replace(/&lt;|&gt;|&quot;|&#34;|&#39;|&#x27;|&apos;/g, (e) => ENTITIES[e] ?? e)
68
+ .replace(/&amp;/g, "&");
69
+ }
70
+ /**
71
+ * Every whole-value transport encoding, outermost first.
72
+ *
73
+ * @param language - the grammar of the value; escaped line breaks are only
74
+ * decoded where they cannot belong to a literal of it.
75
+ */
76
+ export function decodeSourceTextTransport(value, language) {
77
+ return decodeEscapedLineBreaks(decodeHtmlEscapedSource(decodeJsonEncodedSource(unwrapCdataEnvelope(value))), language);
78
+ }
79
+ //# sourceMappingURL=source-text-transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-text-transport.js","sourceRoot":"","sources":["../src/source-text-transport.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAAE,uBAAuB,EAAuB,MAAM,0BAA0B,CAAC;AACxF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IACvB,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACzE,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACvC,OAAO,OAAO,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,QAAQ,GAAqC;IACjD,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,QAAQ,EAAE,GAAG;CACd,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CAAC,KAAc;IACpD,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxE,OAAO,KAAK;SACT,OAAO,CAAC,6CAA6C,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;SAC/E,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc,EAAE,QAAwB;IAChF,OAAO,uBAAuB,CAC5B,uBAAuB,CAAC,uBAAuB,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,EAC5E,QAAQ,CACT,CAAC;AACJ,CAAC"}
@@ -1,21 +1,42 @@
1
1
  import { type ModuleFieldKind } from "./content.js";
2
2
  import { type LinkResolver } from "./link-refs.js";
3
+ import { type SourceDef } from "./lists/list-type.js";
4
+ import type { ListHolder, ListPageContext } from "./lists/resolve.js";
3
5
  /**
4
6
  * Subset of `modules.fields[]` the engine cares about. The full
5
- * schema lives in `content.ts`; the engine only needs `name`, `kind`,
6
- * and the optional `default`. Importers pass the full row through.
7
+ * schema lives in `content.ts`; the engine needs `name`, `kind`, the
8
+ * optional `default` and, for a `list` field, its binding
9
+ * (`listType`, `bind`, `list`, `source` — `docs/lists.md` §7).
10
+ * Importers pass the full row through.
7
11
  */
8
12
  export interface TemplateField {
9
13
  readonly name: string;
10
14
  readonly kind: ModuleFieldKind;
11
15
  readonly default?: unknown;
16
+ readonly listType?: string;
17
+ readonly bind?: "local" | "shared" | "source";
18
+ readonly list?: string;
19
+ readonly source?: SourceDef;
12
20
  }
21
+ /**
22
+ * Parse a stored `modules.fields` jsonb (array or JSON text) into the
23
+ * fields the engine renders with: name, kind (absent = `text`), default,
24
+ * and a `list` field's binding. A typo'd kind passes through as is — the
25
+ * engine reports it loudly (kind-mismatch) instead of the parser hiding
26
+ * it. Entries without a string name are skipped; they cannot be rendered.
27
+ */
28
+ export declare function templateFieldsFromJson(raw: unknown): TemplateField[];
13
29
  /**
14
30
  * Renders the nested-module partial for `key` (see
15
31
  * {@link RenderTemplateInput.partials}) on demand, or `undefined` when
16
- * the caller has no renderer for it.
32
+ * the caller has no renderer for it. `ref` is passed for the module
33
+ * field of a list entry (key `list:<field>/<itemId>/<entryField>`),
34
+ * whose value the caller cannot look up by field name.
17
35
  */
18
- export type PartialResolver = (key: string) => string | undefined;
36
+ export type PartialResolver = (key: string, ref?: {
37
+ readonly moduleId: string;
38
+ readonly contentInstanceId: string;
39
+ }) => string | undefined;
19
40
  export interface RenderTemplateInput {
20
41
  readonly html: string;
21
42
  readonly fields: readonly TemplateField[];
@@ -25,6 +46,8 @@ export interface RenderTemplateInput {
25
46
  * Nested-module HTML keyed by:
26
47
  * - `<name>` for single `{{>name}}` (module field kind)
27
48
  * - `<name>__<index>` for each `{{#name}}` element (module-list)
49
+ * - `list:<field>/<itemId>/<entryField>` for `{{>entryField}}`
50
+ * inside an entry of list field `<field>` (resolver gets the ref)
28
51
  * Either pre-rendered, or a {@link PartialResolver} the engine calls
29
52
  * only for the refs the template actually dispatches — the recursive
30
53
  * renderer (nested-module-render.ts) passes a resolver so a declared
@@ -33,23 +56,17 @@ export interface RenderTemplateInput {
33
56
  */
34
57
  readonly partials?: Readonly<Record<string, string>> | PartialResolver;
35
58
  /**
36
- * Plugin-provided lists for THIS page, keyed by the claimed name a
37
- * module iterates as `{{#name}}`. The plugin supplies the data, the
38
- * module owns the markup — so a language switcher looks like the site
39
- * it lives on instead of carrying a plugin's fixed HTML.
40
- *
41
- * Resolved per page, which is what lets a module carrying one sit in
42
- * a LAYOUT and cover every page. The `staticRender` placeholder can't:
43
- * it needs the page's own id baked into its HTML.
59
+ * The list view of THIS page (`lists/resolve.ts`): resolves `list`
60
+ * fields, `{{page.*}}` and plugin list sources. Without it a `list`
61
+ * field renders raw with `list-context-unavailable:<field>`.
44
62
  */
45
- readonly dataLists?: Readonly<Record<string, ReadonlyArray<Readonly<Record<string, string>>>>>;
63
+ readonly lists?: ListPageContext;
46
64
  /**
47
- * Names an INSTALLED plugin declares that are not live right now,
48
- * mapped to the owning plugin. A module written while the plugin ran
49
- * still says `{{#language_links}}`; this is what lets the render
50
- * report "that plugin is switched off" instead of "unknown field".
65
+ * The content instance whose values are rendered — the address of
66
+ * local list entries for overlays and `data-caelo-list-item`. Absent
67
+ * for field defaults (site chrome).
51
68
  */
52
- readonly dormantDataLists?: Readonly<Record<string, string>>;
69
+ readonly listHolder?: ListHolder;
53
70
  /**
54
71
  * v0.11.1 (issue #76) — active theme's resolved asset URLs. When
55
72
  * present, `{{theme_logo_url}}` / `{{theme_logo_dark_url}}` /
@@ -71,7 +88,7 @@ export interface RenderTemplateInput {
71
88
  * `caelo:media/<id>`) into URLs for the page being rendered. Applied
72
89
  * to the fully substituted output, so a reference resolves wherever it
73
90
  * came from: module HTML attributes, a field value, a field default, a
74
- * link-list item, rich text. A missing target stays raw and pushes
91
+ * list entry, rich text. A missing target stays raw and pushes
75
92
  * `link-target-missing:<kind>/<id>`; with no resolver every reference
76
93
  * pushes `link-resolver-unavailable:<kind>/<id>` (loud, never empty).
77
94
  */
@@ -98,26 +115,22 @@ export declare function caeloMissingComment(reason: string): string;
98
115
  * channel. Pure / sync / no IO.
99
116
  *
100
117
  * @example
101
- * // AC #1 fixture (issue #71). Iterates a link-list field per element.
118
+ * // A local list of the shipped `links` type; `lists` comes from
119
+ * // createListRenderContext(data).forPage(pageId, { linkResolver }).
102
120
  * renderTemplate({
103
- * html: '<nav>{{#nav_items}}<a href="{{href}}">{{label}}</a>{{/nav_items}}</nav>',
104
- * fields: [{ name: 'nav_items', kind: 'link-list' }],
121
+ * html: '<nav>{{#nav}}<a href="{{link}}">{{label}}</a>{{/nav}}</nav>',
122
+ * fields: [{ name: 'nav', kind: 'list', listType: 'links' }],
105
123
  * contentValues: {
106
- * nav_items: [
107
- * { label: 'Docs', href: '/docs' },
108
- * { label: 'Blog', href: '/blog' },
109
- * ],
124
+ * nav: [{ id: '<uuid>', node: 'link', values: { label: 'Docs', link: { href: '/docs' } } }],
110
125
  * },
126
+ * lists,
111
127
  * });
112
- * // → {
113
- * // html: '<nav><a href="/docs">Docs</a><a href="/blog">Blog</a></nav>',
114
- * // missingSlots: [],
115
- * // }
128
+ * // → html: '<nav><a href="/docs" data-caelo-list-item="local/nav/<uuid>">Docs</a></nav>'
116
129
  *
117
130
  * @see {@link TemplateField} for the field shape (name + kind + optional default).
118
131
  * @see {@link ./content.js#MODULE_FIELD_KINDS} for the canonical kind union.
119
132
  * @see {@link ./content.js#MODULE_FIELD_SECTION_KINDS} for the kinds the engine
120
- * iterates via `{{#name}}` (text-list / link-list / module-list).
133
+ * iterates via `{{#name}}` (list / module-list).
121
134
  */
122
135
  export declare function renderTemplate(input: RenderTemplateInput): RenderTemplateOutput;
123
136
  //# sourceMappingURL=template-engine.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"AAsEA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAyB,MAAM,gBAAgB,CAAC;AAS1E;;;;GAIG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D;;;;;;;;;OASG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,eAAe,CAAC;IACvE;;;;;;;;;OASG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/F;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC7D;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,CAAC;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AA4DD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAWD;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAyJ/E"}
1
+ {"version":3,"file":"template-engine.d.ts","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"AAoFA,OAAO,EAA8B,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAChF,OAAO,EAAE,KAAK,YAAY,EAAyB,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EAAE,KAAK,SAAS,EAAmB,MAAM,sBAAsB,CAAC;AACvE,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAUtE;;;;;;GAMG;AACH,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC;CAC7B;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,aAAa,EAAE,CAqBpE;AAED;;;;;;GAMG;AACH,MAAM,MAAM,eAAe,GAAG,CAC5B,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE;IAAE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,KACpE,MAAM,GAAG,SAAS,CAAC;AAExB,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAC;IAC1C,4DAA4D;IAC5D,QAAQ,CAAC,aAAa,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3D;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,GAAG,eAAe,CAAC;IACvE;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,UAAU,CAAC;IACjC;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;KACrC,CAAC;IACF;;;;;;;;OAQG;IACH,QAAQ,CAAC,YAAY,CAAC,EAAE,YAAY,CAAC;CACtC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,2EAA2E;IAC3E,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;CAC1C;AAmDD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAE1D;AAWD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,oBAAoB,CAwJ/E"}
@@ -5,18 +5,27 @@
5
5
  * DB-aware `substituteWithRecursion` in `nested-module-render.ts` into a
6
6
  * single engine built on `mustache.js` (Plan B per issue #71).
7
7
  *
8
- * Grammar (a Mustache subset — see CMS_REQUIREMENTS §3.1 / §5):
8
+ * Grammar (a Mustache subset — see CMS_REQUIREMENTS §3.1 / §5, and
9
+ * `docs/lists.md` §8 for lists):
9
10
  * {{name}} — primitive substitution
10
- * {{#name}}…inner…{{/name}} — section: ITERATES over a list field
11
- * (text-list / link-list / module-list);
12
- * for a SCALAR (text/image/…) or single
11
+ * {{#name}}…inner…{{/name}} — section: ITERATES over a `list` field
12
+ * (any binding — local, shared, query,
13
+ * system, plugin source) or a
14
+ * `module-list`; for a SCALAR or single
13
15
  * `module` field it is a CONDITIONAL —
14
16
  * the block renders once when the field
15
17
  * has a value, and is dropped when empty
16
18
  * (never a kind-mismatch — that used to
17
19
  * silently drop real scalar content)
20
+ * {{^name}}…inner…{{/name}} — inverted section: renders when the list
21
+ * is empty or the value absent / false
18
22
  * {{>name}} — single nested module reference
19
23
  * (module field kind)
24
+ * {{page.title}}, {{a.b}} — dot access (`page.*`, compound entry
25
+ * values); inside a list entry the
26
+ * entry's keys, `{{>recurse}}`,
27
+ * `{{>f}}` (embedded module) and the
28
+ * system keys — see template-sections.ts
20
29
  *
21
30
  * Substitution priority for {{name}}:
22
31
  * 1. contentValues[name] — per-placement value
@@ -33,13 +42,18 @@
33
42
  * Failure markers preserved verbatim from the legacy preview-render
34
43
  * for `missingSlots`: `field-not-declared:<name>`,
35
44
  * `kind-mismatch:<name> expected=<…> actual=<kind>`,
36
- * `text-list-malformed:<name>[<i>]`, `link-list-malformed:<name>[<i>]`,
37
45
  * `module-list-malformed:<name>[<i>]`, `module-ref-malformed:<name>`,
38
46
  * `nested-renderer-unavailable:<name>` / `…:<name>[<i>]` (a nested ref
39
47
  * rendered without the recursive renderer's partial).
40
48
  * v0.11.1 (issue #76): `theme-asset-unbound:<slot>` for the four
41
49
  * `{{theme_<slot>_url}}` placeholders when the active theme's asset
42
50
  * slot isn't bound.
51
+ * Epic #1107 (lists): `list-unbound:<field>`, `list-missing:<listId>`,
52
+ * `list-type-missing:<slug>`, `list-source-unavailable:<name> plugin=<slug>`,
53
+ * `list-malformed:<field>[<path>]`, `field-not-declared:<field>.<key>`
54
+ * for a key no entry, enclosing entry or module field has, and
55
+ * `list-context-unavailable:<field>` / `…:page` for a list rendered by a
56
+ * caller that gave the engine no list context (never legitimate output).
43
57
  * Epic #724: `link-target-missing:page/<id>` / `…:media/<id>` for an
44
58
  * internal reference (`caelo:page/<id>`, `caelo:media/<id>`) whose
45
59
  * target does not exist, `link-resolver-unavailable:<kind>/<id>` for
@@ -68,12 +82,46 @@
68
82
  import Mustache from "mustache";
69
83
  import { MODULE_FIELD_SECTION_KINDS } from "./content.js";
70
84
  import { resolveLinkRefsInHtml } from "./link-refs.js";
85
+ import { sourceDefSchema } from "./lists/list-type.js";
71
86
  import { stripCdataGuards } from "./strip-cdata.js";
87
+ import { renderSections } from "./template-sections.js";
72
88
  // Override Mustache's default HTML escape — module HTML substitutes
73
89
  // raw. The engine module is the only workspace importer of mustache,
74
90
  // so the singleton mutation is scoped in effect. Plan §2 risk #1: the
75
91
  // {{href}} test pins this; any leak of the default escape fails.
76
92
  Mustache.escape = (s) => (s === null || s === undefined ? "" : String(s));
93
+ /**
94
+ * Parse a stored `modules.fields` jsonb (array or JSON text) into the
95
+ * fields the engine renders with: name, kind (absent = `text`), default,
96
+ * and a `list` field's binding. A typo'd kind passes through as is — the
97
+ * engine reports it loudly (kind-mismatch) instead of the parser hiding
98
+ * it. Entries without a string name are skipped; they cannot be rendered.
99
+ */
100
+ export function templateFieldsFromJson(raw) {
101
+ const parsed = typeof raw === "string" ? JSON.parse(raw) : raw;
102
+ if (!Array.isArray(parsed))
103
+ return [];
104
+ const out = [];
105
+ for (const f of parsed) {
106
+ if (!f || typeof f !== "object")
107
+ continue;
108
+ const o = f;
109
+ if (typeof o.name !== "string")
110
+ continue;
111
+ out.push({
112
+ name: o.name,
113
+ kind: (typeof o.kind === "string" ? o.kind : "text"),
114
+ ...(o.default !== undefined ? { default: o.default } : {}),
115
+ ...(typeof o.listType === "string" ? { listType: o.listType } : {}),
116
+ ...(o.bind === "local" || o.bind === "shared" || o.bind === "source" ? { bind: o.bind } : {}),
117
+ ...(typeof o.list === "string" ? { list: o.list } : {}),
118
+ // A source that fails its schema stays absent: the resolver then
119
+ // reports `list-malformed:<field>[source]` instead of guessing.
120
+ ...(sourceDefSchema.safeParse(o.source).success ? { source: o.source } : {}),
121
+ });
122
+ }
123
+ return out;
124
+ }
77
125
  // Field names per the v0.4.0 + v0.12.0 grammar: lowercase ASCII +
78
126
  // digits + underscores. Case-insensitive primitive matching (the AI
79
127
  // sometimes camelCases the placeholder when extracting from existing
@@ -81,14 +129,6 @@ Mustache.escape = (s) => (s === null || s === undefined ? "" : String(s));
81
129
  // between `{{` and the sigil (#, >, /) is permitted to match the
82
130
  // Mustache spec — an extractor that pretty-prints AI-authored HTML
83
131
  // shouldn't silently break section / partial dispatch.
84
- // The section body uses a "tempered dot" — `(?:(?!CLOSE)[\s\S])*` — instead
85
- // of a lazy `[\s\S]*?`. The lazy form makes the engine try, then backtrack,
86
- // the close-tag match at every interior position, which is O(n²) on
87
- // unclosed/large input (CodeQL js/polynomial-redos). The tempered form
88
- // consumes one character only when the close tag does not start there, so
89
- // there is a single unambiguous path. The capture stops at the first close
90
- // tag for the captured name, exactly as the lazy form did — same output.
91
- const SECTION_RE = /\{\{\s*#\s*([a-z][a-z0-9_]*)\s*\}\}((?:(?!\{\{\s*\/\s*\1\s*\}\})[\s\S])*)\{\{\s*\/\s*\1\s*\}\}/g;
92
132
  const PARTIAL_RE = /\{\{\s*>\s*([a-z][a-z0-9_]*)\s*\}\}/g;
93
133
  const PRIMITIVE_RE = /\{\{\s*([a-zA-Z][a-zA-Z0-9_]*)\s*\}\}/g;
94
134
  // A plain tag (no Mustache sigil) of any name, and the identifier test
@@ -143,26 +183,22 @@ const NESTED_RENDERER_UNAVAILABLE = "nested-renderer-unavailable";
143
183
  * channel. Pure / sync / no IO.
144
184
  *
145
185
  * @example
146
- * // AC #1 fixture (issue #71). Iterates a link-list field per element.
186
+ * // A local list of the shipped `links` type; `lists` comes from
187
+ * // createListRenderContext(data).forPage(pageId, { linkResolver }).
147
188
  * renderTemplate({
148
- * html: '<nav>{{#nav_items}}<a href="{{href}}">{{label}}</a>{{/nav_items}}</nav>',
149
- * fields: [{ name: 'nav_items', kind: 'link-list' }],
189
+ * html: '<nav>{{#nav}}<a href="{{link}}">{{label}}</a>{{/nav}}</nav>',
190
+ * fields: [{ name: 'nav', kind: 'list', listType: 'links' }],
150
191
  * contentValues: {
151
- * nav_items: [
152
- * { label: 'Docs', href: '/docs' },
153
- * { label: 'Blog', href: '/blog' },
154
- * ],
192
+ * nav: [{ id: '<uuid>', node: 'link', values: { label: 'Docs', link: { href: '/docs' } } }],
155
193
  * },
194
+ * lists,
156
195
  * });
157
- * // → {
158
- * // html: '<nav><a href="/docs">Docs</a><a href="/blog">Blog</a></nav>',
159
- * // missingSlots: [],
160
- * // }
196
+ * // → html: '<nav><a href="/docs" data-caelo-list-item="local/nav/<uuid>">Docs</a></nav>'
161
197
  *
162
198
  * @see {@link TemplateField} for the field shape (name + kind + optional default).
163
199
  * @see {@link ./content.js#MODULE_FIELD_KINDS} for the canonical kind union.
164
200
  * @see {@link ./content.js#MODULE_FIELD_SECTION_KINDS} for the kinds the engine
165
- * iterates via `{{#name}}` (text-list / link-list / module-list).
201
+ * iterates via `{{#name}}` (list / module-list).
166
202
  */
167
203
  export function renderTemplate(input) {
168
204
  const missing = [];
@@ -203,8 +239,19 @@ export function renderTemplate(input) {
203
239
  // Store-time normalization (modules.create/update) cleans new
204
240
  // modules; this covers any already-stored HTML + the deploy render.
205
241
  const sourceHtml = stripCdataGuards(input.html);
206
- // 1. {{#name}}…{{/name}} sections.
207
- let html = sourceHtml.replace(SECTION_RE, (match, name, inner) => renderSection(match, name, inner, fieldByName, cvs, partials, missing, mkSentinel, input.dataLists ?? {}, input.dormantDataLists ?? {}));
242
+ // 1. {{#name}}…{{/name}} and {{^name}}…{{/name}} sections, list
243
+ // entries and dot access (template-sections.ts).
244
+ let html = renderSections(sourceHtml, {
245
+ fields: fieldByName,
246
+ values: cvs,
247
+ partials,
248
+ missing,
249
+ mkSentinel,
250
+ lists: input.lists,
251
+ holder: input.listHolder ?? { contentInstanceId: null },
252
+ moduleLevelKeys: new Set(THEME_ASSET_KEYS),
253
+ renderModuleList: (name, field) => renderModuleList(name, field, cvs, partials, missing, mkSentinel),
254
+ });
208
255
  // 2. {{>name}} single partials.
209
256
  html = html.replace(PARTIAL_RE, (match, name) => renderPartialRef(match, name, fieldByName, cvs, partials, missing, mkSentinel));
210
257
  // 3. {{name}} primitives. Pre-rewrite to canonical lowercase form
@@ -289,152 +336,6 @@ export function renderTemplate(input) {
289
336
  final = resolveLinkRefsInHtml(final, input.linkResolver, missing);
290
337
  return { html: final, missingSlots: missing };
291
338
  }
292
- function renderSection(match, name, inner, fields, cvs, partials, missing, mkSentinel, dataLists, dormantLists) {
293
- const field = fields.get(name);
294
- if (!field) {
295
- // No declared field — a plugin may still offer this name. Module
296
- // fields are looked up FIRST by construction, so a plugin can never
297
- // shadow something the module's author declared.
298
- const items = dataLists[name];
299
- if (items)
300
- return renderDataList(inner, items, mkSentinel);
301
- // Declared by an installed plugin that is NOT running. Naming the
302
- // plugin turns "unknown field" (hunt for a typo) into "switch that
303
- // plugin back on", which is the actual fix.
304
- const owner = dormantLists[name];
305
- if (owner) {
306
- missing.push(`plugin-list-unavailable:${name} plugin=${owner}`);
307
- return mkSentinel(match);
308
- }
309
- missing.push(`field-not-declared:${name}`);
310
- return mkSentinel(match);
311
- }
312
- if (field.kind === "module-list") {
313
- return renderModuleList(name, field, cvs, partials, missing, mkSentinel);
314
- }
315
- if (field.kind === "text-list") {
316
- return renderTextList(name, inner, field, cvs, missing, mkSentinel);
317
- }
318
- if (field.kind === "link-list") {
319
- return renderLinkList(name, inner, field, cvs, missing, mkSentinel);
320
- }
321
- // Any NON-list field used as a `{{#name}}…{{/name}}` section is a
322
- // CONDITIONAL (Mustache semantics): render the inner block once when the
323
- // field has a present, non-empty value; drop it when empty. This is what
324
- // makes `{{#subtitle}}<p>{{subtitle}}</p>{{/subtitle}}` wrap a scalar
325
- // text/image field — previously a scalar in a section fell through to
326
- // `kind-mismatch` and SILENTLY DROPPED real content (headings, body copy,
327
- // an image, a single nested module). `{{name}}` inside the block resolves
328
- // in the later primitive pass (a `module` field's `{{>name}}` in the
329
- // partial pass); `{{.}}`/`{{item}}` are substituted here for parity with
330
- // the *-list renderers. An empty conditional is intentional, not
331
- // "missing" — nothing is pushed to `missing`.
332
- return renderConditionalSection(name, inner, field, cvs, mkSentinel);
333
- }
334
- /**
335
- * Render a `{{#name}}…{{/name}}` section over a scalar/module field as a
336
- * Mustache conditional: the block once when the value is present, else "".
337
- */
338
- function renderConditionalSection(name, inner, field, cvs, mkSentinel) {
339
- const raw = Object.hasOwn(cvs, name) ? cvs[name] : field.default;
340
- if (!isPresentSectionValue(raw))
341
- return "";
342
- const value = scalarSectionString(raw);
343
- return value.length > 0
344
- ? inner.replace(/\{\{\s*(?:\.|item)\s*\}\}/g, () => mkSentinel(value))
345
- : inner;
346
- }
347
- /**
348
- * Mustache-style truthiness for a conditional section value. Empty string,
349
- * null/undefined, `false`, and an empty array/object are absent; everything
350
- * else (incl. a numeric 0 — a real content value, not a control flag) is
351
- * present.
352
- */
353
- function isPresentSectionValue(raw) {
354
- if (raw === undefined || raw === null || raw === false)
355
- return false;
356
- if (typeof raw === "string")
357
- return raw.trim().length > 0;
358
- if (typeof raw === "number")
359
- return !Number.isNaN(raw);
360
- if (Array.isArray(raw))
361
- return raw.length > 0;
362
- if (typeof raw === "object")
363
- return Object.keys(raw).length > 0;
364
- return true;
365
- }
366
- /** String form for `{{.}}`/`{{item}}` inside a scalar conditional. Objects
367
- * (module refs / image objects) render through `{{name}}`/`{{>name}}`, not
368
- * `{{.}}`, so they stringify to "". */
369
- function scalarSectionString(raw) {
370
- if (typeof raw === "string")
371
- return raw;
372
- if (typeof raw === "number" || typeof raw === "boolean")
373
- return String(raw);
374
- return "";
375
- }
376
- function renderTextList(name, inner, field, cvs, missing, mkSentinel) {
377
- const raw = Object.hasOwn(cvs, name) ? cvs[name] : field.default;
378
- if (!Array.isArray(raw))
379
- return "";
380
- const parts = [];
381
- for (let i = 0; i < raw.length; i += 1) {
382
- const el = raw[i];
383
- if (typeof el !== "string" && typeof el !== "number" && typeof el !== "boolean") {
384
- missing.push(`text-list-malformed:${name}[${i}]`);
385
- parts.push(comment(`text-list-malformed ${name}[${i}]`));
386
- continue;
387
- }
388
- const value = String(el);
389
- parts.push(inner.replace(/\{\{\s*(?:\.|item)\s*\}\}/g, () => mkSentinel(value)));
390
- }
391
- return parts.join("");
392
- }
393
- /**
394
- * Iterate a plugin-provided list, substituting each item's keys inside
395
- * the section body.
396
- *
397
- * Unlike `link-list` no shape is imposed: the keys are whatever the
398
- * plugin declared in `itemFields`, so a language switcher uses
399
- * href/label/locale and a comment list something else entirely. A
400
- * `{{key}}` the item does not carry is left raw, matching the engine's
401
- * loud-raw rule everywhere else — a typo'd key stays visible instead of
402
- * quietly rendering as nothing.
403
- */
404
- function renderDataList(inner, items, mkSentinel) {
405
- const parts = [];
406
- for (const item of items) {
407
- let rendered = inner;
408
- for (const [key, value] of Object.entries(item)) {
409
- const escaped = key.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
410
- rendered = rendered.replace(new RegExp(`\\{\\{\\s*${escaped}\\s*\\}\\}`, "g"), () => mkSentinel(value));
411
- }
412
- parts.push(rendered);
413
- }
414
- return parts.join("");
415
- }
416
- function renderLinkList(name, inner, field, cvs, missing, mkSentinel) {
417
- const raw = Object.hasOwn(cvs, name) ? cvs[name] : field.default;
418
- if (!Array.isArray(raw))
419
- return "";
420
- const parts = [];
421
- for (let i = 0; i < raw.length; i += 1) {
422
- const el = raw[i];
423
- if (typeof el !== "object" ||
424
- el === null ||
425
- typeof el.label !== "string" ||
426
- typeof el.href !== "string") {
427
- missing.push(`link-list-malformed:${name}[${i}]`);
428
- parts.push(comment(`link-list-malformed ${name}[${i}]`));
429
- continue;
430
- }
431
- const { label, href } = el;
432
- parts.push(inner
433
- .replace(/\{\{\s*label\s*\}\}/g, () => mkSentinel(label))
434
- .replace(/\{\{\s*href\s*\}\}/g, () => mkSentinel(href)));
435
- }
436
- return parts.join("");
437
- }
438
339
  function renderModuleList(name, field, cvs, partials, missing, mkSentinel) {
439
340
  const raw = Object.hasOwn(cvs, name) ? cvs[name] : field.default;
440
341
  if (!Array.isArray(raw))
@@ -476,7 +377,7 @@ function renderPartialRef(match, name, fields, cvs, partials, missing, mkSentine
476
377
  }
477
378
  const ref = Object.hasOwn(cvs, name) ? cvs[name] : undefined;
478
379
  // An unset or explicitly null single `module` field is an EMPTY slot,
479
- // the same as an empty module-list / text-list: it renders nothing and
380
+ // the same as an empty module-list / list: it renders nothing and
480
381
  // is not a failure (#1041). The static generator refuses a Stage on any
481
382
  // marker, so flagging "empty" here made an optional nested slot
482
383
  // impossible to leave blank. A present value that is not a ref is still
@@ -1 +1 @@
1
- {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"template-engine.js","sourceRoot":"","sources":["../src/template-engine.ts"],"names":[],"mappings":"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"}