@objectstack/sdui-parser 17.2.0 → 17.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/parse.ts","../src/validate.ts","../src/codegen.ts"],"sourcesContent":["/**\n * @objectstack/sdui-parser — constrained JSX-source → SDUI SchemaNode tree (ADR-0080)\n *\n * Isomorphic, zero React. Run server-side as the authoritative save-time gate;\n * may also run client-side for live edit preview (re-validated on the server —\n * never the trust boundary). It PARSES; it never executes.\n */\n\nexport * from './types.js';\nexport { parseJsx, interpretBrace } from './parse.js';\nexport { validateTree } from './validate.js';\nexport { generateDts, propsName, generateBlockList } from './codegen.js';\nexport type { CodegenOptions } from './codegen.js';\n\nimport { parseJsx } from './parse.js';\nimport { validateTree } from './validate.js';\nimport type { Diagnostic, Manifest, SchemaElement, ValidationResult } from './types.js';\n\nexport interface CompileResult {\n tree: SchemaElement | null;\n diagnostics: Diagnostic[];\n requires: string[];\n bindings: ValidationResult['bindings'];\n /** true when there are no error-severity diagnostics — the save gate's pass/fail */\n ok: boolean;\n}\n\n/**\n * The authoritative pipeline: parse (with the manifest's tags as the whitelist)\n * → validate against the manifest → derive `requires` + binding sites.\n */\nexport function compile(source: string, manifest: Manifest): CompileResult {\n const allowedTags = new Set(Object.keys(manifest.components));\n const parsed = parseJsx(source, { allowedTags });\n const validated = validateTree(parsed.tree, manifest);\n const diagnostics = [...parsed.diagnostics, ...validated.diagnostics];\n return {\n tree: parsed.tree,\n diagnostics,\n requires: validated.requires,\n bindings: validated.bindings,\n ok: !diagnostics.some((d) => d.severity === 'error'),\n };\n}\n\n/* ------------------------------------------------------------------ *\n * Registry → manifest adapter. Structural input (no @object-ui/core\n * dependency) so the package stays pure and hoistable to framework.\n * Feed it `ComponentRegistry.getAllConfigs()` (optionally filtered to\n * the `tier:'public'` set).\n * ------------------------------------------------------------------ */\n\nexport interface RegistryConfigLike {\n type: string;\n namespace?: string;\n isContainer?: boolean;\n /** ADR-0080 contract tier — only 'public' configs form the AI/contract surface. */\n tier?: 'public' | 'internal';\n label?: string;\n category?: string;\n inputs?: Array<{\n name: string;\n type: string;\n required?: boolean;\n enum?: Array<string | { value: unknown; label?: string }>;\n binding?: 'object' | 'field';\n description?: string;\n }>;\n}\n\nconst INPUT_TYPES = new Set([\n 'string',\n 'number',\n 'boolean',\n 'enum',\n 'array',\n 'object',\n 'color',\n 'date',\n 'code',\n 'file',\n 'slot',\n]);\n\nexport function manifestFromConfigs(\n configs: RegistryConfigLike[],\n opts: { only?: Set<string>; publicOnly?: boolean } = {},\n): Manifest {\n const components: Manifest['components'] = {};\n for (const c of configs) {\n if (opts.only && !opts.only.has(c.type)) continue;\n if (opts.publicOnly && c.tier !== 'public') continue;\n components[c.type] = {\n type: c.type,\n namespace: c.namespace,\n isContainer: c.isContainer,\n inputs: (c.inputs ?? []).map((i) => ({\n name: i.name,\n type: (INPUT_TYPES.has(i.type) ? i.type : 'string') as Manifest['components'][string]['inputs'][number]['type'],\n required: i.required,\n enum: i.enum,\n binding: i.binding,\n description: i.description,\n })),\n };\n }\n return { components };\n}\n","/**\n * ObjectUI — SDUI JSX-source parser (ADR-0080)\n *\n * A small recursive-descent parser for a CONSTRAINED JSX subset. It is\n * deliberately not a full JS/JSX parser: a bounded grammar is the point\n * (Markdoc model) — it shrinks the attack surface and the expressible-but-wrong\n * space. Output is the existing SDUI `SchemaNode` tree. Nothing is executed.\n *\n * Grammar (informal):\n * document := element (exactly one root)\n * element := openTag child-star closeTag, or a self-closing tag\n * attr := name '=' (string | braced), or a bare name meaning true\n * child := element | text | jsx-block-comment\n * tag := [A-Za-z][A-Za-z0-9:_-]star (matches registry keys)\n */\n\nimport type { Diagnostic, ParseOptions, ParseResult, SchemaElement, SchemaNode } from './types.js';\n\n/** Event handlers and raw-HTML injection are never allowed (parse ≠ execute). */\nconst EVENT_ATTR = /^on[A-Z]/;\nconst FORBIDDEN_ATTRS = new Set(['dangerouslySetInnerHTML', 'ref', 'key']);\n\nexport function parseJsx(source: string, options: ParseOptions = {}): ParseResult {\n return new Parser(source, options).parseDocument();\n}\n\nconst isNameStart = (c: string) => /[A-Za-z]/.test(c);\nconst isNameChar = (c: string) => /[A-Za-z0-9:_-]/.test(c);\n\nclass Parser {\n private pos = 0;\n private readonly diagnostics: Diagnostic[] = [];\n\n constructor(private readonly src: string, private readonly opts: ParseOptions) {}\n\n parseDocument(): ParseResult {\n this.skipTrivia();\n if (this.peek() !== '<') {\n this.error('no-root', 'Expected a single root element');\n return { tree: null, diagnostics: this.diagnostics };\n }\n const tree = this.parseElement();\n this.skipTrivia();\n if (tree && this.pos < this.src.length) {\n this.error('multiple-roots', 'A page must have exactly one root element', this.pos);\n }\n return { tree, diagnostics: this.diagnostics };\n }\n\n private parseElement(): SchemaElement | null {\n const start = this.pos;\n if (!this.eat('<')) {\n this.error('expected-element', 'Expected \"<\"', start);\n return null;\n }\n const tag = this.readName();\n if (!tag) {\n this.error('bad-tag', 'Expected a tag name after \"<\"', start);\n return null;\n }\n if (this.opts.allowedTags && !this.opts.allowedTags.has(tag)) {\n this.error('forbidden-tag', `<${tag}> is not an allowed component`, start, tag);\n }\n\n const props: Record<string, unknown> = {};\n for (;;) {\n this.skipWs();\n const c = this.peek();\n if (c === '' || c === '>' || c === '/') break;\n const attr = this.parseAttr(start, tag);\n if (!attr) break;\n props[attr.name] = attr.value;\n }\n\n this.skipWs();\n let children: SchemaNode[] | undefined;\n if (this.eat('/')) {\n if (!this.eat('>')) this.error('bad-self-close', `Malformed self-closing <${tag}>`, this.pos, tag);\n } else if (this.eat('>')) {\n children = this.parseChildren(tag);\n } else {\n this.error('unterminated-open-tag', `Unterminated <${tag}> open tag`, start, tag);\n }\n\n const node: SchemaElement = { type: tag, ...props };\n if (children && children.length) node.children = children;\n return node;\n }\n\n private parseAttr(elStart: number, tag: string): { name: string; value: unknown } | null {\n const name = this.readName();\n if (!name) {\n this.error('bad-attr', `Malformed attribute on <${tag}>`, this.pos, tag);\n // skip one char to avoid an infinite loop on garbage\n this.pos++;\n return null;\n }\n this.skipWs();\n let value: unknown = true; // bare attribute => boolean true\n if (this.eat('=')) {\n this.skipWs();\n value = this.parseAttrValue(tag);\n }\n if (EVENT_ATTR.test(name) || FORBIDDEN_ATTRS.has(name)) {\n this.error('forbidden-attr', `Attribute \"${name}\" is not allowed on <${tag}>`, elStart, tag);\n return { name: `__forbidden_${name}`, value: undefined };\n }\n return { name, value };\n }\n\n private parseAttrValue(tag: string): unknown {\n const c = this.peek();\n if (c === '\"' || c === \"'\") return this.readString(c);\n if (c === '{') return interpretBrace(this.readBraced());\n this.error('bad-attr-value', `Expected an attribute value on <${tag}>`, this.pos, tag);\n return undefined;\n }\n\n private parseChildren(parentTag: string): SchemaNode[] {\n const children: SchemaNode[] = [];\n for (;;) {\n if (this.pos >= this.src.length) {\n this.error('unclosed-element', `Unclosed <${parentTag}>`, this.pos, parentTag);\n break;\n }\n // closing tag\n if (this.src.startsWith('</', this.pos)) {\n this.pos += 2;\n this.skipWs();\n const close = this.readName();\n this.skipWs();\n this.eat('>');\n if (close !== parentTag) {\n this.error('mismatched-tag', `Expected </${parentTag}> but found </${close}>`, this.pos, parentTag);\n }\n break;\n }\n // JSX comment {/* ... */}\n if (this.src.startsWith('{/*', this.pos)) {\n const end = this.src.indexOf('*/}', this.pos);\n if (end === -1) {\n this.error('unclosed-comment', 'Unclosed comment', this.pos);\n this.pos = this.src.length;\n } else {\n this.pos = end + 3;\n }\n continue;\n }\n // nested element\n if (this.peek() === '<') {\n const el = this.parseElement();\n if (el) children.push(el);\n continue;\n }\n // expression child {expr} — out of grammar for v1: skip with a warning\n if (this.peek() === '{') {\n const start = this.pos;\n this.readBraced();\n this.error(\n 'expression-child',\n 'Inline {expression} children are not supported yet — bind via a component prop',\n start,\n );\n continue;\n }\n // text\n const text = this.readTextRun();\n const trimmed = text.replace(/\\s+/g, ' ').trim();\n if (trimmed) children.push(trimmed);\n }\n return children;\n }\n\n /* ----------------------------- lexing ----------------------------- */\n\n private peek(): string {\n return this.pos < this.src.length ? this.src[this.pos] : '';\n }\n\n private eat(ch: string): boolean {\n if (this.src[this.pos] === ch) {\n this.pos++;\n return true;\n }\n return false;\n }\n\n private readName(): string {\n if (!isNameStart(this.peek())) return '';\n const start = this.pos;\n this.pos++;\n while (this.pos < this.src.length && isNameChar(this.src[this.pos])) this.pos++;\n return this.src.slice(start, this.pos);\n }\n\n private readString(quote: string): string {\n this.pos++; // opening quote\n const start = this.pos;\n while (this.pos < this.src.length && this.src[this.pos] !== quote) this.pos++;\n const value = this.src.slice(start, this.pos);\n if (!this.eat(quote)) this.error('unterminated-string', 'Unterminated string literal', start);\n return value;\n }\n\n /** Reads a balanced `{ ... }` run and returns the inner text (no outer braces). */\n private readBraced(): string {\n const start = this.pos;\n let depth = 0;\n let inStr: string | null = null;\n for (; this.pos < this.src.length; this.pos++) {\n const ch = this.src[this.pos];\n if (inStr) {\n if (ch === inStr && this.src[this.pos - 1] !== '\\\\') inStr = null;\n continue;\n }\n if (ch === '\"' || ch === \"'\") inStr = ch;\n else if (ch === '{') depth++;\n else if (ch === '}') {\n depth--;\n if (depth === 0) {\n const inner = this.src.slice(start + 1, this.pos);\n this.pos++; // consume closing brace\n return inner;\n }\n }\n }\n this.error('unterminated-brace', 'Unterminated \"{\"', start);\n return this.src.slice(start + 1);\n }\n\n private readTextRun(): string {\n const start = this.pos;\n while (this.pos < this.src.length && this.src[this.pos] !== '<' && this.src[this.pos] !== '{') this.pos++;\n return this.src.slice(start, this.pos);\n }\n\n private skipWs(): void {\n while (this.pos < this.src.length && /\\s/.test(this.src[this.pos])) this.pos++;\n }\n\n /** whitespace + top-level JSX comments */\n private skipTrivia(): void {\n for (;;) {\n this.skipWs();\n if (this.src.startsWith('{/*', this.pos)) {\n const end = this.src.indexOf('*/}', this.pos);\n this.pos = end === -1 ? this.src.length : end + 3;\n continue;\n }\n break;\n }\n }\n\n private error(code: string, message: string, start?: number, tag?: string): void {\n this.diagnostics.push({ severity: 'error', code, message, start: start ?? this.pos, tag });\n }\n}\n\n/**\n * Interpret a braced attribute value `{...}`.\n * JSON-literal values (numbers, booleans, null, strings, arrays, objects with\n * quoted keys) are materialized. Anything else is kept as a deferred expression\n * marker `{ $expr }` — typed and validated later, NEVER evaluated here.\n */\nexport function interpretBrace(raw: string): unknown {\n const trimmed = raw.trim();\n try {\n return JSON.parse(trimmed);\n } catch {\n return { $expr: trimmed };\n }\n}\n","/**\n * ObjectUI — SDUI tree validation against the registry manifest (ADR-0080 §3/§6)\n *\n * Shallow, author-time validation: unknown component, unknown/missing prop,\n * wrong coarse type, illegal enum value. Collects `requires` (plugin provenance)\n * and binding sites the SERVER must resolve against object schema (we cannot\n * resolve objects/fields here — that check is framework-side by design).\n */\n\nimport type {\n Diagnostic,\n Manifest,\n ManifestInput,\n SchemaElement,\n SchemaNode,\n ValidationResult,\n} from './types.js';\n\n/** Base props every node may carry (mirrors BaseSchema) — never \"unknown prop\". */\nconst BASE_PROPS = new Set([\n 'type',\n 'id',\n 'className',\n 'style',\n 'visible',\n 'visibleOn',\n 'disabled',\n 'disabledOn',\n 'children',\n]);\n\nconst isExpr = (v: unknown): boolean =>\n typeof v === 'object' && v !== null && '$expr' in (v as Record<string, unknown>);\n\nexport function validateTree(tree: SchemaElement | null, manifest: Manifest): ValidationResult {\n const diagnostics: Diagnostic[] = [];\n const requires = new Set<string>();\n const bindings: ValidationResult['bindings'] = [];\n\n const visit = (node: SchemaNode): void => {\n if (typeof node === 'string') return;\n const comp = manifest.components[node.type];\n if (!comp) {\n diagnostics.push({\n severity: 'error',\n code: 'unknown-component',\n message: `<${node.type}> is not a known component`,\n tag: node.type,\n });\n } else {\n if (comp.namespace) requires.add(comp.namespace);\n const byName = new Map(comp.inputs.map((i) => [i.name, i]));\n\n // required present?\n for (const input of comp.inputs) {\n if (input.required && !(input.name in node)) {\n diagnostics.push({\n severity: 'error',\n code: 'missing-required-prop',\n message: `<${node.type}> is missing required prop \"${input.name}\"`,\n tag: node.type,\n });\n }\n }\n\n // each provided prop\n for (const [key, value] of Object.entries(node)) {\n if (BASE_PROPS.has(key)) continue;\n const input = byName.get(key);\n if (!input) {\n diagnostics.push({\n severity: 'warning',\n code: 'unknown-prop',\n message: `<${node.type}> has no prop \"${key}\"`,\n tag: node.type,\n });\n continue;\n }\n if (input.binding) {\n bindings.push({ tag: node.type, input: key, kind: input.binding, value });\n }\n if (!isExpr(value)) {\n const typeDiag = checkType(node.type, input, value);\n if (typeDiag) diagnostics.push(typeDiag);\n }\n }\n\n // containment\n if (node.children?.length && !comp.isContainer) {\n diagnostics.push({\n severity: 'warning',\n code: 'not-a-container',\n message: `<${node.type}> does not accept children`,\n tag: node.type,\n });\n }\n }\n\n if (node.children) node.children.forEach(visit);\n };\n\n if (tree) visit(tree);\n return { diagnostics, requires: [...requires], bindings };\n}\n\nfunction checkType(tag: string, input: ManifestInput, value: unknown): Diagnostic | null {\n const mismatch = (expected: string): Diagnostic => ({\n severity: 'warning',\n code: 'type-mismatch',\n message: `<${tag}> prop \"${input.name}\" expected ${expected}`,\n tag,\n });\n switch (input.type) {\n case 'number':\n return typeof value === 'number' ? null : mismatch('a number');\n case 'boolean':\n return typeof value === 'boolean' ? null : mismatch('a boolean');\n case 'string':\n case 'color':\n case 'date':\n case 'code':\n case 'file':\n return typeof value === 'string' ? null : mismatch('a string');\n case 'array':\n return Array.isArray(value) ? null : mismatch('an array');\n case 'object':\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n ? null\n : mismatch('an object');\n case 'enum': {\n const allowed = (input.enum ?? []).map((e) => (typeof e === 'object' ? e.value : e));\n return allowed.includes(value as never)\n ? null\n : {\n severity: 'error',\n code: 'invalid-enum',\n message: `<${tag}> prop \"${input.name}\"=${JSON.stringify(value)} is not one of ${JSON.stringify(allowed)}`,\n tag,\n };\n }\n default:\n return null;\n }\n}\n","/**\n * ObjectUI — codegen the JSX type surface from the registry manifest (ADR-0080 §3)\n *\n * Emits a `.d.ts` that augments `JSX.IntrinsicElements` so a constrained\n * JSX-source page type-checks in `.tsx`: tag name === registry `type` key,\n * attributes === the component's manifest `inputs`. This is a TYPE-CHECKING\n * fiction — no real React intrinsic named `flex` exists; the interpreter\n * fulfills it via the registry at render time.\n */\n\nimport type { Manifest, ManifestComponent, ManifestInput } from './types.js';\n\nexport interface CodegenOptions {\n /** include a self-contained minimal JSX namespace so the d.ts type-checks\n * standalone (no React types needed). Default true. */\n standaloneJsx?: boolean;\n}\n\nexport function generateDts(manifest: Manifest, options: CodegenOptions = {}): string {\n const { standaloneJsx = true } = options;\n const comps = Object.values(manifest.components).sort((a, b) => a.type.localeCompare(b.type));\n\n const interfaces = comps.map(emitInterface).join('\\n\\n');\n const intrinsics = comps\n .map((c) => ` ${JSON.stringify(c.type)}: ${propsName(c.type)};`)\n .join('\\n');\n\n const baseElement = standaloneJsx\n ? `\n // minimal, so the surface type-checks without pulling React types\n type Element = unknown;\n interface ElementClass {}\n interface ElementAttributesProperty {}\n interface ElementChildrenAttribute { children: object; }`\n : '';\n\n return `// AUTO-GENERATED by @object-ui/sdui-parser — DO NOT EDIT.\n// Source of truth: ComponentRegistry inputs (ADR-0080 §3). Regenerate via codegen.\n/* eslint-disable */\n\nexport interface SduiBaseProps {\n id?: string;\n className?: string;\n style?: Record<string, unknown>;\n visible?: boolean;\n visibleOn?: string;\n disabled?: boolean;\n disabledOn?: string;\n children?: unknown;\n}\n\n${interfaces}\n\ndeclare global {\n namespace JSX {\n interface IntrinsicElements {\n${intrinsics}\n }${baseElement}\n }\n}\n\nexport {};\n`;\n}\n\nfunction emitInterface(comp: ManifestComponent): string {\n const lines = comp.inputs\n .filter((i) => i.type !== 'slot')\n .map((i) => ` ${propLine(i)}`)\n .join('\\n');\n return `export interface ${propsName(comp.type)} extends SduiBaseProps {\\n${lines}\\n}`;\n}\n\nfunction propLine(input: ManifestInput): string {\n const opt = input.required ? '' : '?';\n return `${quoteKeyIfNeeded(input.name)}${opt}: ${tsType(input)};`;\n}\n\nfunction tsType(input: ManifestInput): string {\n switch (input.type) {\n case 'number':\n return 'number';\n case 'boolean':\n return 'boolean';\n case 'array':\n return 'unknown[]';\n case 'object':\n return 'Record<string, unknown>';\n case 'enum': {\n const vals = (input.enum ?? []).map((e) => (typeof e === 'object' ? e.value : e));\n return vals.length ? vals.map((v) => JSON.stringify(v)).join(' | ') : 'string';\n }\n case 'string':\n case 'color':\n case 'date':\n case 'code':\n case 'file':\n default:\n return 'string';\n }\n}\n\nconst IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;\nconst quoteKeyIfNeeded = (name: string): string => (IDENT.test(name) ? name : JSON.stringify(name));\n\n/** 'object-grid' -> 'ObjectGrid', 'record:details' -> 'RecordDetails' */\nexport function propsName(type: string): string {\n const pascal = type\n .split(/[^A-Za-z0-9]+/)\n .filter(Boolean)\n .map((s) => s[0].toUpperCase() + s.slice(1))\n .join('');\n return `${pascal}Props`;\n}\n\n/**\n * Generate the human-facing PUBLIC block list (the curated \"清单\") from a\n * manifest — a Markdown table. Derived, never hand-maintained (ADR-0046).\n */\nexport function generateBlockList(manifest: Manifest): string {\n const rows = Object.values(manifest.components)\n .sort((a, b) => a.type.localeCompare(b.type))\n .map((c) => {\n const req = c.inputs.filter((i) => i.required).map((i) => i.name);\n const binds = c.inputs.filter((i) => i.binding).map((i) => `${i.name}:${i.binding}`);\n return `| \\`${c.type}\\` | ${c.namespace ?? '—'} | ${c.isContainer ? '✓' : ''} | ${req.join(', ') || '—'} | ${binds.join(', ') || '—'} |`;\n });\n return [\n `# SDUI public blocks (${Object.keys(manifest.components).length})`,\n '',\n '> Auto-generated from the registry `tier:\\'public\\'` set (ADR-0080). Do not edit by hand.',\n '',\n '| block | plugin | container | required props | bindings |',\n '|---|---|---|---|---|',\n ...rows,\n '',\n ].join('\\n');\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/parse.ts","../src/input-type.ts","../src/dashboard-widget-options.ts","../src/validate.ts","../src/codegen.ts"],"mappings":"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","names":["isExpr"]}
package/dist/index.mjs CHANGED
@@ -1,6 +1,7 @@
1
1
  // src/parse.ts
2
2
  var EVENT_ATTR = /^on[A-Z]/;
3
3
  var FORBIDDEN_ATTRS = /* @__PURE__ */ new Set(["dangerouslySetInnerHTML", "ref", "key"]);
4
+ var DISCRIMINATOR_ATTR = "type";
4
5
  function parseJsx(source, options = {}) {
5
6
  return new Parser(source, options).parseDocument();
6
7
  }
@@ -47,7 +48,7 @@ var Parser = class {
47
48
  if (c === "" || c === ">" || c === "/") break;
48
49
  const attr = this.parseAttr(start, tag);
49
50
  if (!attr) break;
50
- props[attr.name] = attr.value;
51
+ if (!attr.drop) props[attr.name] = attr.value;
51
52
  }
52
53
  this.skipWs();
53
54
  let children;
@@ -58,7 +59,7 @@ var Parser = class {
58
59
  } else {
59
60
  this.error("unterminated-open-tag", `Unterminated <${tag}> open tag`, start, tag);
60
61
  }
61
- const node = { type: tag, ...props };
62
+ const node = { ...props, type: tag };
62
63
  if (children && children.length) node.children = children;
63
64
  return node;
64
65
  }
@@ -75,6 +76,15 @@ var Parser = class {
75
76
  this.skipWs();
76
77
  value = this.parseAttrValue(tag);
77
78
  }
79
+ if (name === DISCRIMINATOR_ATTR) {
80
+ this.error(
81
+ "forbidden-attr",
82
+ `Attribute "${DISCRIMINATOR_ATTR}" is not allowed on <${tag}> \u2014 on this tier the tag name IS the component, so <${tag}> already means type "${tag}". Delete the attribute, or write the tag of the component you meant.`,
83
+ elStart,
84
+ tag
85
+ );
86
+ return { name, value: void 0, drop: true };
87
+ }
78
88
  if (EVENT_ATTR.test(name) || FORBIDDEN_ATTRS.has(name)) {
79
89
  this.error("forbidden-attr", `Attribute "${name}" is not allowed on <${tag}>`, elStart, tag);
80
90
  return { name: `__forbidden_${name}`, value: void 0 };
@@ -132,8 +142,17 @@ var Parser = class {
132
142
  continue;
133
143
  }
134
144
  const text = this.readTextRun();
135
- const trimmed = text.replace(/\s+/g, " ").trim();
136
- if (trimmed) children.push(trimmed);
145
+ const collapsed = text.replace(/\s+/g, " ");
146
+ const core = collapsed.trim();
147
+ const afterSibling = children.length > 0;
148
+ const beforeElement = this.peek() === "<" && !this.src.startsWith("</", this.pos);
149
+ if (core) {
150
+ const lead = afterSibling && collapsed.startsWith(" ") ? " " : "";
151
+ const trail = beforeElement && collapsed.endsWith(" ") ? " " : "";
152
+ children.push(`${lead}${core}${trail}`);
153
+ } else if (collapsed && afterSibling && beforeElement) {
154
+ children.push(" ");
155
+ }
137
156
  }
138
157
  return children;
139
158
  }
@@ -217,9 +236,268 @@ function interpretBrace(raw) {
217
236
  try {
218
237
  return JSON.parse(trimmed);
219
238
  } catch {
220
- return { $expr: trimmed };
239
+ const literal = readLiteral(trimmed);
240
+ return literal === NOT_LITERAL ? { $expr: trimmed } : literal;
221
241
  }
222
242
  }
243
+ var NOT_LITERAL = /* @__PURE__ */ Symbol("not-a-literal");
244
+ var LITERAL_WS = /[ \t\n\r]/;
245
+ var IDENT_START = /[A-Za-z_$]/;
246
+ var IDENT_CHAR = /[A-Za-z0-9_$]/;
247
+ var NUMBER = /^-?(?:0|[1-9][0-9]*)(?:\.[0-9]+)?(?:[eE][+-]?[0-9]+)?/;
248
+ var SIMPLE_ESCAPE = {
249
+ '"': '"',
250
+ "\\": "\\",
251
+ "/": "/",
252
+ b: "\b",
253
+ f: "\f",
254
+ n: "\n",
255
+ r: "\r",
256
+ t: " "
257
+ };
258
+ function readLiteral(src) {
259
+ const reader = new LiteralReader(src);
260
+ const value = reader.value();
261
+ if (value === NOT_LITERAL) return NOT_LITERAL;
262
+ reader.ws();
263
+ return reader.done() ? value : NOT_LITERAL;
264
+ }
265
+ var LiteralReader = class {
266
+ constructor(src) {
267
+ this.src = src;
268
+ this.pos = 0;
269
+ }
270
+ done() {
271
+ return this.pos >= this.src.length;
272
+ }
273
+ ws() {
274
+ while (this.pos < this.src.length && LITERAL_WS.test(this.src[this.pos])) this.pos++;
275
+ }
276
+ value() {
277
+ this.ws();
278
+ const c = this.src[this.pos];
279
+ if (c === void 0) return NOT_LITERAL;
280
+ if (c === '"' || c === "'") return this.string(c);
281
+ if (c === "[") return this.array();
282
+ if (c === "{") return this.object();
283
+ if (this.keyword("true")) return true;
284
+ if (this.keyword("false")) return false;
285
+ if (this.keyword("null")) return null;
286
+ return this.number();
287
+ }
288
+ /** A keyword only when it is not the prefix of a longer identifier. */
289
+ keyword(word) {
290
+ if (!this.src.startsWith(word, this.pos)) return false;
291
+ const after = this.src[this.pos + word.length];
292
+ if (after !== void 0 && IDENT_CHAR.test(after)) return false;
293
+ this.pos += word.length;
294
+ return true;
295
+ }
296
+ number() {
297
+ const m = NUMBER.exec(this.src.slice(this.pos));
298
+ if (!m) return NOT_LITERAL;
299
+ this.pos += m[0].length;
300
+ return Number(m[0]);
301
+ }
302
+ string(quote) {
303
+ this.pos++;
304
+ let out = "";
305
+ for (; ; ) {
306
+ const c = this.src[this.pos];
307
+ if (c === void 0) return NOT_LITERAL;
308
+ if (c === quote) {
309
+ this.pos++;
310
+ return out;
311
+ }
312
+ if (c === "\\") {
313
+ const esc = this.src[this.pos + 1];
314
+ if (esc === void 0) return NOT_LITERAL;
315
+ if (esc === "u") {
316
+ const hex = this.src.slice(this.pos + 2, this.pos + 6);
317
+ if (!/^[0-9a-fA-F]{4}$/.test(hex)) return NOT_LITERAL;
318
+ out += String.fromCharCode(parseInt(hex, 16));
319
+ this.pos += 6;
320
+ continue;
321
+ }
322
+ if (esc === "'" && quote === "'") {
323
+ out += "'";
324
+ this.pos += 2;
325
+ continue;
326
+ }
327
+ const simple = SIMPLE_ESCAPE[esc];
328
+ if (simple === void 0) return NOT_LITERAL;
329
+ out += simple;
330
+ this.pos += 2;
331
+ continue;
332
+ }
333
+ if (c < " ") return NOT_LITERAL;
334
+ out += c;
335
+ this.pos++;
336
+ }
337
+ }
338
+ array() {
339
+ this.pos++;
340
+ const out = [];
341
+ this.ws();
342
+ if (this.src[this.pos] === "]") {
343
+ this.pos++;
344
+ return out;
345
+ }
346
+ for (; ; ) {
347
+ const item = this.value();
348
+ if (item === NOT_LITERAL) return NOT_LITERAL;
349
+ out.push(item);
350
+ this.ws();
351
+ const c = this.src[this.pos];
352
+ if (c === ",") {
353
+ this.pos++;
354
+ continue;
355
+ }
356
+ if (c === "]") {
357
+ this.pos++;
358
+ return out;
359
+ }
360
+ return NOT_LITERAL;
361
+ }
362
+ }
363
+ object() {
364
+ this.pos++;
365
+ const out = {};
366
+ this.ws();
367
+ if (this.src[this.pos] === "}") {
368
+ this.pos++;
369
+ return out;
370
+ }
371
+ for (; ; ) {
372
+ this.ws();
373
+ const key = this.key();
374
+ if (key === NOT_LITERAL) return NOT_LITERAL;
375
+ this.ws();
376
+ if (this.src[this.pos] !== ":") return NOT_LITERAL;
377
+ this.pos++;
378
+ const item = this.value();
379
+ if (item === NOT_LITERAL) return NOT_LITERAL;
380
+ Object.defineProperty(out, key, {
381
+ value: item,
382
+ writable: true,
383
+ enumerable: true,
384
+ configurable: true
385
+ });
386
+ this.ws();
387
+ const c = this.src[this.pos];
388
+ if (c === ",") {
389
+ this.pos++;
390
+ continue;
391
+ }
392
+ if (c === "}") {
393
+ this.pos++;
394
+ return out;
395
+ }
396
+ return NOT_LITERAL;
397
+ }
398
+ }
399
+ /** A quoted string, or a bare identifier — the second ruled widening. */
400
+ key() {
401
+ const c = this.src[this.pos];
402
+ if (c === '"' || c === "'") return this.string(c);
403
+ if (c !== void 0 && IDENT_START.test(c)) {
404
+ const start = this.pos;
405
+ this.pos++;
406
+ while (this.pos < this.src.length && IDENT_CHAR.test(this.src[this.pos])) this.pos++;
407
+ return this.src.slice(start, this.pos);
408
+ }
409
+ return NOT_LITERAL;
410
+ }
411
+ };
412
+
413
+ // src/input-type.ts
414
+ var MANIFEST_INPUT_TYPES = /* @__PURE__ */ new Set([
415
+ "string",
416
+ "number",
417
+ "boolean",
418
+ "enum",
419
+ "array",
420
+ "object",
421
+ "color",
422
+ "date",
423
+ "code",
424
+ "file",
425
+ "slot"
426
+ ]);
427
+ function inputTypeArms(type) {
428
+ if (type === void 0) return [];
429
+ return Array.isArray(type) ? type : [type];
430
+ }
431
+ function canonicalizeInputType(type) {
432
+ const arms = (Array.isArray(type) ? type : [type]).filter(
433
+ (arm) => typeof arm === "string" && MANIFEST_INPUT_TYPES.has(arm)
434
+ );
435
+ const distinct = [...new Set(arms)];
436
+ if (distinct.length === 0) return "string";
437
+ if (distinct.length === 1) return distinct[0];
438
+ return distinct;
439
+ }
440
+
441
+ // src/dashboard-widget-options.ts
442
+ var UNCONSUMED_WIDGET_OPTION = "unconsumed-widget-option";
443
+ var DASHBOARD_WIDGET_HOST_TYPES = /* @__PURE__ */ new Set([
444
+ "dashboard",
445
+ "dashboard-grid"
446
+ ]);
447
+ var CONSUMED_WIDGET_OPTION_KEYS = [
448
+ "dateGranularity",
449
+ "description",
450
+ "limit",
451
+ "sortBy",
452
+ "sortOrder",
453
+ "stageOrder"
454
+ ];
455
+ var CONSUMED = new Set(CONSUMED_WIDGET_OPTION_KEYS);
456
+ var isPlainObject = (v) => typeof v === "object" && v !== null && !Array.isArray(v);
457
+ var isExpr = (v) => isPlainObject(v) && "$expr" in v;
458
+ function checkDashboardWidgetOptions(node) {
459
+ if (!DASHBOARD_WIDGET_HOST_TYPES.has(node.type)) return [];
460
+ const widgets = node.widgets;
461
+ if (!Array.isArray(widgets)) return [];
462
+ const diagnostics = [];
463
+ widgets.forEach((widget, index) => {
464
+ if (!isPlainObject(widget) || isExpr(widget)) return;
465
+ if (widget.component !== void 0) return;
466
+ if (widget.dataset === void 0 || widget.dataset === null || widget.dataset === "") return;
467
+ const options = widget.options;
468
+ if (!isPlainObject(options) || isExpr(options)) return;
469
+ if (Array.isArray(widget.suppressWarnings) && widget.suppressWarnings.includes(UNCONSUMED_WIDGET_OPTION)) {
470
+ return;
471
+ }
472
+ const label = typeof widget.id === "string" && widget.id !== "" ? widget.id : `#${index}`;
473
+ const widgetType = typeof widget.type === "string" && widget.type !== "" ? widget.type : "widget";
474
+ for (const key of Object.keys(options)) {
475
+ if (CONSUMED.has(key)) continue;
476
+ diagnostics.push({
477
+ severity: "warning",
478
+ // DIVERGENCE FROM OBJECTUI, and the only one below this file's header:
479
+ // objectui writes `code: UNCONSUMED_WIDGET_OPTION` here. This repo runs
480
+ // `check:dispatcher-error-vocabulary`, whose `objlitconst` shape reads
481
+ // the SCREAMING_SNAKE constant NAME at a `code:` position and then must
482
+ // reduce it to a literal — and its literal grammar is
483
+ // `[A-Za-z][A-Za-z0-9_]*`, which a KEBAB-case value cannot satisfy. So
484
+ // the constant form is reported as an unresolvable code constant, and
485
+ // that finding cannot be declared away. `unconsumed-widget-option` is a
486
+ // parser DIAGNOSTIC code, not an ADR-0112 wire code, and an inline
487
+ // quoted literal is the form both vocabulary gates already accept for
488
+ // the six sibling diagnostic codes in `validate.ts`
489
+ // (`unknown-component`, `unknown-prop`, `not-a-container`,
490
+ // `inert-expression`, `type-mismatch`, `invalid-enum`). The emitted
491
+ // VALUE is unchanged, and the test next door pins it equal to
492
+ // `UNCONSUMED_WIDGET_OPTION` so the two spellings cannot drift apart.
493
+ code: "unconsumed-widget-option",
494
+ message: `<${node.type}> widget "${label}" (${widgetType}): options.${key} reaches no renderer \u2014 dashboard widget renderers read only: ${CONSUMED_WIDGET_OPTION_KEYS.join(", ")}`,
495
+ tag: node.type
496
+ });
497
+ }
498
+ });
499
+ return diagnostics;
500
+ }
223
501
 
224
502
  // src/validate.ts
225
503
  var BASE_PROPS = /* @__PURE__ */ new Set([
@@ -233,7 +511,7 @@ var BASE_PROPS = /* @__PURE__ */ new Set([
233
511
  "disabledOn",
234
512
  "children"
235
513
  ]);
236
- var isExpr = (v) => typeof v === "object" && v !== null && "$expr" in v;
514
+ var isExpr2 = (v) => typeof v === "object" && v !== null && "$expr" in v;
237
515
  function validateTree(tree, manifest) {
238
516
  const diagnostics = [];
239
517
  const requires = /* @__PURE__ */ new Set();
@@ -276,7 +554,14 @@ function validateTree(tree, manifest) {
276
554
  if (input.binding) {
277
555
  bindings.push({ tag: node.type, input: key, kind: input.binding, value });
278
556
  }
279
- if (!isExpr(value)) {
557
+ if (isExpr2(value)) {
558
+ diagnostics.push({
559
+ severity: "warning",
560
+ code: "inert-expression",
561
+ message: `<${node.type}> prop "${key}" is a braced expression this tier never evaluates \u2014 the value will be silently ignored at render. This tier materializes LITERALS only (strings, numbers, booleans, null, arrays, objects; quotes may be single or double, object keys may be unquoted), e.g. columns={['name','amount']} works \u2014 columns={rows.map((r) => r.name)} cannot`,
562
+ tag: node.type
563
+ });
564
+ } else {
280
565
  const typeDiag = checkType(node.type, input, value);
281
566
  if (typeDiag) diagnostics.push(typeDiag);
282
567
  }
@@ -289,46 +574,70 @@ function validateTree(tree, manifest) {
289
574
  tag: node.type
290
575
  });
291
576
  }
577
+ diagnostics.push(...checkDashboardWidgetOptions(node));
292
578
  }
293
579
  if (node.children) node.children.forEach(visit);
294
580
  };
295
581
  if (tree) visit(tree);
296
582
  return { diagnostics, requires: [...requires], bindings };
297
583
  }
298
- function checkType(tag, input, value) {
299
- const mismatch = (expected) => ({
300
- severity: "warning",
301
- code: "type-mismatch",
302
- message: `<${tag}> prop "${input.name}" expected ${expected}`,
303
- tag
304
- });
305
- switch (input.type) {
584
+ var enumValues = (input) => (input.enum ?? []).map((e) => typeof e === "object" ? e.value : e);
585
+ function armAccepts(arm, input, value) {
586
+ switch (arm) {
306
587
  case "number":
307
- return typeof value === "number" ? null : mismatch("a number");
588
+ return typeof value === "number";
308
589
  case "boolean":
309
- return typeof value === "boolean" ? null : mismatch("a boolean");
590
+ return typeof value === "boolean";
310
591
  case "string":
311
592
  case "color":
312
593
  case "date":
313
594
  case "code":
314
595
  case "file":
315
- return typeof value === "string" ? null : mismatch("a string");
596
+ return typeof value === "string";
316
597
  case "array":
317
- return Array.isArray(value) ? null : mismatch("an array");
598
+ return Array.isArray(value);
318
599
  case "object":
319
- return typeof value === "object" && value !== null && !Array.isArray(value) ? null : mismatch("an object");
320
- case "enum": {
321
- const allowed = (input.enum ?? []).map((e) => typeof e === "object" ? e.value : e);
322
- return allowed.includes(value) ? null : {
323
- severity: "error",
324
- code: "invalid-enum",
325
- message: `<${tag}> prop "${input.name}"=${JSON.stringify(value)} is not one of ${JSON.stringify(allowed)}`,
326
- tag
327
- };
328
- }
600
+ return typeof value === "object" && value !== null && !Array.isArray(value);
601
+ case "enum":
602
+ return enumValues(input).includes(value);
329
603
  default:
330
- return null;
604
+ return true;
605
+ }
606
+ }
607
+ function armExpectation(arm, input) {
608
+ switch (arm) {
609
+ case "number":
610
+ return "a number";
611
+ case "boolean":
612
+ return "a boolean";
613
+ case "array":
614
+ return "an array";
615
+ case "object":
616
+ return "an object";
617
+ case "enum":
618
+ return `one of ${JSON.stringify(enumValues(input))}`;
619
+ default:
620
+ return "a string";
621
+ }
622
+ }
623
+ function checkType(tag, input, value) {
624
+ const arms = inputTypeArms(input.type);
625
+ if (arms.length === 0) return null;
626
+ if (arms.some((arm) => armAccepts(arm, input, value))) return null;
627
+ if (arms.length === 1 && arms[0] === "enum") {
628
+ return {
629
+ severity: "error",
630
+ code: "invalid-enum",
631
+ message: `<${tag}> prop "${input.name}"=${JSON.stringify(value)} is not one of ${JSON.stringify(enumValues(input))}`,
632
+ tag
633
+ };
331
634
  }
635
+ return {
636
+ severity: arms.includes("enum") ? "error" : "warning",
637
+ code: "type-mismatch",
638
+ message: `<${tag}> prop "${input.name}" expected ${arms.map((arm) => armExpectation(arm, input)).join(" or ")}`,
639
+ tag
640
+ };
332
641
  }
333
642
 
334
643
  // src/codegen.ts
@@ -345,7 +654,6 @@ function generateDts(manifest, options = {}) {
345
654
  interface ElementChildrenAttribute { children: object; }` : "";
346
655
  return `// AUTO-GENERATED by @object-ui/sdui-parser \u2014 DO NOT EDIT.
347
656
  // Source of truth: ComponentRegistry inputs (ADR-0080 \xA73). Regenerate via codegen.
348
- /* eslint-disable */
349
657
 
350
658
  export interface SduiBaseProps {
351
659
  id?: string;
@@ -372,17 +680,18 @@ export {};
372
680
  `;
373
681
  }
374
682
  function emitInterface(comp) {
375
- const lines = comp.inputs.filter((i) => i.type !== "slot").map((i) => ` ${propLine(i)}`).join("\n");
683
+ const lines = comp.inputs.filter((i) => valueArms(i).length > 0).map((i) => ` ${propLine(i)}`).join("\n");
376
684
  return `export interface ${propsName(comp.type)} extends SduiBaseProps {
377
685
  ${lines}
378
686
  }`;
379
687
  }
688
+ var valueArms = (input) => inputTypeArms(input.type).filter((arm) => arm !== "slot");
380
689
  function propLine(input) {
381
690
  const opt = input.required ? "" : "?";
382
691
  return `${quoteKeyIfNeeded(input.name)}${opt}: ${tsType(input)};`;
383
692
  }
384
- function tsType(input) {
385
- switch (input.type) {
693
+ function armTsType(arm, input) {
694
+ switch (arm) {
386
695
  case "number":
387
696
  return "number";
388
697
  case "boolean":
@@ -395,15 +704,16 @@ function tsType(input) {
395
704
  const vals = (input.enum ?? []).map((e) => typeof e === "object" ? e.value : e);
396
705
  return vals.length ? vals.map((v) => JSON.stringify(v)).join(" | ") : "string";
397
706
  }
398
- case "string":
399
- case "color":
400
- case "date":
401
- case "code":
402
- case "file":
403
707
  default:
404
708
  return "string";
405
709
  }
406
710
  }
711
+ function tsType(input) {
712
+ const arms = valueArms(input);
713
+ if (arms.length === 0) return "string";
714
+ const emitted = [...new Set(arms.map((arm) => armTsType(arm, input)))];
715
+ return emitted.join(" | ");
716
+ }
407
717
  var IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
408
718
  var quoteKeyIfNeeded = (name) => IDENT.test(name) ? name : JSON.stringify(name);
409
719
  function propsName(type) {
@@ -442,19 +752,6 @@ function compile(source, manifest) {
442
752
  ok: !diagnostics.some((d) => d.severity === "error")
443
753
  };
444
754
  }
445
- var INPUT_TYPES = /* @__PURE__ */ new Set([
446
- "string",
447
- "number",
448
- "boolean",
449
- "enum",
450
- "array",
451
- "object",
452
- "color",
453
- "date",
454
- "code",
455
- "file",
456
- "slot"
457
- ]);
458
755
  function manifestFromConfigs(configs, opts = {}) {
459
756
  const components = {};
460
757
  for (const c of configs) {
@@ -466,7 +763,7 @@ function manifestFromConfigs(configs, opts = {}) {
466
763
  isContainer: c.isContainer,
467
764
  inputs: (c.inputs ?? []).map((i) => ({
468
765
  name: i.name,
469
- type: INPUT_TYPES.has(i.type) ? i.type : "string",
766
+ type: canonicalizeInputType(i.type),
470
767
  required: i.required,
471
768
  enum: i.enum,
472
769
  binding: i.binding,
@@ -477,9 +774,16 @@ function manifestFromConfigs(configs, opts = {}) {
477
774
  return { components };
478
775
  }
479
776
  export {
777
+ CONSUMED_WIDGET_OPTION_KEYS,
778
+ DASHBOARD_WIDGET_HOST_TYPES,
779
+ MANIFEST_INPUT_TYPES,
780
+ UNCONSUMED_WIDGET_OPTION,
781
+ canonicalizeInputType,
782
+ checkDashboardWidgetOptions,
480
783
  compile,
481
784
  generateBlockList,
482
785
  generateDts,
786
+ inputTypeArms,
483
787
  interpretBrace,
484
788
  manifestFromConfigs,
485
789
  parseJsx,