@tmorrow/cre8-wc 2.0.8 → 2.1.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.
@@ -87,6 +87,17 @@ function describeType(v) {
87
87
  return 'array';
88
88
  return typeof v;
89
89
  }
90
+ /**
91
+ * Native DOM events, bindable on any component.
92
+ *
93
+ * Read from the catalog's `x-native-events` rather than kept here, so there is
94
+ * one list rather than two that must be held equal. A component's `@fires` tags
95
+ * describe only what it dispatches itself, so these can never be derived from
96
+ * source — `click` on a button is legitimate and undocumentable.
97
+ */
98
+ function nativeEvents(catalog) {
99
+ return new Set(catalog.schema['x-native-events'] ?? []);
100
+ }
90
101
  export function validateSpec(spec, catalog, path = '$') {
91
102
  if (!spec || typeof spec !== 'object') {
92
103
  throw new Error(`${path}: spec must be an object`);
@@ -131,7 +142,24 @@ export function validateSpec(spec, catalog, path = '$') {
131
142
  if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {
132
143
  throw new Error(`${path}.events: must be an object`);
133
144
  }
145
+ // Custom event *names* are checked against the catalog, the same way props
146
+ // and slots are. Previously only the binding shape was validated, so an
147
+ // invented event bound cleanly and then silently never fired — the worst
148
+ // failure mode available, since the UI renders and simply does nothing.
149
+ //
150
+ // Native DOM events are always allowed: `addEventListener` handles them on
151
+ // any element, and `@fires` documents only what a component dispatches
152
+ // itself. `click` on a button is legitimate and undocumented by design.
153
+ const declaredEvents = new Set(Object.keys(def['x-events'] ?? {}));
154
+ const native = nativeEvents(catalog);
134
155
  for (const [evtName, binding] of Object.entries(s.events)) {
156
+ if (!native.has(evtName) && !declaredEvents.has(evtName)) {
157
+ const available = [...declaredEvents].sort().join(', ');
158
+ throw new Error(`${path}.events.${evtName}: not a declared event on ${s.component}. ` +
159
+ (available
160
+ ? `Custom events available: ${available}`
161
+ : `${s.component} declares no custom events`));
162
+ }
135
163
  if (typeof binding === 'string')
136
164
  continue;
137
165
  if (!binding || typeof binding !== 'object') {
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CatalogSchema, ComponentSpec, PropSchema, RegisteredCatalog } from './types.js';\n\nexport function registerCatalog(schema: CatalogSchema): RegisteredCatalog {\n const defs = schema.$defs?.components ?? {};\n const components = new Map(Object.entries(defs));\n const id = schema['x-a2ui']?.catalogId ?? schema.$id ?? 'unknown';\n return { id, schema, components };\n}\n\nfunction validatePropValue(value: unknown, schema: PropSchema | undefined, path: string): void {\n if (value === undefined || value === null) return;\n if (!schema) return;\n\n if (schema.const !== undefined && value !== schema.const) {\n throw new Error(\n `${path}: expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`\n );\n }\n\n if (schema.enum && !schema.enum.includes(value as string)) {\n const allowed = schema.enum.map((v) => JSON.stringify(v)).join(', ');\n throw new Error(`${path}: value ${JSON.stringify(value)} not in enum [${allowed}]`);\n }\n\n if (schema.oneOf && schema.oneOf.length) {\n const errors: string[] = [];\n for (const branch of schema.oneOf) {\n try {\n validatePropValue(value, branch, path);\n return;\n } catch (e) {\n errors.push((e as Error).message);\n }\n }\n throw new Error(\n `${path}: value ${JSON.stringify(value)} matched none of oneOf branches: ${errors.join(' | ')}`\n );\n }\n\n const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];\n if (types.length && !types.some((t) => matchesType(t, value))) {\n throw new Error(`${path}: expected type ${types.join('|')}, got ${describeType(value)}`);\n }\n\n if (Array.isArray(value) && schema.items) {\n value.forEach((item, i) => validatePropValue(item, schema.items, `${path}[${i}]`));\n }\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n schema.properties\n ) {\n const obj = value as Record<string, unknown>;\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in obj)) {\n throw new Error(`${path}.${req}: required property missing`);\n }\n }\n }\n for (const [key, childVal] of Object.entries(obj)) {\n const childSchema = schema.properties[key];\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n throw new Error(`${path}.${key}: unexpected property`);\n }\n continue;\n }\n validatePropValue(childVal, childSchema, `${path}.${key}`);\n }\n }\n}\n\nfunction matchesType(t: string, v: unknown): boolean {\n switch (t) {\n case 'string':\n return typeof v === 'string';\n case 'number':\n return typeof v === 'number' && Number.isFinite(v);\n case 'integer':\n return typeof v === 'number' && Number.isInteger(v);\n case 'boolean':\n return typeof v === 'boolean';\n case 'array':\n return Array.isArray(v);\n case 'object':\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n case 'null':\n return v === null;\n default:\n return true;\n }\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\nexport function validateSpec(spec: unknown, catalog: RegisteredCatalog, path = '$'): asserts spec is ComponentSpec {\n if (!spec || typeof spec !== 'object') {\n throw new Error(`${path}: spec must be an object`);\n }\n const s = spec as Record<string, unknown>;\n if (typeof s.component !== 'string') {\n throw new Error(`${path}: spec.component must be a string`);\n }\n if (!catalog.components.has(s.component)) {\n throw new Error(\n `${path}: component \"${s.component}\" is not registered in catalog \"${catalog.id}\"`\n );\n }\n\n const def = catalog.components.get(s.component)!;\n const allowedProps = new Set(Object.keys(def.properties?.props?.properties ?? {}));\n const hasChildren = def.properties?.children !== undefined;\n const allowedSlots = def.properties?.slots\n ? new Set(Object.keys(def.properties.slots.properties ?? {}))\n : null;\n\n if (s.props) {\n if (typeof s.props !== 'object') throw new Error(`${path}.props: must be an object`);\n const propDefs = def.properties?.props?.properties ?? {};\n for (const [prop, value] of Object.entries(s.props as Record<string, unknown>)) {\n if (!allowedProps.has(prop)) {\n throw new Error(`${path}.props.${prop}: not a declared prop on ${s.component}`);\n }\n validatePropValue(value, propDefs[prop], `${path}.props.${prop}`);\n }\n }\n\n if (s.children !== undefined) {\n if (!hasChildren) {\n throw new Error(`${path}.children: ${s.component} does not accept default children`);\n }\n if (!Array.isArray(s.children)) throw new Error(`${path}.children: must be an array`);\n s.children.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.children[${i}]`);\n });\n }\n\n if (s.events !== undefined) {\n if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {\n throw new Error(`${path}.events: must be an object`);\n }\n for (const [evtName, binding] of Object.entries(s.events as Record<string, unknown>)) {\n if (typeof binding === 'string') continue;\n if (!binding || typeof binding !== 'object') {\n throw new Error(`${path}.events.${evtName}: must be a string or { handler } object`);\n }\n const b = binding as Record<string, unknown>;\n if (typeof b.handler !== 'string' || b.handler.length === 0) {\n throw new Error(`${path}.events.${evtName}.handler: must be a non-empty string`);\n }\n }\n }\n\n if (s.slots !== undefined) {\n if (!allowedSlots) {\n throw new Error(`${path}.slots: ${s.component} does not accept named slots`);\n }\n if (typeof s.slots !== 'object') throw new Error(`${path}.slots: must be an object`);\n for (const [slotName, arr] of Object.entries(s.slots as Record<string, unknown>)) {\n if (!allowedSlots.has(slotName)) {\n throw new Error(\n `${path}.slots.${slotName}: not a declared slot on ${s.component}`\n );\n }\n if (!Array.isArray(arr)) {\n throw new Error(`${path}.slots.${slotName}: must be an array`);\n }\n arr.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.slots.${slotName}[${i}]`);\n });\n }\n }\n}\n"]}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../a2ui/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CatalogSchema, ComponentSpec, PropSchema, RegisteredCatalog } from './types.js';\n\nexport function registerCatalog(schema: CatalogSchema): RegisteredCatalog {\n const defs = schema.$defs?.components ?? {};\n const components = new Map(Object.entries(defs));\n const id = schema['x-a2ui']?.catalogId ?? schema.$id ?? 'unknown';\n return { id, schema, components };\n}\n\nfunction validatePropValue(value: unknown, schema: PropSchema | undefined, path: string): void {\n if (value === undefined || value === null) return;\n if (!schema) return;\n\n if (schema.const !== undefined && value !== schema.const) {\n throw new Error(\n `${path}: expected const ${JSON.stringify(schema.const)}, got ${JSON.stringify(value)}`\n );\n }\n\n if (schema.enum && !schema.enum.includes(value as string)) {\n const allowed = schema.enum.map((v) => JSON.stringify(v)).join(', ');\n throw new Error(`${path}: value ${JSON.stringify(value)} not in enum [${allowed}]`);\n }\n\n if (schema.oneOf && schema.oneOf.length) {\n const errors: string[] = [];\n for (const branch of schema.oneOf) {\n try {\n validatePropValue(value, branch, path);\n return;\n } catch (e) {\n errors.push((e as Error).message);\n }\n }\n throw new Error(\n `${path}: value ${JSON.stringify(value)} matched none of oneOf branches: ${errors.join(' | ')}`\n );\n }\n\n const types = Array.isArray(schema.type) ? schema.type : schema.type ? [schema.type] : [];\n if (types.length && !types.some((t) => matchesType(t, value))) {\n throw new Error(`${path}: expected type ${types.join('|')}, got ${describeType(value)}`);\n }\n\n if (Array.isArray(value) && schema.items) {\n value.forEach((item, i) => validatePropValue(item, schema.items, `${path}[${i}]`));\n }\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n schema.properties\n ) {\n const obj = value as Record<string, unknown>;\n if (schema.required) {\n for (const req of schema.required) {\n if (!(req in obj)) {\n throw new Error(`${path}.${req}: required property missing`);\n }\n }\n }\n for (const [key, childVal] of Object.entries(obj)) {\n const childSchema = schema.properties[key];\n if (!childSchema) {\n if (schema.additionalProperties === false) {\n throw new Error(`${path}.${key}: unexpected property`);\n }\n continue;\n }\n validatePropValue(childVal, childSchema, `${path}.${key}`);\n }\n }\n}\n\nfunction matchesType(t: string, v: unknown): boolean {\n switch (t) {\n case 'string':\n return typeof v === 'string';\n case 'number':\n return typeof v === 'number' && Number.isFinite(v);\n case 'integer':\n return typeof v === 'number' && Number.isInteger(v);\n case 'boolean':\n return typeof v === 'boolean';\n case 'array':\n return Array.isArray(v);\n case 'object':\n return typeof v === 'object' && v !== null && !Array.isArray(v);\n case 'null':\n return v === null;\n default:\n return true;\n }\n}\n\nfunction describeType(v: unknown): string {\n if (v === null) return 'null';\n if (Array.isArray(v)) return 'array';\n return typeof v;\n}\n\n/**\n * Native DOM events, bindable on any component.\n *\n * Read from the catalog's `x-native-events` rather than kept here, so there is\n * one list rather than two that must be held equal. A component's `@fires` tags\n * describe only what it dispatches itself, so these can never be derived from\n * source — `click` on a button is legitimate and undocumentable.\n */\nfunction nativeEvents(catalog: RegisteredCatalog): Set<string> {\n return new Set(catalog.schema['x-native-events'] ?? []);\n}\n\nexport function validateSpec(spec: unknown, catalog: RegisteredCatalog, path = '$'): asserts spec is ComponentSpec {\n if (!spec || typeof spec !== 'object') {\n throw new Error(`${path}: spec must be an object`);\n }\n const s = spec as Record<string, unknown>;\n if (typeof s.component !== 'string') {\n throw new Error(`${path}: spec.component must be a string`);\n }\n if (!catalog.components.has(s.component)) {\n throw new Error(\n `${path}: component \"${s.component}\" is not registered in catalog \"${catalog.id}\"`\n );\n }\n\n const def = catalog.components.get(s.component)!;\n const allowedProps = new Set(Object.keys(def.properties?.props?.properties ?? {}));\n const hasChildren = def.properties?.children !== undefined;\n const allowedSlots = def.properties?.slots\n ? new Set(Object.keys(def.properties.slots.properties ?? {}))\n : null;\n\n if (s.props) {\n if (typeof s.props !== 'object') throw new Error(`${path}.props: must be an object`);\n const propDefs = def.properties?.props?.properties ?? {};\n for (const [prop, value] of Object.entries(s.props as Record<string, unknown>)) {\n if (!allowedProps.has(prop)) {\n throw new Error(`${path}.props.${prop}: not a declared prop on ${s.component}`);\n }\n validatePropValue(value, propDefs[prop], `${path}.props.${prop}`);\n }\n }\n\n if (s.children !== undefined) {\n if (!hasChildren) {\n throw new Error(`${path}.children: ${s.component} does not accept default children`);\n }\n if (!Array.isArray(s.children)) throw new Error(`${path}.children: must be an array`);\n s.children.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.children[${i}]`);\n });\n }\n\n if (s.events !== undefined) {\n if (!s.events || typeof s.events !== 'object' || Array.isArray(s.events)) {\n throw new Error(`${path}.events: must be an object`);\n }\n // Custom event *names* are checked against the catalog, the same way props\n // and slots are. Previously only the binding shape was validated, so an\n // invented event bound cleanly and then silently never fired — the worst\n // failure mode available, since the UI renders and simply does nothing.\n //\n // Native DOM events are always allowed: `addEventListener` handles them on\n // any element, and `@fires` documents only what a component dispatches\n // itself. `click` on a button is legitimate and undocumented by design.\n const declaredEvents = new Set(Object.keys(def['x-events'] ?? {}));\n const native = nativeEvents(catalog);\n for (const [evtName, binding] of Object.entries(s.events as Record<string, unknown>)) {\n if (!native.has(evtName) && !declaredEvents.has(evtName)) {\n const available = [...declaredEvents].sort().join(', ');\n throw new Error(\n `${path}.events.${evtName}: not a declared event on ${s.component}. ` +\n (available\n ? `Custom events available: ${available}`\n : `${s.component} declares no custom events`)\n );\n }\n if (typeof binding === 'string') continue;\n if (!binding || typeof binding !== 'object') {\n throw new Error(`${path}.events.${evtName}: must be a string or { handler } object`);\n }\n const b = binding as Record<string, unknown>;\n if (typeof b.handler !== 'string' || b.handler.length === 0) {\n throw new Error(`${path}.events.${evtName}.handler: must be a non-empty string`);\n }\n }\n }\n\n if (s.slots !== undefined) {\n if (!allowedSlots) {\n throw new Error(`${path}.slots: ${s.component} does not accept named slots`);\n }\n if (typeof s.slots !== 'object') throw new Error(`${path}.slots: must be an object`);\n for (const [slotName, arr] of Object.entries(s.slots as Record<string, unknown>)) {\n if (!allowedSlots.has(slotName)) {\n throw new Error(\n `${path}.slots.${slotName}: not a declared slot on ${s.component}`\n );\n }\n if (!Array.isArray(arr)) {\n throw new Error(`${path}.slots.${slotName}: must be an array`);\n }\n arr.forEach((c, i) => {\n if (typeof c === 'string') return;\n validateSpec(c, catalog, `${path}.slots.${slotName}[${i}]`);\n });\n }\n }\n}\n"]}
@@ -24,6 +24,11 @@ export interface CatalogSchema {
24
24
  $defs?: {
25
25
  components?: Record<string, CatalogComponentDef>;
26
26
  };
27
+ /**
28
+ * Native DOM events bindable on any component. The single source of truth —
29
+ * the runtime validator reads this rather than keeping its own copy.
30
+ */
31
+ 'x-native-events'?: string[];
27
32
  'x-a2ui'?: {
28
33
  catalogId?: string;
29
34
  library?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SpecChild = ComponentSpec | string;\n\nexport interface ComponentSpec {\n component: string;\n props?: Record<string, unknown>;\n children?: SpecChild[];\n slots?: Record<string, SpecChild[]>;\n events?: Record<string, EventBinding>;\n}\n\nexport type EventBinding =\n | string\n | {\n handler: string;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n\nexport interface EmittedEvent {\n component: string;\n path: string;\n event: string;\n handler: string;\n detail: unknown;\n nativeEvent: Event;\n}\n\nexport interface CatalogSchema {\n $id?: string;\n $defs?: {\n components?: Record<string, CatalogComponentDef>;\n };\n 'x-a2ui'?: {\n catalogId?: string;\n library?: string;\n libraryVersion?: string;\n tagPrefix?: string;\n framework?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface CatalogComponentDef {\n title?: string;\n description?: string;\n 'x-category'?: string;\n 'x-slot-descriptions'?: Record<string, string>;\n 'x-events'?: Record<string, { detail?: unknown }>;\n properties?: {\n component?: { const?: string };\n props?: {\n properties?: Record<string, PropSchema>;\n };\n children?: unknown;\n slots?: {\n properties?: Record<string, unknown>;\n };\n };\n}\n\nexport interface PropSchema {\n type?: string | string[];\n enum?: string[];\n const?: unknown;\n default?: unknown;\n description?: string;\n items?: PropSchema;\n properties?: Record<string, PropSchema>;\n required?: string[];\n additionalProperties?: boolean;\n oneOf?: PropSchema[];\n 'x-tsType'?: string;\n 'x-kind'?: 'attribute' | 'property';\n}\n\nexport interface RegisteredCatalog {\n id: string;\n schema: CatalogSchema;\n components: Map<string, CatalogComponentDef>;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../a2ui/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SpecChild = ComponentSpec | string;\n\nexport interface ComponentSpec {\n component: string;\n props?: Record<string, unknown>;\n children?: SpecChild[];\n slots?: Record<string, SpecChild[]>;\n events?: Record<string, EventBinding>;\n}\n\nexport type EventBinding =\n | string\n | {\n handler: string;\n stopPropagation?: boolean;\n preventDefault?: boolean;\n };\n\nexport interface EmittedEvent {\n component: string;\n path: string;\n event: string;\n handler: string;\n detail: unknown;\n nativeEvent: Event;\n}\n\nexport interface CatalogSchema {\n $id?: string;\n $defs?: {\n components?: Record<string, CatalogComponentDef>;\n };\n /**\n * Native DOM events bindable on any component. The single source of truth —\n * the runtime validator reads this rather than keeping its own copy.\n */\n 'x-native-events'?: string[];\n 'x-a2ui'?: {\n catalogId?: string;\n library?: string;\n libraryVersion?: string;\n tagPrefix?: string;\n framework?: string;\n };\n [key: string]: unknown;\n}\n\nexport interface CatalogComponentDef {\n title?: string;\n description?: string;\n 'x-category'?: string;\n 'x-slot-descriptions'?: Record<string, string>;\n 'x-events'?: Record<string, { detail?: unknown }>;\n properties?: {\n component?: { const?: string };\n props?: {\n properties?: Record<string, PropSchema>;\n };\n children?: unknown;\n slots?: {\n properties?: Record<string, unknown>;\n };\n };\n}\n\nexport interface PropSchema {\n type?: string | string[];\n enum?: string[];\n const?: unknown;\n default?: unknown;\n description?: string;\n items?: PropSchema;\n properties?: Record<string, PropSchema>;\n required?: string[];\n additionalProperties?: boolean;\n oneOf?: PropSchema[];\n 'x-tsType'?: string;\n 'x-kind'?: 'attribute' | 'property';\n}\n\nexport interface RegisteredCatalog {\n id: string;\n schema: CatalogSchema;\n components: Map<string, CatalogComponentDef>;\n}\n"]}
@@ -10,6 +10,30 @@ import { fileURLToPath } from 'url';
10
10
  const __filename = fileURLToPath(import.meta.url);
11
11
  const __dirname = dirname(__filename);
12
12
  const ROOT = join(__dirname, '..');
13
+ /**
14
+ * Custom elements that register but are not part of the public API.
15
+ *
16
+ * These are sub-components: they call `customElements.define` as a side effect
17
+ * of their parent being imported, but nothing exports them from `index.ts` or
18
+ * `cdn-entry.ts`, so a consumer cannot use them on their own.
19
+ *
20
+ * The list is explicit because the exclusion used to be accidental — the
21
+ * analyzer glob was `components/*​/*.ts`, one level too shallow to see anything
22
+ * nested, so all five vanished from the manifest, the catalog, the compact
23
+ * projection, the React manifest and custom-elements.json without anyone
24
+ * choosing that. Now the glob reaches everything and the omission is a
25
+ * decision, pinned here and asserted by `check-layer-parity.mjs`. Adding a
26
+ * component can no longer silently skip the pipeline.
27
+ *
28
+ * To publish one: delete it here and export it from `index.ts`/`cdn-entry.ts`.
29
+ */
30
+ const INTERNAL_ELEMENTS = [
31
+ 'cre8-calendar',
32
+ 'cre8-calendar-month-modal',
33
+ 'cre8-calendar-navigation',
34
+ 'cre8-calendar-year-modal',
35
+ 'cre8-page-counter',
36
+ ];
13
37
  // ─── Category Mapping ────────────────────────────────────────────────
14
38
  const CATEGORY_MAP = {
15
39
  'button': 'Actions',
@@ -301,8 +325,15 @@ function main() {
301
325
  // Read package.json for version and dependencies
302
326
  const pkgJson = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8'));
303
327
  // Transform components
328
+ const seen = new Set(wcaData.tags.map(t => t.name).filter(n => n.startsWith('cre8-')));
329
+ const missingInternals = INTERNAL_ELEMENTS.filter(n => !seen.has(n));
330
+ if (missingInternals.length) {
331
+ throw new Error(`INTERNAL_ELEMENTS lists element(s) the analyzer no longer sees: ${missingInternals.join(', ')}. ` +
332
+ `Remove them from the list, or fix the analyzer glob.`);
333
+ }
304
334
  const components = wcaData.tags
305
335
  .filter(tag => tag.name.startsWith('cre8-'))
336
+ .filter(tag => !INTERNAL_ELEMENTS.includes(tag.name))
306
337
  .map(transformTag)
307
338
  .sort((a, b) => {
308
339
  // Sort by category, then name
@@ -333,6 +364,13 @@ function main() {
333
364
  tagPrefix: 'cre8',
334
365
  description: pkgJson.description,
335
366
  framework: `Lit ${pkgJson.dependencies?.lit || '3.x'}`,
367
+ /**
368
+ * Elements that register but are intentionally absent from `components`.
369
+ * Recorded here so `check-layer-parity.mjs` can tell a deliberate omission
370
+ * from a component that silently fell out of the pipeline, without keeping
371
+ * a second copy of the list.
372
+ */
373
+ internalElements: INTERNAL_ELEMENTS,
336
374
  components,
337
375
  baseClasses: staticData.baseClasses,
338
376
  patterns: staticData.patterns,
@@ -1 +1 @@
1
- {"version":3,"file":"generate-mcp-manifest.js","sourceRoot":"","sources":["../../scripts/generate-mcp-manifest.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,IAAI,CAAC;AACjD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;AAEnC,wEAAwE;AACxE,MAAM,YAAY,GAA2B;IAC3C,QAAQ,EAAE,SAAS;IACnB,eAAe,EAAE,SAAS;IAC1B,cAAc,EAAE,SAAS;IACzB,cAAc,EAAE,SAAS;IACzB,OAAO,EAAE,OAAO;IAChB,YAAY,EAAE,OAAO;IACrB,QAAQ,EAAE,OAAO;IACjB,cAAc,EAAE,OAAO;IACvB,gBAAgB,EAAE,OAAO;IACzB,sBAAsB,EAAE,OAAO;IAC/B,qBAAqB,EAAE,OAAO;IAC9B,aAAa,EAAE,OAAO;IACtB,mBAAmB,EAAE,OAAO;IAC5B,kBAAkB,EAAE,OAAO;IAC3B,aAAa,EAAE,OAAO;IACtB,aAAa,EAAE,OAAO;IACtB,mBAAmB,EAAE,OAAO;IAC5B,kBAAkB,EAAE,OAAO;IAC3B,cAAc,EAAE,OAAO;IACvB,WAAW,EAAE,OAAO;IACpB,eAAe,EAAE,OAAO;IACxB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,WAAW,EAAE,QAAQ;IACrB,QAAQ,EAAE,QAAQ;IAClB,kBAAkB,EAAE,QAAQ;IAC5B,gBAAgB,EAAE,QAAQ;IAC1B,sBAAsB,EAAE,QAAQ;IAChC,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,QAAQ;IACnB,MAAM,EAAE,QAAQ;IAChB,SAAS,EAAE,YAAY;IACvB,cAAc,EAAE,YAAY;IAC5B,WAAW,EAAE,YAAY;IACzB,MAAM,EAAE,YAAY;IACpB,WAAW,EAAE,YAAY;IACzB,gBAAgB,EAAE,YAAY;IAC9B,aAAa,EAAE,YAAY;IAC3B,kBAAkB,EAAE,YAAY;IAChC,YAAY,EAAE,YAAY;IAC1B,QAAQ,EAAE,YAAY;IACtB,QAAQ,EAAE,YAAY;IACtB,YAAY,EAAE,YAAY;IAC1B,MAAM,EAAE,YAAY;IACpB,KAAK,EAAE,YAAY;IACnB,WAAW,EAAE,YAAY;IACzB,YAAY,EAAE,YAAY;IAC1B,iBAAiB,EAAE,YAAY;IAC/B,aAAa,EAAE,YAAY;IAC3B,kBAAkB,EAAE,YAAY;IAChC,cAAc,EAAE,YAAY;IAC5B,mBAAmB,EAAE,YAAY;IACjC,aAAa,EAAE,YAAY;IAC3B,kBAAkB,EAAE,YAAY;IAChC,eAAe,EAAE,YAAY;IAC7B,UAAU,EAAE,YAAY;IACxB,WAAW,EAAE,YAAY;IACzB,gBAAgB,EAAE,YAAY;IAC9B,iBAAiB,EAAE,YAAY;IAC/B,UAAU,EAAE,YAAY;IACxB,eAAe,EAAE,YAAY;IAC7B,OAAO,EAAE,YAAY;IACrB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,SAAS,EAAE,YAAY;IACvB,cAAc,EAAE,YAAY;IAC5B,OAAO,EAAE,UAAU;IACnB,cAAc,EAAE,UAAU;IAC1B,OAAO,EAAE,UAAU;IACnB,iBAAiB,EAAE,UAAU;IAC7B,iBAAiB,EAAE,UAAU;IAC7B,gBAAgB,EAAE,UAAU;IAC5B,aAAa,EAAE,UAAU;IACzB,qBAAqB,EAAE,UAAU;IACjC,OAAO,EAAE,MAAM;IACf,cAAc,EAAE,MAAM;IACtB,mBAAmB,EAAE,MAAM;IAC3B,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,MAAM;IACpB,cAAc,EAAE,MAAM;IACtB,MAAM,EAAE,MAAM;IACd,WAAW,EAAE,MAAM;IACnB,KAAK,EAAE,MAAM;IACb,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,MAAM;IACpB,OAAO,EAAE,MAAM;IACf,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,OAAO;IACf,SAAS,EAAE,WAAW;IACtB,aAAa,EAAE,WAAW;CAC3B,CAAC;AAuFF,uEAAuE;AAGvE;;;GAGG;AACH,SAAS,SAAS,CAAC,OAAgB;IACjC,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAExC,sDAAsD;IACtD,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAChE,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IACpC,CAAC;IAED,wDAAwD;IACxD,MAAM,kBAAkB,GAAG,OAAO,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5E,IAAI,kBAAkB,KAAK,OAAO,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,kBAAkB,CAAC,CAAC;IACvC,CAAC;IAED,mBAAmB;IACnB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,cAAc,IAAI,KAAK,KAAK,cAAc;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;IAC5G,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAClD,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAElD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,UAAmB,EAAE,IAAa;IACtD,IAAI,UAAU,KAAK,SAAS,IAAI,UAAU,KAAK,WAAW,IAAI,UAAU,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACzG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,UAAU;IACV,IAAI,UAAU,KAAK,OAAO;QAAE,OAAO,KAAK,CAAC;IACzC,IAAI,UAAU,KAAK,MAAM;QAAE,OAAO,IAAI,CAAC;IAEvC,SAAS;IACT,IAAI,IAAI,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,MAAM,CAAC,UAAU,CAAC,CAAC;IAC5B,CAAC;IAED,eAAe;IACf,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;IACxD,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,OAAe;IACnC,OAAO,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACpC,OAAO,YAAY,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,GAAW;IACnC,MAAM,QAAQ,GAAiD,EAAE,CAAC;IAClE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC;IAEtB,yBAAyB;IACzB,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IACpE,MAAM,QAAQ,GAAG,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IAE9D,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,MAAM,cAAc,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACjC,IAAI,KAAK,GAAG,YAAY,cAAc,GAAG,CAAC;YAC1C,IAAI,QAAQ;gBAAE,KAAK,IAAI,UAAU,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC;YACnE,QAAQ,CAAC,IAAI,CAAC;gBACZ,WAAW,EAAE,GAAG,UAAU,CAAC,cAAc,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,EAAE;gBAClE,IAAI,EAAE,IAAI,IAAI,IAAI,KAAK,MAAM,IAAI,GAAG;aACrC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC;YACZ,WAAW,EAAE,SAAS,YAAY,CAAC,IAAI,CAAC,EAAE;YAC1C,IAAI,EAAE,IAAI,IAAI,UAAU,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,OAAO,IAAI,GAAG;SACrE,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACjF,CAAC;AAED,uEAAuE;AAEvE,SAAS,YAAY,CAAC,GAAW;IAC/B,2EAA2E;IAC3E,2EAA2E;IAC3E,uEAAuE;IACvE,wEAAwE;IACxE,kDAAkD;IAClD,MAAM,UAAU,GAAiC,EAAE,CAAC;IACpD,MAAM,UAAU,GAAmH,EAAE,CAAC;IAEtI,6DAA6D;IAG7D,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9C,MAAM,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAE5C,MAAM,KAAK,GAAiB,EAAE,IAAI,EAAE,CAAC;QACrC,IAAI,MAAM;YAAE,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC;QAClC,IAAI,YAAY,KAAK,SAAS;YAAE,KAAK,CAAC,OAAO,GAAG,YAAY,CAAC;QAC7D,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAE3D,IAAI,WAAW,EAAE,CAAC;YAChB,oEAAoE;YACpE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,iDAAiD;YACjD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAChC,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,wEAAwE;IACxE,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC;QAC9B,QAAQ,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE,mBAAmB;QAChE,UAAU,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY;QACtD,iBAAiB,EAAE,YAAY,EAAE,gBAAgB;KAClD,CAAC,CAAC;IACH,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,UAAU,IAAI,EAAE,EAAE,CAAC;QACxC,IAAI,IAAI,CAAC,SAAS;YAAE,SAAS,CAAC,wBAAwB;QACtD,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,KAAK,GAA2C,EAAE,IAAI,EAAE,CAAC;QAC/D,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QAC3D,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;IAChC,CAAC;IAED,kBAAkB;IAClB,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,IAAI,SAAS,CAAC;QACxC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QACrB,IAAI,IAAI,CAAC,WAAW;YAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;IACvE,CAAC;IAED,mBAAmB;IACnB,MAAM,MAAM,GAA6B,EAAE,CAAC;IAC5C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QACpC,IAAI,KAAK,CAAC,WAAW;YAAE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IAC5E,CAAC;IAED,2BAA2B;IAC3B,MAAM,aAAa,GAAmC,EAAE,CAAC;IACzD,KAAK,MAAM,OAAO,IAAI,GAAG,CAAC,aAAa,IAAI,EAAE,EAAE,CAAC;QAC9C,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;QACjC,IAAI,OAAO,CAAC,WAAW;YAAE,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IACzF,CAAC;IAED,OAAO;QACL,IAAI,EAAE,GAAG,CAAC,IAAI;QACd,QAAQ,EAAE,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC/B,WAAW,EAAE,GAAG,CAAC,WAAW,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,aAAa;QAClF,UAAU;QACV,UAAU;QACV,KAAK;QACL,MAAM;QACN,aAAa;QACb,QAAQ,EAAE,gBAAgB,CAAC,GAAG,CAAC;KAChC,CAAC;AACJ,CAAC;AAED,SAAS,IAAI;IACX,kBAAkB;IAClB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,mBAAmB,CAAC;IACvD,OAAO,CAAC,GAAG,CAAC,4BAA4B,OAAO,EAAE,CAAC,CAAC;IAEnD,IAAI,OAAkB,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,8BAA8B,GAAG,EAAE,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,CAAC,IAAI,CAAC,MAAM,qBAAqB,CAAC,CAAC;IAE/D,mBAAmB;IACnB,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAC3B,YAAY,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,CAAC,EAAE,OAAO,CAAC,CAC/D,CAAC;IAEF,iDAAiD;IACjD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CACxB,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAClD,CAAC;IAEF,uBAAuB;IACvB,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI;SAC5B,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;SAC3C,GAAG,CAAC,YAAY,CAAC;SACjB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACb,8BAA8B;QAC9B,MAAM,UAAU,GAAG,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACxD,IAAI,UAAU,KAAK,CAAC;YAAE,OAAO,UAAU,CAAC;QACxC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEL,OAAO,CAAC,GAAG,CAAC,eAAe,UAAU,CAAC,MAAM,aAAa,CAAC,CAAC;IAE3D,4BAA4B;IAC5B,MAAM,UAAU,GAA2B,EAAE,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;QAC9B,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAEhE,uCAAuC;IACvC,MAAM,YAAY,GAA2B,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,kBAAkB,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;IACrH,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;YAChC,YAAY,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,iBAAiB;IACjB,MAAM,QAAQ,GAAG;QACf,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,SAAS,EAAE,MAAM;QACjB,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,SAAS,EAAE,OAAO,OAAO,CAAC,YAAY,EAAE,GAAG,IAAI,KAAK,EAAE;QACtD,UAAU;QACV,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,QAAQ,EAAE,UAAU,CAAC,QAAQ;QAC7B,YAAY,EAAE,UAAU,CAAC,YAAY;QACrC,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,YAAY;KACb,CAAC;IAEF,eAAe;IACf,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,EAAE,mBAAmB,CAAC,CAAC;IACnD,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,qBAAqB,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;AACxD,CAAC;AAED,IAAI,EAAE,CAAC","sourcesContent":["/**\n * Generate MCP Manifest from Web Component Analyzer output.\n *\n * Reads WCA JSON output and transforms it into the MCP manifest format\n * used by the cre8-mcp server for component intelligence.\n */\n\nimport { readFileSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst ROOT = join(__dirname, '..');\n\n// ─── Category Mapping ────────────────────────────────────────────────\nconst CATEGORY_MAP: Record<string, string> = {\n 'button': 'Actions',\n 'danger-button': 'Actions',\n 'button-group': 'Actions',\n 'split-button': 'Actions',\n 'field': 'Forms',\n 'field-note': 'Forms',\n 'select': 'Forms',\n 'multi-select': 'Forms',\n 'checkbox-field': 'Forms',\n 'checkbox-field-group': 'Forms',\n 'checkbox-field-item': 'Forms',\n 'radio-field': 'Forms',\n 'radio-field-group': 'Forms',\n 'radio-field-item': 'Forms',\n 'date-picker': 'Forms',\n 'select-tile': 'Forms',\n 'select-tile-group': 'Forms',\n 'select-tile-list': 'Forms',\n 'toggle-field': 'Forms',\n 'text-area': 'Forms',\n 'form-fieldset': 'Forms',\n 'card': 'Layout',\n 'grid': 'Layout',\n 'grid-item': 'Layout',\n 'layout': 'Layout',\n 'layout-container': 'Layout',\n 'layout-section': 'Layout',\n 'linelength-container': 'Layout',\n 'section': 'Layout',\n 'hero': 'Layout',\n 'band': 'Layout',\n 'divider': 'Layout',\n 'main': 'Layout',\n 'heading': 'Typography',\n 'text-passage': 'Typography',\n 'text-link': 'Typography',\n 'link': 'Navigation',\n 'link-list': 'Navigation',\n 'link-list-item': 'Navigation',\n 'breadcrumbs': 'Navigation',\n 'breadcrumbs-item': 'Navigation',\n 'pagination': 'Navigation',\n 'header': 'Navigation',\n 'footer': 'Navigation',\n 'footer-nav': 'Navigation',\n 'tabs': 'Navigation',\n 'tab': 'Navigation',\n 'tab-panel': 'Navigation',\n 'global-nav': 'Navigation',\n 'global-nav-item': 'Navigation',\n 'primary-nav': 'Navigation',\n 'primary-nav-item': 'Navigation',\n 'tertiary-nav': 'Navigation',\n 'tertiary-nav-item': 'Navigation',\n 'utility-nav': 'Navigation',\n 'utility-nav-item': 'Navigation',\n 'nav-container': 'Navigation',\n 'skip-nav': 'Navigation',\n 'accordion': 'Disclosure',\n 'accordion-item': 'Disclosure',\n 'accordion-panel': 'Disclosure',\n 'dropdown': 'Disclosure',\n 'dropdown-item': 'Disclosure',\n 'modal': 'Disclosure',\n 'popover': 'Disclosure',\n 'tooltip': 'Disclosure',\n 'submenu': 'Disclosure',\n 'submenu-item': 'Disclosure',\n 'alert': 'Feedback',\n 'inline-alert': 'Feedback',\n 'badge': 'Feedback',\n 'loading-spinner': 'Feedback',\n 'skeleton-loader': 'Feedback',\n 'progress-meter': 'Feedback',\n 'percent-bar': 'Feedback',\n 'progress-steps-item': 'Feedback',\n 'table': 'Data',\n 'table-header': 'Data',\n 'table-header-cell': 'Data',\n 'table-body': 'Data',\n 'table-row': 'Data',\n 'table-cell': 'Data',\n 'table-object': 'Data',\n 'list': 'Data',\n 'list-item': 'Data',\n 'tag': 'Data',\n 'tag-list': 'Data',\n 'remove-tag': 'Data',\n 'chart': 'Data',\n 'icon': 'Media',\n 'logo': 'Media',\n 'feature': 'Marketing',\n 'page-header': 'Marketing',\n};\n\n// ─── WCA Types ───────────────────────────────────────────────────────\ninterface WcaTag {\n name: string;\n path: string;\n description?: string;\n attributes?: WcaAttribute[];\n properties?: WcaProperty[];\n slots?: WcaSlot[];\n events?: WcaEvent[];\n cssParts?: WcaCssPart[];\n cssProperties?: WcaCssProperty[];\n}\n\ninterface WcaAttribute {\n name: string;\n type?: string;\n default?: string;\n description?: string;\n}\n\ninterface WcaProperty {\n name: string;\n type?: string;\n default?: string;\n attribute?: string;\n description?: string;\n}\n\ninterface WcaSlot {\n name: string;\n description?: string;\n}\n\ninterface WcaEvent {\n name: string;\n description?: string;\n}\n\ninterface WcaCssPart {\n name: string;\n description?: string;\n}\n\ninterface WcaCssProperty {\n name: string;\n description?: string;\n}\n\ninterface WcaOutput {\n tags: WcaTag[];\n}\n\n// ─── MCP Manifest Types ─────────────────────────────────────────────\ninterface McpAttribute {\n type: string;\n values?: string[];\n default?: string | boolean | number;\n description?: string;\n}\n\ninterface McpSlot {\n description?: string;\n}\n\ninterface McpEvent {\n detail?: Record<string, unknown>;\n description?: string;\n}\n\ninterface McpCssProperty {\n description?: string;\n}\n\ninterface McpComponent {\n name: string;\n category: string;\n description: string;\n attributes: Record<string, McpAttribute>;\n properties: Record<string, { type: string; description?: string }>;\n slots: Record<string, McpSlot>;\n events: Record<string, McpEvent>;\n cssProperties: Record<string, McpCssProperty>;\n examples: Array<{ description: string; html: string }>;\n}\n\n// ─── Transform Helpers ──────────────────────────────────────────────\n\n\n/**\n * Parse a WCA type string into a base type and optional values array.\n * e.g. '\"primary\" | \"secondary\" | \"tertiary\"' → { type: 'string', values: ['primary', 'secondary', 'tertiary'] }\n */\nfunction parseType(typeStr?: string): { type: string; values?: string[] } {\n if (!typeStr) return { type: 'string' };\n\n // Check for union of string literals: \"a\" | \"b\" | \"c\"\n const unionMatch = typeStr.match(/^\"[^\"]*\"(\\s*\\|\\s*\"[^\"]*\")+$/);\n if (unionMatch) {\n const values = [...typeStr.matchAll(/\"([^\"]*)\"/g)].map(m => m[1]);\n return { type: 'string', values };\n }\n\n // Check for union with undefined: \"a\" | \"b\" | undefined\n const unionWithUndefined = typeStr.replace(/\\s*\\|\\s*undefined/g, '').trim();\n if (unionWithUndefined !== typeStr) {\n return parseType(unionWithUndefined);\n }\n\n // Map common types\n const lower = typeStr.toLowerCase().trim();\n if (lower === 'boolean' || lower === 'true | false' || lower === 'false | true') return { type: 'boolean' };\n if (lower === 'number') return { type: 'number' };\n if (lower === 'string') return { type: 'string' };\n\n return { type: typeStr };\n}\n\n/**\n * Parse a default value string into the appropriate JS type.\n */\nfunction parseDefault(defaultStr?: string, type?: string): string | boolean | number | undefined {\n if (defaultStr === undefined || defaultStr === 'undefined' || defaultStr === '\"\"' || defaultStr === \"''\") {\n return undefined;\n }\n\n // Boolean\n if (defaultStr === 'false') return false;\n if (defaultStr === 'true') return true;\n\n // Number\n if (type === 'number' && !isNaN(Number(defaultStr))) {\n return Number(defaultStr);\n }\n\n // Strip quotes\n const unquoted = defaultStr.replace(/^[\"']|[\"']$/g, '');\n return unquoted || undefined;\n}\n\n/**\n * Get the component short name (without cre8- prefix) for category lookup.\n */\nfunction getShortName(tagName: string): string {\n return tagName.replace(/^cre8-/, '');\n}\n\n/**\n * Determine category from component name.\n */\nfunction getCategory(tagName: string): string {\n const short = getShortName(tagName);\n return CATEGORY_MAP[short] || 'Other';\n}\n\n/**\n * Generate basic examples for a component based on its attributes.\n */\nfunction generateExamples(tag: WcaTag): Array<{ description: string; html: string }> {\n const examples: Array<{ description: string; html: string }> = [];\n const name = tag.name;\n\n // Find variant attribute\n const variantAttr = tag.attributes?.find(a => a.name === 'variant');\n const textAttr = tag.attributes?.find(a => a.name === 'text');\n\n if (variantAttr) {\n const { values } = parseType(variantAttr.type);\n if (values && values.length > 0) {\n const primaryVariant = values[0];\n let attrs = `variant=\"${primaryVariant}\"`;\n if (textAttr) attrs += ` text=\"${capitalize(getShortName(name))}\"`;\n examples.push({\n description: `${capitalize(primaryVariant)} ${getShortName(name)}`,\n html: `<${name} ${attrs}></${name}>`,\n });\n }\n } else if (textAttr) {\n examples.push({\n description: `Basic ${getShortName(name)}`,\n html: `<${name} text=\"${capitalize(getShortName(name))}\"></${name}>`,\n });\n }\n\n return examples;\n}\n\nfunction capitalize(s: string): string {\n return s.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n}\n\n// ─── Main Transform ─────────────────────────────────────────────────\n\nfunction transformTag(tag: WcaTag): McpComponent {\n // Separate WCA attributes into true HTML attributes vs JS-only properties.\n // In Lit, @property() without an explicit `attribute:` option auto-creates\n // a lowercased attribute. But camelCase names (e.g. iconRotateDegree →\n // \"iconrotatedegree\") are awkward and rarely used as HTML attributes in\n // practice. We treat those as properties instead.\n const attributes: Record<string, McpAttribute> = {};\n const properties: Record<string, { type: string; values?: string[]; default?: string | boolean | number; description?: string }> = {};\n\n // Build a set of property names that WCA links to attributes\n\n\n for (const attr of tag.attributes || []) {\n const { type, values } = parseType(attr.type);\n const defaultValue = parseDefault(attr.default, type);\n const isCamelCase = /[A-Z]/.test(attr.name);\n\n const entry: McpAttribute = { type };\n if (values) entry.values = values;\n if (defaultValue !== undefined) entry.default = defaultValue;\n if (attr.description) entry.description = attr.description;\n\n if (isCamelCase) {\n // CamelCase → treat as a JS property (set via .prop or Lit binding)\n properties[attr.name] = entry;\n } else {\n // Simple lowercase name → genuine HTML attribute\n attributes[attr.name] = entry;\n }\n }\n\n // Add properties that WCA lists with no attribute linkage (true prop-only),\n // but skip inherited Lit/DOM internals that aren't useful for consumers\n const SKIP_PROPERTIES = new Set([\n 'styles', 'formAssociated', 'field', 'form', 'validationMessage',\n 'validity', 'willValidate', 'shadowRoot', 'renderRoot',\n 'isUpdatePending', 'hasUpdated', 'updateComplete',\n ]);\n for (const prop of tag.properties || []) {\n if (prop.attribute) continue; // Already handled above\n if (SKIP_PROPERTIES.has(prop.name)) continue;\n const { type } = parseType(prop.type);\n const entry: { type: string; description?: string } = { type };\n if (prop.description) entry.description = prop.description;\n properties[prop.name] = entry;\n }\n\n // Transform slots\n const slots: Record<string, McpSlot> = {};\n for (const slot of tag.slots || []) {\n const slotName = slot.name || 'default';\n slots[slotName] = {};\n if (slot.description) slots[slotName].description = slot.description;\n }\n\n // Transform events\n const events: Record<string, McpEvent> = {};\n for (const event of tag.events || []) {\n events[event.name] = { detail: {} };\n if (event.description) events[event.name].description = event.description;\n }\n\n // Transform CSS properties\n const cssProperties: Record<string, McpCssProperty> = {};\n for (const cssProp of tag.cssProperties || []) {\n cssProperties[cssProp.name] = {};\n if (cssProp.description) cssProperties[cssProp.name].description = cssProp.description;\n }\n\n return {\n name: tag.name,\n category: getCategory(tag.name),\n description: tag.description || `${capitalize(getShortName(tag.name))} component.`,\n attributes,\n properties,\n slots,\n events,\n cssProperties,\n examples: generateExamples(tag),\n };\n}\n\nfunction main() {\n // Read WCA output\n const wcaPath = process.argv[2] || '/tmp/wca-raw.json';\n console.log(`Reading WCA output from: ${wcaPath}`);\n\n let wcaData: WcaOutput;\n try {\n wcaData = JSON.parse(readFileSync(wcaPath, 'utf-8'));\n } catch (err) {\n console.error(`Failed to read WCA output: ${err}`);\n process.exit(1);\n }\n\n console.log(`Found ${wcaData.tags.length} tags in WCA output`);\n\n // Read static data\n const staticData = JSON.parse(\n readFileSync(join(__dirname, 'mcp-static-data.json'), 'utf-8')\n );\n\n // Read package.json for version and dependencies\n const pkgJson = JSON.parse(\n readFileSync(join(ROOT, 'package.json'), 'utf-8')\n );\n\n // Transform components\n const components = wcaData.tags\n .filter(tag => tag.name.startsWith('cre8-'))\n .map(transformTag)\n .sort((a, b) => {\n // Sort by category, then name\n const catCompare = a.category.localeCompare(b.category);\n if (catCompare !== 0) return catCompare;\n return a.name.localeCompare(b.name);\n });\n\n console.log(`Transformed ${components.length} components`);\n\n // Log category distribution\n const categories: Record<string, number> = {};\n for (const comp of components) {\n categories[comp.category] = (categories[comp.category] || 0) + 1;\n }\n console.log('Categories:', JSON.stringify(categories, null, 2));\n\n // Build dependencies from package.json\n const dependencies: Record<string, string> = {};\n const depKeys = ['lit', '@lit/context', '@lit/react', '@a11y/focus-trap', 'chart.js', 'classnames', 'nanoid', 'zod'];\n for (const key of depKeys) {\n if (pkgJson.dependencies?.[key]) {\n dependencies[key] = pkgJson.dependencies[key];\n }\n }\n\n // Build manifest\n const manifest = {\n version: pkgJson.version,\n library: pkgJson.name,\n tagPrefix: 'cre8',\n description: pkgJson.description,\n framework: `Lit ${pkgJson.dependencies?.lit || '3.x'}`,\n components,\n baseClasses: staticData.baseClasses,\n patterns: staticData.patterns,\n designTokens: staticData.designTokens,\n accessibility: staticData.accessibility,\n dependencies,\n };\n\n // Write output\n const outputPath = join(ROOT, 'mcp-manifest.json');\n writeFileSync(outputPath, JSON.stringify(manifest, null, 2) + '\\n');\n console.log(`Wrote manifest to: ${outputPath}`);\n console.log(`Total components: ${components.length}`);\n}\n\nmain();\n"]}
1
+ {"version":3,"file":"generate-mcp-manifest.js","sourceRoot":"","sources":["../../scripts/generate-mcp-manifest.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Generate MCP Manifest from Web Component Analyzer output.\n *\n * Reads WCA JSON output and transforms it into the MCP manifest format\n * used by the cre8-mcp server for component intelligence.\n */\n\nimport { readFileSync, writeFileSync } from 'fs';\nimport { join, dirname } from 'path';\nimport { fileURLToPath } from 'url';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst ROOT = join(__dirname, '..');\n\n/**\n * Custom elements that register but are not part of the public API.\n *\n * These are sub-components: they call `customElements.define` as a side effect\n * of their parent being imported, but nothing exports them from `index.ts` or\n * `cdn-entry.ts`, so a consumer cannot use them on their own.\n *\n * The list is explicit because the exclusion used to be accidental — the\n * analyzer glob was `components/*​/*.ts`, one level too shallow to see anything\n * nested, so all five vanished from the manifest, the catalog, the compact\n * projection, the React manifest and custom-elements.json without anyone\n * choosing that. Now the glob reaches everything and the omission is a\n * decision, pinned here and asserted by `check-layer-parity.mjs`. Adding a\n * component can no longer silently skip the pipeline.\n *\n * To publish one: delete it here and export it from `index.ts`/`cdn-entry.ts`.\n */\nconst INTERNAL_ELEMENTS = [\n 'cre8-calendar',\n 'cre8-calendar-month-modal',\n 'cre8-calendar-navigation',\n 'cre8-calendar-year-modal',\n 'cre8-page-counter',\n];\n\n// ─── Category Mapping ────────────────────────────────────────────────\nconst CATEGORY_MAP: Record<string, string> = {\n 'button': 'Actions',\n 'danger-button': 'Actions',\n 'button-group': 'Actions',\n 'split-button': 'Actions',\n 'field': 'Forms',\n 'field-note': 'Forms',\n 'select': 'Forms',\n 'multi-select': 'Forms',\n 'checkbox-field': 'Forms',\n 'checkbox-field-group': 'Forms',\n 'checkbox-field-item': 'Forms',\n 'radio-field': 'Forms',\n 'radio-field-group': 'Forms',\n 'radio-field-item': 'Forms',\n 'date-picker': 'Forms',\n 'select-tile': 'Forms',\n 'select-tile-group': 'Forms',\n 'select-tile-list': 'Forms',\n 'toggle-field': 'Forms',\n 'text-area': 'Forms',\n 'form-fieldset': 'Forms',\n 'card': 'Layout',\n 'grid': 'Layout',\n 'grid-item': 'Layout',\n 'layout': 'Layout',\n 'layout-container': 'Layout',\n 'layout-section': 'Layout',\n 'linelength-container': 'Layout',\n 'section': 'Layout',\n 'hero': 'Layout',\n 'band': 'Layout',\n 'divider': 'Layout',\n 'main': 'Layout',\n 'heading': 'Typography',\n 'text-passage': 'Typography',\n 'text-link': 'Typography',\n 'link': 'Navigation',\n 'link-list': 'Navigation',\n 'link-list-item': 'Navigation',\n 'breadcrumbs': 'Navigation',\n 'breadcrumbs-item': 'Navigation',\n 'pagination': 'Navigation',\n 'header': 'Navigation',\n 'footer': 'Navigation',\n 'footer-nav': 'Navigation',\n 'tabs': 'Navigation',\n 'tab': 'Navigation',\n 'tab-panel': 'Navigation',\n 'global-nav': 'Navigation',\n 'global-nav-item': 'Navigation',\n 'primary-nav': 'Navigation',\n 'primary-nav-item': 'Navigation',\n 'tertiary-nav': 'Navigation',\n 'tertiary-nav-item': 'Navigation',\n 'utility-nav': 'Navigation',\n 'utility-nav-item': 'Navigation',\n 'nav-container': 'Navigation',\n 'skip-nav': 'Navigation',\n 'accordion': 'Disclosure',\n 'accordion-item': 'Disclosure',\n 'accordion-panel': 'Disclosure',\n 'dropdown': 'Disclosure',\n 'dropdown-item': 'Disclosure',\n 'modal': 'Disclosure',\n 'popover': 'Disclosure',\n 'tooltip': 'Disclosure',\n 'submenu': 'Disclosure',\n 'submenu-item': 'Disclosure',\n 'alert': 'Feedback',\n 'inline-alert': 'Feedback',\n 'badge': 'Feedback',\n 'loading-spinner': 'Feedback',\n 'skeleton-loader': 'Feedback',\n 'progress-meter': 'Feedback',\n 'percent-bar': 'Feedback',\n 'progress-steps-item': 'Feedback',\n 'table': 'Data',\n 'table-header': 'Data',\n 'table-header-cell': 'Data',\n 'table-body': 'Data',\n 'table-row': 'Data',\n 'table-cell': 'Data',\n 'table-object': 'Data',\n 'list': 'Data',\n 'list-item': 'Data',\n 'tag': 'Data',\n 'tag-list': 'Data',\n 'remove-tag': 'Data',\n 'chart': 'Data',\n 'icon': 'Media',\n 'logo': 'Media',\n 'feature': 'Marketing',\n 'page-header': 'Marketing',\n};\n\n// ─── WCA Types ───────────────────────────────────────────────────────\ninterface WcaTag {\n name: string;\n path: string;\n description?: string;\n attributes?: WcaAttribute[];\n properties?: WcaProperty[];\n slots?: WcaSlot[];\n events?: WcaEvent[];\n cssParts?: WcaCssPart[];\n cssProperties?: WcaCssProperty[];\n}\n\ninterface WcaAttribute {\n name: string;\n type?: string;\n default?: string;\n description?: string;\n}\n\ninterface WcaProperty {\n name: string;\n type?: string;\n default?: string;\n attribute?: string;\n description?: string;\n}\n\ninterface WcaSlot {\n name: string;\n description?: string;\n}\n\ninterface WcaEvent {\n name: string;\n description?: string;\n}\n\ninterface WcaCssPart {\n name: string;\n description?: string;\n}\n\ninterface WcaCssProperty {\n name: string;\n description?: string;\n}\n\ninterface WcaOutput {\n tags: WcaTag[];\n}\n\n// ─── MCP Manifest Types ─────────────────────────────────────────────\ninterface McpAttribute {\n type: string;\n values?: string[];\n default?: string | boolean | number;\n description?: string;\n}\n\ninterface McpSlot {\n description?: string;\n}\n\ninterface McpEvent {\n detail?: Record<string, unknown>;\n description?: string;\n}\n\ninterface McpCssProperty {\n description?: string;\n}\n\ninterface McpComponent {\n name: string;\n category: string;\n description: string;\n attributes: Record<string, McpAttribute>;\n properties: Record<string, { type: string; description?: string }>;\n slots: Record<string, McpSlot>;\n events: Record<string, McpEvent>;\n cssProperties: Record<string, McpCssProperty>;\n examples: Array<{ description: string; html: string }>;\n}\n\n// ─── Transform Helpers ──────────────────────────────────────────────\n\n\n/**\n * Parse a WCA type string into a base type and optional values array.\n * e.g. '\"primary\" | \"secondary\" | \"tertiary\"' → { type: 'string', values: ['primary', 'secondary', 'tertiary'] }\n */\nfunction parseType(typeStr?: string): { type: string; values?: string[] } {\n if (!typeStr) return { type: 'string' };\n\n // Check for union of string literals: \"a\" | \"b\" | \"c\"\n const unionMatch = typeStr.match(/^\"[^\"]*\"(\\s*\\|\\s*\"[^\"]*\")+$/);\n if (unionMatch) {\n const values = [...typeStr.matchAll(/\"([^\"]*)\"/g)].map(m => m[1]);\n return { type: 'string', values };\n }\n\n // Check for union with undefined: \"a\" | \"b\" | undefined\n const unionWithUndefined = typeStr.replace(/\\s*\\|\\s*undefined/g, '').trim();\n if (unionWithUndefined !== typeStr) {\n return parseType(unionWithUndefined);\n }\n\n // Map common types\n const lower = typeStr.toLowerCase().trim();\n if (lower === 'boolean' || lower === 'true | false' || lower === 'false | true') return { type: 'boolean' };\n if (lower === 'number') return { type: 'number' };\n if (lower === 'string') return { type: 'string' };\n\n return { type: typeStr };\n}\n\n/**\n * Parse a default value string into the appropriate JS type.\n */\nfunction parseDefault(defaultStr?: string, type?: string): string | boolean | number | undefined {\n if (defaultStr === undefined || defaultStr === 'undefined' || defaultStr === '\"\"' || defaultStr === \"''\") {\n return undefined;\n }\n\n // Boolean\n if (defaultStr === 'false') return false;\n if (defaultStr === 'true') return true;\n\n // Number\n if (type === 'number' && !isNaN(Number(defaultStr))) {\n return Number(defaultStr);\n }\n\n // Strip quotes\n const unquoted = defaultStr.replace(/^[\"']|[\"']$/g, '');\n return unquoted || undefined;\n}\n\n/**\n * Get the component short name (without cre8- prefix) for category lookup.\n */\nfunction getShortName(tagName: string): string {\n return tagName.replace(/^cre8-/, '');\n}\n\n/**\n * Determine category from component name.\n */\nfunction getCategory(tagName: string): string {\n const short = getShortName(tagName);\n return CATEGORY_MAP[short] || 'Other';\n}\n\n/**\n * Generate basic examples for a component based on its attributes.\n */\nfunction generateExamples(tag: WcaTag): Array<{ description: string; html: string }> {\n const examples: Array<{ description: string; html: string }> = [];\n const name = tag.name;\n\n // Find variant attribute\n const variantAttr = tag.attributes?.find(a => a.name === 'variant');\n const textAttr = tag.attributes?.find(a => a.name === 'text');\n\n if (variantAttr) {\n const { values } = parseType(variantAttr.type);\n if (values && values.length > 0) {\n const primaryVariant = values[0];\n let attrs = `variant=\"${primaryVariant}\"`;\n if (textAttr) attrs += ` text=\"${capitalize(getShortName(name))}\"`;\n examples.push({\n description: `${capitalize(primaryVariant)} ${getShortName(name)}`,\n html: `<${name} ${attrs}></${name}>`,\n });\n }\n } else if (textAttr) {\n examples.push({\n description: `Basic ${getShortName(name)}`,\n html: `<${name} text=\"${capitalize(getShortName(name))}\"></${name}>`,\n });\n }\n\n return examples;\n}\n\nfunction capitalize(s: string): string {\n return s.split('-').map(w => w.charAt(0).toUpperCase() + w.slice(1)).join(' ');\n}\n\n// ─── Main Transform ─────────────────────────────────────────────────\n\nfunction transformTag(tag: WcaTag): McpComponent {\n // Separate WCA attributes into true HTML attributes vs JS-only properties.\n // In Lit, @property() without an explicit `attribute:` option auto-creates\n // a lowercased attribute. But camelCase names (e.g. iconRotateDegree →\n // \"iconrotatedegree\") are awkward and rarely used as HTML attributes in\n // practice. We treat those as properties instead.\n const attributes: Record<string, McpAttribute> = {};\n const properties: Record<string, { type: string; values?: string[]; default?: string | boolean | number; description?: string }> = {};\n\n // Build a set of property names that WCA links to attributes\n\n\n for (const attr of tag.attributes || []) {\n const { type, values } = parseType(attr.type);\n const defaultValue = parseDefault(attr.default, type);\n const isCamelCase = /[A-Z]/.test(attr.name);\n\n const entry: McpAttribute = { type };\n if (values) entry.values = values;\n if (defaultValue !== undefined) entry.default = defaultValue;\n if (attr.description) entry.description = attr.description;\n\n if (isCamelCase) {\n // CamelCase → treat as a JS property (set via .prop or Lit binding)\n properties[attr.name] = entry;\n } else {\n // Simple lowercase name → genuine HTML attribute\n attributes[attr.name] = entry;\n }\n }\n\n // Add properties that WCA lists with no attribute linkage (true prop-only),\n // but skip inherited Lit/DOM internals that aren't useful for consumers\n const SKIP_PROPERTIES = new Set([\n 'styles', 'formAssociated', 'field', 'form', 'validationMessage',\n 'validity', 'willValidate', 'shadowRoot', 'renderRoot',\n 'isUpdatePending', 'hasUpdated', 'updateComplete',\n ]);\n for (const prop of tag.properties || []) {\n if (prop.attribute) continue; // Already handled above\n if (SKIP_PROPERTIES.has(prop.name)) continue;\n const { type } = parseType(prop.type);\n const entry: { type: string; description?: string } = { type };\n if (prop.description) entry.description = prop.description;\n properties[prop.name] = entry;\n }\n\n // Transform slots\n const slots: Record<string, McpSlot> = {};\n for (const slot of tag.slots || []) {\n const slotName = slot.name || 'default';\n slots[slotName] = {};\n if (slot.description) slots[slotName].description = slot.description;\n }\n\n // Transform events\n const events: Record<string, McpEvent> = {};\n for (const event of tag.events || []) {\n events[event.name] = { detail: {} };\n if (event.description) events[event.name].description = event.description;\n }\n\n // Transform CSS properties\n const cssProperties: Record<string, McpCssProperty> = {};\n for (const cssProp of tag.cssProperties || []) {\n cssProperties[cssProp.name] = {};\n if (cssProp.description) cssProperties[cssProp.name].description = cssProp.description;\n }\n\n return {\n name: tag.name,\n category: getCategory(tag.name),\n description: tag.description || `${capitalize(getShortName(tag.name))} component.`,\n attributes,\n properties,\n slots,\n events,\n cssProperties,\n examples: generateExamples(tag),\n };\n}\n\nfunction main() {\n // Read WCA output\n const wcaPath = process.argv[2] || '/tmp/wca-raw.json';\n console.log(`Reading WCA output from: ${wcaPath}`);\n\n let wcaData: WcaOutput;\n try {\n wcaData = JSON.parse(readFileSync(wcaPath, 'utf-8'));\n } catch (err) {\n console.error(`Failed to read WCA output: ${err}`);\n process.exit(1);\n }\n\n console.log(`Found ${wcaData.tags.length} tags in WCA output`);\n\n // Read static data\n const staticData = JSON.parse(\n readFileSync(join(__dirname, 'mcp-static-data.json'), 'utf-8')\n );\n\n // Read package.json for version and dependencies\n const pkgJson = JSON.parse(\n readFileSync(join(ROOT, 'package.json'), 'utf-8')\n );\n\n // Transform components\n const seen = new Set(wcaData.tags.map(t => t.name).filter(n => n.startsWith('cre8-')));\n const missingInternals = INTERNAL_ELEMENTS.filter(n => !seen.has(n));\n if (missingInternals.length) {\n throw new Error(\n `INTERNAL_ELEMENTS lists element(s) the analyzer no longer sees: ${missingInternals.join(', ')}. ` +\n `Remove them from the list, or fix the analyzer glob.`\n );\n }\n\n const components = wcaData.tags\n .filter(tag => tag.name.startsWith('cre8-'))\n .filter(tag => !INTERNAL_ELEMENTS.includes(tag.name))\n .map(transformTag)\n .sort((a, b) => {\n // Sort by category, then name\n const catCompare = a.category.localeCompare(b.category);\n if (catCompare !== 0) return catCompare;\n return a.name.localeCompare(b.name);\n });\n\n console.log(`Transformed ${components.length} components`);\n\n // Log category distribution\n const categories: Record<string, number> = {};\n for (const comp of components) {\n categories[comp.category] = (categories[comp.category] || 0) + 1;\n }\n console.log('Categories:', JSON.stringify(categories, null, 2));\n\n // Build dependencies from package.json\n const dependencies: Record<string, string> = {};\n const depKeys = ['lit', '@lit/context', '@lit/react', '@a11y/focus-trap', 'chart.js', 'classnames', 'nanoid', 'zod'];\n for (const key of depKeys) {\n if (pkgJson.dependencies?.[key]) {\n dependencies[key] = pkgJson.dependencies[key];\n }\n }\n\n // Build manifest\n const manifest = {\n version: pkgJson.version,\n library: pkgJson.name,\n tagPrefix: 'cre8',\n description: pkgJson.description,\n framework: `Lit ${pkgJson.dependencies?.lit || '3.x'}`,\n /**\n * Elements that register but are intentionally absent from `components`.\n * Recorded here so `check-layer-parity.mjs` can tell a deliberate omission\n * from a component that silently fell out of the pipeline, without keeping\n * a second copy of the list.\n */\n internalElements: INTERNAL_ELEMENTS,\n components,\n baseClasses: staticData.baseClasses,\n patterns: staticData.patterns,\n designTokens: staticData.designTokens,\n accessibility: staticData.accessibility,\n dependencies,\n };\n\n // Write output\n const outputPath = join(ROOT, 'mcp-manifest.json');\n writeFileSync(outputPath, JSON.stringify(manifest, null, 2) + '\\n');\n console.log(`Wrote manifest to: ${outputPath}`);\n console.log(`Total components: ${components.length}`);\n}\n\nmain();\n"]}
package/mcp-manifest.json CHANGED
@@ -1,9 +1,16 @@
1
1
  {
2
- "version": "2.0.8",
2
+ "version": "2.1.0",
3
3
  "library": "@tmorrow/cre8-wc",
4
4
  "tagPrefix": "cre8",
5
5
  "description": "cre8 Web Components is a library of presentational UI web components to be consumed by # web applications.",
6
6
  "framework": "Lit 3.3.1",
7
+ "internalElements": [
8
+ "cre8-calendar",
9
+ "cre8-calendar-month-modal",
10
+ "cre8-calendar-navigation",
11
+ "cre8-calendar-year-modal",
12
+ "cre8-page-counter"
13
+ ],
7
14
  "components": [
8
15
  {
9
16
  "name": "cre8-button",
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@tmorrow/cre8-wc",
3
- "version": "2.0.8",
3
+ "version": "2.1.0",
4
4
  "description": "cre8 Web Components is a library of presentational UI web components to be consumed by # web applications.",
5
5
  "license": "BSD-3-Clause",
6
6
  "scripts": {
7
7
  "start": "pnpm run build:custom-elements.json && pnpm run storybook",
8
8
  "compile-styles": "npx tsx scripts/convert-scss-to-ts.ts",
9
9
  "build": "rm -rf lib && pnpm run compile-styles && pnpm build:cdn && vite build && tsc && cp .storybook/custom-elements.json custom-elements.json && pnpm run build:react && pnpm run build:mcp-manifest && pnpm run build:react-manifest",
10
- "build:mcp-manifest": "npx web-component-analyzer analyze \"components/*/*.ts\" --format json --outFile /tmp/wca-raw.json && npx tsx scripts/generate-mcp-manifest.ts",
10
+ "build:mcp-manifest": "npx web-component-analyzer analyze \"components/**/*.ts\" --format json --outFile /tmp/wca-raw.json && npx tsx scripts/generate-mcp-manifest.ts",
11
11
  "build:react-manifest": "npx tsx scripts/generate-react-manifest.ts",
12
12
  "build:cdn": "rm -rf cdn && vite build --config vite.config.cdn.ts",
13
13
  "build:react": "rm -rf react-wrappers/components react-wrappers/dist react-wrappers/index.ts && npx tsx scripts/generate-react-wrappers.ts && cd react-wrappers && npx tsc",
@@ -34,9 +34,10 @@
34
34
  "publish:react": "cd react-wrappers && npm publish --access public",
35
35
  "release:publish": "node scripts/release.cjs --skip-lint --skip-tests --publish",
36
36
  "version:bump": "node scripts/version-bump.cjs",
37
- "test:a2ui": "npx tsx a2ui/smoke-test.mjs && npx tsx a2ui/stream/stream-test.mjs && npx tsx a2ui/stream/diff-test.mjs && node a2ui/render-audit.mjs --check",
37
+ "test:a2ui": "npx tsx a2ui/smoke-test.mjs && npx tsx a2ui/stream/stream-test.mjs && npx tsx a2ui/stream/diff-test.mjs && node a2ui/render-audit.mjs --check && node a2ui/check-layer-parity.mjs",
38
38
  "audit:render": "node a2ui/render-audit.mjs",
39
- "audit:render:check": "node a2ui/render-audit.mjs --check"
39
+ "audit:render:check": "node a2ui/render-audit.mjs --check",
40
+ "check:parity": "node a2ui/check-layer-parity.mjs"
40
41
  },
41
42
  "type": "module",
42
43
  "module": "lib/index.js",
@@ -94,6 +95,7 @@
94
95
  "types": "./a2ui/index.d.ts"
95
96
  },
96
97
  "./a2ui/catalog.json": "./a2ui/catalog.json",
98
+ "./a2ui/catalog.compact.json": "./a2ui/catalog.compact.json",
97
99
  "./a2ui/catalog-kg.json": "./a2ui/catalog-kg.json",
98
100
  "./a2ui/*": {
99
101
  "import": "./a2ui/*",
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "2.0.8",
2
+ "version": "2.1.0",
3
3
  "library": "@tmorrow/cre8-react",
4
4
  "componentPrefix": "Cre8",
5
5
  "description": "React wrappers for cre8 Web Components (@tmorrow/cre8-wc)",
@@ -3693,7 +3693,7 @@
3693
3693
  },
3694
3694
  "dependencies": {
3695
3695
  "@lit/react": "^1.0.8",
3696
- "@tmorrow/cre8-wc": "^2.0.8",
3696
+ "@tmorrow/cre8-wc": "^2.1.0",
3697
3697
  "react": ">=18",
3698
3698
  "react-dom": ">=18"
3699
3699
  }