@syncropel/projections 0.2.0 → 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,14 @@
2
2
 
3
3
  All notable changes to `@syncropel/projections` are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); this project uses [SemVer](https://semver.org/spec/v2.0.0.html).
4
4
 
5
+ ## [0.2.1] — 2026-05-18
6
+
7
+ Additive, backwards-compatible — a `data-table` column rendering hint.
8
+
9
+ ### Features
10
+
11
+ - **`data-table` column `kind`** — a column may now declare `kind: "text" | "chip"`. `text` (default) renders a plain string cell; `chip` renders the value as a compact metadata chip. New `TableCellKind` token union. Validators reject any other value. Every 0.2.0 document remains valid — `kind` is optional and defaults to `text`.
12
+
5
13
  ## [0.2.0] — 2026-05-17
6
14
 
7
15
  SRP v0.2 — five interactive container + input node types. Additive and backwards-compatible: every v0.1 document remains valid; the `srp` field now accepts `"0.1"` or `"0.2"`. See ADR-102.
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@
10
10
  *
11
11
  * Docs: https://syncropel.com
12
12
  */
13
- export type { SRPDocument, SRPMeta, SRPNode, NodeType, ColumnNode, RowNode, GridNode, CardNode, DividerNode, RecordLineNode, RecordLineListNode, ChipNode, HeadingNode, TextNode, StatNode, KeyValueNode, ButtonNode, IconButtonNode, CopyButtonNode, SelectNode, EmptyStateNode, ErrorStateNode, SkeletonNode, TabsNode, DataTableNode, BoardNode, TextInputNode, FormNode, Gap, Padding, DividerSpacing, Cols, ColumnAlign, RowAlign, Justify, RecordLineVariant, ChipTone, TextSize, TextWeight, TextTone, ButtonVariant, ButtonSize, SkeletonShape, TableColumnAlign, DataTableVariant, TextInputKind, GlyphKind, ActionDesc, VQLQuery, } from "./schema.js";
13
+ export type { SRPDocument, SRPMeta, SRPNode, NodeType, ColumnNode, RowNode, GridNode, CardNode, DividerNode, RecordLineNode, RecordLineListNode, ChipNode, HeadingNode, TextNode, StatNode, KeyValueNode, ButtonNode, IconButtonNode, CopyButtonNode, SelectNode, EmptyStateNode, ErrorStateNode, SkeletonNode, TabsNode, DataTableNode, BoardNode, TextInputNode, FormNode, Gap, Padding, DividerSpacing, Cols, ColumnAlign, RowAlign, Justify, RecordLineVariant, ChipTone, TextSize, TextWeight, TextTone, ButtonVariant, ButtonSize, SkeletonShape, TableColumnAlign, TableCellKind, DataTableVariant, TextInputKind, GlyphKind, ActionDesc, VQLQuery, } from "./schema.js";
14
14
  export { NODE_TYPES } from "./schema.js";
15
15
  export { validateSRP, validateNode, isSRPDocument, isSRPNode, } from "./validators.js";
16
16
  export type { ValidationResult, ValidationError, ValidationErrorCode, } from "./validators.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EACV,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EAER,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAAW,EAEX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EAER,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EAEZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EAEV,cAAc,EACd,cAAc,EACd,YAAY,EAEZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,aAAa,EACb,QAAQ,EAER,GAAG,EACH,OAAO,EACP,cAAc,EACd,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,aAAa,EACb,SAAS,EAET,UAAU,EACV,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,YAAY,EACV,WAAW,EACX,OAAO,EACP,OAAO,EACP,QAAQ,EAER,UAAU,EACV,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,WAAW,EAEX,cAAc,EACd,kBAAkB,EAClB,QAAQ,EAER,WAAW,EACX,QAAQ,EACR,QAAQ,EACR,YAAY,EAEZ,UAAU,EACV,cAAc,EACd,cAAc,EACd,UAAU,EAEV,cAAc,EACd,cAAc,EACd,YAAY,EAEZ,QAAQ,EACR,aAAa,EACb,SAAS,EACT,aAAa,EACb,QAAQ,EAER,GAAG,EACH,OAAO,EACP,cAAc,EACd,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,iBAAiB,EACjB,QAAQ,EACR,QAAQ,EACR,UAAU,EACV,QAAQ,EACR,aAAa,EACb,UAAU,EACV,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,gBAAgB,EAChB,aAAa,EACb,SAAS,EAET,UAAU,EACV,QAAQ,GACT,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGzC,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAEzB,YAAY,EACV,gBAAgB,EAChB,eAAe,EACf,mBAAmB,GACpB,MAAM,iBAAiB,CAAC;AAGzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAC7D,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AA+DH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,aAAa;AACb,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAQzB,yBAAyB;AACzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC","sourcesContent":["/**\n * @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.2.\n *\n * TypeScript schema + runtime validators for declarative UI documents\n * rendered by @syncropel/react (and other renderers). Zero runtime\n * dependencies; universal runtime (Node, Deno, Bun, Workers, browsers).\n *\n * v0.2 adds five interactive container + input node types (tabs,\n * data-table, board, text-input, form) — additive, backwards-compatible.\n *\n * Docs: https://syncropel.com\n */\n\n// Schema types\nexport type {\n SRPDocument,\n SRPMeta,\n SRPNode,\n NodeType,\n // Container nodes\n ColumnNode,\n RowNode,\n GridNode,\n CardNode,\n DividerNode,\n // Record-rendering nodes\n RecordLineNode,\n RecordLineListNode,\n ChipNode,\n // Data-display nodes\n HeadingNode,\n TextNode,\n StatNode,\n KeyValueNode,\n // Interactive nodes\n ButtonNode,\n IconButtonNode,\n CopyButtonNode,\n SelectNode,\n // Feedback nodes\n EmptyStateNode,\n ErrorStateNode,\n SkeletonNode,\n // Interactive containers + inputs (SRP v0.2)\n TabsNode,\n DataTableNode,\n BoardNode,\n TextInputNode,\n FormNode,\n // Token unions\n Gap,\n Padding,\n DividerSpacing,\n Cols,\n ColumnAlign,\n RowAlign,\n Justify,\n RecordLineVariant,\n ChipTone,\n TextSize,\n TextWeight,\n TextTone,\n ButtonVariant,\n ButtonSize,\n SkeletonShape,\n TableColumnAlign,\n DataTableVariant,\n TextInputKind,\n GlyphKind,\n // Actions + queries\n ActionDesc,\n VQLQuery,\n} from \"./schema.js\";\n\nexport { NODE_TYPES } from \"./schema.js\";\n\n// Validators\nexport {\n validateSRP,\n validateNode,\n isSRPDocument,\n isSRPNode,\n} from \"./validators.js\";\n\nexport type {\n ValidationResult,\n ValidationError,\n ValidationErrorCode,\n} from \"./validators.js\";\n\n// Markdown subset parser\nexport { parseInline, stripFormatting } from \"./markdown.js\";\nexport type { InlineNode } from \"./markdown.js\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAgEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,aAAa;AACb,OAAO,EACL,WAAW,EACX,YAAY,EACZ,aAAa,EACb,SAAS,GACV,MAAM,iBAAiB,CAAC;AAQzB,yBAAyB;AACzB,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC","sourcesContent":["/**\n * @syncropel/projections — Syncropel Rendering Protocol (SRP) v0.2.\n *\n * TypeScript schema + runtime validators for declarative UI documents\n * rendered by @syncropel/react (and other renderers). Zero runtime\n * dependencies; universal runtime (Node, Deno, Bun, Workers, browsers).\n *\n * v0.2 adds five interactive container + input node types (tabs,\n * data-table, board, text-input, form) — additive, backwards-compatible.\n *\n * Docs: https://syncropel.com\n */\n\n// Schema types\nexport type {\n SRPDocument,\n SRPMeta,\n SRPNode,\n NodeType,\n // Container nodes\n ColumnNode,\n RowNode,\n GridNode,\n CardNode,\n DividerNode,\n // Record-rendering nodes\n RecordLineNode,\n RecordLineListNode,\n ChipNode,\n // Data-display nodes\n HeadingNode,\n TextNode,\n StatNode,\n KeyValueNode,\n // Interactive nodes\n ButtonNode,\n IconButtonNode,\n CopyButtonNode,\n SelectNode,\n // Feedback nodes\n EmptyStateNode,\n ErrorStateNode,\n SkeletonNode,\n // Interactive containers + inputs (SRP v0.2)\n TabsNode,\n DataTableNode,\n BoardNode,\n TextInputNode,\n FormNode,\n // Token unions\n Gap,\n Padding,\n DividerSpacing,\n Cols,\n ColumnAlign,\n RowAlign,\n Justify,\n RecordLineVariant,\n ChipTone,\n TextSize,\n TextWeight,\n TextTone,\n ButtonVariant,\n ButtonSize,\n SkeletonShape,\n TableColumnAlign,\n TableCellKind,\n DataTableVariant,\n TextInputKind,\n GlyphKind,\n // Actions + queries\n ActionDesc,\n VQLQuery,\n} from \"./schema.js\";\n\nexport { NODE_TYPES } from \"./schema.js\";\n\n// Validators\nexport {\n validateSRP,\n validateNode,\n isSRPDocument,\n isSRPNode,\n} from \"./validators.js\";\n\nexport type {\n ValidationResult,\n ValidationError,\n ValidationErrorCode,\n} from \"./validators.js\";\n\n// Markdown subset parser\nexport { parseInline, stripFormatting } from \"./markdown.js\";\nexport type { InlineNode } from \"./markdown.js\";\n"]}
package/dist/schema.d.ts CHANGED
@@ -53,6 +53,11 @@ export type SkeletonShape = "rect" | "circle" | "text";
53
53
  export type TableColumnAlign = "start" | "end";
54
54
  export type DataTableVariant = "default" | "compact";
55
55
  export type TextInputKind = "text" | "search";
56
+ /**
57
+ * How a `data-table` column renders its cell value. `text` (default) is a
58
+ * plain string; `chip` renders the value as a compact metadata chip.
59
+ */
60
+ export type TableCellKind = "text" | "chip";
56
61
  /**
57
62
  * Glyph kinds — the closed enumeration of semantic symbols the palette renders.
58
63
  * Covers act types, domain objects, thread states, and the AITL marker.
@@ -297,6 +302,8 @@ export interface DataTableNode extends NodeBase {
297
302
  label: string;
298
303
  align?: TableColumnAlign;
299
304
  width?: string;
305
+ /** How the cell value renders. Default `text`. */
306
+ kind?: TableCellKind;
300
307
  }[];
301
308
  variant?: DataTableVariant;
302
309
  sortable?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAMH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,2EAA2E;IAC3E,GAAG,EAAE,KAAK,GAAG,KAAK,CAAC;IACnB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;CACf;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAMD,MAAM,MAAM,OAAO,GAEf,UAAU,GACV,OAAO,GACP,QAAQ,GACR,QAAQ,GACR,WAAW,GAEX,cAAc,GACd,kBAAkB,GAClB,QAAQ,GAER,WAAW,GACX,QAAQ,GACR,QAAQ,GACR,YAAY,GAEZ,UAAU,GACV,cAAc,GACd,cAAc,GACd,UAAU,GAEV,cAAc,GACd,cAAc,GACd,YAAY,GAEZ,QAAQ,GACR,aAAa,GACb,SAAS,GACT,aAAa,GACb,QAAQ,CAAC;AAEb;;GAEG;AACH,eAAO,MAAM,UAAU,2RA0Bb,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC;AAMnD,UAAU,QAAQ;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACtC;AAMD,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAC5D,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACzD,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAChE,MAAM,MAAM,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,CAAC;AACjE,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,SAAS,GAAG,UAAU,CAAC;AAC3E,MAAM,MAAM,OAAO,GACf,OAAO,GACP,QAAQ,GACR,KAAK,GACL,SAAS,GACT,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,iBAAiB,GACzB,MAAM,GACN,SAAS,GACT,QAAQ,GACR,QAAQ,GACR,QAAQ,CAAC;AAEb,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE7D,MAAM,MAAM,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AACjD,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,CAAC;AAC1D,MAAM,MAAM,QAAQ,GAChB,SAAS,GACT,WAAW,GACX,OAAO,GACP,SAAS,GACT,SAAS,GACT,QAAQ,CAAC;AAEb,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,WAAW,GAAG,OAAO,GAAG,QAAQ,CAAC;AACzE,MAAM,MAAM,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,CAAC;AAE5C,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAAC;AAGvD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,KAAK,CAAC;AAC/C,MAAM,MAAM,gBAAgB,GAAG,SAAS,GAAG,SAAS,CAAC;AACrD,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,QAAQ,CAAC;AAE9C;;;GAGG;AACH,MAAM,MAAM,SAAS,GAEjB,QAAQ,GACR,IAAI,GACJ,MAAM,GACN,OAAO,GAEP,KAAK,GACL,KAAK,GACL,MAAM,GACN,KAAK,GAEL,MAAM,GAEN,QAAQ,GACR,MAAM,GACN,eAAe,GACf,WAAW,GACX,OAAO,GACP,MAAM,GACN,SAAS,GACT,MAAM,GACN,MAAM,GAEN,YAAY,GACZ,cAAc,GACd,iBAAiB,GACjB,cAAc,GACd,iBAAiB,CAAC;AAMtB,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,QAAQ;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CACtB;AAMD,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE;QAAE,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,KAAK,CAAC,EAAE,WAAW,CAAC;QAAC,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IAC9D,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,OAAQ,SAAQ,QAAQ;IACvC,IAAI,EAAE,KAAK,CAAC;IACZ,KAAK,CAAC,EAAE;QACN,GAAG,CAAC,EAAE,GAAG,CAAC;QACV,KAAK,CAAC,EAAE,QAAQ,CAAC;QACjB,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,IAAI,CAAC,EAAE,OAAO,CAAC;KAChB,CAAC;IACF,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,IAAI,EAAE,IAAI,CAAC;QAAC,GAAG,CAAC,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAC;QAAC,MAAM,CAAC,EAAE,GAAG,CAAA;KAAE,CAAC;IAC7D,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,WAAW,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACrD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,YAAY,GAAG,UAAU,CAAC;QAAC,OAAO,CAAC,EAAE,cAAc,CAAA;KAAE,CAAC;CAC/E;AAMD,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,OAAO,EAAE,iBAAiB,CAAA;KAAE,CAAC;IACtC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAmB,SAAQ,QAAQ;IAClD,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE;QAAE,OAAO,EAAE,iBAAiB,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACpE,IAAI,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,KAAK,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;CACjD;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;QAAC,KAAK,CAAC,EAAE,SAAS,CAAA;KAAE,CAAC;CAC9D;AAMD,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAC3C,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE;QAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACvD;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,MAAM,CAAC,EAAE,UAAU,CAAC;QACpB,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,MAAM,CAAC,EAAE,OAAO,CAAC;KAClB,CAAC;CACH;AAED,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;QACvB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KAChC,CAAC;CACH;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;CACzC;AAMD,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,CAAC,EAAE,aAAa,CAAC;QACxB,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QACL,KAAK,EAAE,SAAS,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,CAAC,EAAE,aAAa,CAAC;QACxB,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;IACF,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CACpC;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1C;AAED,MAAM,WAAW,UAAW,SAAQ,QAAQ;IAC1C,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE;QAAE,OAAO,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACvD,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CACrC;AAMD,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE;YAAE,KAAK,EAAE,MAAM,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5C,CAAC;CACH;AAED,MAAM,WAAW,cAAe,SAAQ,QAAQ;IAC9C,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QACL,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAA;SAAE,CAAC;KAC5B,CAAC;CACH;AAED,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,CAAC,EAAE;QACN,KAAK,CAAC,EAAE,aAAa,CAAC;QACtB,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;QACjC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;KAC1B,CAAC;CACH;AAWD;;;;GAIG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE;QAAE,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,SAAS,CAAA;SAAE,EAAE,CAAA;KAAE,CAAC;IACpE,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACzB,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACvC,iDAAiD;IACjD,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE;QACL,OAAO,EAAE;YACP,GAAG,EAAE,MAAM,CAAC;YACZ,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,CAAC,EAAE,gBAAgB,CAAC;YACzB,KAAK,CAAC,EAAE,MAAM,CAAC;SAChB,EAAE,CAAC;QACJ,OAAO,CAAC,EAAE,gBAAgB,CAAC;QAC3B,QAAQ,CAAC,EAAE,OAAO,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,IAAI,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,GAAG;QAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAA;KAAE,CAAC;IAChE,OAAO,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,UAAU,CAAC;QAAC,MAAM,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CAC5D;AAED;;;;;GAKG;AACH,MAAM,WAAW,SAAU,SAAQ,QAAQ;IACzC,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE;QACL,OAAO,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;QACzC,OAAO,EAAE,MAAM,CAAC;QAChB,WAAW,CAAC,EAAE,iBAAiB,CAAC;KACjC,CAAC;IACF,IAAI,EAAE;QAAE,KAAK,EAAE,QAAQ,CAAA;KAAE,CAAC;IAC1B,OAAO,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,UAAU,CAAC;QAAC,UAAU,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CACjE;AAED;;;;GAIG;AACH,MAAM,WAAW,aAAc,SAAQ,QAAQ;IAC7C,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,SAAS,CAAC,EAAE,aAAa,CAAC;QAC1B,IAAI,CAAC,EAAE,QAAQ,CAAC;QAChB,QAAQ,CAAC,EAAE,OAAO,CAAC;KACpB,CAAC;IACF,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,UAAU,CAAC;QAAC,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;CAC5D;AAED;;;GAGG;AACH,MAAM,WAAW,QAAS,SAAQ,QAAQ;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE;QAAE,WAAW,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC;IACjD,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,UAAU,CAAA;KAAE,CAAC;IACpC,QAAQ,CAAC,EAAE,OAAO,EAAE,CAAC;CACtB"}
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2DH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;IACb,QAAQ;IACR,aAAa;IACb,aAAa;IACb,UAAU;IACV,6CAA6C;IAC7C,MAAM;IACN,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,MAAM;CACE,CAAC","sourcesContent":["/**\n * SRP v0.2 — TypeScript schema types.\n *\n * The Syncropel Rendering Protocol is a narrow JSON schema of block-level\n * primitives for declarative UI documents. See the spec and examples at\n * https://syncropel.com.\n *\n * v0.2 adds five interactive container + input nodes (tabs, data-table,\n * board, text-input, form) — additive, backwards-compatible. Every v0.1\n * document remains valid. See ADR-102.\n */\n\n// ---------------------------------------------------------------------------\n// Document envelope\n// ---------------------------------------------------------------------------\n\n/**\n * An SRP v0.1 document — the top-level envelope a Tier-1 extension emits.\n */\nexport interface SRPDocument {\n /** Protocol version. `\"0.2\"` documents may use the v0.2 node additions. */\n srp: \"0.1\" | \"0.2\";\n meta?: SRPMeta;\n root: SRPNode;\n}\n\nexport interface SRPMeta {\n name?: string;\n version?: string;\n description?: string;\n publisher?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all 24 node types\n// ---------------------------------------------------------------------------\n\nexport type SRPNode =\n // Containers (5)\n | ColumnNode\n | RowNode\n | GridNode\n | CardNode\n | DividerNode\n // Record rendering (3)\n | RecordLineNode\n | RecordLineListNode\n | ChipNode\n // Data display (4)\n | HeadingNode\n | TextNode\n | StatNode\n | KeyValueNode\n // Interactive (4)\n | ButtonNode\n | IconButtonNode\n | CopyButtonNode\n | SelectNode\n // Feedback (3)\n | EmptyStateNode\n | ErrorStateNode\n | SkeletonNode\n // Interactive containers + inputs — SRP v0.2 (5)\n | TabsNode\n | DataTableNode\n | BoardNode\n | TextInputNode\n | FormNode;\n\n/**\n * The 24 canonical node-type discriminator strings (19 v0.1 + 5 v0.2).\n */\nexport const NODE_TYPES = [\n \"column\",\n \"row\",\n \"grid\",\n \"card\",\n \"divider\",\n \"record-line\",\n \"record-line-list\",\n \"chip\",\n \"heading\",\n \"text\",\n \"stat\",\n \"key-value\",\n \"button\",\n \"icon-button\",\n \"copy-button\",\n \"select\",\n \"empty-state\",\n \"error-state\",\n \"skeleton\",\n // SRP v0.2 — interactive containers + inputs\n \"tabs\",\n \"data-table\",\n \"board\",\n \"text-input\",\n \"form\",\n] as const;\n\nexport type NodeType = (typeof NODE_TYPES)[number];\n\n// ---------------------------------------------------------------------------\n// Fields every node may carry\n// ---------------------------------------------------------------------------\n\ninterface NodeBase {\n when?: string;\n bind?: Record<string, unknown>;\n actions?: Record<string, ActionDesc>;\n}\n\n// ---------------------------------------------------------------------------\n// Token unions (mirror @syncropel/react token scales)\n// ---------------------------------------------------------------------------\n\nexport type Gap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type Padding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type DividerSpacing = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type Cols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type RowAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type Justify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"between\"\n | \"around\"\n | \"evenly\";\n\nexport type RecordLineVariant =\n | \"feed\"\n | \"compact\"\n | \"detail\"\n | \"search\"\n | \"thread\";\n\nexport type ChipTone = \"default\" | \"info\" | \"warn\" | \"error\";\n\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type TextWeight = \"normal\" | \"medium\" | \"semibold\";\nexport type TextTone =\n | \"primary\"\n | \"secondary\"\n | \"muted\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\";\n\nexport type SkeletonShape = \"rect\" | \"circle\" | \"text\";\n\n// --- SRP v0.2 tokens ---\nexport type TableColumnAlign = \"start\" | \"end\";\nexport type DataTableVariant = \"default\" | \"compact\";\nexport type TextInputKind = \"text\" | \"search\";\n\n/**\n * Glyph kinds — the closed enumeration of semantic symbols the palette renders.\n * Covers act types, domain objects, thread states, and the AITL marker.\n */\nexport type GlyphKind =\n // Act types (coordination)\n | \"INTEND\"\n | \"DO\"\n | \"KNOW\"\n | \"LEARN\"\n // Act types (effects)\n | \"GET\"\n | \"PUT\"\n | \"CALL\"\n | \"MAP\"\n // AITL marker\n | \"AITL\"\n // Domain objects\n | \"thread\"\n | \"fork\"\n | \"record-parent\"\n | \"namespace\"\n | \"actor\"\n | \"file\"\n | \"pattern\"\n | \"page\"\n | \"view\"\n // Thread states\n | \"state-open\"\n | \"state-active\"\n | \"state-converged\"\n | \"state-closed\"\n | \"state-abandoned\";\n\n// ---------------------------------------------------------------------------\n// Actions + queries\n// ---------------------------------------------------------------------------\n\nexport interface ActionDesc {\n intent: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * VQL (Value Query Language) — the query shape a Syncropel server resolves\n * against its record store. Used by `record-line-list` nodes that bind to\n * a live query rather than a static list of record ids.\n *\n * The shape is deliberately open (index signature) — additional fields\n * are protocol extensions the server understands.\n */\nexport interface VQLQuery {\n act?: string;\n actor?: string;\n thread?: string;\n kind?: string;\n since?: number;\n limit?: number;\n [k: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Container node definitions (5)\n// ---------------------------------------------------------------------------\n\nexport interface ColumnNode extends NodeBase {\n type: \"column\";\n props?: { gap?: Gap; align?: ColumnAlign; justify?: Justify };\n children?: SRPNode[];\n}\n\nexport interface RowNode extends NodeBase {\n type: \"row\";\n props?: {\n gap?: Gap;\n align?: RowAlign;\n justify?: Justify;\n wrap?: boolean;\n };\n children?: SRPNode[];\n}\n\nexport interface GridNode extends NodeBase {\n type: \"grid\";\n props: { cols: Cols; gap?: Gap; rowGap?: Gap; colGap?: Gap };\n children?: SRPNode[];\n}\n\nexport interface CardNode extends NodeBase {\n type: \"card\";\n props?: { padding?: Padding; interactive?: boolean };\n children?: SRPNode[];\n}\n\nexport interface DividerNode extends NodeBase {\n type: \"divider\";\n props?: { orientation?: \"horizontal\" | \"vertical\"; spacing?: DividerSpacing };\n}\n\n// ---------------------------------------------------------------------------\n// Record-rendering (3)\n// ---------------------------------------------------------------------------\n\nexport interface RecordLineNode extends NodeBase {\n type: \"record-line\";\n props: { variant: RecordLineVariant };\n bind: { record: string };\n}\n\nexport interface RecordLineListNode extends NodeBase {\n type: \"record-line-list\";\n props: { variant: RecordLineVariant; max?: number; empty?: string };\n bind: { query: VQLQuery } | { items: string[] };\n}\n\nexport interface ChipNode extends NodeBase {\n type: \"chip\";\n props: { label: string; tone?: ChipTone; glyph?: GlyphKind };\n}\n\n// ---------------------------------------------------------------------------\n// Data display (4)\n// ---------------------------------------------------------------------------\n\nexport interface HeadingNode extends NodeBase {\n type: \"heading\";\n props: { level: 1 | 2 | 3 | 4 | 5 | 6; text: string };\n}\n\nexport interface TextNode extends NodeBase {\n type: \"text\";\n props: {\n text: string;\n size?: TextSize;\n weight?: TextWeight;\n tone?: TextTone;\n inline?: boolean;\n };\n}\n\nexport interface StatNode extends NodeBase {\n type: \"stat\";\n props: {\n label: string;\n value: string | number;\n delta?: string | number;\n deltaTone?: \"auto\" | \"neutral\";\n };\n}\n\nexport interface KeyValueNode extends NodeBase {\n type: \"key-value\";\n props: { label: string; value: string };\n}\n\n// ---------------------------------------------------------------------------\n// Interactive (4)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonNode extends NodeBase {\n type: \"button\";\n props: {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface IconButtonNode extends NodeBase {\n type: \"icon-button\";\n props: {\n glyph: GlyphKind;\n ariaLabel: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface CopyButtonNode extends NodeBase {\n type: \"copy-button\";\n props: { value: string; label?: string };\n}\n\nexport interface SelectNode extends NodeBase {\n type: \"select\";\n props: { options: { label: string; value: string }[] };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n\n// ---------------------------------------------------------------------------\n// Feedback (3)\n// ---------------------------------------------------------------------------\n\nexport interface EmptyStateNode extends NodeBase {\n type: \"empty-state\";\n props: {\n message: string;\n action?: { label: string; intent: string };\n };\n}\n\nexport interface ErrorStateNode extends NodeBase {\n type: \"error-state\";\n props: {\n message: string;\n retry?: { intent: string };\n };\n}\n\nexport interface SkeletonNode extends NodeBase {\n type: \"skeleton\";\n props?: {\n shape?: SkeletonShape;\n width?: string | number | \"full\";\n height?: string | number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 — interactive containers + inputs (5)\n//\n// All five reuse the v0.1 contract: `props` is static config, `bind` is\n// host-supplied state, `actions` declares intents the host dispatches. SRP\n// owns layout + shape; the host owns state + behaviour. See ADR-102 and the\n// SRP v0.2 design spec.\n// ---------------------------------------------------------------------------\n\n/**\n * A container whose children are panels; one panel shows at a time. The host\n * supplies the active tab id via `bind.active` and renders the panel whose\n * index matches it in `props.tabs`.\n */\nexport interface TabsNode extends NodeBase {\n type: \"tabs\";\n props: { tabs: { id: string; label: string; glyph?: GlyphKind }[] };\n bind: { active: string };\n actions?: { onTabChange?: ActionDesc };\n /** Panels, parallel to `props.tabs` by index. */\n children?: SRPNode[];\n}\n\n/**\n * A columnar record list — richer than `record-line-list`: explicit columns,\n * alignment, optional sort. `column.key` is a dotted path into each row.\n */\nexport interface DataTableNode extends NodeBase {\n type: \"data-table\";\n props: {\n columns: {\n key: string;\n label: string;\n align?: TableColumnAlign;\n width?: string;\n }[];\n variant?: DataTableVariant;\n sortable?: boolean;\n empty?: string;\n };\n bind: { query: VQLQuery } | { rows: Record<string, unknown>[] };\n actions?: { onRowClick?: ActionDesc; onSort?: ActionDesc };\n}\n\n/**\n * A kanban board — records bucketed into columns by the `props.groupBy` field.\n * A record lands in the column whose `id` equals its `groupBy` value; records\n * matching no column are dropped. `onCardMove` is advisory — a host MAY\n * support drag; a board without drag is read-only and still valid.\n */\nexport interface BoardNode extends NodeBase {\n type: \"board\";\n props: {\n columns: { id: string; label: string }[];\n groupBy: string;\n cardVariant?: RecordLineVariant;\n };\n bind: { query: VQLQuery };\n actions?: { onCardClick?: ActionDesc; onCardMove?: ActionDesc };\n}\n\n/**\n * An editable text field — the `select` of free text. The host owns\n * `bind.value` and re-renders on change (identical ownership model to\n * `select`).\n */\nexport interface TextInputNode extends NodeBase {\n type: \"text-input\";\n props?: {\n placeholder?: string;\n multiline?: boolean;\n inputKind?: TextInputKind;\n size?: TextSize;\n disabled?: boolean;\n };\n bind: { value: string };\n actions?: { onChange?: ActionDesc; onSubmit?: ActionDesc };\n}\n\n/**\n * A container that groups inputs and declares a submit intent. The host\n * collects child input values (by their `bind`) and dispatches `onSubmit`.\n */\nexport interface FormNode extends NodeBase {\n type: \"form\";\n props?: { submitLabel?: string; busy?: boolean };\n actions?: { onSubmit?: ActionDesc };\n children?: SRPNode[];\n}\n"]}
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA2DH;;GAEG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG;IACxB,QAAQ;IACR,KAAK;IACL,MAAM;IACN,MAAM;IACN,SAAS;IACT,aAAa;IACb,kBAAkB;IAClB,MAAM;IACN,SAAS;IACT,MAAM;IACN,MAAM;IACN,WAAW;IACX,QAAQ;IACR,aAAa;IACb,aAAa;IACb,QAAQ;IACR,aAAa;IACb,aAAa;IACb,UAAU;IACV,6CAA6C;IAC7C,MAAM;IACN,YAAY;IACZ,OAAO;IACP,YAAY;IACZ,MAAM;CACE,CAAC","sourcesContent":["/**\n * SRP v0.2 — TypeScript schema types.\n *\n * The Syncropel Rendering Protocol is a narrow JSON schema of block-level\n * primitives for declarative UI documents. See the spec and examples at\n * https://syncropel.com.\n *\n * v0.2 adds five interactive container + input nodes (tabs, data-table,\n * board, text-input, form) — additive, backwards-compatible. Every v0.1\n * document remains valid. See ADR-102.\n */\n\n// ---------------------------------------------------------------------------\n// Document envelope\n// ---------------------------------------------------------------------------\n\n/**\n * An SRP v0.1 document — the top-level envelope a Tier-1 extension emits.\n */\nexport interface SRPDocument {\n /** Protocol version. `\"0.2\"` documents may use the v0.2 node additions. */\n srp: \"0.1\" | \"0.2\";\n meta?: SRPMeta;\n root: SRPNode;\n}\n\nexport interface SRPMeta {\n name?: string;\n version?: string;\n description?: string;\n publisher?: string;\n}\n\n// ---------------------------------------------------------------------------\n// Discriminated union of all 24 node types\n// ---------------------------------------------------------------------------\n\nexport type SRPNode =\n // Containers (5)\n | ColumnNode\n | RowNode\n | GridNode\n | CardNode\n | DividerNode\n // Record rendering (3)\n | RecordLineNode\n | RecordLineListNode\n | ChipNode\n // Data display (4)\n | HeadingNode\n | TextNode\n | StatNode\n | KeyValueNode\n // Interactive (4)\n | ButtonNode\n | IconButtonNode\n | CopyButtonNode\n | SelectNode\n // Feedback (3)\n | EmptyStateNode\n | ErrorStateNode\n | SkeletonNode\n // Interactive containers + inputs — SRP v0.2 (5)\n | TabsNode\n | DataTableNode\n | BoardNode\n | TextInputNode\n | FormNode;\n\n/**\n * The 24 canonical node-type discriminator strings (19 v0.1 + 5 v0.2).\n */\nexport const NODE_TYPES = [\n \"column\",\n \"row\",\n \"grid\",\n \"card\",\n \"divider\",\n \"record-line\",\n \"record-line-list\",\n \"chip\",\n \"heading\",\n \"text\",\n \"stat\",\n \"key-value\",\n \"button\",\n \"icon-button\",\n \"copy-button\",\n \"select\",\n \"empty-state\",\n \"error-state\",\n \"skeleton\",\n // SRP v0.2 — interactive containers + inputs\n \"tabs\",\n \"data-table\",\n \"board\",\n \"text-input\",\n \"form\",\n] as const;\n\nexport type NodeType = (typeof NODE_TYPES)[number];\n\n// ---------------------------------------------------------------------------\n// Fields every node may carry\n// ---------------------------------------------------------------------------\n\ninterface NodeBase {\n when?: string;\n bind?: Record<string, unknown>;\n actions?: Record<string, ActionDesc>;\n}\n\n// ---------------------------------------------------------------------------\n// Token unions (mirror @syncropel/react token scales)\n// ---------------------------------------------------------------------------\n\nexport type Gap = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type Padding = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type DividerSpacing = \"none\" | \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type Cols = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12;\n\nexport type ColumnAlign = \"start\" | \"center\" | \"end\" | \"stretch\";\nexport type RowAlign = \"start\" | \"center\" | \"end\" | \"stretch\" | \"baseline\";\nexport type Justify =\n | \"start\"\n | \"center\"\n | \"end\"\n | \"between\"\n | \"around\"\n | \"evenly\";\n\nexport type RecordLineVariant =\n | \"feed\"\n | \"compact\"\n | \"detail\"\n | \"search\"\n | \"thread\";\n\nexport type ChipTone = \"default\" | \"info\" | \"warn\" | \"error\";\n\nexport type TextSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\nexport type TextWeight = \"normal\" | \"medium\" | \"semibold\";\nexport type TextTone =\n | \"primary\"\n | \"secondary\"\n | \"muted\"\n | \"success\"\n | \"warning\"\n | \"danger\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"ghost\" | \"danger\";\nexport type ButtonSize = \"xs\" | \"sm\" | \"md\";\n\nexport type SkeletonShape = \"rect\" | \"circle\" | \"text\";\n\n// --- SRP v0.2 tokens ---\nexport type TableColumnAlign = \"start\" | \"end\";\nexport type DataTableVariant = \"default\" | \"compact\";\nexport type TextInputKind = \"text\" | \"search\";\n/**\n * How a `data-table` column renders its cell value. `text` (default) is a\n * plain string; `chip` renders the value as a compact metadata chip.\n */\nexport type TableCellKind = \"text\" | \"chip\";\n\n/**\n * Glyph kinds — the closed enumeration of semantic symbols the palette renders.\n * Covers act types, domain objects, thread states, and the AITL marker.\n */\nexport type GlyphKind =\n // Act types (coordination)\n | \"INTEND\"\n | \"DO\"\n | \"KNOW\"\n | \"LEARN\"\n // Act types (effects)\n | \"GET\"\n | \"PUT\"\n | \"CALL\"\n | \"MAP\"\n // AITL marker\n | \"AITL\"\n // Domain objects\n | \"thread\"\n | \"fork\"\n | \"record-parent\"\n | \"namespace\"\n | \"actor\"\n | \"file\"\n | \"pattern\"\n | \"page\"\n | \"view\"\n // Thread states\n | \"state-open\"\n | \"state-active\"\n | \"state-converged\"\n | \"state-closed\"\n | \"state-abandoned\";\n\n// ---------------------------------------------------------------------------\n// Actions + queries\n// ---------------------------------------------------------------------------\n\nexport interface ActionDesc {\n intent: string;\n payload?: Record<string, unknown>;\n}\n\n/**\n * VQL (Value Query Language) — the query shape a Syncropel server resolves\n * against its record store. Used by `record-line-list` nodes that bind to\n * a live query rather than a static list of record ids.\n *\n * The shape is deliberately open (index signature) — additional fields\n * are protocol extensions the server understands.\n */\nexport interface VQLQuery {\n act?: string;\n actor?: string;\n thread?: string;\n kind?: string;\n since?: number;\n limit?: number;\n [k: string]: unknown;\n}\n\n// ---------------------------------------------------------------------------\n// Container node definitions (5)\n// ---------------------------------------------------------------------------\n\nexport interface ColumnNode extends NodeBase {\n type: \"column\";\n props?: { gap?: Gap; align?: ColumnAlign; justify?: Justify };\n children?: SRPNode[];\n}\n\nexport interface RowNode extends NodeBase {\n type: \"row\";\n props?: {\n gap?: Gap;\n align?: RowAlign;\n justify?: Justify;\n wrap?: boolean;\n };\n children?: SRPNode[];\n}\n\nexport interface GridNode extends NodeBase {\n type: \"grid\";\n props: { cols: Cols; gap?: Gap; rowGap?: Gap; colGap?: Gap };\n children?: SRPNode[];\n}\n\nexport interface CardNode extends NodeBase {\n type: \"card\";\n props?: { padding?: Padding; interactive?: boolean };\n children?: SRPNode[];\n}\n\nexport interface DividerNode extends NodeBase {\n type: \"divider\";\n props?: { orientation?: \"horizontal\" | \"vertical\"; spacing?: DividerSpacing };\n}\n\n// ---------------------------------------------------------------------------\n// Record-rendering (3)\n// ---------------------------------------------------------------------------\n\nexport interface RecordLineNode extends NodeBase {\n type: \"record-line\";\n props: { variant: RecordLineVariant };\n bind: { record: string };\n}\n\nexport interface RecordLineListNode extends NodeBase {\n type: \"record-line-list\";\n props: { variant: RecordLineVariant; max?: number; empty?: string };\n bind: { query: VQLQuery } | { items: string[] };\n}\n\nexport interface ChipNode extends NodeBase {\n type: \"chip\";\n props: { label: string; tone?: ChipTone; glyph?: GlyphKind };\n}\n\n// ---------------------------------------------------------------------------\n// Data display (4)\n// ---------------------------------------------------------------------------\n\nexport interface HeadingNode extends NodeBase {\n type: \"heading\";\n props: { level: 1 | 2 | 3 | 4 | 5 | 6; text: string };\n}\n\nexport interface TextNode extends NodeBase {\n type: \"text\";\n props: {\n text: string;\n size?: TextSize;\n weight?: TextWeight;\n tone?: TextTone;\n inline?: boolean;\n };\n}\n\nexport interface StatNode extends NodeBase {\n type: \"stat\";\n props: {\n label: string;\n value: string | number;\n delta?: string | number;\n deltaTone?: \"auto\" | \"neutral\";\n };\n}\n\nexport interface KeyValueNode extends NodeBase {\n type: \"key-value\";\n props: { label: string; value: string };\n}\n\n// ---------------------------------------------------------------------------\n// Interactive (4)\n// ---------------------------------------------------------------------------\n\nexport interface ButtonNode extends NodeBase {\n type: \"button\";\n props: {\n label: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface IconButtonNode extends NodeBase {\n type: \"icon-button\";\n props: {\n glyph: GlyphKind;\n ariaLabel: string;\n variant?: ButtonVariant;\n size?: ButtonSize;\n disabled?: boolean;\n loading?: boolean;\n };\n actions?: { onClick?: ActionDesc };\n}\n\nexport interface CopyButtonNode extends NodeBase {\n type: \"copy-button\";\n props: { value: string; label?: string };\n}\n\nexport interface SelectNode extends NodeBase {\n type: \"select\";\n props: { options: { label: string; value: string }[] };\n bind: { value: string };\n actions?: { onChange?: ActionDesc };\n}\n\n// ---------------------------------------------------------------------------\n// Feedback (3)\n// ---------------------------------------------------------------------------\n\nexport interface EmptyStateNode extends NodeBase {\n type: \"empty-state\";\n props: {\n message: string;\n action?: { label: string; intent: string };\n };\n}\n\nexport interface ErrorStateNode extends NodeBase {\n type: \"error-state\";\n props: {\n message: string;\n retry?: { intent: string };\n };\n}\n\nexport interface SkeletonNode extends NodeBase {\n type: \"skeleton\";\n props?: {\n shape?: SkeletonShape;\n width?: string | number | \"full\";\n height?: string | number;\n };\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 — interactive containers + inputs (5)\n//\n// All five reuse the v0.1 contract: `props` is static config, `bind` is\n// host-supplied state, `actions` declares intents the host dispatches. SRP\n// owns layout + shape; the host owns state + behaviour. See ADR-102 and the\n// SRP v0.2 design spec.\n// ---------------------------------------------------------------------------\n\n/**\n * A container whose children are panels; one panel shows at a time. The host\n * supplies the active tab id via `bind.active` and renders the panel whose\n * index matches it in `props.tabs`.\n */\nexport interface TabsNode extends NodeBase {\n type: \"tabs\";\n props: { tabs: { id: string; label: string; glyph?: GlyphKind }[] };\n bind: { active: string };\n actions?: { onTabChange?: ActionDesc };\n /** Panels, parallel to `props.tabs` by index. */\n children?: SRPNode[];\n}\n\n/**\n * A columnar record list — richer than `record-line-list`: explicit columns,\n * alignment, optional sort. `column.key` is a dotted path into each row.\n */\nexport interface DataTableNode extends NodeBase {\n type: \"data-table\";\n props: {\n columns: {\n key: string;\n label: string;\n align?: TableColumnAlign;\n width?: string;\n /** How the cell value renders. Default `text`. */\n kind?: TableCellKind;\n }[];\n variant?: DataTableVariant;\n sortable?: boolean;\n empty?: string;\n };\n bind: { query: VQLQuery } | { rows: Record<string, unknown>[] };\n actions?: { onRowClick?: ActionDesc; onSort?: ActionDesc };\n}\n\n/**\n * A kanban board — records bucketed into columns by the `props.groupBy` field.\n * A record lands in the column whose `id` equals its `groupBy` value; records\n * matching no column are dropped. `onCardMove` is advisory — a host MAY\n * support drag; a board without drag is read-only and still valid.\n */\nexport interface BoardNode extends NodeBase {\n type: \"board\";\n props: {\n columns: { id: string; label: string }[];\n groupBy: string;\n cardVariant?: RecordLineVariant;\n };\n bind: { query: VQLQuery };\n actions?: { onCardClick?: ActionDesc; onCardMove?: ActionDesc };\n}\n\n/**\n * An editable text field — the `select` of free text. The host owns\n * `bind.value` and re-renders on change (identical ownership model to\n * `select`).\n */\nexport interface TextInputNode extends NodeBase {\n type: \"text-input\";\n props?: {\n placeholder?: string;\n multiline?: boolean;\n inputKind?: TextInputKind;\n size?: TextSize;\n disabled?: boolean;\n };\n bind: { value: string };\n actions?: { onChange?: ActionDesc; onSubmit?: ActionDesc };\n}\n\n/**\n * A container that groups inputs and declares a submit intent. The host\n * collects child input values (by their `bind`) and dispatches `onSubmit`.\n */\nexport interface FormNode extends NodeBase {\n type: \"form\";\n props?: { submitLabel?: string; busy?: boolean };\n actions?: { onSubmit?: ActionDesc };\n children?: SRPNode[];\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,EAAE,mBAAmB,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAahD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAM1E;AAsrBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAG9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,CAGxD"}
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAOxD,MAAM,WAAW,eAAe;IAC9B,8EAA8E;IAC9E,IAAI,EAAE,MAAM,CAAC;IACb,8BAA8B;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,IAAI,EAAE,mBAAmB,CAAC;CAC3B;AAED,MAAM,MAAM,mBAAmB,GAC3B,qBAAqB,GACrB,cAAc,GACd,iBAAiB,GACjB,mBAAmB,GACnB,mBAAmB,GACnB,wBAAwB,GACxB,qBAAqB,GACrB,oBAAoB,GACpB,sBAAsB,GACtB,uBAAuB,GACvB,oBAAoB,CAAC;AAEzB,MAAM,MAAM,gBAAgB,GACxB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GACf;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,MAAM,EAAE,eAAe,EAAE,CAAA;CAAE,CAAC;AAahD;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,gBAAgB,CA4B1D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAM1E;AA6rBD;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAG9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,OAAO,CAGxD"}
@@ -348,6 +348,9 @@ function validateDataTable(n, path, c) {
348
348
  if (typeof o.key !== "string" || typeof o.label !== "string") {
349
349
  c.add(`${path}/props/columns/${i}`, "PROPS_INVALID_VALUE", `data-table column must have string "key" and "label"`);
350
350
  }
351
+ if (o.kind !== undefined && o.kind !== "text" && o.kind !== "chip") {
352
+ c.add(`${path}/props/columns/${i}/kind`, "PROPS_INVALID_VALUE", `data-table column "kind" must be "text" or "chip"`);
353
+ }
351
354
  });
352
355
  }
353
356
  const bind = n.bind;
@@ -1 +1 @@
1
- {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime validators for SRP v0.1 documents.\n *\n * Pure functions — no dependencies. Return a ValidationResult with either a\n * `valid: true` flag or a list of errors keyed by path.\n */\n\nimport type { SRPDocument, SRPNode } from \"./schema.js\";\nimport { NODE_TYPES } from \"./schema.js\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface ValidationError {\n /** JSON-pointer-style path to the offending node, e.g. \"/root/children/0\". */\n path: string;\n /** Human-readable message. */\n message: string;\n /** Machine-readable code for programmatic handling. */\n code: ValidationErrorCode;\n}\n\nexport type ValidationErrorCode =\n | \"SRP_VERSION_INVALID\"\n | \"ROOT_MISSING\"\n | \"NODE_NOT_OBJECT\"\n | \"NODE_TYPE_MISSING\"\n | \"NODE_TYPE_UNKNOWN\"\n | \"PROPS_MISSING_REQUIRED\"\n | \"PROPS_INVALID_VALUE\"\n | \"CHILDREN_NOT_ARRAY\"\n | \"CHILDREN_NOT_ALLOWED\"\n | \"BIND_MISSING_REQUIRED\"\n | \"BIND_INVALID_SHAPE\";\n\nexport type ValidationResult =\n | { valid: true }\n | { valid: false; errors: ValidationError[] };\n\nclass Collector {\n errors: ValidationError[] = [];\n add(path: string, code: ValidationErrorCode, message: string): void {\n this.errors.push({ path, code, message });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a full SRP document.\n *\n * Returns `{ valid: true }` when the document conforms to SRP v0.1.\n * Returns `{ valid: false, errors }` with every violation keyed by a\n * JSON-pointer-style path when it doesn't.\n */\nexport function validateSRP(doc: unknown): ValidationResult {\n const c = new Collector();\n\n if (typeof doc !== \"object\" || doc === null) {\n c.add(\"\", \"NODE_NOT_OBJECT\", \"SRP document must be an object\");\n return { valid: false, errors: c.errors };\n }\n\n const d = doc as Record<string, unknown>;\n\n if (d.srp !== \"0.1\" && d.srp !== \"0.2\") {\n c.add(\n \"/srp\",\n \"SRP_VERSION_INVALID\",\n `srp field must be \"0.1\" or \"0.2\", got ${JSON.stringify(d.srp)}`,\n );\n }\n\n if (!(\"root\" in d)) {\n c.add(\"/root\", \"ROOT_MISSING\", \"SRP document must have a root node\");\n return { valid: false, errors: c.errors };\n }\n\n validateNodeInto(d.root, \"/root\", c);\n\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\n/**\n * Validate a single node (used internally and useful standalone for\n * incremental SRP authoring).\n */\nexport function validateNode(node: unknown, path: string): ValidationResult {\n const c = new Collector();\n validateNodeInto(node, path, c);\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\nfunction validateNodeInto(\n node: unknown,\n path: string,\n c: Collector,\n): void {\n if (typeof node !== \"object\" || node === null) {\n c.add(path, \"NODE_NOT_OBJECT\", `Node at ${path} must be an object`);\n return;\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.type !== \"string\") {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_MISSING\",\n `Node at ${path} must have a string \"type\" field`,\n );\n return;\n }\n\n if (!(NODE_TYPES as readonly string[]).includes(n.type)) {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_UNKNOWN\",\n `Unknown node type \"${n.type}\" at ${path}. Allowed: ${NODE_TYPES.join(\", \")}`,\n );\n return;\n }\n\n // Per-type validation dispatched below\n switch (n.type) {\n case \"column\":\n case \"row\":\n case \"card\":\n validateContainer(n, path, c);\n break;\n case \"grid\":\n validateGrid(n, path, c);\n break;\n case \"divider\":\n validateDivider(n, path, c);\n break;\n case \"record-line\":\n validateRecordLine(n, path, c);\n break;\n case \"record-line-list\":\n validateRecordLineList(n, path, c);\n break;\n case \"chip\":\n validateChip(n, path, c);\n break;\n case \"heading\":\n validateHeading(n, path, c);\n break;\n case \"text\":\n validateText(n, path, c);\n break;\n case \"stat\":\n validateStat(n, path, c);\n break;\n case \"key-value\":\n validateKeyValue(n, path, c);\n break;\n case \"button\":\n validateButton(n, path, c);\n break;\n case \"icon-button\":\n validateIconButton(n, path, c);\n break;\n case \"copy-button\":\n validateCopyButton(n, path, c);\n break;\n case \"select\":\n validateSelect(n, path, c);\n break;\n case \"empty-state\":\n validateEmptyState(n, path, c);\n break;\n case \"error-state\":\n validateErrorState(n, path, c);\n break;\n case \"skeleton\":\n validateSkeleton(n, path, c);\n break;\n case \"tabs\":\n validateTabs(n, path, c);\n break;\n case \"data-table\":\n validateDataTable(n, path, c);\n break;\n case \"board\":\n validateBoard(n, path, c);\n break;\n case \"text-input\":\n validateTextInput(n, path, c);\n break;\n case \"form\":\n validateForm(n, path, c);\n break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Per-node validators\n// ---------------------------------------------------------------------------\n\nfunction validateContainer(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n && n.children !== undefined) {\n if (!Array.isArray(n.children)) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ARRAY\",\n `${n.type} \"children\" must be an array`,\n );\n } else {\n n.children.forEach((child, i) => {\n validateNodeInto(child, `${path}/children/${i}`, c);\n });\n }\n }\n}\n\nfunction validateGrid(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.cols !== \"number\" || !Number.isInteger(props.cols)) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_MISSING_REQUIRED\",\n `grid requires \"props.cols\" to be an integer`,\n );\n } else if (props.cols < 1 || props.cols > 12) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_INVALID_VALUE\",\n `grid \"props.cols\" must be between 1 and 12, got ${props.cols}`,\n );\n }\n validateContainer(n, path, c);\n}\n\nfunction validateDivider(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ALLOWED\",\n `divider cannot have children`,\n );\n }\n}\n\nfunction validateRecordLine(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.record !== \"string\") {\n c.add(\n `${path}/bind/record`,\n \"BIND_MISSING_REQUIRED\",\n `record-line requires \"bind.record\" (a record id string)`,\n );\n }\n}\n\nfunction validateRecordLineList(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line-list requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `record-line-list requires \"bind.query\" or \"bind.items\"`,\n );\n return;\n }\n\n const hasQuery = \"query\" in bind;\n const hasItems = \"items\" in bind;\n if (!hasQuery && !hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" must contain either \"query\" or \"items\"`,\n );\n } else if (hasQuery && hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" cannot contain both \"query\" and \"items\"`,\n );\n } else if (hasItems && !Array.isArray(bind.items)) {\n c.add(\n `${path}/bind/items`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind.items\" must be an array of record ids`,\n );\n }\n}\n\nfunction validateChip(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `chip requires \"props.label\"`,\n );\n }\n}\n\nfunction validateHeading(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.level !== \"number\" || !Number.isInteger(props.level)) {\n c.add(\n `${path}/props/level`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.level\" to be an integer`,\n );\n } else if (props.level < 1 || props.level > 6) {\n c.add(\n `${path}/props/level`,\n \"PROPS_INVALID_VALUE\",\n `heading \"props.level\" must be 1-6, got ${props.level}`,\n );\n }\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.text\"`,\n );\n }\n}\n\nfunction validateText(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `text requires \"props.text\"`,\n );\n }\n}\n\nfunction validateStat(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\" && typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.value\" (string or number)`,\n );\n }\n}\n\nfunction validateKeyValue(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.value\"`,\n );\n }\n}\n\nfunction validateButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `button requires \"props.label\"`,\n );\n }\n}\n\nfunction validateIconButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.glyph !== \"string\") {\n c.add(\n `${path}/props/glyph`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires \"props.glyph\" (Glyph kind string)`,\n );\n }\n if (typeof props.ariaLabel !== \"string\" || props.ariaLabel.length === 0) {\n c.add(\n `${path}/props/ariaLabel`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires a non-empty \"props.ariaLabel\" (WCAG 2.1 AA)`,\n );\n }\n}\n\nfunction validateCopyButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `copy-button requires \"props.value\"`,\n );\n }\n}\n\nfunction validateSelect(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options)) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `select requires \"props.options\" (array of {label, value})`,\n );\n return;\n }\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.label !== \"string\" || typeof o.value !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must have string \"label\" and \"value\"`,\n );\n }\n });\n}\n\nfunction validateEmptyState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `empty-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateErrorState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `error-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateSkeleton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown> | undefined;\n if (props && typeof props.shape === \"string\") {\n const allowed = [\"rect\", \"circle\", \"text\"];\n if (!allowed.includes(props.shape)) {\n c.add(\n `${path}/props/shape`,\n \"PROPS_INVALID_VALUE\",\n `skeleton \"props.shape\" must be one of ${allowed.join(\" | \")}, got ${props.shape}`,\n );\n }\n if (\n props.shape === \"rect\" &&\n props.height === undefined\n ) {\n c.add(\n `${path}/props/height`,\n \"PROPS_MISSING_REQUIRED\",\n `skeleton shape='rect' requires \"props.height\"`,\n );\n }\n }\n\n // Returned silently — suppress unused-param warning\n void n;\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 node validators\n// ---------------------------------------------------------------------------\n\nfunction validateTabs(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.tabs) || props.tabs.length === 0) {\n c.add(\n `${path}/props/tabs`,\n \"PROPS_MISSING_REQUIRED\",\n `tabs requires a non-empty \"props.tabs\" array`,\n );\n } else {\n props.tabs.forEach((tab, i) => {\n if (typeof tab !== \"object\" || tab === null) {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must be an object`,\n );\n return;\n }\n const t = tab as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.label !== \"string\") {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.active !== \"string\") {\n c.add(\n `${path}/bind/active`,\n \"BIND_MISSING_REQUIRED\",\n `tabs requires \"bind.active\" (a tab id string)`,\n );\n }\n\n // Children are the panels — validated recursively.\n validateContainer(n, path, c);\n}\n\nfunction validateDataTable(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `data-table requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.key !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must have string \"key\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `data-table requires \"bind.query\" or \"bind.rows\"`,\n );\n return;\n }\n const hasQuery = \"query\" in bind;\n const hasRows = \"rows\" in bind;\n if (!hasQuery && !hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" must contain either \"query\" or \"rows\"`,\n );\n } else if (hasQuery && hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" cannot contain both \"query\" and \"rows\"`,\n );\n } else if (hasRows && !Array.isArray(bind.rows)) {\n c.add(\n `${path}/bind/rows`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind.rows\" must be an array of row objects`,\n );\n }\n}\n\nfunction validateBoard(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.id !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n if (typeof props.groupBy !== \"string\") {\n c.add(\n `${path}/props/groupBy`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires \"props.groupBy\" (a record field name)`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.query !== \"object\" || bind.query === null) {\n c.add(\n `${path}/bind/query`,\n \"BIND_MISSING_REQUIRED\",\n `board requires \"bind.query\" (a VQL query object)`,\n );\n }\n}\n\nfunction validateTextInput(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `text-input requires \"bind.value\" (a string)`,\n );\n }\n\n const props = n.props as Record<string, unknown> | undefined;\n if (props && props.inputKind !== undefined) {\n const allowed = [\"text\", \"search\"];\n if (\n typeof props.inputKind !== \"string\" ||\n !allowed.includes(props.inputKind)\n ) {\n c.add(\n `${path}/props/inputKind`,\n \"PROPS_INVALID_VALUE\",\n `text-input \"props.inputKind\" must be one of ${allowed.join(\" | \")}`,\n );\n }\n }\n}\n\nfunction validateForm(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n // A form is a pure container — its inputs are validated recursively.\n validateContainer(n, path, c);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for library consumers\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard: true when `doc` is a well-formed SRP document.\n * Useful in adapter code that receives untrusted JSON.\n */\nexport function isSRPDocument(doc: unknown): doc is SRPDocument {\n const result = validateSRP(doc);\n return result.valid;\n}\n\n/**\n * Type guard: true when `node` is a well-formed SRP node.\n */\nexport function isSRPNode(node: unknown): node is SRPNode {\n const result = validateNode(node, \"\");\n return result.valid;\n}\n"]}
1
+ {"version":3,"file":"validators.js","sourceRoot":"","sources":["../src/validators.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runtime validators for SRP v0.1 documents.\n *\n * Pure functions — no dependencies. Return a ValidationResult with either a\n * `valid: true` flag or a list of errors keyed by path.\n */\n\nimport type { SRPDocument, SRPNode } from \"./schema.js\";\nimport { NODE_TYPES } from \"./schema.js\";\n\n// ---------------------------------------------------------------------------\n// Result types\n// ---------------------------------------------------------------------------\n\nexport interface ValidationError {\n /** JSON-pointer-style path to the offending node, e.g. \"/root/children/0\". */\n path: string;\n /** Human-readable message. */\n message: string;\n /** Machine-readable code for programmatic handling. */\n code: ValidationErrorCode;\n}\n\nexport type ValidationErrorCode =\n | \"SRP_VERSION_INVALID\"\n | \"ROOT_MISSING\"\n | \"NODE_NOT_OBJECT\"\n | \"NODE_TYPE_MISSING\"\n | \"NODE_TYPE_UNKNOWN\"\n | \"PROPS_MISSING_REQUIRED\"\n | \"PROPS_INVALID_VALUE\"\n | \"CHILDREN_NOT_ARRAY\"\n | \"CHILDREN_NOT_ALLOWED\"\n | \"BIND_MISSING_REQUIRED\"\n | \"BIND_INVALID_SHAPE\";\n\nexport type ValidationResult =\n | { valid: true }\n | { valid: false; errors: ValidationError[] };\n\nclass Collector {\n errors: ValidationError[] = [];\n add(path: string, code: ValidationErrorCode, message: string): void {\n this.errors.push({ path, code, message });\n }\n}\n\n// ---------------------------------------------------------------------------\n// Public API\n// ---------------------------------------------------------------------------\n\n/**\n * Validate a full SRP document.\n *\n * Returns `{ valid: true }` when the document conforms to SRP v0.1.\n * Returns `{ valid: false, errors }` with every violation keyed by a\n * JSON-pointer-style path when it doesn't.\n */\nexport function validateSRP(doc: unknown): ValidationResult {\n const c = new Collector();\n\n if (typeof doc !== \"object\" || doc === null) {\n c.add(\"\", \"NODE_NOT_OBJECT\", \"SRP document must be an object\");\n return { valid: false, errors: c.errors };\n }\n\n const d = doc as Record<string, unknown>;\n\n if (d.srp !== \"0.1\" && d.srp !== \"0.2\") {\n c.add(\n \"/srp\",\n \"SRP_VERSION_INVALID\",\n `srp field must be \"0.1\" or \"0.2\", got ${JSON.stringify(d.srp)}`,\n );\n }\n\n if (!(\"root\" in d)) {\n c.add(\"/root\", \"ROOT_MISSING\", \"SRP document must have a root node\");\n return { valid: false, errors: c.errors };\n }\n\n validateNodeInto(d.root, \"/root\", c);\n\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\n/**\n * Validate a single node (used internally and useful standalone for\n * incremental SRP authoring).\n */\nexport function validateNode(node: unknown, path: string): ValidationResult {\n const c = new Collector();\n validateNodeInto(node, path, c);\n return c.errors.length === 0\n ? { valid: true }\n : { valid: false, errors: c.errors };\n}\n\nfunction validateNodeInto(\n node: unknown,\n path: string,\n c: Collector,\n): void {\n if (typeof node !== \"object\" || node === null) {\n c.add(path, \"NODE_NOT_OBJECT\", `Node at ${path} must be an object`);\n return;\n }\n\n const n = node as Record<string, unknown>;\n\n if (typeof n.type !== \"string\") {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_MISSING\",\n `Node at ${path} must have a string \"type\" field`,\n );\n return;\n }\n\n if (!(NODE_TYPES as readonly string[]).includes(n.type)) {\n c.add(\n `${path}/type`,\n \"NODE_TYPE_UNKNOWN\",\n `Unknown node type \"${n.type}\" at ${path}. Allowed: ${NODE_TYPES.join(\", \")}`,\n );\n return;\n }\n\n // Per-type validation dispatched below\n switch (n.type) {\n case \"column\":\n case \"row\":\n case \"card\":\n validateContainer(n, path, c);\n break;\n case \"grid\":\n validateGrid(n, path, c);\n break;\n case \"divider\":\n validateDivider(n, path, c);\n break;\n case \"record-line\":\n validateRecordLine(n, path, c);\n break;\n case \"record-line-list\":\n validateRecordLineList(n, path, c);\n break;\n case \"chip\":\n validateChip(n, path, c);\n break;\n case \"heading\":\n validateHeading(n, path, c);\n break;\n case \"text\":\n validateText(n, path, c);\n break;\n case \"stat\":\n validateStat(n, path, c);\n break;\n case \"key-value\":\n validateKeyValue(n, path, c);\n break;\n case \"button\":\n validateButton(n, path, c);\n break;\n case \"icon-button\":\n validateIconButton(n, path, c);\n break;\n case \"copy-button\":\n validateCopyButton(n, path, c);\n break;\n case \"select\":\n validateSelect(n, path, c);\n break;\n case \"empty-state\":\n validateEmptyState(n, path, c);\n break;\n case \"error-state\":\n validateErrorState(n, path, c);\n break;\n case \"skeleton\":\n validateSkeleton(n, path, c);\n break;\n case \"tabs\":\n validateTabs(n, path, c);\n break;\n case \"data-table\":\n validateDataTable(n, path, c);\n break;\n case \"board\":\n validateBoard(n, path, c);\n break;\n case \"text-input\":\n validateTextInput(n, path, c);\n break;\n case \"form\":\n validateForm(n, path, c);\n break;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Per-node validators\n// ---------------------------------------------------------------------------\n\nfunction validateContainer(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n && n.children !== undefined) {\n if (!Array.isArray(n.children)) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ARRAY\",\n `${n.type} \"children\" must be an array`,\n );\n } else {\n n.children.forEach((child, i) => {\n validateNodeInto(child, `${path}/children/${i}`, c);\n });\n }\n }\n}\n\nfunction validateGrid(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.cols !== \"number\" || !Number.isInteger(props.cols)) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_MISSING_REQUIRED\",\n `grid requires \"props.cols\" to be an integer`,\n );\n } else if (props.cols < 1 || props.cols > 12) {\n c.add(\n `${path}/props/cols`,\n \"PROPS_INVALID_VALUE\",\n `grid \"props.cols\" must be between 1 and 12, got ${props.cols}`,\n );\n }\n validateContainer(n, path, c);\n}\n\nfunction validateDivider(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n if (\"children\" in n) {\n c.add(\n `${path}/children`,\n \"CHILDREN_NOT_ALLOWED\",\n `divider cannot have children`,\n );\n }\n}\n\nfunction validateRecordLine(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.record !== \"string\") {\n c.add(\n `${path}/bind/record`,\n \"BIND_MISSING_REQUIRED\",\n `record-line requires \"bind.record\" (a record id string)`,\n );\n }\n}\n\nfunction validateRecordLineList(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.variant !== \"string\") {\n c.add(\n `${path}/props/variant`,\n \"PROPS_MISSING_REQUIRED\",\n `record-line-list requires \"props.variant\"`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `record-line-list requires \"bind.query\" or \"bind.items\"`,\n );\n return;\n }\n\n const hasQuery = \"query\" in bind;\n const hasItems = \"items\" in bind;\n if (!hasQuery && !hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" must contain either \"query\" or \"items\"`,\n );\n } else if (hasQuery && hasItems) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind\" cannot contain both \"query\" and \"items\"`,\n );\n } else if (hasItems && !Array.isArray(bind.items)) {\n c.add(\n `${path}/bind/items`,\n \"BIND_INVALID_SHAPE\",\n `record-line-list \"bind.items\" must be an array of record ids`,\n );\n }\n}\n\nfunction validateChip(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `chip requires \"props.label\"`,\n );\n }\n}\n\nfunction validateHeading(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.level !== \"number\" || !Number.isInteger(props.level)) {\n c.add(\n `${path}/props/level`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.level\" to be an integer`,\n );\n } else if (props.level < 1 || props.level > 6) {\n c.add(\n `${path}/props/level`,\n \"PROPS_INVALID_VALUE\",\n `heading \"props.level\" must be 1-6, got ${props.level}`,\n );\n }\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `heading requires \"props.text\"`,\n );\n }\n}\n\nfunction validateText(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.text !== \"string\") {\n c.add(\n `${path}/props/text`,\n \"PROPS_MISSING_REQUIRED\",\n `text requires \"props.text\"`,\n );\n }\n}\n\nfunction validateStat(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\" && typeof props.value !== \"number\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `stat requires \"props.value\" (string or number)`,\n );\n }\n}\n\nfunction validateKeyValue(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.label\"`,\n );\n }\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `key-value requires \"props.value\"`,\n );\n }\n}\n\nfunction validateButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.label !== \"string\") {\n c.add(\n `${path}/props/label`,\n \"PROPS_MISSING_REQUIRED\",\n `button requires \"props.label\"`,\n );\n }\n}\n\nfunction validateIconButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.glyph !== \"string\") {\n c.add(\n `${path}/props/glyph`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires \"props.glyph\" (Glyph kind string)`,\n );\n }\n if (typeof props.ariaLabel !== \"string\" || props.ariaLabel.length === 0) {\n c.add(\n `${path}/props/ariaLabel`,\n \"PROPS_MISSING_REQUIRED\",\n `icon-button requires a non-empty \"props.ariaLabel\" (WCAG 2.1 AA)`,\n );\n }\n}\n\nfunction validateCopyButton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.value !== \"string\") {\n c.add(\n `${path}/props/value`,\n \"PROPS_MISSING_REQUIRED\",\n `copy-button requires \"props.value\"`,\n );\n }\n}\n\nfunction validateSelect(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.options)) {\n c.add(\n `${path}/props/options`,\n \"PROPS_MISSING_REQUIRED\",\n `select requires \"props.options\" (array of {label, value})`,\n );\n return;\n }\n props.options.forEach((opt, i) => {\n if (typeof opt !== \"object\" || opt === null) {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must be an object`,\n );\n return;\n }\n const o = opt as Record<string, unknown>;\n if (typeof o.label !== \"string\" || typeof o.value !== \"string\") {\n c.add(\n `${path}/props/options/${i}`,\n \"PROPS_INVALID_VALUE\",\n `select option must have string \"label\" and \"value\"`,\n );\n }\n });\n}\n\nfunction validateEmptyState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `empty-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateErrorState(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (typeof props.message !== \"string\") {\n c.add(\n `${path}/props/message`,\n \"PROPS_MISSING_REQUIRED\",\n `error-state requires \"props.message\"`,\n );\n }\n}\n\nfunction validateSkeleton(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown> | undefined;\n if (props && typeof props.shape === \"string\") {\n const allowed = [\"rect\", \"circle\", \"text\"];\n if (!allowed.includes(props.shape)) {\n c.add(\n `${path}/props/shape`,\n \"PROPS_INVALID_VALUE\",\n `skeleton \"props.shape\" must be one of ${allowed.join(\" | \")}, got ${props.shape}`,\n );\n }\n if (\n props.shape === \"rect\" &&\n props.height === undefined\n ) {\n c.add(\n `${path}/props/height`,\n \"PROPS_MISSING_REQUIRED\",\n `skeleton shape='rect' requires \"props.height\"`,\n );\n }\n }\n\n // Returned silently — suppress unused-param warning\n void n;\n}\n\n// ---------------------------------------------------------------------------\n// SRP v0.2 node validators\n// ---------------------------------------------------------------------------\n\nfunction validateTabs(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.tabs) || props.tabs.length === 0) {\n c.add(\n `${path}/props/tabs`,\n \"PROPS_MISSING_REQUIRED\",\n `tabs requires a non-empty \"props.tabs\" array`,\n );\n } else {\n props.tabs.forEach((tab, i) => {\n if (typeof tab !== \"object\" || tab === null) {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must be an object`,\n );\n return;\n }\n const t = tab as Record<string, unknown>;\n if (typeof t.id !== \"string\" || typeof t.label !== \"string\") {\n c.add(\n `${path}/props/tabs/${i}`,\n \"PROPS_INVALID_VALUE\",\n `tab must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.active !== \"string\") {\n c.add(\n `${path}/bind/active`,\n \"BIND_MISSING_REQUIRED\",\n `tabs requires \"bind.active\" (a tab id string)`,\n );\n }\n\n // Children are the panels — validated recursively.\n validateContainer(n, path, c);\n}\n\nfunction validateDataTable(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `data-table requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.key !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `data-table column must have string \"key\" and \"label\"`,\n );\n }\n if (o.kind !== undefined && o.kind !== \"text\" && o.kind !== \"chip\") {\n c.add(\n `${path}/props/columns/${i}/kind`,\n \"PROPS_INVALID_VALUE\",\n `data-table column \"kind\" must be \"text\" or \"chip\"`,\n );\n }\n });\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind) {\n c.add(\n `${path}/bind`,\n \"BIND_MISSING_REQUIRED\",\n `data-table requires \"bind.query\" or \"bind.rows\"`,\n );\n return;\n }\n const hasQuery = \"query\" in bind;\n const hasRows = \"rows\" in bind;\n if (!hasQuery && !hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" must contain either \"query\" or \"rows\"`,\n );\n } else if (hasQuery && hasRows) {\n c.add(\n `${path}/bind`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind\" cannot contain both \"query\" and \"rows\"`,\n );\n } else if (hasRows && !Array.isArray(bind.rows)) {\n c.add(\n `${path}/bind/rows`,\n \"BIND_INVALID_SHAPE\",\n `data-table \"bind.rows\" must be an array of row objects`,\n );\n }\n}\n\nfunction validateBoard(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const props = (n.props ?? {}) as Record<string, unknown>;\n if (!Array.isArray(props.columns) || props.columns.length === 0) {\n c.add(\n `${path}/props/columns`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires a non-empty \"props.columns\" array`,\n );\n } else {\n props.columns.forEach((col, i) => {\n if (typeof col !== \"object\" || col === null) {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must be an object`,\n );\n return;\n }\n const o = col as Record<string, unknown>;\n if (typeof o.id !== \"string\" || typeof o.label !== \"string\") {\n c.add(\n `${path}/props/columns/${i}`,\n \"PROPS_INVALID_VALUE\",\n `board column must have string \"id\" and \"label\"`,\n );\n }\n });\n }\n\n if (typeof props.groupBy !== \"string\") {\n c.add(\n `${path}/props/groupBy`,\n \"PROPS_MISSING_REQUIRED\",\n `board requires \"props.groupBy\" (a record field name)`,\n );\n }\n\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.query !== \"object\" || bind.query === null) {\n c.add(\n `${path}/bind/query`,\n \"BIND_MISSING_REQUIRED\",\n `board requires \"bind.query\" (a VQL query object)`,\n );\n }\n}\n\nfunction validateTextInput(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n const bind = n.bind as Record<string, unknown> | undefined;\n if (!bind || typeof bind.value !== \"string\") {\n c.add(\n `${path}/bind/value`,\n \"BIND_MISSING_REQUIRED\",\n `text-input requires \"bind.value\" (a string)`,\n );\n }\n\n const props = n.props as Record<string, unknown> | undefined;\n if (props && props.inputKind !== undefined) {\n const allowed = [\"text\", \"search\"];\n if (\n typeof props.inputKind !== \"string\" ||\n !allowed.includes(props.inputKind)\n ) {\n c.add(\n `${path}/props/inputKind`,\n \"PROPS_INVALID_VALUE\",\n `text-input \"props.inputKind\" must be one of ${allowed.join(\" | \")}`,\n );\n }\n }\n}\n\nfunction validateForm(\n n: Record<string, unknown>,\n path: string,\n c: Collector,\n): void {\n // A form is a pure container — its inputs are validated recursively.\n validateContainer(n, path, c);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers for library consumers\n// ---------------------------------------------------------------------------\n\n/**\n * Type guard: true when `doc` is a well-formed SRP document.\n * Useful in adapter code that receives untrusted JSON.\n */\nexport function isSRPDocument(doc: unknown): doc is SRPDocument {\n const result = validateSRP(doc);\n return result.valid;\n}\n\n/**\n * Type guard: true when `node` is a well-formed SRP node.\n */\nexport function isSRPNode(node: unknown): node is SRPNode {\n const result = validateNode(node, \"\");\n return result.valid;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syncropel/projections",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "TypeScript schema + validators for the Syncropel Rendering Protocol (SRP v0.2) — declarative UI documents for query-driven and AI-generated interfaces.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",