@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,69 @@
1
+ /**
2
+ * Section pass of the template engine (`template-engine.ts`): every
3
+ * `{{#name}}…{{/name}}` and `{{^name}}…{{/name}}`, list iteration with
4
+ * entry scopes, `{{>recurse}}`, `{{>f}}` for an entry's embedded module,
5
+ * dot access and `{{page.*}}` (epic #1107, `docs/lists.md` §8).
6
+ *
7
+ * The template is tokenized ONCE and sections are matched with one stack
8
+ * per name, so a children loop may repeat inside itself
9
+ * (`{{#children}}…{{#children}}…{{/children}}…{{/children}}`) and the cost
10
+ * stays linear in the number of tags — no regex backtracks over a section
11
+ * body (CodeQL js/polynomial-redos).
12
+ *
13
+ * Output contract with the later passes: text outside list entries and
14
+ * every tag this pass does not own (a module field's `{{name}}`, a
15
+ * top-level `{{>name}}`, `{{&x}}`, comments) comes out verbatim, so the
16
+ * partial and primitive passes treat it exactly as before. Everything
17
+ * this pass pastes — entry values, rendered nested modules, the original
18
+ * source of a tag that must stay raw — is wrapped in a sentinel (#1053),
19
+ * so content that happens to contain `{{…}}` is never parsed again.
20
+ */
21
+ import type { ListFieldSpec, ListHolder, ListPageContext } from "./lists/resolve.js";
22
+ /** A field as the section pass needs it (subset of `TemplateField`). */
23
+ export interface SectionField extends Partial<Omit<ListFieldSpec, "name" | "default">> {
24
+ readonly name: string;
25
+ readonly kind: string;
26
+ readonly default?: unknown;
27
+ }
28
+ /** Renders the nested-module partial for `key`; `ref` is set for an entry's module field. */
29
+ export type SectionPartialResolver = (key: string, ref?: {
30
+ readonly moduleId: string;
31
+ readonly contentInstanceId: string;
32
+ }) => string | undefined;
33
+ /** What the section pass works with — one per `renderTemplate` call. */
34
+ export interface SectionEnv {
35
+ readonly fields: ReadonlyMap<string, SectionField>;
36
+ readonly values: Readonly<Record<string, unknown>>;
37
+ readonly partials: SectionPartialResolver;
38
+ readonly missing: string[];
39
+ readonly mkSentinel: (original: string) => string;
40
+ readonly lists: ListPageContext | undefined;
41
+ readonly holder: ListHolder;
42
+ /** Theme-asset placeholder names, which are module-level keys too. */
43
+ readonly moduleLevelKeys: ReadonlySet<string>;
44
+ /** Renders a `module-list` field (inner block ignored), shared with the old engine path. */
45
+ readonly renderModuleList: (name: string, field: SectionField) => string;
46
+ }
47
+ /**
48
+ * Run the section pass over `html`. Returns the HTML with every matched
49
+ * section rendered and every tag inside list entries resolved.
50
+ */
51
+ export declare function renderSections(html: string, env: SectionEnv): string;
52
+ /**
53
+ * Mustache-style truthiness for a conditional section value. Empty string,
54
+ * null/undefined, `false`, and an empty array/object are absent; everything
55
+ * else (incl. a numeric 0 — a real content value, not a control flag) is
56
+ * present.
57
+ */
58
+ export declare function isPresentSectionValue(raw: unknown): boolean;
59
+ /** The attribute a rendered list entry's root element carries (`docs/lists.md` §13). */
60
+ export declare const LIST_ITEM_ATTRIBUTE = "data-caelo-list-item";
61
+ /**
62
+ * Stamp `data-caelo-list-item` on a rendered entry's root element: the
63
+ * first opening tag, when the entry's markup STARTS with one (leading
64
+ * whitespace and comments allowed). An entry that starts with text
65
+ * (`{{name}}, `) has no root element and stays unstamped, rather than
66
+ * attributing the entry to some inner `<b>`. Idempotent.
67
+ */
68
+ export declare function stampListItem(html: string, attr: string): string;
69
+ //# sourceMappingURL=template-sections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-sections.d.ts","sourceRoot":"","sources":["../src/template-sections.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAGrF,wEAAwE;AACxE,MAAM,WAAW,YAAa,SAAQ,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACpF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,6FAA6F;AAC7F,MAAM,MAAM,sBAAsB,GAAG,CACnC,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,wEAAwE;AACxE,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACnD,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACnD,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAE,eAAe,GAAG,SAAS,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC;IAC5B,sEAAsE;IACtE,QAAQ,CAAC,eAAe,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC9C,4FAA4F;IAC5F,QAAQ,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,KAAK,MAAM,CAAC;CAC1E;AAoFD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,GAAG,MAAM,CAOpE;AAmTD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAO3D;AASD,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,yBAAyB,CAAC;AAE1D;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BhE"}
@@ -0,0 +1,436 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ // `\s*` around the sigil is split by the mandatory sigil character, and
3
+ // the name ends on a word character, so no two quantifiers compete for
4
+ // the same input (linear matching).
5
+ const TAG_RE = /\{\{\s*([#^/>]\s*)?([a-zA-Z][a-zA-Z0-9_]*(?:\.[a-zA-Z0-9_]+)*)\s*\}\}/g;
6
+ const SECTION_NAME_RE = /^[a-z][a-z0-9_]*(?:\.[a-z0-9_]+)*$/;
7
+ const DOT_RE = /\{\{\s*\.\s*\}\}/g;
8
+ /** Dotted heads the list context answers, not an entry: `{{page.*}}`, `{{site_text.*}}`. */
9
+ const CONTEXT_HEADS = new Set(["page", "site_text"]);
10
+ function contextHead(name) {
11
+ return (name.split(".")[0] ?? "").toLowerCase();
12
+ }
13
+ function isContextHead(name) {
14
+ return CONTEXT_HEADS.has(contextHead(name));
15
+ }
16
+ function tokenize(html) {
17
+ const out = [];
18
+ TAG_RE.lastIndex = 0;
19
+ for (let m = TAG_RE.exec(html); m !== null; m = TAG_RE.exec(html)) {
20
+ out.push({
21
+ start: m.index,
22
+ end: m.index + m[0].length,
23
+ sigil: (m[1] ?? "").trim(),
24
+ name: m[2],
25
+ });
26
+ }
27
+ return out;
28
+ }
29
+ /**
30
+ * Pair every section open with its close: one stack per name, so a name
31
+ * nests inside itself and an unclosed open simply stays unpaired (the
32
+ * later Mustache pass reports it, as before).
33
+ */
34
+ function matchSections(tokens) {
35
+ const pairs = new Map();
36
+ const stacks = new Map();
37
+ tokens.forEach((t, i) => {
38
+ if (!SECTION_NAME_RE.test(t.name))
39
+ return;
40
+ if (t.sigil === "#" || t.sigil === "^") {
41
+ const s = stacks.get(t.name) ?? [];
42
+ s.push(i);
43
+ stacks.set(t.name, s);
44
+ }
45
+ else if (t.sigil === "/") {
46
+ const open = stacks.get(t.name)?.pop();
47
+ if (open !== undefined)
48
+ pairs.set(open, i);
49
+ }
50
+ });
51
+ return pairs;
52
+ }
53
+ /**
54
+ * Run the section pass over `html`. Returns the HTML with every matched
55
+ * section rendered and every tag inside list entries resolved.
56
+ */
57
+ export function renderSections(html, env) {
58
+ const tokens = tokenize(html);
59
+ if (tokens.length === 0)
60
+ return html;
61
+ const pairs = matchSections(tokens);
62
+ if (pairs.size === 0 && !tokens.some((t) => t.name.includes(".")))
63
+ return html;
64
+ const r = new SectionRenderer(html, tokens, pairs, env);
65
+ return r.range(0, tokens.length, 0, html.length, { chain: [], dot: null });
66
+ }
67
+ class SectionRenderer {
68
+ html;
69
+ tokens;
70
+ pairs;
71
+ env;
72
+ constructor(html, tokens, pairs, env) {
73
+ this.html = html;
74
+ this.tokens = tokens;
75
+ this.pairs = pairs;
76
+ this.env = env;
77
+ }
78
+ /** Render tokens [from, to) covering text [textFrom, textTo). */
79
+ range(from, to, textFrom, textTo, st) {
80
+ let out = "";
81
+ let cursor = textFrom;
82
+ let i = from;
83
+ while (i < to) {
84
+ const t = this.tokens[i];
85
+ out += this.text(cursor, t.start, st);
86
+ const close = this.pairs.get(i);
87
+ if ((t.sigil === "#" || t.sigil === "^") && close !== undefined && close < to) {
88
+ const c = this.tokens[close];
89
+ const block = { from: i + 1, to: close, textFrom: t.end, textTo: c.start };
90
+ out += this.section(t, block, this.html.slice(t.start, c.end), st);
91
+ cursor = c.end;
92
+ i = close + 1;
93
+ continue;
94
+ }
95
+ out += this.tag(t, st);
96
+ cursor = t.end;
97
+ i += 1;
98
+ }
99
+ return out + this.text(cursor, textTo, st);
100
+ }
101
+ text(from, to, st) {
102
+ const s = this.html.slice(from, to);
103
+ if (st.dot === null || s.length === 0)
104
+ return s;
105
+ const dot = st.dot;
106
+ return s.replace(DOT_RE, () => this.env.mkSentinel(dot));
107
+ }
108
+ raw(source, marker) {
109
+ if (marker !== null)
110
+ this.env.missing.push(marker);
111
+ return this.env.mkSentinel(source);
112
+ }
113
+ /** The module field a list entry's markers name: the outermost iterated field. */
114
+ listField(st) {
115
+ return st.chain[0]?.name ?? "";
116
+ }
117
+ // ── Lookups ──
118
+ /**
119
+ * Look `name` (possibly dotted) up in the entry chain, innermost
120
+ * first, then `page`. `undefined` = not an entry key (a module-level
121
+ * name, or unknown); `{ missing }` = the head exists but a dotted part
122
+ * does not.
123
+ */
124
+ lookup(name, st) {
125
+ const parts = name.split(".");
126
+ const head = parts[0].toLowerCase();
127
+ let v;
128
+ if (head === "page") {
129
+ v = this.env.lists?.pageScope() ?? undefined;
130
+ if (v === undefined)
131
+ return parts.length > 1 || st.chain.length > 0 ? { missing: true } : undefined;
132
+ }
133
+ else if (head === "site_text") {
134
+ v = this.env.lists?.siteTextScope();
135
+ if (v === undefined)
136
+ return { missing: true };
137
+ }
138
+ else {
139
+ for (let k = st.chain.length - 1; k >= 0 && v === undefined; k -= 1) {
140
+ v = st.chain[k]?.entry.get(head);
141
+ }
142
+ if (v === undefined)
143
+ return undefined;
144
+ }
145
+ for (const p of parts.slice(1)) {
146
+ if (v.kind !== "record")
147
+ return { missing: true };
148
+ const next = v.get(p.toLowerCase());
149
+ if (next === undefined)
150
+ return { missing: true };
151
+ v = next;
152
+ }
153
+ return v;
154
+ }
155
+ isModuleLevel(name) {
156
+ const lower = name.toLowerCase();
157
+ return (this.env.fields.has(name) || this.env.fields.has(lower) || this.env.moduleLevelKeys.has(lower));
158
+ }
159
+ notDeclared(name, st) {
160
+ const field = this.listField(st);
161
+ return field.length > 0 ? `field-not-declared:${field}.${name}` : `field-not-declared:${name}`;
162
+ }
163
+ // ── Plain tags ──
164
+ tag(t, st) {
165
+ const source = this.html.slice(t.start, t.end);
166
+ if (t.sigil === ">")
167
+ return this.partial(t, source, st);
168
+ if (t.sigil !== "")
169
+ return source;
170
+ if (st.dot !== null && t.name === "item" && st.chain.length === 0) {
171
+ return this.env.mkSentinel(st.dot);
172
+ }
173
+ const dotted = t.name.includes(".");
174
+ if (st.chain.length === 0 && !dotted)
175
+ return source;
176
+ const v = this.lookup(t.name, st);
177
+ if (v === undefined) {
178
+ if (dotted) {
179
+ const head = t.name.slice(0, t.name.indexOf("."));
180
+ if (st.chain.length === 0 && !this.isModuleLevel(head))
181
+ return source;
182
+ return this.raw(source, this.notDeclared(t.name, st));
183
+ }
184
+ if (this.isModuleLevel(t.name))
185
+ return source;
186
+ return this.raw(source, this.notDeclared(t.name, st));
187
+ }
188
+ if ("missing" in v) {
189
+ const marker = isContextHead(t.name) && this.env.lists === undefined
190
+ ? `list-context-unavailable:${contextHead(t.name)}`
191
+ : this.notDeclared(t.name, st);
192
+ return this.raw(source, marker);
193
+ }
194
+ return this.valueText(v, source, t.name, st);
195
+ }
196
+ valueText(v, source, name, st) {
197
+ switch (v.kind) {
198
+ case "text":
199
+ return v.text.length === 0 ? "" : this.env.mkSentinel(v.text);
200
+ case "bool":
201
+ return String(v.value);
202
+ case "record":
203
+ if (v.text === null)
204
+ return this.raw(source, this.notDeclared(name, st));
205
+ return v.text.length === 0 ? "" : this.env.mkSentinel(v.text);
206
+ case "failed":
207
+ return this.raw(source, v.marker);
208
+ default:
209
+ return this.raw(source, this.notDeclared(name, st));
210
+ }
211
+ }
212
+ // ── Partials ──
213
+ partial(t, source, st) {
214
+ if (st.chain.length === 0)
215
+ return source;
216
+ if (t.name === "recurse")
217
+ return this.recurse(st);
218
+ const v = this.lookup(t.name, st);
219
+ if (v === undefined) {
220
+ return this.isModuleLevel(t.name) ? source : this.raw(source, this.notDeclared(t.name, st));
221
+ }
222
+ if ("missing" in v)
223
+ return this.raw(source, this.notDeclared(t.name, st));
224
+ if (v.kind === "module") {
225
+ const frame = st.chain[st.chain.length - 1];
226
+ const field = this.listField(st);
227
+ const key = `list:${field}/${frame.entry.id}/${t.name}`;
228
+ const html = this.env.partials(key, v.ref);
229
+ if (html === undefined) {
230
+ this.env.missing.push(`nested-renderer-unavailable:${field}[${frame.entry.id}].${t.name}`);
231
+ return `<!-- caelo:module ${field}[${frame.entry.id}].${t.name} needs recursive renderer (compose path) -->`;
232
+ }
233
+ return this.env.mkSentinel(html);
234
+ }
235
+ if (v.kind === "text" && v.text.length === 0)
236
+ return "";
237
+ if (v.kind === "failed")
238
+ return this.raw(source, v.marker);
239
+ const reason = `kind-mismatch:${this.listField(st)}.${t.name} expected=module actual=${v.kind}`;
240
+ this.env.missing.push(reason);
241
+ return `<!-- caelo:missing reason=${reason} -->`;
242
+ }
243
+ /** `{{>recurse}}`: the current entry's children with the enclosing section's block. */
244
+ recurse(st) {
245
+ const frame = st.chain[st.chain.length - 1];
246
+ const key = frame.entry.childrenKey;
247
+ if (key === null)
248
+ return "";
249
+ const kids = frame.entry.get(key);
250
+ if (kids?.kind !== "list")
251
+ return "";
252
+ return this.iterate(kids.entries, frame.name, frame.block, st);
253
+ }
254
+ // ── Sections ──
255
+ section(t, block, source, st) {
256
+ const inverted = t.sigil === "^";
257
+ const v = this.lookup(t.name, st);
258
+ if (v !== undefined) {
259
+ if ("missing" in v) {
260
+ const marker = isContextHead(t.name) && this.env.lists === undefined
261
+ ? `list-context-unavailable:${contextHead(t.name)}`
262
+ : this.notDeclared(t.name, st);
263
+ return this.raw(source, marker);
264
+ }
265
+ return this.scopeSection(v, t.name, inverted, block, source, st);
266
+ }
267
+ if (t.name.includes("."))
268
+ return this.raw(source, this.notDeclared(t.name, st));
269
+ return this.moduleSection(t.name, inverted, block, source, st);
270
+ }
271
+ /** A section over a value found in the entry chain or `page`. */
272
+ scopeSection(v, name, inverted, block, source, st) {
273
+ if (v.kind === "failed")
274
+ return this.raw(source, v.marker);
275
+ if (v.kind === "list") {
276
+ if (inverted)
277
+ return v.entries.length === 0 ? this.body(block, st, null) : "";
278
+ return this.iterate(v.entries, name, block, st);
279
+ }
280
+ const present = v.kind === "bool"
281
+ ? v.value
282
+ : v.kind === "text"
283
+ ? v.text.trim().length > 0
284
+ : v.kind === "record"
285
+ ? v.present
286
+ : true;
287
+ return present !== inverted ? this.body(block, st, st.dot) : "";
288
+ }
289
+ /** A section over a module field (or an undeclared plugin source name). */
290
+ moduleSection(name, inverted, block, source, st) {
291
+ const env = this.env;
292
+ const field = env.fields.get(name);
293
+ if (!field) {
294
+ // No declared field — a plugin may still offer this name as a list
295
+ // source. Module fields are looked up FIRST, so a plugin can never
296
+ // shadow something the module's author declared.
297
+ const plugin = env.lists?.pluginSource(name) ?? null;
298
+ if (plugin !== null) {
299
+ if (!plugin.ok)
300
+ return this.raw(source, plugin.marker);
301
+ if (inverted)
302
+ return plugin.entries.length === 0 ? this.body(block, st, null) : "";
303
+ return this.iterate(plugin.entries, name, block, st);
304
+ }
305
+ return this.raw(source, this.notDeclared(name, st));
306
+ }
307
+ const raw = Object.hasOwn(env.values, name) ? env.values[name] : field.default;
308
+ if (field.kind === "module-list") {
309
+ if (inverted)
310
+ return Array.isArray(raw) && raw.length > 0 ? "" : this.body(block, st, null);
311
+ return env.renderModuleList(name, field);
312
+ }
313
+ if (field.kind === "list") {
314
+ if (!env.lists)
315
+ return this.raw(source, `list-context-unavailable:${name}`);
316
+ const spec = {
317
+ name: field.name,
318
+ listType: field.listType ?? "",
319
+ ...(field.bind !== undefined ? { bind: field.bind } : {}),
320
+ ...(field.list !== undefined ? { list: field.list } : {}),
321
+ ...(field.source !== undefined ? { source: field.source } : {}),
322
+ ...(field.default !== undefined ? { default: field.default } : {}),
323
+ };
324
+ const value = Object.hasOwn(env.values, name) ? env.values[name] : undefined;
325
+ const res = env.lists.resolveField(spec, value, env.holder);
326
+ if (!res.ok)
327
+ return this.raw(source, res.marker);
328
+ if (inverted)
329
+ return res.entries.length === 0 ? this.body(block, st, null) : "";
330
+ return this.iterate(res.entries, name, block, st);
331
+ }
332
+ // Any other field used as a section is a CONDITIONAL (Mustache
333
+ // semantics): the block once when the field has a present, non-empty
334
+ // value, dropped when empty — never a kind-mismatch, which used to
335
+ // silently drop real scalar content. `{{.}}` / `{{item}}` inside it
336
+ // read the scalar. An empty conditional is intentional, not missing.
337
+ const present = isPresentSectionValue(raw);
338
+ if (present === inverted)
339
+ return "";
340
+ const dot = present ? scalarSectionString(raw) : "";
341
+ return this.body(block, st, dot.length > 0 ? dot : st.dot);
342
+ }
343
+ body(block, st, dot) {
344
+ return this.range(block.from, block.to, block.textFrom, block.textTo, { chain: st.chain, dot });
345
+ }
346
+ iterate(entries, name, block, st) {
347
+ // The empty-restoring sentinel in front claims the iteration's first
348
+ // element for its own entries: an enclosing entry whose block starts
349
+ // with this iteration (`{{#items}}<p>…`) must not stamp a GENERATED
350
+ // entry's element as its own root.
351
+ let out = entries.length > 0 ? this.env.mkSentinel("") : "";
352
+ for (const entry of entries) {
353
+ const chain = [...st.chain, { entry, block, name }];
354
+ const rendered = this.range(block.from, block.to, block.textFrom, block.textTo, {
355
+ chain,
356
+ dot: null,
357
+ });
358
+ out += entry.itemAttr === null ? rendered : stampListItem(rendered, entry.itemAttr);
359
+ }
360
+ return out;
361
+ }
362
+ }
363
+ /**
364
+ * Mustache-style truthiness for a conditional section value. Empty string,
365
+ * null/undefined, `false`, and an empty array/object are absent; everything
366
+ * else (incl. a numeric 0 — a real content value, not a control flag) is
367
+ * present.
368
+ */
369
+ export function isPresentSectionValue(raw) {
370
+ if (raw === undefined || raw === null || raw === false)
371
+ return false;
372
+ if (typeof raw === "string")
373
+ return raw.trim().length > 0;
374
+ if (typeof raw === "number")
375
+ return !Number.isNaN(raw);
376
+ if (Array.isArray(raw))
377
+ return raw.length > 0;
378
+ if (typeof raw === "object")
379
+ return Object.keys(raw).length > 0;
380
+ return true;
381
+ }
382
+ /** String form for `{{.}}`/`{{item}}` inside a scalar conditional; objects stringify to "". */
383
+ function scalarSectionString(raw) {
384
+ if (typeof raw === "string")
385
+ return raw;
386
+ if (typeof raw === "number" || typeof raw === "boolean")
387
+ return String(raw);
388
+ return "";
389
+ }
390
+ /** The attribute a rendered list entry's root element carries (`docs/lists.md` §13). */
391
+ export const LIST_ITEM_ATTRIBUTE = "data-caelo-list-item";
392
+ /**
393
+ * Stamp `data-caelo-list-item` on a rendered entry's root element: the
394
+ * first opening tag, when the entry's markup STARTS with one (leading
395
+ * whitespace and comments allowed). An entry that starts with text
396
+ * (`{{name}}, `) has no root element and stays unstamped, rather than
397
+ * attributing the entry to some inner `<b>`. Idempotent.
398
+ */
399
+ export function stampListItem(html, attr) {
400
+ let i = 0;
401
+ for (;;) {
402
+ while (i < html.length && /\s/.test(html[i]))
403
+ i += 1;
404
+ if (html.startsWith("<!--", i)) {
405
+ const end = html.indexOf("-->", i + 4);
406
+ if (end < 0)
407
+ return html;
408
+ i = end + 3;
409
+ continue;
410
+ }
411
+ break;
412
+ }
413
+ if (html[i] !== "<" || !/[a-zA-Z]/.test(html[i + 1] ?? ""))
414
+ return html;
415
+ let quote = null;
416
+ let j = i + 1;
417
+ for (; j < html.length; j += 1) {
418
+ const c = html[j];
419
+ if (quote) {
420
+ if (c === quote)
421
+ quote = null;
422
+ }
423
+ else if (c === '"' || c === "'")
424
+ quote = c;
425
+ else if (c === ">")
426
+ break;
427
+ }
428
+ if (j >= html.length)
429
+ return html;
430
+ const tag = html.slice(i, j);
431
+ if (tag.includes(`${LIST_ITEM_ATTRIBUTE}=`))
432
+ return html;
433
+ const insertAt = tag.endsWith("/") ? j - 1 : j;
434
+ return `${html.slice(0, insertAt)} ${LIST_ITEM_ATTRIBUTE}="${attr.replace(/"/g, "&quot;")}"${html.slice(insertAt)}`;
435
+ }
436
+ //# sourceMappingURL=template-sections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template-sections.js","sourceRoot":"","sources":["../src/template-sections.ts"],"names":[],"mappings":"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"}
package/dist/version.d.ts CHANGED
@@ -19,7 +19,7 @@
19
19
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
20
20
  * follow standard SemVer.
21
21
  */
22
- export declare const CAELO_VERSION = "0.10.72";
22
+ export declare const CAELO_VERSION = "0.11.1";
23
23
  /**
24
24
  * Deprecated alias for back-compat — early P17 work spelled this
25
25
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
@@ -31,7 +31,7 @@ export declare const CAELO_VERSION = "0.10.72";
31
31
  *
32
32
  * @deprecated use CAELO_VERSION
33
33
  */
34
- export declare const CALEO_VERSION = "0.10.72";
34
+ export declare const CALEO_VERSION = "0.11.1";
35
35
  /**
36
36
  * Parsed shape — major/minor/patch + optional pre-release tag.
37
37
  * Stable interface for callers that need to feature-gate (rare —
@@ -1 +1 @@
1
- {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,aAAa,YAAY,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,YAAgB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,YAAY,CAYtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBvE"}
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,aAAa,WAAW,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,eAAO,MAAM,aAAa,WAAgB,CAAC;AAE3C;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,GAAG,GAAE,MAAsB,GAAG,YAAY,CAYtE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAkBvE"}
package/dist/version.js CHANGED
@@ -20,7 +20,7 @@
20
20
  * Format: SemVer 2.0.0. Pre-1.0 minor bumps are breaking; post-1.0
21
21
  * follow standard SemVer.
22
22
  */
23
- export const CAELO_VERSION = "0.10.72";
23
+ export const CAELO_VERSION = "0.11.1";
24
24
  /**
25
25
  * Deprecated alias for back-compat — early P17 work spelled this
26
26
  * `CALEO_VERSION` (typo of "Caelo"). New code should import
@@ -1 +1 @@
1
- {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAEvC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAgB3C,MAAM,UAAU,YAAY,CAAC,MAAc,aAAa;IACtD,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QACxB,GAAG;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAuB,EAAE;QAC/C,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QACrD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,CAAC,MAAM,aAAa,GAAG,QAAQ,CAAC;AAEtC;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAAC;AAgB3C,MAAM,UAAU,YAAY,CAAC,MAAc,aAAa;IACtD,MAAM,CAAC,GAAG,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtD,IAAI,CAAC,CAAC,EAAE,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,0BAA0B,GAAG,EAAE,CAAC,CAAC;IACnD,CAAC;IACD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC;QACvC,UAAU,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI;QACxB,GAAG;KACJ,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc,EAAE,OAAe;IAC5D,MAAM,KAAK,GAAG,CAAC,CAAS,EAAuB,EAAE;QAC/C,IAAI,CAAC;YACH,OAAO,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IACF,MAAM,CAAC,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC;IACxB,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3B,KAAK,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAU,EAAE,CAAC;QACrD,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IACD,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,UAAU;QAAE,OAAO,KAAK,CAAC;IAChD,IAAI,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,IAAI,CAAC;IAC/C,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC,UAAU,CAAC;IACrE,OAAO,KAAK,CAAC;AACf,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@caelo-cms/shared",
3
- "version": "0.10.72",
3
+ "version": "0.11.1",
4
4
  "private": false,
5
5
  "license": "MPL-2.0",
6
6
  "description": "Shared Zod schemas + types + the two-pass HTML composer used by every Caelo CMS workspace package. Stable enough for plugin authors and embedders to depend on directly.",
@@ -21,6 +21,13 @@
21
21
  "development": "./src/index.ts",
22
22
  "import": "./dist/index.js",
23
23
  "default": "./dist/index.js"
24
+ },
25
+ "./lists-model": {
26
+ "types": "./dist/lists/model.d.ts",
27
+ "bun": "./src/lists/model.ts",
28
+ "development": "./src/lists/model.ts",
29
+ "import": "./dist/lists/model.js",
30
+ "default": "./dist/lists/model.js"
24
31
  }
25
32
  },
26
33
  "files": [