@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 @@
1
+ {"version":3,"file":"address.js","sourceRoot":"","sources":["../../src/lists/address.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAiCnC,MAAM,GAAG,GAAG,aAAa,CAAC;AAC1B,MAAM,UAAU,GAAG,IAAI,MAAM,CAC3B,aAAa,GAAG,WAAW,GAAG,MAAM,GAAG,GAAG;IACxC,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,MAAM,GAAG,GAAG;IACpD,UAAU,GAAG,YAAY,GAAG,GAAG;IAC/B,eAAe,GAAG,WAAW,GAAG,MAAM,GAAG,KAAK,CACjD,CAAC;AAEF,iDAAiD;AACjD,MAAM,UAAU,kBAAkB,CAAC,CAAe;IAChD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,CAAC,MAAM,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACxD,KAAK,UAAU;YACb,OAAO,YAAY,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QACtF,KAAK,UAAU;YACb,OAAO,QAAQ,CAAC,CAAC,MAAM,UAAU,CAAC,CAAC,KAAK,EAAE,CAAC;QAC7C,KAAK,eAAe;YAClB,OAAO,aAAa,CAAC,CAAC,UAAU,SAAS,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;IACjE,CAAC;AACH,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,iBAAiB,CAAC,CAAS;IACzC,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACpB,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3F,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACjC,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC;YACvB,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;YACX,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC;YACZ,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC;SAChB,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;IACjF,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * The list types every install starts with (epic #1107,
3
+ * `docs/lists.md` §3). They are seeded as STORED data by migration 0352
4
+ * and edited like any other type afterwards — these objects are the
5
+ * source the seed and the tests share, not a render-time fallback
6
+ * (CLAUDE.md §2).
7
+ */
8
+ import type { ListTypeDef } from "./list-type.js";
9
+ export declare const DEFAULT_LIST_TYPES: readonly ListTypeDef[];
10
+ //# sourceMappingURL=default-types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-types.d.ts","sourceRoot":"","sources":["../../src/lists/default-types.ts"],"names":[],"mappings":"AAEA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAElD,eAAO,MAAM,kBAAkB,EAAE,SAAS,WAAW,EAyFpD,CAAC"}
@@ -0,0 +1,91 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ export const DEFAULT_LIST_TYPES = [
3
+ {
4
+ slug: "texts",
5
+ name: "Texts",
6
+ purpose: "A flat list of short texts inside one module: feature bullets, chips, steps.",
7
+ role: "content",
8
+ root: { allow: ["text"] },
9
+ nodes: {
10
+ text: {
11
+ label: "Text",
12
+ fields: [{ name: "text", label: "Text", type: "text", required: true }],
13
+ },
14
+ },
15
+ },
16
+ {
17
+ slug: "links",
18
+ name: "Links",
19
+ purpose: "A flat group of links: legal links, social links, a footer column.",
20
+ role: "content",
21
+ root: { allow: ["link"] },
22
+ nodes: {
23
+ link: {
24
+ label: "Link",
25
+ fields: [
26
+ { name: "label", label: "Label", type: "text", required: true },
27
+ { name: "link", label: "Link", type: "link", required: true },
28
+ ],
29
+ current_from: "link",
30
+ },
31
+ },
32
+ },
33
+ {
34
+ slug: "menu",
35
+ name: "Menu",
36
+ purpose: "Site navigation with up to three levels: header menu, footer menu, mobile menu. Use a custom type for mega menus with columns or teasers.",
37
+ role: "navigation",
38
+ root: { allow: ["entry"] },
39
+ nodes: {
40
+ entry: {
41
+ label: "Menu entry",
42
+ fields: [
43
+ { name: "label", label: "Label", type: "text", required: true },
44
+ { name: "link", label: "Link", type: "link" },
45
+ ],
46
+ children: { name: "children", allow: ["entry"] },
47
+ current_from: "link",
48
+ },
49
+ },
50
+ max_depth: 3,
51
+ },
52
+ {
53
+ slug: "categories",
54
+ name: "Categories",
55
+ purpose: "A category tree pages are assigned to: blog sections, product groups, doc areas.",
56
+ role: "vocabulary",
57
+ root: { allow: ["category"] },
58
+ nodes: {
59
+ category: {
60
+ label: "Category",
61
+ fields: [
62
+ { name: "name", label: "Name", type: "text", required: true },
63
+ { name: "slug", label: "Slug", type: "text", required: true },
64
+ { name: "description", label: "Description", type: "richtext" },
65
+ { name: "landing_page", label: "Landing page", type: "link" },
66
+ ],
67
+ children: { name: "children", allow: ["category"] },
68
+ current_from: "landing_page",
69
+ },
70
+ },
71
+ max_depth: 6,
72
+ },
73
+ {
74
+ slug: "tags",
75
+ name: "Tags",
76
+ purpose: "Flat keywords pages are tagged with, for filters, tag clouds and related content.",
77
+ role: "vocabulary",
78
+ root: { allow: ["tag"] },
79
+ nodes: {
80
+ tag: {
81
+ label: "Tag",
82
+ fields: [
83
+ { name: "name", label: "Name", type: "text", required: true },
84
+ { name: "slug", label: "Slug", type: "text", required: true },
85
+ { name: "color", label: "Color", type: "text", maxLength: 9 },
86
+ ],
87
+ },
88
+ },
89
+ },
90
+ ];
91
+ //# sourceMappingURL=default-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"default-types.js","sourceRoot":"","sources":["../../src/lists/default-types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ /**
2
+ * The field system shared by list types (entry fields) and page types
3
+ * (page properties) — epic #1107, `docs/lists.md` §2.
4
+ *
5
+ * A list imposes no shape of its own: no entry must have a label or a
6
+ * link. The list type declares fields once, and every stored value is
7
+ * checked against that declaration at write time. One set of field types
8
+ * keeps list entries, page properties and future definitions speaking the
9
+ * same language, so the editor generates every form from the same code
10
+ * and the template engine renders every value the same way.
11
+ *
12
+ * `ext` carries attributes a plugin declared for fields (translation is
13
+ * the canonical case). Core stores and validates them against the
14
+ * plugin's schema but never interprets them — core has no locale concept
15
+ * (epic #380).
16
+ */
17
+ import { z } from "zod";
18
+ /** Every field type a definition may declare. */
19
+ export declare const LIST_FIELD_TYPES: readonly ["text", "richtext", "link", "media", "select", "boolean", "number", "date", "icon", "module", "term"];
20
+ export type ListFieldType = (typeof LIST_FIELD_TYPES)[number];
21
+ /**
22
+ * Names the template engine binds itself inside a list entry, so a field
23
+ * or children list may not take them. Prefixes `is_`, `has_`, `count_`
24
+ * are reserved as a family (`is_<node>`, `has_<children>`,
25
+ * `count_<children>`).
26
+ */
27
+ export declare const LIST_RESERVED_NAMES: ReadonlySet<string>;
28
+ /** True when `name` is taken by the engine (see {@link LIST_RESERVED_NAMES}). */
29
+ export declare function isReservedListName(name: string): boolean;
30
+ export declare const listNameSchema: z.ZodString;
31
+ /** Plugin-declared attributes keyed by plugin slug; validated by the host. */
32
+ export declare const fieldExtSchema: z.ZodRecord<z.ZodString, z.ZodUnknown>;
33
+ /** One field declaration. See `docs/lists.md` §2 for the value shapes. */
34
+ export declare const fieldDefSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
35
+ type: z.ZodLiteral<"text">;
36
+ maxLength: z.ZodOptional<z.ZodNumber>;
37
+ name: z.ZodString;
38
+ label: z.ZodString;
39
+ required: z.ZodOptional<z.ZodBoolean>;
40
+ default: z.ZodOptional<z.ZodUnknown>;
41
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
42
+ }, z.core.$strict>, z.ZodObject<{
43
+ type: z.ZodLiteral<"richtext">;
44
+ maxLength: z.ZodOptional<z.ZodNumber>;
45
+ name: z.ZodString;
46
+ label: z.ZodString;
47
+ required: z.ZodOptional<z.ZodBoolean>;
48
+ default: z.ZodOptional<z.ZodUnknown>;
49
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
50
+ }, z.core.$strict>, z.ZodObject<{
51
+ type: z.ZodLiteral<"link">;
52
+ name: z.ZodString;
53
+ label: z.ZodString;
54
+ required: z.ZodOptional<z.ZodBoolean>;
55
+ default: z.ZodOptional<z.ZodUnknown>;
56
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
57
+ }, z.core.$strict>, z.ZodObject<{
58
+ type: z.ZodLiteral<"media">;
59
+ name: z.ZodString;
60
+ label: z.ZodString;
61
+ required: z.ZodOptional<z.ZodBoolean>;
62
+ default: z.ZodOptional<z.ZodUnknown>;
63
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
64
+ }, z.core.$strict>, z.ZodObject<{
65
+ type: z.ZodLiteral<"select">;
66
+ options: z.ZodArray<z.ZodString>;
67
+ name: z.ZodString;
68
+ label: z.ZodString;
69
+ required: z.ZodOptional<z.ZodBoolean>;
70
+ default: z.ZodOptional<z.ZodUnknown>;
71
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
72
+ }, z.core.$strict>, z.ZodObject<{
73
+ type: z.ZodLiteral<"boolean">;
74
+ name: z.ZodString;
75
+ label: z.ZodString;
76
+ required: z.ZodOptional<z.ZodBoolean>;
77
+ default: z.ZodOptional<z.ZodUnknown>;
78
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
79
+ }, z.core.$strict>, z.ZodObject<{
80
+ type: z.ZodLiteral<"number">;
81
+ min: z.ZodOptional<z.ZodNumber>;
82
+ max: z.ZodOptional<z.ZodNumber>;
83
+ name: z.ZodString;
84
+ label: z.ZodString;
85
+ required: z.ZodOptional<z.ZodBoolean>;
86
+ default: z.ZodOptional<z.ZodUnknown>;
87
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
88
+ }, z.core.$strict>, z.ZodObject<{
89
+ type: z.ZodLiteral<"date">;
90
+ name: z.ZodString;
91
+ label: z.ZodString;
92
+ required: z.ZodOptional<z.ZodBoolean>;
93
+ default: z.ZodOptional<z.ZodUnknown>;
94
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
95
+ }, z.core.$strict>, z.ZodObject<{
96
+ type: z.ZodLiteral<"icon">;
97
+ name: z.ZodString;
98
+ label: z.ZodString;
99
+ required: z.ZodOptional<z.ZodBoolean>;
100
+ default: z.ZodOptional<z.ZodUnknown>;
101
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
102
+ }, z.core.$strict>, z.ZodObject<{
103
+ type: z.ZodLiteral<"module">;
104
+ accepts: z.ZodOptional<z.ZodArray<z.ZodString>>;
105
+ name: z.ZodString;
106
+ label: z.ZodString;
107
+ required: z.ZodOptional<z.ZodBoolean>;
108
+ default: z.ZodOptional<z.ZodUnknown>;
109
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
110
+ }, z.core.$strict>, z.ZodObject<{
111
+ type: z.ZodLiteral<"term">;
112
+ list: z.ZodString;
113
+ multiple: z.ZodOptional<z.ZodBoolean>;
114
+ name: z.ZodString;
115
+ label: z.ZodString;
116
+ required: z.ZodOptional<z.ZodBoolean>;
117
+ default: z.ZodOptional<z.ZodUnknown>;
118
+ ext: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
119
+ }, z.core.$strict>], "type">;
120
+ export type FieldDef = z.infer<typeof fieldDefSchema>;
121
+ /** Stored value of a `link` field. `href` may be an internal reference. */
122
+ export declare const linkValueSchema: z.ZodObject<{
123
+ href: z.ZodString;
124
+ target: z.ZodOptional<z.ZodEnum<{
125
+ _self: "_self";
126
+ _blank: "_blank";
127
+ }>>;
128
+ }, z.core.$strict>;
129
+ export type LinkValue = z.infer<typeof linkValueSchema>;
130
+ /** Stored value of a `module` field — the same ref shape as module fields. */
131
+ export declare const embeddedModuleValueSchema: z.ZodObject<{
132
+ moduleId: z.ZodString;
133
+ contentInstanceId: z.ZodString;
134
+ }, z.core.$strict>;
135
+ /** `caelo:term/<listId>/<itemId>` */
136
+ export declare const TERM_REF_RE: RegExp;
137
+ /** One problem found while checking a definition or a value. */
138
+ export interface ListIssue {
139
+ /** Where the problem is, e.g. `items[2].values.label` or `nodes.entry.fields[0]`. */
140
+ readonly path: string;
141
+ /** What is wrong and what to do about it, written for the AI caller. */
142
+ readonly message: string;
143
+ }
144
+ /**
145
+ * Validate one stored value against its field. Returns the issues found
146
+ * (empty = valid). `undefined` is "not set" and only an issue when the
147
+ * field is required.
148
+ */
149
+ export declare function validateFieldValue(field: FieldDef, value: unknown, path: string): ListIssue[];
150
+ /** Checks on one field declaration that Zod cannot express. */
151
+ export declare function checkFieldDef(field: FieldDef, path: string): ListIssue[];
152
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../src/lists/fields.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,eAAO,MAAM,gBAAgB,iHAYnB,CAAC;AACX,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,gBAAgB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,MAAM,CAUlD,CAAC;AAGH,iFAAiF;AACjF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAExD;AAED,eAAO,MAAM,cAAc,aAEsE,CAAC;AAIlG,8EAA8E;AAC9E,eAAO,MAAM,cAAc,wCAA0D,CAAC;AAiEtF,0EAA0E;AAC1E,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BAYzB,CAAC;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEtD,2EAA2E;AAC3E,eAAO,MAAM,eAAe;;;;;;kBAKjB,CAAC;AACZ,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,eAAe,CAAC,CAAC;AAExD,8EAA8E;AAC9E,eAAO,MAAM,yBAAyB;;;kBAE3B,CAAC;AAGZ,qCAAqC;AACrC,eAAO,MAAM,WAAW,QAAmD,CAAC;AAO5E,gEAAgE;AAChE,MAAM,WAAW,SAAS;IACxB,qFAAqF;IACrF,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,wEAAwE;IACxE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA+D7F;AAED,+DAA+D;AAC/D,wBAAgB,aAAa,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,EAAE,CA0BxE"}
@@ -0,0 +1,258 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * The field system shared by list types (entry fields) and page types
4
+ * (page properties) — epic #1107, `docs/lists.md` §2.
5
+ *
6
+ * A list imposes no shape of its own: no entry must have a label or a
7
+ * link. The list type declares fields once, and every stored value is
8
+ * checked against that declaration at write time. One set of field types
9
+ * keeps list entries, page properties and future definitions speaking the
10
+ * same language, so the editor generates every form from the same code
11
+ * and the template engine renders every value the same way.
12
+ *
13
+ * `ext` carries attributes a plugin declared for fields (translation is
14
+ * the canonical case). Core stores and validates them against the
15
+ * plugin's schema but never interprets them — core has no locale concept
16
+ * (epic #380).
17
+ */
18
+ import { z } from "zod";
19
+ /** Every field type a definition may declare. */
20
+ export const LIST_FIELD_TYPES = [
21
+ "text",
22
+ "richtext",
23
+ "link",
24
+ "media",
25
+ "select",
26
+ "boolean",
27
+ "number",
28
+ "date",
29
+ "icon",
30
+ "module",
31
+ "term",
32
+ ];
33
+ /**
34
+ * Names the template engine binds itself inside a list entry, so a field
35
+ * or children list may not take them. Prefixes `is_`, `has_`, `count_`
36
+ * are reserved as a family (`is_<node>`, `has_<children>`,
37
+ * `count_<children>`).
38
+ */
39
+ export const LIST_RESERVED_NAMES = new Set([
40
+ "id",
41
+ "node",
42
+ "index",
43
+ "depth",
44
+ "first",
45
+ "last",
46
+ "items",
47
+ "page",
48
+ "recurse",
49
+ ]);
50
+ const RESERVED_PREFIXES = ["is_", "has_", "count_"];
51
+ /** True when `name` is taken by the engine (see {@link LIST_RESERVED_NAMES}). */
52
+ export function isReservedListName(name) {
53
+ return LIST_RESERVED_NAMES.has(name) || RESERVED_PREFIXES.some((p) => name.startsWith(p));
54
+ }
55
+ export const listNameSchema = z
56
+ .string()
57
+ .regex(/^[a-z][a-z0-9_]{0,63}$/, "must be snake_case (lowercase letters, digits, underscores)");
58
+ const fieldLabel = z.string().min(1).max(128);
59
+ /** Plugin-declared attributes keyed by plugin slug; validated by the host. */
60
+ export const fieldExtSchema = z.record(z.string().regex(/^[a-z0-9-]+$/), z.unknown());
61
+ const base = {
62
+ name: listNameSchema,
63
+ label: fieldLabel,
64
+ required: z.boolean().optional(),
65
+ default: z.unknown().optional(),
66
+ ext: fieldExtSchema.optional(),
67
+ };
68
+ const textField = z
69
+ .object({
70
+ ...base,
71
+ type: z.literal("text"),
72
+ maxLength: z.number().int().min(1).max(2000).optional(),
73
+ })
74
+ .strict();
75
+ const richtextField = z
76
+ .object({
77
+ ...base,
78
+ type: z.literal("richtext"),
79
+ maxLength: z.number().int().min(1).max(20000).optional(),
80
+ })
81
+ .strict();
82
+ const linkField = z.object({ ...base, type: z.literal("link") }).strict();
83
+ const mediaField = z.object({ ...base, type: z.literal("media") }).strict();
84
+ const selectField = z
85
+ .object({
86
+ ...base,
87
+ type: z.literal("select"),
88
+ options: z.array(listNameSchema).min(1).max(64),
89
+ })
90
+ .strict();
91
+ const booleanField = z.object({ ...base, type: z.literal("boolean") }).strict();
92
+ const numberField = z
93
+ .object({
94
+ ...base,
95
+ type: z.literal("number"),
96
+ min: z.number().optional(),
97
+ max: z.number().optional(),
98
+ })
99
+ .strict();
100
+ const dateField = z.object({ ...base, type: z.literal("date") }).strict();
101
+ const iconField = z.object({ ...base, type: z.literal("icon") }).strict();
102
+ const moduleField = z
103
+ .object({
104
+ ...base,
105
+ type: z.literal("module"),
106
+ /** Stable module `type`s that may fill the slot; absent = any module. */
107
+ accepts: z
108
+ .array(z.string().regex(/^[a-z0-9-]+$/))
109
+ .max(32)
110
+ .optional(),
111
+ })
112
+ .strict();
113
+ const termField = z
114
+ .object({
115
+ ...base,
116
+ type: z.literal("term"),
117
+ /** Slug of the vocabulary list the terms come from. */
118
+ list: z.string().regex(/^[a-z0-9-]+$/),
119
+ multiple: z.boolean().optional(),
120
+ })
121
+ .strict();
122
+ /** One field declaration. See `docs/lists.md` §2 for the value shapes. */
123
+ export const fieldDefSchema = z.discriminatedUnion("type", [
124
+ textField,
125
+ richtextField,
126
+ linkField,
127
+ mediaField,
128
+ selectField,
129
+ booleanField,
130
+ numberField,
131
+ dateField,
132
+ iconField,
133
+ moduleField,
134
+ termField,
135
+ ]);
136
+ /** Stored value of a `link` field. `href` may be an internal reference. */
137
+ export const linkValueSchema = z
138
+ .object({
139
+ href: z.string().min(1).max(2000),
140
+ target: z.enum(["_self", "_blank"]).optional(),
141
+ })
142
+ .strict();
143
+ /** Stored value of a `module` field — the same ref shape as module fields. */
144
+ export const embeddedModuleValueSchema = z
145
+ .object({ moduleId: z.string().uuid(), contentInstanceId: z.string().uuid() })
146
+ .strict();
147
+ const MEDIA_REF_RE = /^caelo:media\/[0-9a-f-]{36}(?:\/[a-z0-9-]+)?$/;
148
+ /** `caelo:term/<listId>/<itemId>` */
149
+ export const TERM_REF_RE = /^caelo:term\/([0-9a-f-]{36})\/([0-9a-f-]{36})$/;
150
+ const ISO_DATE_RE = /^\d{4}-\d{2}-\d{2}$/;
151
+ const ICON_RE = /^[a-z0-9-]{1,64}$/;
152
+ const DEFAULT_TEXT_MAX = 500;
153
+ const DEFAULT_RICHTEXT_MAX = 5000;
154
+ /**
155
+ * Validate one stored value against its field. Returns the issues found
156
+ * (empty = valid). `undefined` is "not set" and only an issue when the
157
+ * field is required.
158
+ */
159
+ export function validateFieldValue(field, value, path) {
160
+ if (value === undefined || value === null) {
161
+ return field.required
162
+ ? [{ path, message: `"${field.name}" is required (${field.type}) — set a value.` }]
163
+ : [];
164
+ }
165
+ const bad = (expected) => [
166
+ { path, message: `"${field.name}" must be ${expected}, got ${describe(value)}.` },
167
+ ];
168
+ switch (field.type) {
169
+ case "text":
170
+ case "richtext": {
171
+ if (typeof value !== "string")
172
+ return bad("a string");
173
+ const max = field.maxLength ?? (field.type === "text" ? DEFAULT_TEXT_MAX : DEFAULT_RICHTEXT_MAX);
174
+ if (value.length > max)
175
+ return bad(`at most ${max} characters`);
176
+ if (field.required && value.trim().length === 0)
177
+ return bad("non-empty text");
178
+ return [];
179
+ }
180
+ case "link": {
181
+ const r = linkValueSchema.safeParse(value);
182
+ return r.success ? [] : bad('{ href, target? } (href like "/about" or "https://…")');
183
+ }
184
+ case "media":
185
+ return typeof value === "string" && MEDIA_REF_RE.test(value)
186
+ ? []
187
+ : bad("a media reference (caelo:media/<id>) — pick an asset from find_media");
188
+ case "select":
189
+ return typeof value === "string" && field.options.includes(value)
190
+ ? []
191
+ : bad(`one of ${field.options.map((o) => `"${o}"`).join(", ")}`);
192
+ case "boolean":
193
+ return typeof value === "boolean" ? [] : bad("true or false");
194
+ case "number": {
195
+ if (typeof value !== "number" || !Number.isFinite(value))
196
+ return bad("a number");
197
+ if (field.min !== undefined && value < field.min)
198
+ return bad(`≥ ${field.min}`);
199
+ if (field.max !== undefined && value > field.max)
200
+ return bad(`≤ ${field.max}`);
201
+ return [];
202
+ }
203
+ case "date":
204
+ return typeof value === "string" &&
205
+ ISO_DATE_RE.test(value) &&
206
+ !Number.isNaN(Date.parse(value))
207
+ ? []
208
+ : bad("an ISO date YYYY-MM-DD");
209
+ case "icon":
210
+ return typeof value === "string" && ICON_RE.test(value) ? [] : bad("an icon name");
211
+ case "module":
212
+ return embeddedModuleValueSchema.safeParse(value).success
213
+ ? []
214
+ : bad("{ moduleId, contentInstanceId }");
215
+ case "term": {
216
+ if (!Array.isArray(value) ||
217
+ value.some((v) => typeof v !== "string" || !TERM_REF_RE.test(v))) {
218
+ return bad("an array of term references (caelo:term/<listId>/<itemId>)");
219
+ }
220
+ if (!field.multiple && value.length > 1)
221
+ return bad("at most one term (multiple is off)");
222
+ if (field.required && value.length === 0)
223
+ return bad("at least one term");
224
+ return [];
225
+ }
226
+ }
227
+ }
228
+ /** Checks on one field declaration that Zod cannot express. */
229
+ export function checkFieldDef(field, path) {
230
+ const issues = [];
231
+ if (isReservedListName(field.name)) {
232
+ issues.push({
233
+ path,
234
+ message: `field name "${field.name}" is reserved by the template engine — pick another name.`,
235
+ });
236
+ }
237
+ if (field.default !== undefined) {
238
+ for (const i of validateFieldValue({ ...field, required: false }, field.default, `${path}.default`)) {
239
+ issues.push(i);
240
+ }
241
+ }
242
+ if (field.type === "number" &&
243
+ field.min !== undefined &&
244
+ field.max !== undefined &&
245
+ field.min > field.max) {
246
+ issues.push({ path, message: "min is greater than max." });
247
+ }
248
+ return issues;
249
+ }
250
+ function describe(value) {
251
+ if (Array.isArray(value))
252
+ return "an array";
253
+ if (value === null)
254
+ return "null";
255
+ const s = typeof value === "string" ? JSON.stringify(value.slice(0, 40)) : typeof value;
256
+ return s;
257
+ }
258
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../src/lists/fields.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,iDAAiD;AACjD,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,MAAM;IACN,UAAU;IACV,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;IACT,QAAQ;IACR,MAAM;IACN,MAAM;IACN,QAAQ;IACR,MAAM;CACE,CAAC;AAGX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAAC;IAC9D,IAAI;IACJ,MAAM;IACN,OAAO;IACP,OAAO;IACP,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,SAAS;CACV,CAAC,CAAC;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,CAAU,CAAC;AAE7D,iFAAiF;AACjF,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,OAAO,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;AAC5F,CAAC;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC;KAC5B,MAAM,EAAE;KACR,KAAK,CAAC,wBAAwB,EAAE,6DAA6D,CAAC,CAAC;AAElG,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAE9C,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;AAEtF,MAAM,IAAI,GAAG;IACX,IAAI,EAAE,cAAc;IACpB,KAAK,EAAE,UAAU;IACjB,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAChC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,GAAG,EAAE,cAAc,CAAC,QAAQ,EAAE;CAC/B,CAAC;AAEF,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;CACxD,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,aAAa,GAAG,CAAC;KACpB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IAC3B,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;CACzD,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1E,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC5E,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;CAChD,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAChF,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC1B,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC3B,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1E,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC;AAC1E,MAAM,WAAW,GAAG,CAAC;KAClB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACzB,yEAAyE;IACzE,OAAO,EAAE,CAAC;SACP,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;SACvC,GAAG,CAAC,EAAE,CAAC;SACP,QAAQ,EAAE;CACd,CAAC;KACD,MAAM,EAAE,CAAC;AACZ,MAAM,SAAS,GAAG,CAAC;KAChB,MAAM,CAAC;IACN,GAAG,IAAI;IACP,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC;IACvB,uDAAuD;IACvD,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,cAAc,CAAC;IACtC,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACjC,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,CAAC,kBAAkB,CAAC,MAAM,EAAE;IACzD,SAAS;IACT,aAAa;IACb,SAAS;IACT,UAAU;IACV,WAAW;IACX,YAAY;IACZ,WAAW;IACX,SAAS;IACT,SAAS;IACT,WAAW;IACX,SAAS;CACV,CAAC,CAAC;AAGH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC;KAC7B,MAAM,CAAC;IACN,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;IACjC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;CAC/C,CAAC;KACD,MAAM,EAAE,CAAC;AAGZ,8EAA8E;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC;KACvC,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;KAC7E,MAAM,EAAE,CAAC;AAEZ,MAAM,YAAY,GAAG,+CAA+C,CAAC;AACrE,qCAAqC;AACrC,MAAM,CAAC,MAAM,WAAW,GAAG,gDAAgD,CAAC;AAC5E,MAAM,WAAW,GAAG,qBAAqB,CAAC;AAC1C,MAAM,OAAO,GAAG,mBAAmB,CAAC;AAEpC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,oBAAoB,GAAG,IAAI,CAAC;AAUlC;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAe,EAAE,KAAc,EAAE,IAAY;IAC9E,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QAC1C,OAAO,KAAK,CAAC,QAAQ;YACnB,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,kBAAkB,KAAK,CAAC,IAAI,kBAAkB,EAAE,CAAC;YACnF,CAAC,CAAC,EAAE,CAAC;IACT,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,QAAgB,EAAe,EAAE,CAAC;QAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,KAAK,CAAC,IAAI,aAAa,QAAQ,SAAS,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE;KAClF,CAAC;IACF,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC,CAAC,CAAC;YAChB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;YACtD,MAAM,GAAG,GACP,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,oBAAoB,CAAC,CAAC;YACvF,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG;gBAAE,OAAO,GAAG,CAAC,WAAW,GAAG,aAAa,CAAC,CAAC;YAChE,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,eAAe,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;YAC3C,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;QACvF,CAAC;QACD,KAAK,OAAO;YACV,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC;gBAC1D,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QAClF,KAAK,QAAQ;YACX,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAC/D,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,KAAK,SAAS;YACZ,OAAO,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAChE,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC,UAAU,CAAC,CAAC;YACjF,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG;gBAAE,OAAO,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/E,IAAI,KAAK,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,GAAG,KAAK,CAAC,GAAG;gBAAE,OAAO,GAAG,CAAC,KAAK,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAC/E,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,KAAK,QAAQ;gBAC9B,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;gBACvB,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAChC,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACpC,KAAK,MAAM;YACT,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACrF,KAAK,QAAQ;YACX,OAAO,yBAAyB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO;gBACvD,CAAC,CAAC,EAAE;gBACJ,CAAC,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAC7C,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACrB,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAChE,CAAC;gBACD,OAAO,GAAG,CAAC,4DAA4D,CAAC,CAAC;YAC3E,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC,oCAAoC,CAAC,CAAC;YAC1F,IAAI,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,GAAG,CAAC,mBAAmB,CAAC,CAAC;YAC1E,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,aAAa,CAAC,KAAe,EAAE,IAAY;IACzD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,IAAI,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,OAAO,EAAE,eAAe,KAAK,CAAC,IAAI,2DAA2D;SAC9F,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAChC,KAAK,MAAM,CAAC,IAAI,kBAAkB,CAChC,EAAE,GAAG,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,EAC7B,KAAK,CAAC,OAAO,EACb,GAAG,IAAI,UAAU,CAClB,EAAE,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACjB,CAAC;IACH,CAAC;IACD,IACE,KAAK,CAAC,IAAI,KAAK,QAAQ;QACvB,KAAK,CAAC,GAAG,KAAK,SAAS;QACvB,KAAK,CAAC,GAAG,KAAK,SAAS;QACvB,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EACrB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,MAAM,CAAC,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC;IACxF,OAAO,CAAC,CAAC;AACX,CAAC"}
@@ -0,0 +1,14 @@
1
+ /** Lists, list types, page types — epic #1107, see `docs/lists.md`. */
2
+ export * from "./address.js";
3
+ export * from "./default-types.js";
4
+ export * from "./fields.js";
5
+ export * from "./item-attr.js";
6
+ export * from "./items.js";
7
+ export * from "./list-type.js";
8
+ export * from "./page-type.js";
9
+ export * from "./refs.js";
10
+ export * from "./render-data.js";
11
+ export * from "./render-deps.js";
12
+ export * from "./resolve.js";
13
+ export * from "./scope.js";
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAEA,uEAAuE;AAEvE,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,15 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /** Lists, list types, page types — epic #1107, see `docs/lists.md`. */
3
+ export * from "./address.js";
4
+ export * from "./default-types.js";
5
+ export * from "./fields.js";
6
+ export * from "./item-attr.js";
7
+ export * from "./items.js";
8
+ export * from "./list-type.js";
9
+ export * from "./page-type.js";
10
+ export * from "./refs.js";
11
+ export * from "./render-data.js";
12
+ export * from "./render-deps.js";
13
+ export * from "./resolve.js";
14
+ export * from "./scope.js";
15
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lists/index.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC,uEAAuE;AAEvE,cAAc,cAAc,CAAC;AAC7B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC;AAC5B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** Every form a `data-caelo-list-item` value takes. */
2
+ export declare const LIST_ITEM_ATTR_RE: RegExp;
3
+ /** A parsed `data-caelo-list-item` value. */
4
+ export type ListItemAttr =
5
+ /** An entry of a shared list. */
6
+ {
7
+ readonly kind: "shared";
8
+ readonly listId: string;
9
+ readonly itemId: string;
10
+ }
11
+ /** An entry of a module's own list, stored in a content instance. */
12
+ | {
13
+ readonly kind: "instance";
14
+ readonly contentInstanceId: string;
15
+ readonly field: string;
16
+ readonly itemId: string;
17
+ }
18
+ /** An entry of a module field's default list (site chrome without stored content). */
19
+ | {
20
+ readonly kind: "local";
21
+ readonly field: string;
22
+ readonly itemId: string;
23
+ };
24
+ /** Parse a `data-caelo-list-item` value; null when it is not one. */
25
+ export declare function parseListItemAttr(value: string): ListItemAttr | null;
26
+ //# sourceMappingURL=item-attr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-attr.d.ts","sourceRoot":"","sources":["../../src/lists/item-attr.ts"],"names":[],"mappings":"AAaA,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,QAE7B,CAAC;AAEF,6CAA6C;AAC7C,MAAM,MAAM,YAAY;AACtB,iCAAiC;AAC/B;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AAC/E,qEAAqE;GACnE;IACE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AACH,sFAAsF;GACpF;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhF,qEAAqE;AACrE,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAepE"}
@@ -0,0 +1,31 @@
1
+ // SPDX-License-Identifier: MPL-2.0
2
+ /**
3
+ * The `data-caelo-list-item` value the engine stamps on a rendered stored
4
+ * list entry (epic #1107, `docs/lists.md` §13), parsed. Live Edit sends it
5
+ * with a click-to-chat reference so the chip names the list entry, not the
6
+ * whole module, and the AI edits that entry with the list tools (shared
7
+ * list) or the content tools (a module's own list).
8
+ */
9
+ const UUID = "[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}";
10
+ const NAME = "[a-z][a-z0-9_]{0,63}";
11
+ /** Every form a `data-caelo-list-item` value takes. */
12
+ export const LIST_ITEM_ATTR_RE = new RegExp(`^(?:${UUID}/${UUID}|instance/${UUID}/${NAME}/${UUID}|local/${NAME}/${UUID})$`);
13
+ /** Parse a `data-caelo-list-item` value; null when it is not one. */
14
+ export function parseListItemAttr(value) {
15
+ if (!LIST_ITEM_ATTR_RE.test(value))
16
+ return null;
17
+ const parts = value.split("/");
18
+ if (parts[0] === "instance") {
19
+ return {
20
+ kind: "instance",
21
+ contentInstanceId: parts[1],
22
+ field: parts[2],
23
+ itemId: parts[3],
24
+ };
25
+ }
26
+ if (parts[0] === "local") {
27
+ return { kind: "local", field: parts[1], itemId: parts[2] };
28
+ }
29
+ return { kind: "shared", listId: parts[0], itemId: parts[1] };
30
+ }
31
+ //# sourceMappingURL=item-attr.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"item-attr.js","sourceRoot":"","sources":["../../src/lists/item-attr.ts"],"names":[],"mappings":"AAAA,mCAAmC;AAEnC;;;;;;GAMG;AAEH,MAAM,IAAI,GAAG,8DAA8D,CAAC;AAC5E,MAAM,IAAI,GAAG,sBAAsB,CAAC;AAEpC,uDAAuD;AACvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,MAAM,CACzC,OAAO,IAAI,IAAI,IAAI,aAAa,IAAI,IAAI,IAAI,IAAI,IAAI,UAAU,IAAI,IAAI,IAAI,IAAI,CAC/E,CAAC;AAgBF,qEAAqE;AACrE,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,UAAU;YAChB,iBAAiB,EAAE,KAAK,CAAC,CAAC,CAAW;YACrC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAW;YACzB,MAAM,EAAE,KAAK,CAAC,CAAC,CAAW;SAC3B,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC;QACzB,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAC;IAClF,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAW,EAAE,CAAC;AACpF,CAAC"}