@caelo-cms/shared 0.10.71 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai-tools.d.ts +125 -50
- package/dist/ai-tools.d.ts.map +1 -1
- package/dist/ai-tools.js +50 -38
- package/dist/ai-tools.js.map +1 -1
- package/dist/build-page.d.ts +110 -30
- package/dist/build-page.d.ts.map +1 -1
- package/dist/build-page.js +26 -7
- package/dist/build-page.js.map +1 -1
- package/dist/content.d.ts +203 -102
- package/dist/content.d.ts.map +1 -1
- package/dist/content.js +178 -76
- package/dist/content.js.map +1 -1
- package/dist/css-var-aliases.d.ts +20 -0
- package/dist/css-var-aliases.d.ts.map +1 -0
- package/dist/css-var-aliases.js +95 -0
- package/dist/css-var-aliases.js.map +1 -0
- package/dist/css-var-scan.d.ts +0 -16
- package/dist/css-var-scan.d.ts.map +1 -1
- package/dist/css-var-scan.js +24 -0
- package/dist/css-var-scan.js.map +1 -1
- package/dist/edit-markers.d.ts +41 -5
- package/dist/edit-markers.d.ts.map +1 -1
- package/dist/edit-markers.js +47 -50
- package/dist/edit-markers.js.map +1 -1
- package/dist/id-safe-truncate.d.ts +15 -0
- package/dist/id-safe-truncate.d.ts.map +1 -0
- package/dist/id-safe-truncate.js +47 -0
- package/dist/id-safe-truncate.js.map +1 -0
- package/dist/index.d.ts +5 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/interactions.js +2 -2
- package/dist/interactions.js.map +1 -1
- package/dist/link-canonicalise.d.ts.map +1 -1
- package/dist/link-canonicalise.js +7 -1
- package/dist/link-canonicalise.js.map +1 -1
- package/dist/link-refs.d.ts +1 -1
- package/dist/link-refs.js +3 -3
- package/dist/lists/address.d.ts +34 -0
- package/dist/lists/address.d.ts.map +1 -0
- package/dist/lists/address.js +43 -0
- package/dist/lists/address.js.map +1 -0
- package/dist/lists/default-types.d.ts +10 -0
- package/dist/lists/default-types.d.ts.map +1 -0
- package/dist/lists/default-types.js +91 -0
- package/dist/lists/default-types.js.map +1 -0
- package/dist/lists/fields.d.ts +152 -0
- package/dist/lists/fields.d.ts.map +1 -0
- package/dist/lists/fields.js +258 -0
- package/dist/lists/fields.js.map +1 -0
- package/dist/lists/index.d.ts +14 -0
- package/dist/lists/index.d.ts.map +1 -0
- package/dist/lists/index.js +15 -0
- package/dist/lists/index.js.map +1 -0
- package/dist/lists/item-attr.d.ts +26 -0
- package/dist/lists/item-attr.d.ts.map +1 -0
- package/dist/lists/item-attr.js +31 -0
- package/dist/lists/item-attr.js.map +1 -0
- package/dist/lists/items.d.ts +105 -0
- package/dist/lists/items.d.ts.map +1 -0
- package/dist/lists/items.js +304 -0
- package/dist/lists/items.js.map +1 -0
- package/dist/lists/list-type.d.ts +401 -0
- package/dist/lists/list-type.d.ts.map +1 -0
- package/dist/lists/list-type.js +275 -0
- package/dist/lists/list-type.js.map +1 -0
- package/dist/lists/model.d.ts +14 -0
- package/dist/lists/model.d.ts.map +1 -0
- package/dist/lists/model.js +15 -0
- package/dist/lists/model.js.map +1 -0
- package/dist/lists/page-type.d.ts +115 -0
- package/dist/lists/page-type.d.ts.map +1 -0
- package/dist/lists/page-type.js +66 -0
- package/dist/lists/page-type.js.map +1 -0
- package/dist/lists/refs.d.ts +13 -0
- package/dist/lists/refs.d.ts.map +1 -0
- package/dist/lists/refs.js +18 -0
- package/dist/lists/refs.js.map +1 -0
- package/dist/lists/render-data.d.ts +114 -0
- package/dist/lists/render-data.d.ts.map +1 -0
- package/dist/lists/render-data.js +3 -0
- package/dist/lists/render-data.js.map +1 -0
- package/dist/lists/render-deps.d.ts +68 -0
- package/dist/lists/render-deps.d.ts.map +1 -0
- package/dist/lists/render-deps.js +91 -0
- package/dist/lists/render-deps.js.map +1 -0
- package/dist/lists/resolve-values.d.ts +63 -0
- package/dist/lists/resolve-values.d.ts.map +1 -0
- package/dist/lists/resolve-values.js +181 -0
- package/dist/lists/resolve-values.js.map +1 -0
- package/dist/lists/resolve.d.ts +106 -0
- package/dist/lists/resolve.d.ts.map +1 -0
- package/dist/lists/resolve.js +878 -0
- package/dist/lists/resolve.js.map +1 -0
- package/dist/lists/scope.d.ts +81 -0
- package/dist/lists/scope.d.ts.map +1 -0
- package/dist/lists/scope.js +3 -0
- package/dist/lists/scope.js.map +1 -0
- package/dist/markup-structure.d.ts +8 -0
- package/dist/markup-structure.d.ts.map +1 -1
- package/dist/markup-structure.js +2 -0
- package/dist/markup-structure.js.map +1 -1
- package/dist/media.d.ts +1 -1
- package/dist/nested-module-render.d.ts +25 -20
- package/dist/nested-module-render.d.ts.map +1 -1
- package/dist/nested-module-render.js +122 -31
- package/dist/nested-module-render.js.map +1 -1
- package/dist/page-log.d.ts +1 -1
- package/dist/preview-compose.d.ts +24 -21
- package/dist/preview-compose.d.ts.map +1 -1
- package/dist/preview-compose.js +34 -118
- package/dist/preview-compose.js.map +1 -1
- package/dist/preview-scanner.d.ts +5 -2
- package/dist/preview-scanner.d.ts.map +1 -1
- package/dist/preview-scanner.js +5 -3
- package/dist/preview-scanner.js.map +1 -1
- package/dist/source-text-transport.d.ts +17 -0
- package/dist/source-text-transport.d.ts.map +1 -0
- package/dist/source-text-transport.js +71 -0
- package/dist/source-text-transport.js.map +1 -0
- package/dist/template-engine.d.ts +44 -31
- package/dist/template-engine.d.ts.map +1 -1
- package/dist/template-engine.js +75 -174
- package/dist/template-engine.js.map +1 -1
- package/dist/template-sections.d.ts +69 -0
- package/dist/template-sections.d.ts.map +1 -0
- package/dist/template-sections.js +423 -0
- package/dist/template-sections.js.map +1 -0
- package/dist/uuid-diagnose.d.ts +9 -0
- package/dist/uuid-diagnose.d.ts.map +1 -0
- package/dist/uuid-diagnose.js +47 -0
- package/dist/uuid-diagnose.js.map +1 -0
- package/dist/version.d.ts +2 -2
- package/dist/version.d.ts.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +8 -1
- package/src/__tests__/redos-hardening.test.ts +50 -16
- package/src/ai-tools-add-module-modes.test.ts +50 -0
- package/src/ai-tools.test.ts +10 -0
- package/src/ai-tools.ts +53 -39
- package/src/build-page.test.ts +34 -3
- package/src/build-page.ts +29 -6
- package/src/content.test.ts +111 -3
- package/src/content.ts +188 -77
- package/src/css-var-aliases.test.ts +61 -0
- package/src/css-var-aliases.ts +109 -0
- package/src/css-var-scan.ts +9 -0
- package/src/edit-markers.test.ts +37 -21
- package/src/edit-markers.ts +52 -20
- package/src/id-safe-truncate.test.ts +35 -0
- package/src/id-safe-truncate.ts +46 -0
- package/src/index.ts +5 -1
- package/src/interactions.ts +2 -2
- package/src/link-canonicalise.test.ts +36 -6
- package/src/link-canonicalise.ts +6 -1
- package/src/link-refs.test.ts +66 -42
- package/src/link-refs.ts +3 -3
- package/src/lists/address.ts +75 -0
- package/src/lists/default-types.ts +102 -0
- package/src/lists/fields.ts +285 -0
- package/src/lists/index.ts +16 -0
- package/src/lists/item-attr.test.ts +36 -0
- package/src/lists/item-attr.ts +49 -0
- package/src/lists/items.ts +402 -0
- package/src/lists/list-fixtures.test.ts +302 -0
- package/src/lists/list-type.ts +306 -0
- package/src/lists/lists.test.ts +328 -0
- package/src/lists/model.ts +16 -0
- package/src/lists/page-type.ts +71 -0
- package/src/lists/refs.ts +21 -0
- package/src/lists/render-data.ts +125 -0
- package/src/lists/render-deps.test.ts +132 -0
- package/src/lists/render-deps.ts +144 -0
- package/src/lists/resolve-values.ts +224 -0
- package/src/lists/resolve.test.ts +295 -0
- package/src/lists/resolve.ts +1148 -0
- package/src/lists/scope.ts +69 -0
- package/src/lists-compose-parity.test.ts +262 -0
- package/src/markup-structure.ts +10 -0
- package/src/nested-module-render.test.ts +111 -77
- package/src/nested-module-render.ts +85 -48
- package/src/preview-compose.test.ts +74 -19
- package/src/preview-compose.ts +59 -154
- package/src/preview-scanner.test.ts +8 -4
- package/src/preview-scanner.ts +5 -3
- package/src/source-text-transport.test.ts +63 -0
- package/src/source-text-transport.ts +70 -0
- package/src/template-engine-lists.test.ts +553 -0
- package/src/template-engine.test.ts +62 -80
- package/src/template-engine.ts +102 -245
- package/src/template-sections.ts +500 -0
- package/src/uuid-diagnose.test.ts +28 -0
- package/src/uuid-diagnose.ts +50 -0
- package/src/version.ts +1 -1
- package/dist/structured-sets.d.ts +0 -70
- package/dist/structured-sets.d.ts.map +0 -1
- package/dist/structured-sets.js +0 -92
- package/dist/structured-sets.js.map +0 -1
- package/src/structured-sets.ts +0 -114
- package/src/template-engine-data-lists.test.ts +0 -90
|
@@ -0,0 +1,423 @@
|
|
|
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
|
+
function tokenize(html) {
|
|
9
|
+
const out = [];
|
|
10
|
+
TAG_RE.lastIndex = 0;
|
|
11
|
+
for (let m = TAG_RE.exec(html); m !== null; m = TAG_RE.exec(html)) {
|
|
12
|
+
out.push({
|
|
13
|
+
start: m.index,
|
|
14
|
+
end: m.index + m[0].length,
|
|
15
|
+
sigil: (m[1] ?? "").trim(),
|
|
16
|
+
name: m[2],
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
return out;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Pair every section open with its close: one stack per name, so a name
|
|
23
|
+
* nests inside itself and an unclosed open simply stays unpaired (the
|
|
24
|
+
* later Mustache pass reports it, as before).
|
|
25
|
+
*/
|
|
26
|
+
function matchSections(tokens) {
|
|
27
|
+
const pairs = new Map();
|
|
28
|
+
const stacks = new Map();
|
|
29
|
+
tokens.forEach((t, i) => {
|
|
30
|
+
if (!SECTION_NAME_RE.test(t.name))
|
|
31
|
+
return;
|
|
32
|
+
if (t.sigil === "#" || t.sigil === "^") {
|
|
33
|
+
const s = stacks.get(t.name) ?? [];
|
|
34
|
+
s.push(i);
|
|
35
|
+
stacks.set(t.name, s);
|
|
36
|
+
}
|
|
37
|
+
else if (t.sigil === "/") {
|
|
38
|
+
const open = stacks.get(t.name)?.pop();
|
|
39
|
+
if (open !== undefined)
|
|
40
|
+
pairs.set(open, i);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
return pairs;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Run the section pass over `html`. Returns the HTML with every matched
|
|
47
|
+
* section rendered and every tag inside list entries resolved.
|
|
48
|
+
*/
|
|
49
|
+
export function renderSections(html, env) {
|
|
50
|
+
const tokens = tokenize(html);
|
|
51
|
+
if (tokens.length === 0)
|
|
52
|
+
return html;
|
|
53
|
+
const pairs = matchSections(tokens);
|
|
54
|
+
if (pairs.size === 0 && !tokens.some((t) => t.name.includes(".")))
|
|
55
|
+
return html;
|
|
56
|
+
const r = new SectionRenderer(html, tokens, pairs, env);
|
|
57
|
+
return r.range(0, tokens.length, 0, html.length, { chain: [], dot: null });
|
|
58
|
+
}
|
|
59
|
+
class SectionRenderer {
|
|
60
|
+
html;
|
|
61
|
+
tokens;
|
|
62
|
+
pairs;
|
|
63
|
+
env;
|
|
64
|
+
constructor(html, tokens, pairs, env) {
|
|
65
|
+
this.html = html;
|
|
66
|
+
this.tokens = tokens;
|
|
67
|
+
this.pairs = pairs;
|
|
68
|
+
this.env = env;
|
|
69
|
+
}
|
|
70
|
+
/** Render tokens [from, to) covering text [textFrom, textTo). */
|
|
71
|
+
range(from, to, textFrom, textTo, st) {
|
|
72
|
+
let out = "";
|
|
73
|
+
let cursor = textFrom;
|
|
74
|
+
let i = from;
|
|
75
|
+
while (i < to) {
|
|
76
|
+
const t = this.tokens[i];
|
|
77
|
+
out += this.text(cursor, t.start, st);
|
|
78
|
+
const close = this.pairs.get(i);
|
|
79
|
+
if ((t.sigil === "#" || t.sigil === "^") && close !== undefined && close < to) {
|
|
80
|
+
const c = this.tokens[close];
|
|
81
|
+
const block = { from: i + 1, to: close, textFrom: t.end, textTo: c.start };
|
|
82
|
+
out += this.section(t, block, this.html.slice(t.start, c.end), st);
|
|
83
|
+
cursor = c.end;
|
|
84
|
+
i = close + 1;
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
out += this.tag(t, st);
|
|
88
|
+
cursor = t.end;
|
|
89
|
+
i += 1;
|
|
90
|
+
}
|
|
91
|
+
return out + this.text(cursor, textTo, st);
|
|
92
|
+
}
|
|
93
|
+
text(from, to, st) {
|
|
94
|
+
const s = this.html.slice(from, to);
|
|
95
|
+
if (st.dot === null || s.length === 0)
|
|
96
|
+
return s;
|
|
97
|
+
const dot = st.dot;
|
|
98
|
+
return s.replace(DOT_RE, () => this.env.mkSentinel(dot));
|
|
99
|
+
}
|
|
100
|
+
raw(source, marker) {
|
|
101
|
+
if (marker !== null)
|
|
102
|
+
this.env.missing.push(marker);
|
|
103
|
+
return this.env.mkSentinel(source);
|
|
104
|
+
}
|
|
105
|
+
/** The module field a list entry's markers name: the outermost iterated field. */
|
|
106
|
+
listField(st) {
|
|
107
|
+
return st.chain[0]?.name ?? "";
|
|
108
|
+
}
|
|
109
|
+
// ── Lookups ──
|
|
110
|
+
/**
|
|
111
|
+
* Look `name` (possibly dotted) up in the entry chain, innermost
|
|
112
|
+
* first, then `page`. `undefined` = not an entry key (a module-level
|
|
113
|
+
* name, or unknown); `{ missing }` = the head exists but a dotted part
|
|
114
|
+
* does not.
|
|
115
|
+
*/
|
|
116
|
+
lookup(name, st) {
|
|
117
|
+
const parts = name.split(".");
|
|
118
|
+
const head = parts[0].toLowerCase();
|
|
119
|
+
let v;
|
|
120
|
+
if (head === "page") {
|
|
121
|
+
v = this.env.lists?.pageScope() ?? undefined;
|
|
122
|
+
if (v === undefined)
|
|
123
|
+
return parts.length > 1 || st.chain.length > 0 ? { missing: true } : undefined;
|
|
124
|
+
}
|
|
125
|
+
else {
|
|
126
|
+
for (let k = st.chain.length - 1; k >= 0 && v === undefined; k -= 1) {
|
|
127
|
+
v = st.chain[k]?.entry.get(head);
|
|
128
|
+
}
|
|
129
|
+
if (v === undefined)
|
|
130
|
+
return undefined;
|
|
131
|
+
}
|
|
132
|
+
for (const p of parts.slice(1)) {
|
|
133
|
+
if (v.kind !== "record")
|
|
134
|
+
return { missing: true };
|
|
135
|
+
const next = v.get(p.toLowerCase());
|
|
136
|
+
if (next === undefined)
|
|
137
|
+
return { missing: true };
|
|
138
|
+
v = next;
|
|
139
|
+
}
|
|
140
|
+
return v;
|
|
141
|
+
}
|
|
142
|
+
isModuleLevel(name) {
|
|
143
|
+
const lower = name.toLowerCase();
|
|
144
|
+
return (this.env.fields.has(name) || this.env.fields.has(lower) || this.env.moduleLevelKeys.has(lower));
|
|
145
|
+
}
|
|
146
|
+
notDeclared(name, st) {
|
|
147
|
+
const field = this.listField(st);
|
|
148
|
+
return field.length > 0 ? `field-not-declared:${field}.${name}` : `field-not-declared:${name}`;
|
|
149
|
+
}
|
|
150
|
+
// ── Plain tags ──
|
|
151
|
+
tag(t, st) {
|
|
152
|
+
const source = this.html.slice(t.start, t.end);
|
|
153
|
+
if (t.sigil === ">")
|
|
154
|
+
return this.partial(t, source, st);
|
|
155
|
+
if (t.sigil !== "")
|
|
156
|
+
return source;
|
|
157
|
+
if (st.dot !== null && t.name === "item" && st.chain.length === 0) {
|
|
158
|
+
return this.env.mkSentinel(st.dot);
|
|
159
|
+
}
|
|
160
|
+
const dotted = t.name.includes(".");
|
|
161
|
+
if (st.chain.length === 0 && !dotted)
|
|
162
|
+
return source;
|
|
163
|
+
const v = this.lookup(t.name, st);
|
|
164
|
+
if (v === undefined) {
|
|
165
|
+
if (dotted) {
|
|
166
|
+
const head = t.name.slice(0, t.name.indexOf("."));
|
|
167
|
+
if (st.chain.length === 0 && !this.isModuleLevel(head))
|
|
168
|
+
return source;
|
|
169
|
+
return this.raw(source, this.notDeclared(t.name, st));
|
|
170
|
+
}
|
|
171
|
+
if (this.isModuleLevel(t.name))
|
|
172
|
+
return source;
|
|
173
|
+
return this.raw(source, this.notDeclared(t.name, st));
|
|
174
|
+
}
|
|
175
|
+
if ("missing" in v) {
|
|
176
|
+
const marker = t.name.split(".")[0]?.toLowerCase() === "page" && this.env.lists === undefined
|
|
177
|
+
? "list-context-unavailable:page"
|
|
178
|
+
: this.notDeclared(t.name, st);
|
|
179
|
+
return this.raw(source, marker);
|
|
180
|
+
}
|
|
181
|
+
return this.valueText(v, source, t.name, st);
|
|
182
|
+
}
|
|
183
|
+
valueText(v, source, name, st) {
|
|
184
|
+
switch (v.kind) {
|
|
185
|
+
case "text":
|
|
186
|
+
return v.text.length === 0 ? "" : this.env.mkSentinel(v.text);
|
|
187
|
+
case "bool":
|
|
188
|
+
return String(v.value);
|
|
189
|
+
case "record":
|
|
190
|
+
if (v.text === null)
|
|
191
|
+
return this.raw(source, this.notDeclared(name, st));
|
|
192
|
+
return v.text.length === 0 ? "" : this.env.mkSentinel(v.text);
|
|
193
|
+
case "failed":
|
|
194
|
+
return this.raw(source, v.marker);
|
|
195
|
+
default:
|
|
196
|
+
return this.raw(source, this.notDeclared(name, st));
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
// ── Partials ──
|
|
200
|
+
partial(t, source, st) {
|
|
201
|
+
if (st.chain.length === 0)
|
|
202
|
+
return source;
|
|
203
|
+
if (t.name === "recurse")
|
|
204
|
+
return this.recurse(st);
|
|
205
|
+
const v = this.lookup(t.name, st);
|
|
206
|
+
if (v === undefined) {
|
|
207
|
+
return this.isModuleLevel(t.name) ? source : this.raw(source, this.notDeclared(t.name, st));
|
|
208
|
+
}
|
|
209
|
+
if ("missing" in v)
|
|
210
|
+
return this.raw(source, this.notDeclared(t.name, st));
|
|
211
|
+
if (v.kind === "module") {
|
|
212
|
+
const frame = st.chain[st.chain.length - 1];
|
|
213
|
+
const field = this.listField(st);
|
|
214
|
+
const key = `list:${field}/${frame.entry.id}/${t.name}`;
|
|
215
|
+
const html = this.env.partials(key, v.ref);
|
|
216
|
+
if (html === undefined) {
|
|
217
|
+
this.env.missing.push(`nested-renderer-unavailable:${field}[${frame.entry.id}].${t.name}`);
|
|
218
|
+
return `<!-- caelo:module ${field}[${frame.entry.id}].${t.name} needs recursive renderer (compose path) -->`;
|
|
219
|
+
}
|
|
220
|
+
return this.env.mkSentinel(html);
|
|
221
|
+
}
|
|
222
|
+
if (v.kind === "text" && v.text.length === 0)
|
|
223
|
+
return "";
|
|
224
|
+
if (v.kind === "failed")
|
|
225
|
+
return this.raw(source, v.marker);
|
|
226
|
+
const reason = `kind-mismatch:${this.listField(st)}.${t.name} expected=module actual=${v.kind}`;
|
|
227
|
+
this.env.missing.push(reason);
|
|
228
|
+
return `<!-- caelo:missing reason=${reason} -->`;
|
|
229
|
+
}
|
|
230
|
+
/** `{{>recurse}}`: the current entry's children with the enclosing section's block. */
|
|
231
|
+
recurse(st) {
|
|
232
|
+
const frame = st.chain[st.chain.length - 1];
|
|
233
|
+
const key = frame.entry.childrenKey;
|
|
234
|
+
if (key === null)
|
|
235
|
+
return "";
|
|
236
|
+
const kids = frame.entry.get(key);
|
|
237
|
+
if (kids?.kind !== "list")
|
|
238
|
+
return "";
|
|
239
|
+
return this.iterate(kids.entries, frame.name, frame.block, st);
|
|
240
|
+
}
|
|
241
|
+
// ── Sections ──
|
|
242
|
+
section(t, block, source, st) {
|
|
243
|
+
const inverted = t.sigil === "^";
|
|
244
|
+
const v = this.lookup(t.name, st);
|
|
245
|
+
if (v !== undefined) {
|
|
246
|
+
if ("missing" in v) {
|
|
247
|
+
const marker = t.name.split(".")[0] === "page" && this.env.lists === undefined
|
|
248
|
+
? "list-context-unavailable:page"
|
|
249
|
+
: this.notDeclared(t.name, st);
|
|
250
|
+
return this.raw(source, marker);
|
|
251
|
+
}
|
|
252
|
+
return this.scopeSection(v, t.name, inverted, block, source, st);
|
|
253
|
+
}
|
|
254
|
+
if (t.name.includes("."))
|
|
255
|
+
return this.raw(source, this.notDeclared(t.name, st));
|
|
256
|
+
return this.moduleSection(t.name, inverted, block, source, st);
|
|
257
|
+
}
|
|
258
|
+
/** A section over a value found in the entry chain or `page`. */
|
|
259
|
+
scopeSection(v, name, inverted, block, source, st) {
|
|
260
|
+
if (v.kind === "failed")
|
|
261
|
+
return this.raw(source, v.marker);
|
|
262
|
+
if (v.kind === "list") {
|
|
263
|
+
if (inverted)
|
|
264
|
+
return v.entries.length === 0 ? this.body(block, st, null) : "";
|
|
265
|
+
return this.iterate(v.entries, name, block, st);
|
|
266
|
+
}
|
|
267
|
+
const present = v.kind === "bool"
|
|
268
|
+
? v.value
|
|
269
|
+
: v.kind === "text"
|
|
270
|
+
? v.text.trim().length > 0
|
|
271
|
+
: v.kind === "record"
|
|
272
|
+
? v.present
|
|
273
|
+
: true;
|
|
274
|
+
return present !== inverted ? this.body(block, st, st.dot) : "";
|
|
275
|
+
}
|
|
276
|
+
/** A section over a module field (or an undeclared plugin source name). */
|
|
277
|
+
moduleSection(name, inverted, block, source, st) {
|
|
278
|
+
const env = this.env;
|
|
279
|
+
const field = env.fields.get(name);
|
|
280
|
+
if (!field) {
|
|
281
|
+
// No declared field — a plugin may still offer this name as a list
|
|
282
|
+
// source. Module fields are looked up FIRST, so a plugin can never
|
|
283
|
+
// shadow something the module's author declared.
|
|
284
|
+
const plugin = env.lists?.pluginSource(name) ?? null;
|
|
285
|
+
if (plugin !== null) {
|
|
286
|
+
if (!plugin.ok)
|
|
287
|
+
return this.raw(source, plugin.marker);
|
|
288
|
+
if (inverted)
|
|
289
|
+
return plugin.entries.length === 0 ? this.body(block, st, null) : "";
|
|
290
|
+
return this.iterate(plugin.entries, name, block, st);
|
|
291
|
+
}
|
|
292
|
+
return this.raw(source, this.notDeclared(name, st));
|
|
293
|
+
}
|
|
294
|
+
const raw = Object.hasOwn(env.values, name) ? env.values[name] : field.default;
|
|
295
|
+
if (field.kind === "module-list") {
|
|
296
|
+
if (inverted)
|
|
297
|
+
return Array.isArray(raw) && raw.length > 0 ? "" : this.body(block, st, null);
|
|
298
|
+
return env.renderModuleList(name, field);
|
|
299
|
+
}
|
|
300
|
+
if (field.kind === "list") {
|
|
301
|
+
if (!env.lists)
|
|
302
|
+
return this.raw(source, `list-context-unavailable:${name}`);
|
|
303
|
+
const spec = {
|
|
304
|
+
name: field.name,
|
|
305
|
+
listType: field.listType ?? "",
|
|
306
|
+
...(field.bind !== undefined ? { bind: field.bind } : {}),
|
|
307
|
+
...(field.list !== undefined ? { list: field.list } : {}),
|
|
308
|
+
...(field.source !== undefined ? { source: field.source } : {}),
|
|
309
|
+
...(field.default !== undefined ? { default: field.default } : {}),
|
|
310
|
+
};
|
|
311
|
+
const value = Object.hasOwn(env.values, name) ? env.values[name] : undefined;
|
|
312
|
+
const res = env.lists.resolveField(spec, value, env.holder);
|
|
313
|
+
if (!res.ok)
|
|
314
|
+
return this.raw(source, res.marker);
|
|
315
|
+
if (inverted)
|
|
316
|
+
return res.entries.length === 0 ? this.body(block, st, null) : "";
|
|
317
|
+
return this.iterate(res.entries, name, block, st);
|
|
318
|
+
}
|
|
319
|
+
// Any other field used as a section is a CONDITIONAL (Mustache
|
|
320
|
+
// semantics): the block once when the field has a present, non-empty
|
|
321
|
+
// value, dropped when empty — never a kind-mismatch, which used to
|
|
322
|
+
// silently drop real scalar content. `{{.}}` / `{{item}}` inside it
|
|
323
|
+
// read the scalar. An empty conditional is intentional, not missing.
|
|
324
|
+
const present = isPresentSectionValue(raw);
|
|
325
|
+
if (present === inverted)
|
|
326
|
+
return "";
|
|
327
|
+
const dot = present ? scalarSectionString(raw) : "";
|
|
328
|
+
return this.body(block, st, dot.length > 0 ? dot : st.dot);
|
|
329
|
+
}
|
|
330
|
+
body(block, st, dot) {
|
|
331
|
+
return this.range(block.from, block.to, block.textFrom, block.textTo, { chain: st.chain, dot });
|
|
332
|
+
}
|
|
333
|
+
iterate(entries, name, block, st) {
|
|
334
|
+
// The empty-restoring sentinel in front claims the iteration's first
|
|
335
|
+
// element for its own entries: an enclosing entry whose block starts
|
|
336
|
+
// with this iteration (`{{#items}}<p>…`) must not stamp a GENERATED
|
|
337
|
+
// entry's element as its own root.
|
|
338
|
+
let out = entries.length > 0 ? this.env.mkSentinel("") : "";
|
|
339
|
+
for (const entry of entries) {
|
|
340
|
+
const chain = [...st.chain, { entry, block, name }];
|
|
341
|
+
const rendered = this.range(block.from, block.to, block.textFrom, block.textTo, {
|
|
342
|
+
chain,
|
|
343
|
+
dot: null,
|
|
344
|
+
});
|
|
345
|
+
out += entry.itemAttr === null ? rendered : stampListItem(rendered, entry.itemAttr);
|
|
346
|
+
}
|
|
347
|
+
return out;
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Mustache-style truthiness for a conditional section value. Empty string,
|
|
352
|
+
* null/undefined, `false`, and an empty array/object are absent; everything
|
|
353
|
+
* else (incl. a numeric 0 — a real content value, not a control flag) is
|
|
354
|
+
* present.
|
|
355
|
+
*/
|
|
356
|
+
export function isPresentSectionValue(raw) {
|
|
357
|
+
if (raw === undefined || raw === null || raw === false)
|
|
358
|
+
return false;
|
|
359
|
+
if (typeof raw === "string")
|
|
360
|
+
return raw.trim().length > 0;
|
|
361
|
+
if (typeof raw === "number")
|
|
362
|
+
return !Number.isNaN(raw);
|
|
363
|
+
if (Array.isArray(raw))
|
|
364
|
+
return raw.length > 0;
|
|
365
|
+
if (typeof raw === "object")
|
|
366
|
+
return Object.keys(raw).length > 0;
|
|
367
|
+
return true;
|
|
368
|
+
}
|
|
369
|
+
/** String form for `{{.}}`/`{{item}}` inside a scalar conditional; objects stringify to "". */
|
|
370
|
+
function scalarSectionString(raw) {
|
|
371
|
+
if (typeof raw === "string")
|
|
372
|
+
return raw;
|
|
373
|
+
if (typeof raw === "number" || typeof raw === "boolean")
|
|
374
|
+
return String(raw);
|
|
375
|
+
return "";
|
|
376
|
+
}
|
|
377
|
+
/** The attribute a rendered list entry's root element carries (`docs/lists.md` §13). */
|
|
378
|
+
export const LIST_ITEM_ATTRIBUTE = "data-caelo-list-item";
|
|
379
|
+
/**
|
|
380
|
+
* Stamp `data-caelo-list-item` on a rendered entry's root element: the
|
|
381
|
+
* first opening tag, when the entry's markup STARTS with one (leading
|
|
382
|
+
* whitespace and comments allowed). An entry that starts with text
|
|
383
|
+
* (`{{name}}, `) has no root element and stays unstamped, rather than
|
|
384
|
+
* attributing the entry to some inner `<b>`. Idempotent.
|
|
385
|
+
*/
|
|
386
|
+
export function stampListItem(html, attr) {
|
|
387
|
+
let i = 0;
|
|
388
|
+
for (;;) {
|
|
389
|
+
while (i < html.length && /\s/.test(html[i]))
|
|
390
|
+
i += 1;
|
|
391
|
+
if (html.startsWith("<!--", i)) {
|
|
392
|
+
const end = html.indexOf("-->", i + 4);
|
|
393
|
+
if (end < 0)
|
|
394
|
+
return html;
|
|
395
|
+
i = end + 3;
|
|
396
|
+
continue;
|
|
397
|
+
}
|
|
398
|
+
break;
|
|
399
|
+
}
|
|
400
|
+
if (html[i] !== "<" || !/[a-zA-Z]/.test(html[i + 1] ?? ""))
|
|
401
|
+
return html;
|
|
402
|
+
let quote = null;
|
|
403
|
+
let j = i + 1;
|
|
404
|
+
for (; j < html.length; j += 1) {
|
|
405
|
+
const c = html[j];
|
|
406
|
+
if (quote) {
|
|
407
|
+
if (c === quote)
|
|
408
|
+
quote = null;
|
|
409
|
+
}
|
|
410
|
+
else if (c === '"' || c === "'")
|
|
411
|
+
quote = c;
|
|
412
|
+
else if (c === ">")
|
|
413
|
+
break;
|
|
414
|
+
}
|
|
415
|
+
if (j >= html.length)
|
|
416
|
+
return html;
|
|
417
|
+
const tag = html.slice(i, j);
|
|
418
|
+
if (tag.includes(`${LIST_ITEM_ATTRIBUTE}=`))
|
|
419
|
+
return html;
|
|
420
|
+
const insertAt = tag.endsWith("/") ? j - 1 : j;
|
|
421
|
+
return `${html.slice(0, insertAt)} ${LIST_ITEM_ATTRIBUTE}="${attr.replace(/"/g, """)}"${html.slice(insertAt)}`;
|
|
422
|
+
}
|
|
423
|
+
//# 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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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/** The next step every malformed-id message ends with. */
|
|
2
|
+
export declare const COPY_ID_EXACTLY_HINT = "Copy the id character for character from the tool result that returned it; never retype, shorten or complete an id from memory \u2014 if it is no longer in view, call the list_/get_ tool again.";
|
|
3
|
+
/**
|
|
4
|
+
* What is wrong with `value` as a UUID, e.g.
|
|
5
|
+
* `"c9c7ddcb-cc85-4747-84f-90967da6f769" is not a UUID: group 4 has 3 characters (expected 4)`.
|
|
6
|
+
* Returns null when `value` is a well-formed UUID.
|
|
7
|
+
*/
|
|
8
|
+
export declare function describeMalformedUuid(value: unknown): string | null;
|
|
9
|
+
//# sourceMappingURL=uuid-diagnose.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid-diagnose.d.ts","sourceRoot":"","sources":["../src/uuid-diagnose.ts"],"names":[],"mappings":"AAgBA,0DAA0D;AAC1D,eAAO,MAAM,oBAAoB,sMAC+J,CAAC;AAEjM;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAwBnE"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// SPDX-License-Identifier: MPL-2.0
|
|
2
|
+
/**
|
|
3
|
+
* Say precisely what is wrong with a value that should be a UUID.
|
|
4
|
+
*
|
|
5
|
+
* #1089 / #1094 — a bare "Invalid UUID", or "expects { moduleId,
|
|
6
|
+
* contentInstanceId }; got {…}" around a correctly-shaped object, left the
|
|
7
|
+
* model looking for a structural mistake that was not there. The real fault
|
|
8
|
+
* was one id with a character missing; naming the group that is off lets
|
|
9
|
+
* the model see the id itself is wrong and fetch it again instead of
|
|
10
|
+
* re-sending the same value.
|
|
11
|
+
*/
|
|
12
|
+
const GROUP_LENGTHS = [8, 4, 4, 4, 12];
|
|
13
|
+
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
14
|
+
/** The next step every malformed-id message ends with. */
|
|
15
|
+
export const COPY_ID_EXACTLY_HINT = "Copy the id character for character from the tool result that returned it; never retype, shorten or complete an id from memory — if it is no longer in view, call the list_/get_ tool again.";
|
|
16
|
+
/**
|
|
17
|
+
* What is wrong with `value` as a UUID, e.g.
|
|
18
|
+
* `"c9c7ddcb-cc85-4747-84f-90967da6f769" is not a UUID: group 4 has 3 characters (expected 4)`.
|
|
19
|
+
* Returns null when `value` is a well-formed UUID.
|
|
20
|
+
*/
|
|
21
|
+
export function describeMalformedUuid(value) {
|
|
22
|
+
if (typeof value !== "string") {
|
|
23
|
+
return `${JSON.stringify(value) ?? String(value)} is not a UUID (expected a string)`;
|
|
24
|
+
}
|
|
25
|
+
if (UUID_RE.test(value))
|
|
26
|
+
return null;
|
|
27
|
+
const quoted = JSON.stringify(value);
|
|
28
|
+
if (value.includes("…") || value.includes("...")) {
|
|
29
|
+
return `${quoted} is not a UUID: it is shortened (contains an ellipsis)`;
|
|
30
|
+
}
|
|
31
|
+
const groups = value.split("-");
|
|
32
|
+
if (groups.length !== GROUP_LENGTHS.length) {
|
|
33
|
+
return `${quoted} is not a UUID: it has ${groups.length} dash-separated group(s), a UUID has 5 (8-4-4-4-12 hex characters)`;
|
|
34
|
+
}
|
|
35
|
+
for (let i = 0; i < groups.length; i++) {
|
|
36
|
+
const g = groups[i] ?? "";
|
|
37
|
+
const want = GROUP_LENGTHS[i] ?? 0;
|
|
38
|
+
if (g.length !== want) {
|
|
39
|
+
return `${quoted} is not a UUID: group ${i + 1} has ${g.length} character(s) (expected ${want}; a UUID is 8-4-4-4-12)`;
|
|
40
|
+
}
|
|
41
|
+
if (!/^[0-9a-f]+$/i.test(g)) {
|
|
42
|
+
return `${quoted} is not a UUID: group ${i + 1} contains non-hex characters`;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return `${quoted} is not a UUID`;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=uuid-diagnose.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"uuid-diagnose.js","sourceRoot":"","sources":["../src/uuid-diagnose.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;GASG;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,CAAU,CAAC;AAChD,MAAM,OAAO,GAAG,iEAAiE,CAAC;AAElF,0DAA0D;AAC1D,MAAM,CAAC,MAAM,oBAAoB,GAC/B,8LAA8L,CAAC;AAEjM;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,oCAAoC,CAAC;IACvF,CAAC;IACD,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,OAAO,GAAG,MAAM,wDAAwD,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,MAAM,CAAC,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE,CAAC;QAC3C,OAAO,GAAG,MAAM,0BAA0B,MAAM,CAAC,MAAM,oEAAoE,CAAC;IAC9H,CAAC;IACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YACtB,OAAO,GAAG,MAAM,yBAAyB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,MAAM,2BAA2B,IAAI,yBAAyB,CAAC;QACzH,CAAC;QACD,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5B,OAAO,GAAG,MAAM,yBAAyB,CAAC,GAAG,CAAC,8BAA8B,CAAC;QAC/E,CAAC;IACH,CAAC;IACD,OAAO,GAAG,MAAM,gBAAgB,CAAC;AACnC,CAAC"}
|
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.
|
|
22
|
+
export declare const CAELO_VERSION = "0.11.0";
|
|
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.71";
|
|
|
31
31
|
*
|
|
32
32
|
* @deprecated use CAELO_VERSION
|
|
33
33
|
*/
|
|
34
|
-
export declare const CALEO_VERSION = "0.
|
|
34
|
+
export declare const CALEO_VERSION = "0.11.0";
|
|
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 —
|
package/dist/version.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,eAAO,MAAM,aAAa,
|
|
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.
|
|
23
|
+
export const CAELO_VERSION = "0.11.0";
|
|
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
|
package/dist/version.js.map
CHANGED
|
@@ -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,
|
|
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.
|
|
3
|
+
"version": "0.11.0",
|
|
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": [
|