@caelo-cms/shared 0.10.72 → 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.
Files changed (184) hide show
  1. package/dist/ai-tools.d.ts +125 -50
  2. package/dist/ai-tools.d.ts.map +1 -1
  3. package/dist/ai-tools.js +48 -36
  4. package/dist/ai-tools.js.map +1 -1
  5. package/dist/build-page.d.ts +110 -30
  6. package/dist/build-page.d.ts.map +1 -1
  7. package/dist/build-page.js +23 -4
  8. package/dist/build-page.js.map +1 -1
  9. package/dist/content.d.ts +201 -100
  10. package/dist/content.d.ts.map +1 -1
  11. package/dist/content.js +176 -74
  12. package/dist/content.js.map +1 -1
  13. package/dist/css-var-aliases.d.ts +20 -0
  14. package/dist/css-var-aliases.d.ts.map +1 -0
  15. package/dist/css-var-aliases.js +95 -0
  16. package/dist/css-var-aliases.js.map +1 -0
  17. package/dist/css-var-scan.d.ts +0 -16
  18. package/dist/css-var-scan.d.ts.map +1 -1
  19. package/dist/css-var-scan.js +24 -0
  20. package/dist/css-var-scan.js.map +1 -1
  21. package/dist/edit-markers.d.ts +41 -5
  22. package/dist/edit-markers.d.ts.map +1 -1
  23. package/dist/edit-markers.js +47 -50
  24. package/dist/edit-markers.js.map +1 -1
  25. package/dist/index.d.ts +3 -1
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +3 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/interactions.js +2 -2
  30. package/dist/interactions.js.map +1 -1
  31. package/dist/link-canonicalise.d.ts.map +1 -1
  32. package/dist/link-canonicalise.js +7 -1
  33. package/dist/link-canonicalise.js.map +1 -1
  34. package/dist/link-refs.d.ts +1 -1
  35. package/dist/link-refs.js +3 -3
  36. package/dist/lists/address.d.ts +34 -0
  37. package/dist/lists/address.d.ts.map +1 -0
  38. package/dist/lists/address.js +43 -0
  39. package/dist/lists/address.js.map +1 -0
  40. package/dist/lists/default-types.d.ts +10 -0
  41. package/dist/lists/default-types.d.ts.map +1 -0
  42. package/dist/lists/default-types.js +91 -0
  43. package/dist/lists/default-types.js.map +1 -0
  44. package/dist/lists/fields.d.ts +152 -0
  45. package/dist/lists/fields.d.ts.map +1 -0
  46. package/dist/lists/fields.js +258 -0
  47. package/dist/lists/fields.js.map +1 -0
  48. package/dist/lists/index.d.ts +14 -0
  49. package/dist/lists/index.d.ts.map +1 -0
  50. package/dist/lists/index.js +15 -0
  51. package/dist/lists/index.js.map +1 -0
  52. package/dist/lists/item-attr.d.ts +26 -0
  53. package/dist/lists/item-attr.d.ts.map +1 -0
  54. package/dist/lists/item-attr.js +31 -0
  55. package/dist/lists/item-attr.js.map +1 -0
  56. package/dist/lists/items.d.ts +105 -0
  57. package/dist/lists/items.d.ts.map +1 -0
  58. package/dist/lists/items.js +304 -0
  59. package/dist/lists/items.js.map +1 -0
  60. package/dist/lists/list-type.d.ts +401 -0
  61. package/dist/lists/list-type.d.ts.map +1 -0
  62. package/dist/lists/list-type.js +275 -0
  63. package/dist/lists/list-type.js.map +1 -0
  64. package/dist/lists/model.d.ts +14 -0
  65. package/dist/lists/model.d.ts.map +1 -0
  66. package/dist/lists/model.js +15 -0
  67. package/dist/lists/model.js.map +1 -0
  68. package/dist/lists/page-type.d.ts +115 -0
  69. package/dist/lists/page-type.d.ts.map +1 -0
  70. package/dist/lists/page-type.js +66 -0
  71. package/dist/lists/page-type.js.map +1 -0
  72. package/dist/lists/refs.d.ts +13 -0
  73. package/dist/lists/refs.d.ts.map +1 -0
  74. package/dist/lists/refs.js +18 -0
  75. package/dist/lists/refs.js.map +1 -0
  76. package/dist/lists/render-data.d.ts +114 -0
  77. package/dist/lists/render-data.d.ts.map +1 -0
  78. package/dist/lists/render-data.js +3 -0
  79. package/dist/lists/render-data.js.map +1 -0
  80. package/dist/lists/render-deps.d.ts +68 -0
  81. package/dist/lists/render-deps.d.ts.map +1 -0
  82. package/dist/lists/render-deps.js +91 -0
  83. package/dist/lists/render-deps.js.map +1 -0
  84. package/dist/lists/resolve-values.d.ts +63 -0
  85. package/dist/lists/resolve-values.d.ts.map +1 -0
  86. package/dist/lists/resolve-values.js +181 -0
  87. package/dist/lists/resolve-values.js.map +1 -0
  88. package/dist/lists/resolve.d.ts +106 -0
  89. package/dist/lists/resolve.d.ts.map +1 -0
  90. package/dist/lists/resolve.js +878 -0
  91. package/dist/lists/resolve.js.map +1 -0
  92. package/dist/lists/scope.d.ts +81 -0
  93. package/dist/lists/scope.d.ts.map +1 -0
  94. package/dist/lists/scope.js +3 -0
  95. package/dist/lists/scope.js.map +1 -0
  96. package/dist/markup-structure.d.ts +8 -0
  97. package/dist/markup-structure.d.ts.map +1 -1
  98. package/dist/markup-structure.js +2 -0
  99. package/dist/markup-structure.js.map +1 -1
  100. package/dist/media.d.ts +1 -1
  101. package/dist/nested-module-render.d.ts +25 -20
  102. package/dist/nested-module-render.d.ts.map +1 -1
  103. package/dist/nested-module-render.js +122 -31
  104. package/dist/nested-module-render.js.map +1 -1
  105. package/dist/page-log.d.ts +1 -1
  106. package/dist/preview-compose.d.ts +24 -21
  107. package/dist/preview-compose.d.ts.map +1 -1
  108. package/dist/preview-compose.js +34 -118
  109. package/dist/preview-compose.js.map +1 -1
  110. package/dist/source-text-transport.d.ts +17 -0
  111. package/dist/source-text-transport.d.ts.map +1 -0
  112. package/dist/source-text-transport.js +71 -0
  113. package/dist/source-text-transport.js.map +1 -0
  114. package/dist/template-engine.d.ts +44 -31
  115. package/dist/template-engine.d.ts.map +1 -1
  116. package/dist/template-engine.js +75 -174
  117. package/dist/template-engine.js.map +1 -1
  118. package/dist/template-sections.d.ts +69 -0
  119. package/dist/template-sections.d.ts.map +1 -0
  120. package/dist/template-sections.js +423 -0
  121. package/dist/template-sections.js.map +1 -0
  122. package/dist/version.d.ts +2 -2
  123. package/dist/version.d.ts.map +1 -1
  124. package/dist/version.js +1 -1
  125. package/dist/version.js.map +1 -1
  126. package/package.json +8 -1
  127. package/src/__tests__/redos-hardening.test.ts +50 -16
  128. package/src/ai-tools-add-module-modes.test.ts +50 -0
  129. package/src/ai-tools.test.ts +10 -0
  130. package/src/ai-tools.ts +51 -37
  131. package/src/build-page.test.ts +34 -3
  132. package/src/build-page.ts +26 -3
  133. package/src/content.test.ts +111 -3
  134. package/src/content.ts +186 -75
  135. package/src/css-var-aliases.test.ts +61 -0
  136. package/src/css-var-aliases.ts +109 -0
  137. package/src/css-var-scan.ts +9 -0
  138. package/src/edit-markers.test.ts +37 -21
  139. package/src/edit-markers.ts +52 -20
  140. package/src/index.ts +3 -1
  141. package/src/interactions.ts +2 -2
  142. package/src/link-canonicalise.test.ts +36 -6
  143. package/src/link-canonicalise.ts +6 -1
  144. package/src/link-refs.test.ts +66 -42
  145. package/src/link-refs.ts +3 -3
  146. package/src/lists/address.ts +75 -0
  147. package/src/lists/default-types.ts +102 -0
  148. package/src/lists/fields.ts +285 -0
  149. package/src/lists/index.ts +16 -0
  150. package/src/lists/item-attr.test.ts +36 -0
  151. package/src/lists/item-attr.ts +49 -0
  152. package/src/lists/items.ts +402 -0
  153. package/src/lists/list-fixtures.test.ts +302 -0
  154. package/src/lists/list-type.ts +306 -0
  155. package/src/lists/lists.test.ts +328 -0
  156. package/src/lists/model.ts +16 -0
  157. package/src/lists/page-type.ts +71 -0
  158. package/src/lists/refs.ts +21 -0
  159. package/src/lists/render-data.ts +125 -0
  160. package/src/lists/render-deps.test.ts +132 -0
  161. package/src/lists/render-deps.ts +144 -0
  162. package/src/lists/resolve-values.ts +224 -0
  163. package/src/lists/resolve.test.ts +295 -0
  164. package/src/lists/resolve.ts +1148 -0
  165. package/src/lists/scope.ts +69 -0
  166. package/src/lists-compose-parity.test.ts +262 -0
  167. package/src/markup-structure.ts +10 -0
  168. package/src/nested-module-render.test.ts +111 -77
  169. package/src/nested-module-render.ts +85 -48
  170. package/src/preview-compose.test.ts +55 -19
  171. package/src/preview-compose.ts +59 -154
  172. package/src/source-text-transport.test.ts +63 -0
  173. package/src/source-text-transport.ts +70 -0
  174. package/src/template-engine-lists.test.ts +553 -0
  175. package/src/template-engine.test.ts +62 -80
  176. package/src/template-engine.ts +102 -245
  177. package/src/template-sections.ts +500 -0
  178. package/src/version.ts +1 -1
  179. package/dist/structured-sets.d.ts +0 -70
  180. package/dist/structured-sets.d.ts.map +0 -1
  181. package/dist/structured-sets.js +0 -92
  182. package/dist/structured-sets.js.map +0 -1
  183. package/src/structured-sets.ts +0 -114
  184. package/src/template-engine-data-lists.test.ts +0 -90
@@ -0,0 +1,63 @@
1
+ import type { FieldDef } from "./fields.js";
2
+ import type { ListRenderData } from "./render-data.js";
3
+ import type { ScopeEntry, ScopeValue } from "./scope.js";
4
+ export declare const EMPTY_TEXT: ScopeValue;
5
+ export declare const FALSE: ScopeValue;
6
+ export declare const TRUE: ScopeValue;
7
+ export declare const EMPTY_LIST: ScopeValue;
8
+ /** A text scope value. */
9
+ export declare function text(s: string): ScopeValue;
10
+ /** A boolean scope value. */
11
+ export declare function bool(v: boolean): ScopeValue;
12
+ /** A record scope value over a fixed key map. */
13
+ export declare function record(bare: string | null, present: boolean, parts: Readonly<Record<string, ScopeValue>>): ScopeValue;
14
+ /** What value scopes need from the render: data plus lazy hooks into the page context. */
15
+ export interface ValueEnv {
16
+ readonly data: ListRenderData;
17
+ /** Format an ISO date in the site language (cached formatter). */
18
+ formatDate(iso: string): string;
19
+ /**
20
+ * Resolve term references to vocabulary entries. `field` names the
21
+ * field for markers; the vocabulary lists are recorded as deps.
22
+ */
23
+ termEntries(refs: readonly string[], field: string): ScopeValue;
24
+ }
25
+ /** The empty value of a declared field — declared-but-unset never falls through to outer scopes. */
26
+ export declare function emptyValueOf(field: FieldDef): ScopeValue;
27
+ /** Scope value of a link: bare = href, plus `href`, `target`, `title` (internal page title). */
28
+ export declare function linkValue(v: {
29
+ readonly href: string;
30
+ readonly target?: string;
31
+ }, data: ListRenderData | null): ScopeValue;
32
+ /** Scope value of a media reference: bare = url (the reference, resolved later), alt/width/height. */
33
+ export declare function mediaValue(ref: string, data: ListRenderData): ScopeValue;
34
+ /** Scope value of a date or timestamp: bare = the stored ISO string, `formatted` in the site language. */
35
+ export declare function dateValue(iso: string, env: Pick<ValueEnv, "formatDate">): ScopeValue;
36
+ /**
37
+ * Scope value of one stored field value. `undefined` / `null` read as the
38
+ * field's empty value; a value of the wrong shape (data drift after a
39
+ * type change that skipped validation) reads as the raw string form when
40
+ * it has one — validation happens on write, rendering never invents data.
41
+ */
42
+ export declare function fieldValue(field: FieldDef, raw: unknown, env: ValueEnv): ScopeValue;
43
+ /**
44
+ * Lookup for a `select` field's option flag: `{{#f_<option>}}` is true
45
+ * when `f` holds `<option>`. Returns undefined when `key` is no option
46
+ * flag of any select field.
47
+ */
48
+ export declare function selectFlag(fields: readonly FieldDef[], values: Readonly<Record<string, unknown>>, key: string): ScopeValue | undefined;
49
+ /**
50
+ * Generic scope of an untyped value map (plugin source entries, whose
51
+ * node definition the host does not hand over yet): strings and numbers
52
+ * as text, booleans as flags, `{ href }` objects as links.
53
+ */
54
+ export declare function untypedValue(raw: unknown): ScopeValue | undefined;
55
+ /** Position keys every entry carries: `index` (0-based), `first`, `last`, `depth` (1-based). */
56
+ export declare function positionValue(key: string, pos: {
57
+ readonly index: number;
58
+ readonly count: number;
59
+ readonly depth: number;
60
+ }): ScopeValue | undefined;
61
+ /** A list of entries as a scope value, with `has_`/`count_` helpers derived by the caller. */
62
+ export declare function listValue(entries: readonly ScopeEntry[]): ScopeValue;
63
+ //# sourceMappingURL=resolve-values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-values.d.ts","sourceRoot":"","sources":["../../src/lists/resolve-values.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzD,eAAO,MAAM,UAAU,EAAE,UAAuC,CAAC;AACjE,eAAO,MAAM,KAAK,EAAE,UAA2C,CAAC;AAChE,eAAO,MAAM,IAAI,EAAE,UAA0C,CAAC;AAC9D,eAAO,MAAM,UAAU,EAAE,UAA0C,CAAC;AAEpE,0BAA0B;AAC1B,wBAAgB,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,UAAU,CAE1C;AAED,6BAA6B;AAC7B,wBAAgB,IAAI,CAAC,CAAC,EAAE,OAAO,GAAG,UAAU,CAE3C;AAED,iDAAiD;AACjD,wBAAgB,MAAM,CACpB,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,OAAO,EAAE,OAAO,EAChB,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,GAC1C,UAAU,CAOZ;AAED,0FAA0F;AAC1F,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,kEAAkE;IAClE,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAChC;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,UAAU,CAAC;CACjE;AAED,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,GAAG,UAAU,CAoBxD;AAED,gGAAgG;AAChG,wBAAgB,SAAS,CACvB,CAAC,EAAE;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,EACtD,IAAI,EAAE,cAAc,GAAG,IAAI,GAC1B,UAAU,CASZ;AAED,sGAAsG;AACtG,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,cAAc,GAAG,UAAU,CASxE;AAED,0GAA0G;AAC1G,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,YAAY,CAAC,GAAG,UAAU,CAEpF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,GAAG,UAAU,CAwCnF;AAED;;;;GAIG;AACH,wBAAgB,UAAU,CACxB,MAAM,EAAE,SAAS,QAAQ,EAAE,EAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,EACzC,GAAG,EAAE,MAAM,GACV,UAAU,GAAG,SAAS,CAOxB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,GAAG,SAAS,CAYjE;AAED,gGAAgG;AAChG,wBAAgB,aAAa,CAC3B,GAAG,EAAE,MAAM,EACX,GAAG,EAAE;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAC9E,UAAU,GAAG,SAAS,CAaxB;AAED,8FAA8F;AAC9F,wBAAgB,SAAS,CAAC,OAAO,EAAE,SAAS,UAAU,EAAE,GAAG,UAAU,CAEpE"}
@@ -0,0 +1,181 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * Field values as template scopes (epic #1107, `docs/lists.md` §2): how
4
+ * a stored value of each field type reads in a template. Shared by list
5
+ * entries, page properties (`{{page.props.x}}`, `{{props.x}}` on query
6
+ * results) and plugin source entries, so every value renders the same
7
+ * way wherever it comes from.
8
+ *
9
+ * Internal references stay references here (`caelo:page/<id>`,
10
+ * `caelo:media/<id>`): the template engine resolves every reference in
11
+ * the finished HTML through the page's link resolver, so a link inside a
12
+ * list entry follows a page move exactly like a link in module HTML.
13
+ */
14
+ import { parseLinkRef } from "../link-refs.js";
15
+ export const EMPTY_TEXT = { kind: "text", text: "" };
16
+ export const FALSE = { kind: "bool", value: false };
17
+ export const TRUE = { kind: "bool", value: true };
18
+ export const EMPTY_LIST = { kind: "list", entries: [] };
19
+ /** A text scope value. */
20
+ export function text(s) {
21
+ return { kind: "text", text: s };
22
+ }
23
+ /** A boolean scope value. */
24
+ export function bool(v) {
25
+ return v ? TRUE : FALSE;
26
+ }
27
+ /** A record scope value over a fixed key map. */
28
+ export function record(bare, present, parts) {
29
+ return {
30
+ kind: "record",
31
+ text: bare,
32
+ present,
33
+ get: (key) => (Object.hasOwn(parts, key) ? parts[key] : undefined),
34
+ };
35
+ }
36
+ /** The empty value of a declared field — declared-but-unset never falls through to outer scopes. */
37
+ export function emptyValueOf(field) {
38
+ switch (field.type) {
39
+ case "boolean":
40
+ return FALSE;
41
+ case "link":
42
+ return linkValue({ href: "" }, null);
43
+ case "media":
44
+ return record("", false, {
45
+ url: EMPTY_TEXT,
46
+ alt: EMPTY_TEXT,
47
+ width: EMPTY_TEXT,
48
+ height: EMPTY_TEXT,
49
+ });
50
+ case "date":
51
+ return record("", false, { formatted: EMPTY_TEXT });
52
+ case "term":
53
+ return EMPTY_LIST;
54
+ default:
55
+ return EMPTY_TEXT;
56
+ }
57
+ }
58
+ /** Scope value of a link: bare = href, plus `href`, `target`, `title` (internal page title). */
59
+ export function linkValue(v, data) {
60
+ const ref = v.href.length > 0 ? parseLinkRef(v.href) : null;
61
+ const title = ref?.kind === "page" && data !== null ? (data.pages.get(ref.pageId)?.title ?? "") : "";
62
+ return record(v.href, v.href.length > 0, {
63
+ href: text(v.href),
64
+ target: text(v.target ?? ""),
65
+ title: text(title),
66
+ });
67
+ }
68
+ /** Scope value of a media reference: bare = url (the reference, resolved later), alt/width/height. */
69
+ export function mediaValue(ref, data) {
70
+ const parsed = parseLinkRef(ref);
71
+ const meta = parsed?.kind === "media" ? data.media.get(parsed.mediaId) : undefined;
72
+ return record(ref, ref.length > 0, {
73
+ url: text(ref),
74
+ alt: text(meta?.alt ?? ""),
75
+ width: text(meta?.width === null || meta?.width === undefined ? "" : String(meta.width)),
76
+ height: text(meta?.height === null || meta?.height === undefined ? "" : String(meta.height)),
77
+ });
78
+ }
79
+ /** Scope value of a date or timestamp: bare = the stored ISO string, `formatted` in the site language. */
80
+ export function dateValue(iso, env) {
81
+ return record(iso, iso.length > 0, { formatted: text(env.formatDate(iso)) });
82
+ }
83
+ /**
84
+ * Scope value of one stored field value. `undefined` / `null` read as the
85
+ * field's empty value; a value of the wrong shape (data drift after a
86
+ * type change that skipped validation) reads as the raw string form when
87
+ * it has one — validation happens on write, rendering never invents data.
88
+ */
89
+ export function fieldValue(field, raw, env) {
90
+ if (raw === undefined || raw === null)
91
+ return emptyValueOf(field);
92
+ switch (field.type) {
93
+ case "text":
94
+ case "richtext":
95
+ case "icon":
96
+ case "select":
97
+ return typeof raw === "string" ? text(raw) : text(String(raw));
98
+ case "number":
99
+ return typeof raw === "number" ? text(String(raw)) : text(String(raw));
100
+ case "boolean":
101
+ return bool(raw === true);
102
+ case "link": {
103
+ if (typeof raw === "object" && typeof raw.href === "string") {
104
+ return linkValue(raw, env.data);
105
+ }
106
+ return typeof raw === "string" ? linkValue({ href: raw }, env.data) : emptyValueOf(field);
107
+ }
108
+ case "media":
109
+ return typeof raw === "string" ? mediaValue(raw, env.data) : emptyValueOf(field);
110
+ case "date":
111
+ return typeof raw === "string" ? dateValue(raw, env) : emptyValueOf(field);
112
+ case "module": {
113
+ const r = raw;
114
+ if (typeof r.moduleId === "string" && typeof r.contentInstanceId === "string") {
115
+ return {
116
+ kind: "module",
117
+ ref: { moduleId: r.moduleId, contentInstanceId: r.contentInstanceId },
118
+ };
119
+ }
120
+ return { kind: "failed", marker: `list-malformed:${field.name}[module]` };
121
+ }
122
+ case "term":
123
+ return Array.isArray(raw)
124
+ ? env.termEntries(raw.filter((x) => typeof x === "string"), field.name)
125
+ : EMPTY_LIST;
126
+ }
127
+ }
128
+ /**
129
+ * Lookup for a `select` field's option flag: `{{#f_<option>}}` is true
130
+ * when `f` holds `<option>`. Returns undefined when `key` is no option
131
+ * flag of any select field.
132
+ */
133
+ export function selectFlag(fields, values, key) {
134
+ for (const f of fields) {
135
+ if (f.type !== "select" || !key.startsWith(`${f.name}_`))
136
+ continue;
137
+ const option = key.slice(f.name.length + 1);
138
+ if (f.options.includes(option))
139
+ return bool(values[f.name] === option);
140
+ }
141
+ return undefined;
142
+ }
143
+ /**
144
+ * Generic scope of an untyped value map (plugin source entries, whose
145
+ * node definition the host does not hand over yet): strings and numbers
146
+ * as text, booleans as flags, `{ href }` objects as links.
147
+ */
148
+ export function untypedValue(raw) {
149
+ if (typeof raw === "string")
150
+ return text(raw);
151
+ if (typeof raw === "number" && Number.isFinite(raw))
152
+ return text(String(raw));
153
+ if (typeof raw === "boolean")
154
+ return bool(raw);
155
+ if (typeof raw === "object" &&
156
+ raw !== null &&
157
+ typeof raw.href === "string") {
158
+ return linkValue(raw, null);
159
+ }
160
+ return undefined;
161
+ }
162
+ /** Position keys every entry carries: `index` (0-based), `first`, `last`, `depth` (1-based). */
163
+ export function positionValue(key, pos) {
164
+ switch (key) {
165
+ case "index":
166
+ return text(String(pos.index));
167
+ case "first":
168
+ return bool(pos.index === 0);
169
+ case "last":
170
+ return bool(pos.index === pos.count - 1);
171
+ case "depth":
172
+ return text(String(pos.depth));
173
+ default:
174
+ return undefined;
175
+ }
176
+ }
177
+ /** A list of entries as a scope value, with `has_`/`count_` helpers derived by the caller. */
178
+ export function listValue(entries) {
179
+ return { kind: "list", entries };
180
+ }
181
+ //# sourceMappingURL=resolve-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve-values.js","sourceRoot":"","sources":["../../src/lists/resolve-values.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ /**
2
+ * The list resolver (epic #1107, `docs/lists.md` §6, §7, §10). Turns a
3
+ * module's `list` field — local entries, a shared list, a page query, a
4
+ * system source or a plugin source — into the entry scopes the template
5
+ * engine iterates, for ONE rendering page.
6
+ *
7
+ * Built once per preview / per build from batch-loaded
8
+ * {@link ListRenderData} and cut per page with `forPage`, the same split
9
+ * as `SiteLinkIndex`: everything after loading is pure and synchronous,
10
+ * and the editor preview and the static generator get byte-identical
11
+ * output from the same input.
12
+ *
13
+ * Per page it also records what the render read ({@link ListRenderDeps}),
14
+ * which the generator writes to `render-deps.json` so an incremental
15
+ * build can rebuild exactly the pages a change reaches.
16
+ *
17
+ * Loud, never silently empty (CLAUDE.md §2): an unbound shared field, a
18
+ * deleted list, an unknown type, a plugin source whose plugin is off and
19
+ * a malformed entry all resolve to a failure marker the engine renders
20
+ * raw.
21
+ */
22
+ import type { LinkResolver } from "../link-refs.js";
23
+ import { type SourceDef } from "./list-type.js";
24
+ import type { ListRenderData, ListRenderDeps, PluginSourceEntry } from "./render-data.js";
25
+ import type { ScopeEntry, ScopeValue } from "./scope.js";
26
+ /** True for a list failure marker — the editor's missing-content surface shows these. */
27
+ export declare function isListFailureMarker(marker: string): boolean;
28
+ /** What the resolver needs from a module `list` field (`docs/lists.md` §7). */
29
+ export interface ListFieldSpec {
30
+ readonly name: string;
31
+ readonly listType: string;
32
+ readonly bind?: "local" | "shared" | "source";
33
+ readonly list?: string;
34
+ readonly source?: SourceDef;
35
+ readonly default?: unknown;
36
+ }
37
+ /** Result of resolving one list field for one page. */
38
+ export type ListFieldResolution = {
39
+ readonly ok: true;
40
+ readonly entries: readonly ScopeEntry[];
41
+ } | {
42
+ readonly ok: false;
43
+ readonly marker: string;
44
+ };
45
+ /**
46
+ * Where a local list is stored: the content instance holding the module
47
+ * field's value. Null for module field defaults (site chrome renders
48
+ * from defaults) — then entries cannot be addressed by a plugin overlay
49
+ * and carry `local/<field>/<itemId>` as their item attribute.
50
+ */
51
+ export interface ListHolder {
52
+ readonly contentInstanceId: string | null;
53
+ }
54
+ /** An overlay entry the resolver refused (unknown address, structural or invalid value). */
55
+ export interface ListOverlayIssue {
56
+ readonly variant: string;
57
+ readonly address: string;
58
+ readonly reason: string;
59
+ }
60
+ /** Per-page options of {@link ListRenderContext.forPage}. */
61
+ export interface ListPageOptions {
62
+ /** The page's link resolver; drives `is_current` URL comparison. */
63
+ readonly linkResolver?: LinkResolver;
64
+ /** Entries of every ACTIVE plugin list source for this page, keyed by source name. */
65
+ readonly pluginSources?: Readonly<Record<string, readonly PluginSourceEntry[]>>;
66
+ }
67
+ /** The list view of ONE rendering page, handed to the template engine. */
68
+ export interface ListPageContext {
69
+ /** The rendering page, or null for a render outside any page. */
70
+ readonly pageId: string | null;
71
+ /** Resolve a module list field with its placement value. */
72
+ resolveField(field: ListFieldSpec, value: unknown, holder: ListHolder): ListFieldResolution;
73
+ /** `{{page.*}}`: the rendering page as a record scope; null outside a page. */
74
+ pageScope(): ScopeValue | null;
75
+ /**
76
+ * A section name no module field declares, read as a plugin list
77
+ * source (`{{#language_links}}` written before the field kind existed).
78
+ * Null when no installed plugin declares the name.
79
+ */
80
+ pluginSource(name: string): ListFieldResolution | null;
81
+ /** What this page's render read so far. */
82
+ deps(): ListRenderDeps;
83
+ /** Overlay values this page's render refused (also the render-wide ones). */
84
+ overlayIssues(): readonly ListOverlayIssue[];
85
+ }
86
+ /** Render-wide options of {@link createListRenderContext}. */
87
+ export interface ListRenderContextOptions {
88
+ /** Source names declared by installed-but-inactive plugins → plugin slug. */
89
+ readonly dormantPluginSources?: Readonly<Record<string, string>>;
90
+ }
91
+ /** The render-wide list context; cut per page with {@link ListRenderContext.forPage}. */
92
+ export interface ListRenderContext {
93
+ forPage(pageId: string | null, opts?: ListPageOptions): ListPageContext;
94
+ /** Overlay entries refused while preparing the render (shared lists, page props). */
95
+ readonly overlayIssues: readonly ListOverlayIssue[];
96
+ }
97
+ /** Resolve one list field for a page (thin wrapper, `docs/lists.md` §10). */
98
+ export declare function resolveListField(field: ListFieldSpec, value: unknown, page: ListPageContext, holder?: ListHolder): ListFieldResolution;
99
+ /** Build the render-wide list context from loaded data. */
100
+ export declare function createListRenderContext(data: ListRenderData, opts?: ListRenderContextOptions): ListRenderContext;
101
+ /** Every embedded module a set of shared lists references (`module` fields), for batch loading. */
102
+ export declare function collectListModuleRefs(data: Pick<ListRenderData, "lists" | "listTypes">): {
103
+ moduleId: string;
104
+ contentInstanceId: string;
105
+ }[];
106
+ //# sourceMappingURL=resolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../src/lists/resolve.ts"],"names":[],"mappings":"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"}