@happyvertical/smrt-core 0.55.1 → 0.55.3
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/AGENTS.md +8 -0
- package/agents/build-knowledge.md +42 -0
- package/agents/generators.md +13 -0
- package/agents/recipes.md +150 -0
- package/dist/browser.d.ts +3 -0
- package/dist/browser.d.ts.map +1 -1
- package/dist/browser.js +4 -1
- package/dist/generators/mcp.d.ts.map +1 -1
- package/dist/generators/mcp.js +10 -6
- package/dist/generators/mcp.js.map +1 -1
- package/dist/generators/swagger.d.ts.map +1 -1
- package/dist/generators/swagger.js +3 -0
- package/dist/generators/swagger.js.map +1 -1
- package/dist/generators/tool-schema.d.ts +9 -0
- package/dist/generators/tool-schema.d.ts.map +1 -1
- package/dist/generators/tool-schema.js +10 -7
- package/dist/generators/tool-schema.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -1
- package/dist/knowledge.d.ts.map +1 -1
- package/dist/knowledge.js +13 -2
- package/dist/knowledge.js.map +1 -1
- package/dist/manifest/generator.d.ts.map +1 -1
- package/dist/manifest/generator.js +3 -1
- package/dist/manifest/generator.js.map +1 -1
- package/dist/manifest/static-manifest.js +1 -1
- package/dist/manifest/static-manifest.js.map +1 -1
- package/dist/manifest/store.js +1 -1
- package/dist/manifest.json +1 -1
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +2 -1
- package/dist/migrations/migration-lock.d.ts +91 -0
- package/dist/migrations/migration-lock.d.ts.map +1 -0
- package/dist/migrations/migration-lock.js +158 -0
- package/dist/migrations/migration-lock.js.map +1 -0
- package/dist/migrations/types.d.ts +2 -0
- package/dist/migrations/types.d.ts.map +1 -1
- package/dist/migrations.js +2 -1
- package/dist/object.d.ts.map +1 -1
- package/dist/object.js +9 -3
- package/dist/object.js.map +1 -1
- package/dist/prebuild/index.d.ts.map +1 -1
- package/dist/prebuild/index.js +1 -0
- package/dist/prebuild/index.js.map +1 -1
- package/dist/recipe-help.d.ts +186 -0
- package/dist/recipe-help.d.ts.map +1 -0
- package/dist/recipe-help.js +311 -0
- package/dist/recipe-help.js.map +1 -0
- package/dist/recipe.d.ts +83 -0
- package/dist/recipe.d.ts.map +1 -0
- package/dist/recipe.js +30 -0
- package/dist/recipe.js.map +1 -0
- package/dist/registry/manifest-field-merge.d.ts +6 -0
- package/dist/registry/manifest-field-merge.d.ts.map +1 -1
- package/dist/registry/manifest-field-merge.js +12 -1
- package/dist/registry/manifest-field-merge.js.map +1 -1
- package/dist/registry/types.d.ts +17 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/scanner/index.d.ts +1 -1
- package/dist/scanner/index.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.d.ts +33 -0
- package/dist/scanner/manifest-generator.d.ts.map +1 -1
- package/dist/scanner/manifest-generator.js +124 -0
- package/dist/scanner/manifest-generator.js.map +1 -1
- package/dist/scanner/types.d.ts +47 -0
- package/dist/scanner/types.d.ts.map +1 -1
- package/dist/scanner/types.js.map +1 -1
- package/dist/smrt-knowledge.json +16 -9
- package/dist/ui-metadata.d.ts +60 -0
- package/dist/ui-metadata.d.ts.map +1 -0
- package/dist/ui-metadata.js +85 -0
- package/dist/ui-metadata.js.map +1 -0
- package/dist/utils/scanner-module.d.ts +18 -1
- package/dist/utils/scanner-module.d.ts.map +1 -1
- package/dist/vite-plugin/index.d.ts.map +1 -1
- package/dist/vite-plugin/index.js +4 -1
- package/dist/vite-plugin/index.js.map +1 -1
- package/dist/vite-plugin/web-collections.d.ts.map +1 -1
- package/dist/vite-plugin/web-collections.js +8 -3
- package/dist/vite-plugin/web-collections.js.map +1 -1
- package/package.json +15 -10
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe-help.js","names":[],"sources":["../src/recipe-help.ts"],"sourcesContent":["/**\n * Recipe help (#3591): the pure, browser-safe helper that turns a recipe's\n * `help` into something a host can render, following how the app configured\n * the recipe's fields.\n *\n * Contract. A recipe entry carries `help: { markdown, fieldRefs }`. The\n * Markdown is user-facing prose: an overview and tasks. A step names a field as\n * `{field:name}` or `{field:Model.name}`, and the Markdown block that contains a\n * reference (a heading, a paragraph or a list item) is tied to that field.\n * `fieldRefs` is derived from the Markdown at build time, never written by hand.\n *\n * Rendering. {@link renderHelp} replaces each reference with the field's\n * effective label, drops the blocks tied to a field the app does not show\n * (hidden, disabled, advanced-and-not-enabled, or unknown), prunes a heading\n * whose whole section was dropped, builds the glossary from the effective label\n * and help (falling back to the `@field({ description })`), and lists the\n * recipe's generated REST, MCP and CLI surfaces last as \"Connect other tools\".\n *\n * The result is an AST of text nodes, never HTML: no raw markup from help\n * content can reach a page, so nothing needs sanitizing. {@link helpToMarkdown}\n * flattens the same result to Markdown for hosts that prefer their own\n * renderer. Only a small Markdown subset is understood: `##`/`###`/`####`\n * headings, paragraphs, flat `-`/`*`/`1.` lists, and `**bold**`, `*italic*` and\n * `` `code` `` inline. Anything else is plain text.\n *\n * @packageDocumentation\n */\n\nimport type {\n RecipeExposureNarrowing,\n RecipeHelp,\n} from '@happyvertical/smrt-types';\n\nexport type { RecipeHelp };\n\n// -- Parsing ----------------------------------------------------------------\n\nexport type Inline =\n | { type: 'text'; text: string }\n | { type: 'code'; text: string }\n | { type: 'strong'; children: Inline[] }\n | { type: 'em'; children: Inline[] }\n /** Present only before resolution; {@link renderHelp} replaces it. */\n | { type: 'field'; ref: string };\n\nexport interface HelpHeading {\n type: 'heading';\n level: 2 | 3 | 4;\n inlines: Inline[];\n}\nexport interface HelpParagraph {\n type: 'paragraph';\n inlines: Inline[];\n}\nexport interface HelpItem {\n inlines: Inline[];\n}\nexport interface HelpList {\n type: 'list';\n ordered: boolean;\n items: HelpItem[];\n}\nexport type HelpBlock = HelpHeading | HelpParagraph | HelpList;\n\nconst FIELD_REF =\n /\\{field:([A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)?)\\}/;\nconst INLINE =\n /\\{field:[A-Za-z_][A-Za-z0-9_]*(?:\\.[A-Za-z_][A-Za-z0-9_]*)?\\}|`[^`]+`|\\*\\*[^*]+\\*\\*|\\*[^*\\s][^*]*\\*/;\n\nfunction parseInline(source: string): Inline[] {\n const out: Inline[] = [];\n let rest = source;\n while (rest) {\n const match = INLINE.exec(rest);\n if (!match) break;\n if (match.index > 0) {\n out.push({ type: 'text', text: rest.slice(0, match.index) });\n }\n const token = match[0];\n const ref = FIELD_REF.exec(token);\n if (ref && ref[0] === token) {\n out.push({ type: 'field', ref: ref[1] as string });\n } else if (token.startsWith('`')) {\n out.push({ type: 'code', text: token.slice(1, -1) });\n } else if (token.startsWith('**')) {\n out.push({ type: 'strong', children: parseInline(token.slice(2, -2)) });\n } else {\n out.push({ type: 'em', children: parseInline(token.slice(1, -1)) });\n }\n rest = rest.slice(match.index + token.length);\n }\n if (rest) out.push({ type: 'text', text: rest });\n return out;\n}\n\nconst HEADING = /^(#{2,4})\\s+(.+?)\\s*#*\\s*$/;\nconst BULLET = /^[-*]\\s+(.*)$/;\nconst NUMBERED = /^\\d+[.)]\\s+(.*)$/;\n\n/** Parse the supported Markdown subset into blocks. */\nexport function parseHelp(markdown: string): HelpBlock[] {\n const blocks: HelpBlock[] = [];\n let paragraph: string[] = [];\n let list: { ordered: boolean; items: string[] } | null = null;\n\n const flushParagraph = () => {\n if (paragraph.length) {\n blocks.push({\n type: 'paragraph',\n inlines: parseInline(paragraph.join(' ')),\n });\n paragraph = [];\n }\n };\n const flushList = () => {\n if (list) {\n blocks.push({\n type: 'list',\n ordered: list.ordered,\n items: list.items.map((item) => ({ inlines: parseInline(item) })),\n });\n list = null;\n }\n };\n\n for (const raw of markdown.replace(/\\r\\n?/g, '\\n').split('\\n')) {\n const line = raw.trimEnd();\n const trimmed = line.trim();\n if (!trimmed) {\n flushParagraph();\n flushList();\n continue;\n }\n const heading = HEADING.exec(trimmed);\n if (heading) {\n flushParagraph();\n flushList();\n blocks.push({\n type: 'heading',\n level: (heading[1] as string).length as 2 | 3 | 4,\n inlines: parseInline(heading[2] as string),\n });\n continue;\n }\n const bullet = BULLET.exec(trimmed);\n const numbered = bullet ? null : NUMBERED.exec(trimmed);\n const marker = bullet ?? numbered;\n // A marker at the start of the line (not indented) opens a list item.\n if (marker && raw === raw.trimStart()) {\n flushParagraph();\n const ordered = numbered !== null;\n if (list && list.ordered !== ordered) flushList();\n if (!list) list = { ordered, items: [] };\n list.items.push(marker[1] as string);\n continue;\n }\n // An indented line continues the open list item, else the paragraph.\n if (list) {\n list.items[list.items.length - 1] += ` ${trimmed}`;\n } else {\n paragraph.push(trimmed);\n }\n }\n flushParagraph();\n flushList();\n return blocks;\n}\n\nfunction refsOf(inlines: readonly Inline[]): string[] {\n return inlines.flatMap((node) =>\n node.type === 'field'\n ? [node.ref]\n : node.type === 'strong' || node.type === 'em'\n ? refsOf(node.children)\n : [],\n );\n}\n\n/** Every distinct field reference in the Markdown, as written, sorted. */\nexport function extractFieldRefs(markdown: string): string[] {\n const refs = parseHelp(markdown).flatMap((block) =>\n block.type === 'list'\n ? block.items.flatMap((item) => refsOf(item.inlines))\n : refsOf(block.inlines),\n );\n return [...new Set(refs)].sort();\n}\n\n/** Build a contract entry from Markdown, deriving `fieldRefs`. */\nexport function createRecipeHelp(markdown: string): RecipeHelp {\n return { markdown, fieldRefs: extractFieldRefs(markdown) };\n}\n\n// -- Resolution -------------------------------------------------------------\n\n/** A field as the app's options leave it: smrt-fields vocabulary. */\nexport interface HelpField {\n name: string;\n /** Effective label. */\n label: string;\n /** Effective help; empty or absent falls back to the description. */\n help?: string | null;\n /**\n * `basic` fields are shown. `hidden` fields are not. `advanced` fields are\n * treated like hidden unless {@link RenderHelpOptions.showAdvanced} is set.\n */\n visibility: 'basic' | 'advanced' | 'hidden';\n /** A disabled field is never shown, whatever its visibility. */\n disabled?: boolean;\n}\n\nexport interface HelpModel {\n /** Qualified name, `@scope/pkg:Class`. */\n id: string;\n /** Class name, what `{field:Model.name}` uses. */\n name: string;\n /** In display order. */\n fields: readonly HelpField[];\n /** Field descriptions (`@field({ description })`), keyed by field name. */\n descriptions?: Readonly<Record<string, string>>;\n}\n\nexport interface GlossaryEntry {\n model: string;\n name: string;\n label: string;\n text: string;\n}\n\n/** One generated REST route, MCP tool or CLI command of a recipe model. */\nexport interface ConnectSurface {\n /** Class name of the model it belongs to. */\n model: string;\n kind: 'api' | 'mcp' | 'cli';\n /** The operation: a CRUD verb or a method name, e.g. `list`. */\n operation: string;\n /** Tool or command name. */\n name: string;\n /** REST route, when the surface has one. */\n path?: string;\n /** HTTP method, when the surface has one. */\n method?: string;\n}\n\nexport interface RenderHelpOptions {\n /** Treat `advanced` fields as shown; by default they are dropped like hidden ones. */\n showAdvanced?: boolean;\n /** The recipe's generated surfaces, for the \"Connect other tools\" section. */\n surfaces?: readonly ConnectSurface[];\n /**\n * The recipe's `options.<Model>.exposure` narrowing, keyed by class name:\n * `false` withdraws a transport, `{ exclude }` withdraws named operations.\n */\n exposure?: Readonly<\n Record<\n string,\n Partial<Record<'api' | 'mcp' | 'cli', RecipeExposureNarrowing>>\n >\n >;\n}\n\n/** The developer-facing surfaces, listed last and collapsed by default. */\nexport interface ConnectSection {\n title: string;\n /** Hosts render this section collapsed. */\n collapsed: true;\n groups: Array<{\n kind: 'api' | 'mcp' | 'cli';\n label: string;\n entries: Array<{ model: string; text: string }>;\n }>;\n}\n\nexport interface RenderedHelp {\n blocks: HelpBlock[];\n /**\n * One entry per SHOWN field that has text. A shown field with neither\n * effective help nor a description is skipped, not listed with a blank.\n */\n glossary: GlossaryEntry[];\n /** Present only when the recipe has generated surfaces left after narrowing. */\n connect?: ConnectSection;\n}\n\n/** Find a reference's field: `name` in the first model declaring it, or `Model.name`. */\nexport function findField(\n ref: string,\n models: readonly HelpModel[],\n): { model: HelpModel; field: HelpField } | undefined {\n const dot = ref.indexOf('.');\n const modelName = dot === -1 ? null : ref.slice(0, dot);\n const fieldName = dot === -1 ? ref : ref.slice(dot + 1);\n for (const model of models) {\n if (modelName !== null && model.name !== modelName) continue;\n const field = model.fields.find((f) => f.name === fieldName);\n if (field) return { model, field };\n }\n return undefined;\n}\n\n/**\n * Problems that should fail a build: no Markdown, references to fields the\n * recipe's models do not declare, and a `fieldRefs` list that disagrees with\n * the Markdown. An empty list means the help is valid.\n */\nexport function validateHelp(\n help: RecipeHelp,\n models: readonly HelpModel[],\n): string[] {\n const problems: string[] = [];\n if (!help.markdown.trim()) problems.push('help has no markdown');\n const actual = extractFieldRefs(help.markdown);\n for (const ref of actual) {\n if (!findField(ref, models)) {\n problems.push(`{field:${ref}} names a field the recipe's models lack`);\n }\n }\n if (JSON.stringify([...help.fieldRefs].sort()) !== JSON.stringify(actual)) {\n problems.push(\n `fieldRefs does not match the references in the markdown (markdown: [${actual.join(', ')}]; fieldRefs: [${[...help.fieldRefs].sort().join(', ')}]); an unbalanced backtick across lines is a common cause`,\n );\n }\n return problems;\n}\n\nfunction isShown(field: HelpField, options: RenderHelpOptions): boolean {\n if (field.disabled === true) return false;\n return (\n field.visibility === 'basic' ||\n (field.visibility === 'advanced' && options.showAdvanced === true)\n );\n}\n\ntype ResolveOutcome = { inlines: Inline[] } | null;\n\n/** Replace references with labels, or `null` when any is not shown. */\nfunction resolveInlines(\n inlines: readonly Inline[],\n models: readonly HelpModel[],\n options: RenderHelpOptions,\n): ResolveOutcome {\n const out: Inline[] = [];\n for (const node of inlines) {\n if (node.type === 'field') {\n const found = findField(node.ref, models);\n if (!found || !isShown(found.field, options)) return null;\n out.push({ type: 'text', text: found.field.label });\n } else if (node.type === 'strong' || node.type === 'em') {\n const inner = resolveInlines(node.children, models, options);\n if (!inner) return null;\n out.push({ type: node.type, children: inner.inlines });\n } else {\n out.push(node);\n }\n }\n return { inlines: out };\n}\n\ninterface Entry {\n source: HelpBlock;\n /** The resolved block, or `null` when it was tied to a field not shown. */\n kept: HelpBlock | null;\n}\n\n/**\n * Does the section under the heading at `index` hold any non-heading block?\n * With `survivors`, only blocks that were kept count.\n */\nfunction sectionHasBody(\n entries: readonly Entry[],\n index: number,\n survivors: boolean,\n): boolean {\n const heading = entries[index]?.source as HelpHeading;\n for (let i = index + 1; i < entries.length; i++) {\n const next = entries[i] as Entry;\n if (next.source.type === 'heading') {\n if (next.source.level <= heading.level) return false;\n continue;\n }\n if (!survivors || next.kept) return true;\n }\n return false;\n}\n\n/** Resolve the Markdown against the app's options. */\nexport function resolveHelp(\n help: RecipeHelp,\n models: readonly HelpModel[],\n options: RenderHelpOptions = {},\n): HelpBlock[] {\n const entries: Entry[] = parseHelp(help.markdown).map((source) => {\n if (source.type === 'list') {\n const items = source.items.flatMap((item) => {\n const resolved = resolveInlines(item.inlines, models, options);\n return resolved ? [{ inlines: resolved.inlines }] : [];\n });\n return { source, kept: items.length ? { ...source, items } : null };\n }\n const resolved = resolveInlines(source.inlines, models, options);\n return {\n source,\n kept: resolved ? { ...source, inlines: resolved.inlines } : null,\n };\n });\n // A heading whose section had content, all of it dropped, goes too. A\n // heading that never had content (a pure divider) is the author's and stays.\n return entries.flatMap((entry, index) => {\n if (!entry.kept) return [];\n if (\n entry.source.type === 'heading' &&\n sectionHasBody(entries, index, false) &&\n !sectionHasBody(entries, index, true)\n ) {\n return [];\n }\n return [entry.kept];\n });\n}\n\n/**\n * One entry per shown field: effective label, then effective help or, failing\n * that, the field's `@field({ description })`. A shown field with neither is\n * skipped rather than listed with an empty definition.\n */\nexport function buildGlossary(\n models: readonly HelpModel[],\n options: RenderHelpOptions = {},\n): GlossaryEntry[] {\n return models.flatMap((model) =>\n model.fields.flatMap((field) => {\n if (!isShown(field, options)) return [];\n const text = field.help?.trim() || model.descriptions?.[field.name] || '';\n return text\n ? [{ model: model.name, name: field.name, label: field.label, text }]\n : [];\n }),\n );\n}\n\nconst CONNECT_KINDS = [\n ['api', 'REST routes'],\n ['mcp', 'MCP tools'],\n ['cli', 'CLI commands'],\n] as const;\n\nfunction isWithdrawn(\n surface: ConnectSurface,\n options: RenderHelpOptions,\n): boolean {\n const narrowing = options.exposure?.[surface.model]?.[surface.kind];\n if (narrowing === false) return true;\n return (\n typeof narrowing === 'object' &&\n narrowing !== null &&\n narrowing.exclude.includes(surface.operation)\n );\n}\n\n/**\n * The generated REST routes, MCP tools and CLI commands left after the\n * recipe's exposure narrowing, grouped by transport. `undefined` when none.\n */\nexport function buildConnectSection(\n options: RenderHelpOptions = {},\n): ConnectSection | undefined {\n const surfaces = (options.surfaces ?? []).filter(\n (surface) => !isWithdrawn(surface, options),\n );\n const groups = CONNECT_KINDS.flatMap(([kind, label]) => {\n const entries = surfaces\n .filter((surface) => surface.kind === kind)\n .map((surface) => ({\n model: surface.model,\n text:\n surface.method && surface.path\n ? `${surface.method.toUpperCase()} ${surface.path}`\n : surface.name,\n }));\n return entries.length ? [{ kind, label, entries }] : [];\n });\n return groups.length\n ? { title: 'Connect other tools', collapsed: true, groups }\n : undefined;\n}\n\n/** The whole renderer: resolved blocks, the field glossary and the connect section. */\nexport function renderHelp(\n help: RecipeHelp,\n models: readonly HelpModel[],\n options: RenderHelpOptions = {},\n): RenderedHelp {\n const connect = buildConnectSection(options);\n return {\n blocks: resolveHelp(help, models, options),\n glossary: buildGlossary(models, options),\n ...(connect ? { connect } : {}),\n };\n}\n\n// -- Markdown output --------------------------------------------------------\n\nfunction inlinesToMarkdown(inlines: readonly Inline[]): string {\n return inlines\n .map((node) => {\n switch (node.type) {\n case 'text':\n return node.text;\n case 'code':\n return `\\`${node.text}\\``;\n case 'strong':\n return `**${inlinesToMarkdown(node.children)}**`;\n case 'em':\n return `*${inlinesToMarkdown(node.children)}*`;\n default:\n return node.ref;\n }\n })\n .join('');\n}\n\n/**\n * Flatten a rendered help to Markdown, for hosts that prefer their own\n * Markdown renderer. The glossary and the connect section follow the blocks as\n * ordinary headings and lists; collapsing is left to the host. Text is carried\n * verbatim, so a host must render the Markdown with raw HTML disabled; prefer\n * the AST when the output goes to a page.\n */\nexport function helpToMarkdown(rendered: RenderedHelp): string {\n const parts: string[] = [];\n for (const block of rendered.blocks) {\n if (block.type === 'heading') {\n parts.push(\n `${'#'.repeat(block.level)} ${inlinesToMarkdown(block.inlines)}`,\n );\n } else if (block.type === 'paragraph') {\n parts.push(inlinesToMarkdown(block.inlines));\n } else {\n parts.push(\n block.items\n .map(\n (item, index) =>\n `${block.ordered ? `${index + 1}.` : '-'} ${inlinesToMarkdown(item.inlines)}`,\n )\n .join('\\n'),\n );\n }\n }\n if (rendered.glossary.length > 0) {\n parts.push(\n `## Fields\\n\\n${rendered.glossary\n .map((entry) => `- **${entry.label}**: ${entry.text}`)\n .join('\\n')}`,\n );\n }\n if (rendered.connect) {\n const groups = rendered.connect.groups\n .map(\n (group) =>\n `### ${group.label}\\n\\n${group.entries\n .map((entry) => `- ${entry.model}: \\`${entry.text}\\``)\n .join('\\n')}`,\n )\n .join('\\n\\n');\n parts.push(`## ${rendered.connect.title}\\n\\n${groups}`);\n }\n return `${parts.join('\\n\\n')}\\n`;\n}\n"],"mappings":"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"}
|
package/dist/recipe.d.ts
ADDED
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `SmrtRecipe` — a declared, user-facing unit of app functionality (#3590).
|
|
3
|
+
*
|
|
4
|
+
* A recipe is smaller than a package: "Sales" or "Customers", not all of
|
|
5
|
+
* smrt-commerce. It names the models that make up the unit, the navigation
|
|
6
|
+
* entries it contributes, the recipes it needs first, and curation hints for
|
|
7
|
+
* how its models' forms present. It is declaration only: not persisted and not
|
|
8
|
+
* `@smrt()`-decorated.
|
|
9
|
+
*
|
|
10
|
+
* Declare a recipe as a subclass with static properties, in the package that
|
|
11
|
+
* owns the models. The scanner reads the statics at build time and emits them
|
|
12
|
+
* as the top-level `recipes` array of `manifest.json` and
|
|
13
|
+
* `smrt-knowledge.json`; nothing here runs at that point, so every static must
|
|
14
|
+
* be spelled literally (model entries are class references).
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* export class SalesRecipe extends SmrtRecipe {
|
|
19
|
+
* static id = 'commerce.sales';
|
|
20
|
+
* static label = 'Sales';
|
|
21
|
+
* static summary = 'Take customer orders and track them.';
|
|
22
|
+
* static synonyms = ['sales orders', 'orders'];
|
|
23
|
+
* static models = [Order];
|
|
24
|
+
* static nav = [{ label: 'Sales Orders', model: Order }];
|
|
25
|
+
* static requires = ['commerce.customers'];
|
|
26
|
+
* static options = {
|
|
27
|
+
* Order: { fields: { status: { default: 'draft', locked: true } } },
|
|
28
|
+
* };
|
|
29
|
+
* static help = './sales.recipe.md';
|
|
30
|
+
* }
|
|
31
|
+
* ```
|
|
32
|
+
*/
|
|
33
|
+
import type { RecipeExposureNarrowing, RecipeFieldOptions } from '@happyvertical/smrt-types';
|
|
34
|
+
/**
|
|
35
|
+
* A model class as a recipe references it. Any constructor qualifies; the
|
|
36
|
+
* parameter list is `never[]` so models with required constructor options
|
|
37
|
+
* remain assignable.
|
|
38
|
+
*/
|
|
39
|
+
export type SmrtRecipeModel = abstract new (...args: never[]) => object;
|
|
40
|
+
/** One navigation entry a recipe contributes. */
|
|
41
|
+
export interface SmrtRecipeNavEntry {
|
|
42
|
+
label: string;
|
|
43
|
+
model: SmrtRecipeModel;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Curation hints for one model, keyed in `static options` by the model's class
|
|
47
|
+
* name. Hints only ever refine what the model already declares: they name its
|
|
48
|
+
* existing fields and can narrow, never widen, its API/MCP/CLI exposure.
|
|
49
|
+
*/
|
|
50
|
+
export interface SmrtRecipeModelOptions {
|
|
51
|
+
fields?: Record<string, RecipeFieldOptions>;
|
|
52
|
+
exposure?: {
|
|
53
|
+
api?: RecipeExposureNarrowing;
|
|
54
|
+
mcp?: RecipeExposureNarrowing;
|
|
55
|
+
cli?: RecipeExposureNarrowing;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
export declare abstract class SmrtRecipe {
|
|
59
|
+
/** Stable dotted id, e.g. `commerce.sales`. Unique across all recipes. */
|
|
60
|
+
static id: string;
|
|
61
|
+
/** Display name, e.g. `Sales`. */
|
|
62
|
+
static label: string;
|
|
63
|
+
/** One sentence on what the unit gives the user. */
|
|
64
|
+
static summary: string;
|
|
65
|
+
/** Other words someone might use to ask for it. */
|
|
66
|
+
static synonyms: readonly string[];
|
|
67
|
+
/** Models the unit brings. They must belong to the declaring package. */
|
|
68
|
+
static models: readonly SmrtRecipeModel[];
|
|
69
|
+
/** Navigation entries; each model must also be listed in `models`. */
|
|
70
|
+
static nav: readonly SmrtRecipeNavEntry[];
|
|
71
|
+
/** Ids of recipes needed first; they may live in other packages. */
|
|
72
|
+
static requires: readonly string[];
|
|
73
|
+
/** Curation hints keyed by model class name. */
|
|
74
|
+
static options: Readonly<Record<string, SmrtRecipeModelOptions>>;
|
|
75
|
+
/**
|
|
76
|
+
* Optional user-facing help (#3591): a path to a Markdown file beside the
|
|
77
|
+
* recipe, such as `./sales.recipe.md`. The scanner reads it at build time and
|
|
78
|
+
* embeds `{ markdown, fieldRefs }` in the recipe's manifest entry. See
|
|
79
|
+
* `renderHelp` for how a host follows the app's options.
|
|
80
|
+
*/
|
|
81
|
+
static help?: string;
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=recipe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.d.ts","sourceRoot":"","sources":["../src/recipe.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,OAAO,KAAK,EACV,uBAAuB,EACvB,kBAAkB,EACnB,MAAM,2BAA2B,CAAC;AAEnC;;;;GAIG;AACH,MAAM,MAAM,eAAe,GAAG,QAAQ,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,MAAM,CAAC;AAExE,iDAAiD;AACjD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,eAAe,CAAC;CACxB;AAED;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,QAAQ,CAAC,EAAE;QACT,GAAG,CAAC,EAAE,uBAAuB,CAAC;QAC9B,GAAG,CAAC,EAAE,uBAAuB,CAAC;QAC9B,GAAG,CAAC,EAAE,uBAAuB,CAAC;KAC/B,CAAC;CACH;AAED,8BAAsB,UAAU;IAC9B,0EAA0E;IAC1E,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC;IAClB,kCAAkC;IAClC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC;IACrB,oDAAoD;IACpD,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAM;IACxC,yEAAyE;IACzE,MAAM,CAAC,MAAM,EAAE,SAAS,eAAe,EAAE,CAAC;IAC1C,sEAAsE;IACtE,MAAM,CAAC,GAAG,EAAE,SAAS,kBAAkB,EAAE,CAAM;IAC/C,oEAAoE;IACpE,MAAM,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAM;IACxC,gDAAgD;IAChD,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAM;IACtE;;;;;OAKG;IACH,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACtB"}
|
package/dist/recipe.js
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//#region src/recipe.ts
|
|
2
|
+
var SmrtRecipe = class {
|
|
3
|
+
/** Stable dotted id, e.g. `commerce.sales`. Unique across all recipes. */
|
|
4
|
+
static id;
|
|
5
|
+
/** Display name, e.g. `Sales`. */
|
|
6
|
+
static label;
|
|
7
|
+
/** One sentence on what the unit gives the user. */
|
|
8
|
+
static summary;
|
|
9
|
+
/** Other words someone might use to ask for it. */
|
|
10
|
+
static synonyms = [];
|
|
11
|
+
/** Models the unit brings. They must belong to the declaring package. */
|
|
12
|
+
static models;
|
|
13
|
+
/** Navigation entries; each model must also be listed in `models`. */
|
|
14
|
+
static nav = [];
|
|
15
|
+
/** Ids of recipes needed first; they may live in other packages. */
|
|
16
|
+
static requires = [];
|
|
17
|
+
/** Curation hints keyed by model class name. */
|
|
18
|
+
static options = {};
|
|
19
|
+
/**
|
|
20
|
+
* Optional user-facing help (#3591): a path to a Markdown file beside the
|
|
21
|
+
* recipe, such as `./sales.recipe.md`. The scanner reads it at build time and
|
|
22
|
+
* embeds `{ markdown, fieldRefs }` in the recipe's manifest entry. See
|
|
23
|
+
* `renderHelp` for how a host follows the app's options.
|
|
24
|
+
*/
|
|
25
|
+
static help;
|
|
26
|
+
};
|
|
27
|
+
//#endregion
|
|
28
|
+
export { SmrtRecipe };
|
|
29
|
+
|
|
30
|
+
//# sourceMappingURL=recipe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recipe.js","names":[],"sources":["../src/recipe.ts"],"sourcesContent":["/**\n * `SmrtRecipe` — a declared, user-facing unit of app functionality (#3590).\n *\n * A recipe is smaller than a package: \"Sales\" or \"Customers\", not all of\n * smrt-commerce. It names the models that make up the unit, the navigation\n * entries it contributes, the recipes it needs first, and curation hints for\n * how its models' forms present. It is declaration only: not persisted and not\n * `@smrt()`-decorated.\n *\n * Declare a recipe as a subclass with static properties, in the package that\n * owns the models. The scanner reads the statics at build time and emits them\n * as the top-level `recipes` array of `manifest.json` and\n * `smrt-knowledge.json`; nothing here runs at that point, so every static must\n * be spelled literally (model entries are class references).\n *\n * @example\n * ```typescript\n * export class SalesRecipe extends SmrtRecipe {\n * static id = 'commerce.sales';\n * static label = 'Sales';\n * static summary = 'Take customer orders and track them.';\n * static synonyms = ['sales orders', 'orders'];\n * static models = [Order];\n * static nav = [{ label: 'Sales Orders', model: Order }];\n * static requires = ['commerce.customers'];\n * static options = {\n * Order: { fields: { status: { default: 'draft', locked: true } } },\n * };\n * static help = './sales.recipe.md';\n * }\n * ```\n */\n\nimport type {\n RecipeExposureNarrowing,\n RecipeFieldOptions,\n} from '@happyvertical/smrt-types';\n\n/**\n * A model class as a recipe references it. Any constructor qualifies; the\n * parameter list is `never[]` so models with required constructor options\n * remain assignable.\n */\nexport type SmrtRecipeModel = abstract new (...args: never[]) => object;\n\n/** One navigation entry a recipe contributes. */\nexport interface SmrtRecipeNavEntry {\n label: string;\n model: SmrtRecipeModel;\n}\n\n/**\n * Curation hints for one model, keyed in `static options` by the model's class\n * name. Hints only ever refine what the model already declares: they name its\n * existing fields and can narrow, never widen, its API/MCP/CLI exposure.\n */\nexport interface SmrtRecipeModelOptions {\n fields?: Record<string, RecipeFieldOptions>;\n exposure?: {\n api?: RecipeExposureNarrowing;\n mcp?: RecipeExposureNarrowing;\n cli?: RecipeExposureNarrowing;\n };\n}\n\nexport abstract class SmrtRecipe {\n /** Stable dotted id, e.g. `commerce.sales`. Unique across all recipes. */\n static id: string;\n /** Display name, e.g. `Sales`. */\n static label: string;\n /** One sentence on what the unit gives the user. */\n static summary: string;\n /** Other words someone might use to ask for it. */\n static synonyms: readonly string[] = [];\n /** Models the unit brings. They must belong to the declaring package. */\n static models: readonly SmrtRecipeModel[];\n /** Navigation entries; each model must also be listed in `models`. */\n static nav: readonly SmrtRecipeNavEntry[] = [];\n /** Ids of recipes needed first; they may live in other packages. */\n static requires: readonly string[] = [];\n /** Curation hints keyed by model class name. */\n static options: Readonly<Record<string, SmrtRecipeModelOptions>> = {};\n /**\n * Optional user-facing help (#3591): a path to a Markdown file beside the\n * recipe, such as `./sales.recipe.md`. The scanner reads it at build time and\n * embeds `{ markdown, fieldRefs }` in the recipe's manifest entry. See\n * `renderHelp` for how a host follows the app's options.\n */\n static help?: string;\n}\n"],"mappings":";AAiEA,IAAsB,aAAtB,MAAiC;;CAE/B,OAAO;;CAEP,OAAO;;CAEP,OAAO;;CAEP,OAAO,WAA8B,CAAC;;CAEtC,OAAO;;CAEP,OAAO,MAAqC,CAAC;;CAE7C,OAAO,WAA8B,CAAC;;CAEtC,OAAO,UAA4D,CAAC;;;;;;;CAOpE,OAAO;AACT"}
|
|
@@ -23,6 +23,12 @@ type ManifestFieldInput = FieldDefinition;
|
|
|
23
23
|
* normalized copy.
|
|
24
24
|
*/
|
|
25
25
|
export declare function readFieldAttribute(fieldDef: ManifestFieldInput, key: 'required' | 'default' | 'description'): unknown;
|
|
26
|
+
/**
|
|
27
|
+
* Allowed values of an enum- or literal-union-typed field (#3598). Manifest
|
|
28
|
+
* fields carry them top-level; registry-sourced fields mirror them into
|
|
29
|
+
* `_meta` (see {@link createFieldFromManifest}). Read both, top level first.
|
|
30
|
+
*/
|
|
31
|
+
export declare function readFieldEnum(field: ManifestFieldInput | undefined): ReadonlyArray<string | number> | undefined;
|
|
26
32
|
export declare function createFieldFromManifest(fieldDef: ManifestFieldInput): RegisteredField;
|
|
27
33
|
export declare function mergeManifestField(existingField: RegisteredField, fieldDef: ManifestFieldInput): RegisteredField;
|
|
28
34
|
export declare function manifestFieldDiffers(existingField: RegisteredField, fieldDef: ManifestFieldInput): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-field-merge.d.ts","sourceRoot":"","sources":["../../src/registry/manifest-field-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAS,CAAC;AAE/C;;;;;;;;;GASG;AACH,KAAK,kBAAkB,GAAG,eAAe,CAAC;AAyB1C;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,WAW5C;
|
|
1
|
+
{"version":3,"file":"manifest-field-merge.d.ts","sourceRoot":"","sources":["../../src/registry/manifest-field-merge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAa,MAAM,qBAAqB,CAAC;AACtE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAS,CAAC;AAE/C;;;;;;;;;GASG;AACH,KAAK,kBAAkB,GAAG,eAAe,CAAC;AAyB1C;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,QAAQ,EAAE,kBAAkB,EAC5B,GAAG,EAAE,UAAU,GAAG,SAAS,GAAG,aAAa,WAW5C;AAID;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,aAAa,CAAC,MAAM,GAAG,MAAM,CAAC,GAAG,SAAS,CAK5C;AAiBD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,kBAAkB,GAC3B,eAAe,CA8BjB;AAED,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,eAAe,EAC9B,QAAQ,EAAE,kBAAkB,GAC3B,eAAe,CAqCjB;AAED,wBAAgB,oBAAoB,CAClC,aAAa,EAAE,eAAe,EAC9B,QAAQ,EAAE,kBAAkB,GAC3B,OAAO,CAQT"}
|
|
@@ -22,6 +22,15 @@ function readFieldAttribute(fieldDef, key) {
|
|
|
22
22
|
if (hasOwnDefinedValue(fieldDef?._meta, key)) return fieldDef._meta?.[key];
|
|
23
23
|
}
|
|
24
24
|
var readManifestFieldMeta = readFieldAttribute;
|
|
25
|
+
/**
|
|
26
|
+
* Allowed values of an enum- or literal-union-typed field (#3598). Manifest
|
|
27
|
+
* fields carry them top-level; registry-sourced fields mirror them into
|
|
28
|
+
* `_meta` (see {@link createFieldFromManifest}). Read both, top level first.
|
|
29
|
+
*/
|
|
30
|
+
function readFieldEnum(field) {
|
|
31
|
+
const value = field?.enum ?? field?._meta?.enum;
|
|
32
|
+
return Array.isArray(value) && value.length > 0 ? value : void 0;
|
|
33
|
+
}
|
|
25
34
|
function assignDefinedMeta(target, source) {
|
|
26
35
|
if (!source) return;
|
|
27
36
|
for (const [key, value] of Object.entries(source)) if (value !== void 0) target[key] = value;
|
|
@@ -38,6 +47,7 @@ function createFieldFromManifest(fieldDef) {
|
|
|
38
47
|
const value = readManifestFieldMeta(fieldDef, key);
|
|
39
48
|
if (value !== void 0) metaRecord[key] = value;
|
|
40
49
|
}
|
|
50
|
+
if (fieldDef.enum !== void 0) metaRecord.enum = [...fieldDef.enum];
|
|
41
51
|
const out = {
|
|
42
52
|
type: fieldDef.type,
|
|
43
53
|
_meta: meta
|
|
@@ -63,6 +73,7 @@ function mergeManifestField(existingField, fieldDef) {
|
|
|
63
73
|
const existingValue = readExistingFieldMeta(existingField, key);
|
|
64
74
|
if (existingValue !== void 0 && nextMetaRecord[key] === void 0) nextMetaRecord[key] = existingValue;
|
|
65
75
|
}
|
|
76
|
+
if (fieldDef.enum !== void 0) nextMetaRecord.enum = [...fieldDef.enum];
|
|
66
77
|
return {
|
|
67
78
|
...existingField,
|
|
68
79
|
type: !hasTenancyMarker && fieldDef.type ? fieldDef.type : existingField.type,
|
|
@@ -74,6 +85,6 @@ function manifestFieldDiffers(existingField, fieldDef) {
|
|
|
74
85
|
return mergedField.type !== existingField.type || JSON.stringify(mergedField._meta || {}) !== JSON.stringify(existingField._meta || {});
|
|
75
86
|
}
|
|
76
87
|
//#endregion
|
|
77
|
-
export { createFieldFromManifest, manifestFieldDiffers, mergeManifestField, readFieldAttribute };
|
|
88
|
+
export { createFieldFromManifest, manifestFieldDiffers, mergeManifestField, readFieldAttribute, readFieldEnum };
|
|
78
89
|
|
|
79
90
|
//# sourceMappingURL=manifest-field-merge.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-field-merge.js","names":[],"sources":["../../src/registry/manifest-field-merge.ts"],"sourcesContent":["import type { FieldDefinition, FieldMeta } from '../scanner/types.js';\nimport type { RegisteredField } from './types';\n\n/**\n * Manifest-sourced field input handled by the merge helpers.\n *\n * Manifest fields are plain {@link FieldDefinition}s. Already-registered\n * runtime fields are the canonical {@link RegisteredField} superset, which\n * extends `FieldDefinition`, so a `FieldDefinition` parameter accepts both\n * shapes as the incoming `fieldDef`. The helpers return the canonical\n * {@link RegisteredField} so merged fields stay assignable back into the\n * `Map<string, RegisteredField>` they came from.\n */\ntype ManifestFieldInput = FieldDefinition;\n\nfunction hasOwnDefinedValue(source: object | undefined, key: string): boolean {\n return (\n !!source &&\n Object.hasOwn(source, key) &&\n (source as Record<string, unknown>)[key] !== undefined\n );\n}\n\nfunction readExistingFieldMeta(\n existingField: RegisteredField,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(existingField, key)) {\n return existingField[key];\n }\n\n if (hasOwnDefinedValue(existingField?._meta, key)) {\n return existingField._meta?.[key];\n }\n\n return undefined;\n}\n\n/**\n * Read a schema-shaping field attribute from either placement.\n *\n * `required`, `default`, and `description` are written at the top level by\n * manifest field definitions but are normalized into `_meta` by\n * {@link createFieldFromManifest} / {@link mergeManifestField}. Any consumer\n * that shapes a column from a field must therefore check both placements, or\n * it silently drops NOT NULL and DEFAULT for every registry-sourced field\n * (issue #2372). Top level wins so an explicit manifest value overrides the\n * normalized copy.\n */\nexport function readFieldAttribute(\n fieldDef: ManifestFieldInput,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(fieldDef, key)) {\n return fieldDef[key];\n }\n\n if (hasOwnDefinedValue(fieldDef?._meta, key)) {\n return fieldDef._meta?.[key];\n }\n\n return undefined;\n}\n\nconst readManifestFieldMeta = readFieldAttribute;\n\nfunction assignDefinedMeta(\n target: Record<string, unknown>,\n source: Record<string, unknown> | undefined,\n) {\n if (!source) {\n return;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined) {\n target[key] = value;\n }\n }\n}\n\nexport function createFieldFromManifest(\n fieldDef: ManifestFieldInput,\n): RegisteredField {\n const meta: FieldMeta = {};\n\n assignDefinedMeta(meta, fieldDef?._meta);\n\n // Write through the open `FieldMeta` index signature: assigning the same\n // loop value to a union of named keys (`default` is `unknown`, the others\n // narrower) collapses the write target to `undefined`, so route by string.\n const metaRecord = meta as Record<string, unknown>;\n for (const key of ['required', 'default', 'description'] as const) {\n const value = readManifestFieldMeta(fieldDef, key);\n if (value !== undefined) {\n metaRecord[key] = value;\n }\n }\n\n // Preserve top-level `related` for relationship-graph lookups\n // (foreignKey / crossPackageRef / oneToMany / manyToMany all rely on it).\n const out: RegisteredField = {\n type: fieldDef.type,\n _meta: meta,\n };\n if (fieldDef.related !== undefined) {\n out.related = fieldDef.related;\n }\n return out;\n}\n\nexport function mergeManifestField(\n existingField: RegisteredField,\n fieldDef: ManifestFieldInput,\n): RegisteredField {\n const hasTenancyMarker =\n existingField.__tenancy?.isTenantIdField ||\n existingField._meta?.__tenancy?.isTenantIdField;\n\n const nextMeta: FieldMeta = {\n ...(existingField._meta || {}),\n };\n\n assignDefinedMeta(nextMeta, fieldDef?._meta);\n\n // See createFieldFromManifest: route writes through the index signature so a\n // shared loop value isn't narrowed to the `undefined`-only union write target.\n const nextMetaRecord = nextMeta as Record<string, unknown>;\n for (const key of ['required', 'default', 'description'] as const) {\n const manifestValue = readManifestFieldMeta(fieldDef, key);\n if (manifestValue !== undefined) {\n nextMetaRecord[key] = manifestValue;\n continue;\n }\n\n const existingValue = readExistingFieldMeta(existingField, key);\n if (existingValue !== undefined && nextMetaRecord[key] === undefined) {\n nextMetaRecord[key] = existingValue;\n }\n }\n\n return {\n ...existingField,\n type:\n !hasTenancyMarker && fieldDef.type ? fieldDef.type : existingField.type,\n _meta: nextMeta,\n };\n}\n\nexport function manifestFieldDiffers(\n existingField: RegisteredField,\n fieldDef: ManifestFieldInput,\n): boolean {\n const mergedField = mergeManifestField(existingField, fieldDef);\n\n return (\n mergedField.type !== existingField.type ||\n JSON.stringify(mergedField._meta || {}) !==\n JSON.stringify(existingField._meta || {})\n );\n}\n"],"mappings":";AAeA,SAAS,mBAAmB,QAA4B,KAAsB;CAC5E,OACE,CAAC,CAAC,UACF,OAAO,OAAO,QAAQ,GAAG,KACxB,OAAmC,SAAS,KAAA;AAEjD;AAEA,SAAS,sBACP,eACA,KACA;CACA,IAAI,mBAAmB,eAAe,GAAG,GACvC,OAAO,cAAc;CAGvB,IAAI,mBAAmB,eAAe,OAAO,GAAG,GAC9C,OAAO,cAAc,QAAQ;AAIjC;;;;;;;;;;;;AAaA,SAAgB,mBACd,UACA,KACA;CACA,IAAI,mBAAmB,UAAU,GAAG,GAClC,OAAO,SAAS;CAGlB,IAAI,mBAAmB,UAAU,OAAO,GAAG,GACzC,OAAO,SAAS,QAAQ;AAI5B;AAEA,IAAM,wBAAwB;
|
|
1
|
+
{"version":3,"file":"manifest-field-merge.js","names":[],"sources":["../../src/registry/manifest-field-merge.ts"],"sourcesContent":["import type { FieldDefinition, FieldMeta } from '../scanner/types.js';\nimport type { RegisteredField } from './types';\n\n/**\n * Manifest-sourced field input handled by the merge helpers.\n *\n * Manifest fields are plain {@link FieldDefinition}s. Already-registered\n * runtime fields are the canonical {@link RegisteredField} superset, which\n * extends `FieldDefinition`, so a `FieldDefinition` parameter accepts both\n * shapes as the incoming `fieldDef`. The helpers return the canonical\n * {@link RegisteredField} so merged fields stay assignable back into the\n * `Map<string, RegisteredField>` they came from.\n */\ntype ManifestFieldInput = FieldDefinition;\n\nfunction hasOwnDefinedValue(source: object | undefined, key: string): boolean {\n return (\n !!source &&\n Object.hasOwn(source, key) &&\n (source as Record<string, unknown>)[key] !== undefined\n );\n}\n\nfunction readExistingFieldMeta(\n existingField: RegisteredField,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(existingField, key)) {\n return existingField[key];\n }\n\n if (hasOwnDefinedValue(existingField?._meta, key)) {\n return existingField._meta?.[key];\n }\n\n return undefined;\n}\n\n/**\n * Read a schema-shaping field attribute from either placement.\n *\n * `required`, `default`, and `description` are written at the top level by\n * manifest field definitions but are normalized into `_meta` by\n * {@link createFieldFromManifest} / {@link mergeManifestField}. Any consumer\n * that shapes a column from a field must therefore check both placements, or\n * it silently drops NOT NULL and DEFAULT for every registry-sourced field\n * (issue #2372). Top level wins so an explicit manifest value overrides the\n * normalized copy.\n */\nexport function readFieldAttribute(\n fieldDef: ManifestFieldInput,\n key: 'required' | 'default' | 'description',\n) {\n if (hasOwnDefinedValue(fieldDef, key)) {\n return fieldDef[key];\n }\n\n if (hasOwnDefinedValue(fieldDef?._meta, key)) {\n return fieldDef._meta?.[key];\n }\n\n return undefined;\n}\n\nconst readManifestFieldMeta = readFieldAttribute;\n\n/**\n * Allowed values of an enum- or literal-union-typed field (#3598). Manifest\n * fields carry them top-level; registry-sourced fields mirror them into\n * `_meta` (see {@link createFieldFromManifest}). Read both, top level first.\n */\nexport function readFieldEnum(\n field: ManifestFieldInput | undefined,\n): ReadonlyArray<string | number> | undefined {\n const value = field?.enum ?? field?._meta?.enum;\n return Array.isArray(value) && value.length > 0\n ? (value as ReadonlyArray<string | number>)\n : undefined;\n}\n\nfunction assignDefinedMeta(\n target: Record<string, unknown>,\n source: Record<string, unknown> | undefined,\n) {\n if (!source) {\n return;\n }\n\n for (const [key, value] of Object.entries(source)) {\n if (value !== undefined) {\n target[key] = value;\n }\n }\n}\n\nexport function createFieldFromManifest(\n fieldDef: ManifestFieldInput,\n): RegisteredField {\n const meta: FieldMeta = {};\n\n assignDefinedMeta(meta, fieldDef?._meta);\n\n // Write through the open `FieldMeta` index signature: assigning the same\n // loop value to a union of named keys (`default` is `unknown`, the others\n // narrower) collapses the write target to `undefined`, so route by string.\n const metaRecord = meta as Record<string, unknown>;\n for (const key of ['required', 'default', 'description'] as const) {\n const value = readManifestFieldMeta(fieldDef, key);\n if (value !== undefined) {\n metaRecord[key] = value;\n }\n }\n\n if (fieldDef.enum !== undefined) {\n metaRecord.enum = [...fieldDef.enum];\n }\n\n // Preserve top-level `related` for relationship-graph lookups\n // (foreignKey / crossPackageRef / oneToMany / manyToMany all rely on it).\n const out: RegisteredField = {\n type: fieldDef.type,\n _meta: meta,\n };\n if (fieldDef.related !== undefined) {\n out.related = fieldDef.related;\n }\n return out;\n}\n\nexport function mergeManifestField(\n existingField: RegisteredField,\n fieldDef: ManifestFieldInput,\n): RegisteredField {\n const hasTenancyMarker =\n existingField.__tenancy?.isTenantIdField ||\n existingField._meta?.__tenancy?.isTenantIdField;\n\n const nextMeta: FieldMeta = {\n ...(existingField._meta || {}),\n };\n\n assignDefinedMeta(nextMeta, fieldDef?._meta);\n\n // See createFieldFromManifest: route writes through the index signature so a\n // shared loop value isn't narrowed to the `undefined`-only union write target.\n const nextMetaRecord = nextMeta as Record<string, unknown>;\n for (const key of ['required', 'default', 'description'] as const) {\n const manifestValue = readManifestFieldMeta(fieldDef, key);\n if (manifestValue !== undefined) {\n nextMetaRecord[key] = manifestValue;\n continue;\n }\n\n const existingValue = readExistingFieldMeta(existingField, key);\n if (existingValue !== undefined && nextMetaRecord[key] === undefined) {\n nextMetaRecord[key] = existingValue;\n }\n }\n\n if (fieldDef.enum !== undefined) {\n nextMetaRecord.enum = [...fieldDef.enum];\n }\n\n return {\n ...existingField,\n type:\n !hasTenancyMarker && fieldDef.type ? fieldDef.type : existingField.type,\n _meta: nextMeta,\n };\n}\n\nexport function manifestFieldDiffers(\n existingField: RegisteredField,\n fieldDef: ManifestFieldInput,\n): boolean {\n const mergedField = mergeManifestField(existingField, fieldDef);\n\n return (\n mergedField.type !== existingField.type ||\n JSON.stringify(mergedField._meta || {}) !==\n JSON.stringify(existingField._meta || {})\n );\n}\n"],"mappings":";AAeA,SAAS,mBAAmB,QAA4B,KAAsB;CAC5E,OACE,CAAC,CAAC,UACF,OAAO,OAAO,QAAQ,GAAG,KACxB,OAAmC,SAAS,KAAA;AAEjD;AAEA,SAAS,sBACP,eACA,KACA;CACA,IAAI,mBAAmB,eAAe,GAAG,GACvC,OAAO,cAAc;CAGvB,IAAI,mBAAmB,eAAe,OAAO,GAAG,GAC9C,OAAO,cAAc,QAAQ;AAIjC;;;;;;;;;;;;AAaA,SAAgB,mBACd,UACA,KACA;CACA,IAAI,mBAAmB,UAAU,GAAG,GAClC,OAAO,SAAS;CAGlB,IAAI,mBAAmB,UAAU,OAAO,GAAG,GACzC,OAAO,SAAS,QAAQ;AAI5B;AAEA,IAAM,wBAAwB;;;;;;AAO9B,SAAgB,cACd,OAC4C;CAC5C,MAAM,QAAQ,OAAO,QAAQ,OAAO,OAAO;CAC3C,OAAO,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,IACzC,QACD,KAAA;AACN;AAEA,SAAS,kBACP,QACA,QACA;CACA,IAAI,CAAC,QACH;CAGF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,MAAM,GAC9C,IAAI,UAAU,KAAA,GACZ,OAAO,OAAO;AAGpB;AAEA,SAAgB,wBACd,UACiB;CACjB,MAAM,OAAkB,CAAC;CAEzB,kBAAkB,MAAM,UAAU,KAAK;CAKvC,MAAM,aAAa;CACnB,KAAK,MAAM,OAAO;EAAC;EAAY;EAAW;CAAa,GAAY;EACjE,MAAM,QAAQ,sBAAsB,UAAU,GAAG;EACjD,IAAI,UAAU,KAAA,GACZ,WAAW,OAAO;CAEtB;CAEA,IAAI,SAAS,SAAS,KAAA,GACpB,WAAW,OAAO,CAAC,GAAG,SAAS,IAAI;CAKrC,MAAM,MAAuB;EAC3B,MAAM,SAAS;EACf,OAAO;CACT;CACA,IAAI,SAAS,YAAY,KAAA,GACvB,IAAI,UAAU,SAAS;CAEzB,OAAO;AACT;AAEA,SAAgB,mBACd,eACA,UACiB;CACjB,MAAM,mBACJ,cAAc,WAAW,mBACzB,cAAc,OAAO,WAAW;CAElC,MAAM,WAAsB,EAC1B,GAAI,cAAc,SAAS,CAAC,EAC9B;CAEA,kBAAkB,UAAU,UAAU,KAAK;CAI3C,MAAM,iBAAiB;CACvB,KAAK,MAAM,OAAO;EAAC;EAAY;EAAW;CAAa,GAAY;EACjE,MAAM,gBAAgB,sBAAsB,UAAU,GAAG;EACzD,IAAI,kBAAkB,KAAA,GAAW;GAC/B,eAAe,OAAO;GACtB;EACF;EAEA,MAAM,gBAAgB,sBAAsB,eAAe,GAAG;EAC9D,IAAI,kBAAkB,KAAA,KAAa,eAAe,SAAS,KAAA,GACzD,eAAe,OAAO;CAE1B;CAEA,IAAI,SAAS,SAAS,KAAA,GACpB,eAAe,OAAO,CAAC,GAAG,SAAS,IAAI;CAGzC,OAAO;EACL,GAAG;EACH,MACE,CAAC,oBAAoB,SAAS,OAAO,SAAS,OAAO,cAAc;EACrE,OAAO;CACT;AACF;AAEA,SAAgB,qBACd,eACA,UACS;CACT,MAAM,cAAc,mBAAmB,eAAe,QAAQ;CAE9D,OACE,YAAY,SAAS,cAAc,QACnC,KAAK,UAAU,YAAY,SAAS,CAAC,CAAC,MACpC,KAAK,UAAU,cAAc,SAAS,CAAC,CAAC;AAE9C"}
|
package/dist/registry/types.d.ts
CHANGED
|
@@ -775,6 +775,23 @@ export interface SmartObjectConfig {
|
|
|
775
775
|
/** Human-readable description of the agent */
|
|
776
776
|
description?: string;
|
|
777
777
|
};
|
|
778
|
+
/**
|
|
779
|
+
* How a record of this model is named for people and assistants (#3599).
|
|
780
|
+
* Own fields only — no paths into other packages; a model whose label lives
|
|
781
|
+
* elsewhere ships a selector component (`ModuleUISlot.selects`) instead.
|
|
782
|
+
*
|
|
783
|
+
* @example
|
|
784
|
+
* ```typescript
|
|
785
|
+
* @smrt({ display: { label: 'orderNumber' } })
|
|
786
|
+
* ```
|
|
787
|
+
*/
|
|
788
|
+
display?: {
|
|
789
|
+
/**
|
|
790
|
+
* Name of an own, non-sensitive field. When omitted the first of `name`,
|
|
791
|
+
* `title`, `label`, `code` that exists is used. Validated at build time.
|
|
792
|
+
*/
|
|
793
|
+
label?: string;
|
|
794
|
+
};
|
|
778
795
|
/**
|
|
779
796
|
* Optional UI hints consumed by `@happyvertical/smrt-svelte`'s
|
|
780
797
|
* `navTreeFromManifest()` helper (and any other manifest → admin-UI
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/registry/types.ts"],"names":[],"mappings":"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"}
|
package/dist/scanner/index.d.ts
CHANGED
|
@@ -8,5 +8,5 @@
|
|
|
8
8
|
* import { OxcScanner, ManifestAdapter } from '@happyvertical/smrt-scanner';
|
|
9
9
|
*/
|
|
10
10
|
export { generateManifest, ManifestGenerator } from './manifest-generator.js';
|
|
11
|
-
export type { AgentAdminRouteManifest, AgentComponentDeclaration, AgentCreateEntryManifest, AgentFeature, AgentManifest, AgentMenuItem, AgentPermission, AgentUISlotManifest, FieldDefinition, MethodDefinition, ScanOptions, ScanResult, SmartObjectDefinition, SmartObjectManifest, } from './types.js';
|
|
11
|
+
export type { AgentAdminRouteManifest, AgentComponentDeclaration, AgentCreateEntryManifest, AgentFeature, AgentManifest, AgentMenuItem, AgentPermission, AgentUISlotManifest, FieldDefinition, ManifestUISelector, MethodDefinition, ScanOptions, ScanResult, SmartObjectDefinition, SmartObjectManifest, } from './types.js';
|
|
12
12
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/scanner/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC9E,YAAY,EACV,uBAAuB,EACvB,yBAAyB,EACzB,wBAAwB,EACxB,YAAY,EACZ,aAAa,EACb,aAAa,EACb,eAAe,EACf,mBAAmB,EACnB,eAAe,EACf,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACX,UAAU,EACV,qBAAqB,EACrB,mBAAmB,GACpB,MAAM,YAAY,CAAC"}
|
|
@@ -63,6 +63,24 @@ export declare class ManifestGenerator {
|
|
|
63
63
|
*/
|
|
64
64
|
injectTenantScopedFields(manifest: SmartObjectManifest): void;
|
|
65
65
|
private injectTenantScopedField;
|
|
66
|
+
/**
|
|
67
|
+
* Fail the build when a recipe's `options` name a field its model does not
|
|
68
|
+
* declare (#3590). Runs after inherited fields merge, because only the merged
|
|
69
|
+
* manifest knows STI-merged, injected tenant, and framework-base fields
|
|
70
|
+
* (`SmrtHierarchical.parentId`); the scanner sees class bodies alone. The
|
|
71
|
+
* universal `SmrtObject` fields exist on every object but are not manifest
|
|
72
|
+
* fields, so they are accepted by name.
|
|
73
|
+
*/
|
|
74
|
+
assertRecipeOptions(manifest: SmartObjectManifest): void;
|
|
75
|
+
/**
|
|
76
|
+
* Fail the build when a recipe's help refers to a field its models do not
|
|
77
|
+
* declare, or its `fieldRefs` disagree with the Markdown (#3591). Runs on the
|
|
78
|
+
* merged manifest for the same reason as {@link assertRecipeOptions}. The
|
|
79
|
+
* scanner derives `fieldRefs` with its own copy of the reference grammar
|
|
80
|
+
* (it cannot import core); re-deriving here with the real parser means the
|
|
81
|
+
* two can never silently diverge.
|
|
82
|
+
*/
|
|
83
|
+
assertRecipeHelp(manifest: SmartObjectManifest): void;
|
|
66
84
|
/**
|
|
67
85
|
* Validate every `decoratorConfig.previousQualifiedNames` declaration
|
|
68
86
|
* (#3338). The declaration rides into the manifest verbatim — it is the
|
|
@@ -74,6 +92,21 @@ export declare class ManifestGenerator {
|
|
|
74
92
|
* - never declared by two objects of this manifest.
|
|
75
93
|
*/
|
|
76
94
|
assertQualifiedNameAliases(manifest: SmartObjectManifest): void;
|
|
95
|
+
/**
|
|
96
|
+
* Validate and resolve presentation metadata (#3599), failing the build on
|
|
97
|
+
* a declaration no host could honor:
|
|
98
|
+
*
|
|
99
|
+
* - `@field({ ui: { widget } })` must name a known widget the field's type
|
|
100
|
+
* accepts (every widget is text-only; `currency` is an ISO 4217 code
|
|
101
|
+
* picker, not an amount).
|
|
102
|
+
* - `@smrt({ display: { label } })` must name an own, non-sensitive,
|
|
103
|
+
* non-transient, non-relationship field.
|
|
104
|
+
* - A selector slot's `selects` must resolve when it names this package.
|
|
105
|
+
*
|
|
106
|
+
* Also stamps each object's resolved `displayLabelField` (the declared field,
|
|
107
|
+
* else the first of name/title/label/code).
|
|
108
|
+
*/
|
|
109
|
+
applyUiMetadata(manifest: SmartObjectManifest): void;
|
|
77
110
|
assertTenantScopedSchemaContract(manifest: SmartObjectManifest): void;
|
|
78
111
|
private getTenantScopedSchemaOwner;
|
|
79
112
|
private getTenantScopedFieldTypeFailure;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
1
|
+
{"version":3,"file":"manifest-generator.d.ts","sourceRoot":"","sources":["../../src/scanner/manifest-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,8 +6,10 @@ import "./types.js";
|
|
|
6
6
|
import { assertScopedPackageName, createQualifiedName, isQualifiedNameAliasFormat, readPreviousQualifiedNames } from "../utils/qualified-names.js";
|
|
7
7
|
import { generateToolManifest } from "../tools/tool-generator.js";
|
|
8
8
|
import { createManifestClassNamePredicate, resolveApiMethodExposure, resolveCustomActionMetadata, resolveEffectiveActionMetadata } from "../generators/custom-action.js";
|
|
9
|
+
import { findField, validateHelp } from "../recipe-help.js";
|
|
9
10
|
import { VERBOSE_ENABLED } from "../registry/shared-state.js";
|
|
10
11
|
import { SchemaGenerator } from "../schema/generator.js";
|
|
12
|
+
import { FIELD_UI_WIDGETS, FIELD_UI_WIDGET_TYPES, displayLabelFieldProblem, isFieldUIWidget, resolveDisplayLabelField } from "../ui-metadata.js";
|
|
11
13
|
import { isTestFile } from "./test-file-patterns.js";
|
|
12
14
|
import { loadExternalManifestSync, lookupInManifest } from "../manifest/manifest-loader.js";
|
|
13
15
|
import { createLogger } from "@happyvertical/logger";
|
|
@@ -20,6 +22,17 @@ import { createRequire } from "node:module";
|
|
|
20
22
|
var require = createRequire(import.meta.url);
|
|
21
23
|
var logger = createLogger({ level: VERBOSE_ENABLED ? "debug" : "info" });
|
|
22
24
|
/**
|
|
25
|
+
* Fields every `SmrtObject` carries that are not manifest fields (#3590): a
|
|
26
|
+
* recipe option may still refine them.
|
|
27
|
+
*/
|
|
28
|
+
var UNIVERSAL_OBJECT_FIELDS = [
|
|
29
|
+
"id",
|
|
30
|
+
"slug",
|
|
31
|
+
"context",
|
|
32
|
+
"created_at",
|
|
33
|
+
"updated_at"
|
|
34
|
+
];
|
|
35
|
+
/**
|
|
23
36
|
* Framework abstract base classes whose declared fields must be merged
|
|
24
37
|
* into every subclass's `fields` map.
|
|
25
38
|
*
|
|
@@ -209,6 +222,9 @@ var ManifestGenerator = class {
|
|
|
209
222
|
this.normalizeReportTenantScope(manifest);
|
|
210
223
|
this.injectTenantScopedFields(manifest);
|
|
211
224
|
this.mergeInheritedFields(manifest);
|
|
225
|
+
this.assertRecipeOptions(manifest);
|
|
226
|
+
this.assertRecipeHelp(manifest);
|
|
227
|
+
this.applyUiMetadata(manifest);
|
|
212
228
|
this.normalizeReportObjects(manifest);
|
|
213
229
|
this.normalizeConflictColumns(manifest);
|
|
214
230
|
this.generateValidationRules(manifest);
|
|
@@ -276,6 +292,64 @@ var ManifestGenerator = class {
|
|
|
276
292
|
logger.debug(`[manifest-generator] Injected ${fieldName} field for ${objectDef.className} (tenantScoped: ${JSON.stringify(tenantConfig)})`);
|
|
277
293
|
}
|
|
278
294
|
/**
|
|
295
|
+
* Fail the build when a recipe's `options` name a field its model does not
|
|
296
|
+
* declare (#3590). Runs after inherited fields merge, because only the merged
|
|
297
|
+
* manifest knows STI-merged, injected tenant, and framework-base fields
|
|
298
|
+
* (`SmrtHierarchical.parentId`); the scanner sees class bodies alone. The
|
|
299
|
+
* universal `SmrtObject` fields exist on every object but are not manifest
|
|
300
|
+
* fields, so they are accepted by name.
|
|
301
|
+
*/
|
|
302
|
+
assertRecipeOptions(manifest) {
|
|
303
|
+
const problems = [];
|
|
304
|
+
for (const recipe of manifest.recipes ?? []) for (const [model, options] of Object.entries(recipe.options ?? {})) {
|
|
305
|
+
const object = Object.values(manifest.objects).find((candidate) => (candidate.qualifiedName ?? candidate.className) === model);
|
|
306
|
+
if (!object) {
|
|
307
|
+
problems.push(`recipe ${recipe.id}: options name ${model}, which is not an object in this package`);
|
|
308
|
+
continue;
|
|
309
|
+
}
|
|
310
|
+
const declared = /* @__PURE__ */ new Set([...Object.keys(object.fields), ...UNIVERSAL_OBJECT_FIELDS]);
|
|
311
|
+
for (const field of Object.keys(options.fields ?? {})) if (!declared.has(field)) problems.push(`recipe ${recipe.id}: options.${object.className}.fields.${field}: ${object.className} declares no field "${field}"; options only refine fields the model already declares`);
|
|
312
|
+
}
|
|
313
|
+
if (problems.length > 0) throw new Error(`[manifest-generator] invalid recipe options:\n ${problems.join("\n ")}`);
|
|
314
|
+
}
|
|
315
|
+
/**
|
|
316
|
+
* Fail the build when a recipe's help refers to a field its models do not
|
|
317
|
+
* declare, or its `fieldRefs` disagree with the Markdown (#3591). Runs on the
|
|
318
|
+
* merged manifest for the same reason as {@link assertRecipeOptions}. The
|
|
319
|
+
* scanner derives `fieldRefs` with its own copy of the reference grammar
|
|
320
|
+
* (it cannot import core); re-deriving here with the real parser means the
|
|
321
|
+
* two can never silently diverge.
|
|
322
|
+
*/
|
|
323
|
+
assertRecipeHelp(manifest) {
|
|
324
|
+
const problems = [];
|
|
325
|
+
for (const recipe of manifest.recipes ?? []) {
|
|
326
|
+
if (!recipe.help) continue;
|
|
327
|
+
const models = [];
|
|
328
|
+
const sensitiveByModel = /* @__PURE__ */ new Map();
|
|
329
|
+
for (const model of recipe.models) {
|
|
330
|
+
const object = Object.values(manifest.objects).find((candidate) => (candidate.qualifiedName ?? candidate.className) === model);
|
|
331
|
+
if (!object) continue;
|
|
332
|
+
const sensitive = Object.entries(object.fields).filter(([, field]) => field.sensitive === true || field._meta?.sensitive === true).map(([name]) => name);
|
|
333
|
+
models.push({
|
|
334
|
+
id: model,
|
|
335
|
+
name: object.className,
|
|
336
|
+
fields: Object.keys(object.fields).map((name) => ({
|
|
337
|
+
name,
|
|
338
|
+
label: name,
|
|
339
|
+
visibility: "basic"
|
|
340
|
+
}))
|
|
341
|
+
});
|
|
342
|
+
sensitiveByModel.set(object.className, new Set(sensitive));
|
|
343
|
+
}
|
|
344
|
+
for (const problem of validateHelp(recipe.help, models)) problems.push(`recipe ${recipe.id}: help: ${problem}`);
|
|
345
|
+
for (const ref of recipe.help.fieldRefs) {
|
|
346
|
+
const found = findField(ref, models);
|
|
347
|
+
if (found && sensitiveByModel.get(found.model.name)?.has(found.field.name)) problems.push(`recipe ${recipe.id}: help: {field:${ref}} names a sensitive field; sensitive fields are excluded from the knowledge artifact, so describe it without a field reference`);
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
if (problems.length > 0) throw new Error(`[manifest-generator] invalid recipe help:\n ${problems.join("\n ")}`);
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
279
353
|
* Validate every `decoratorConfig.previousQualifiedNames` declaration
|
|
280
354
|
* (#3338). The declaration rides into the manifest verbatim — it is the
|
|
281
355
|
* lazy loader's alias index — so a malformed or colliding alias must stop
|
|
@@ -309,6 +383,55 @@ var ManifestGenerator = class {
|
|
|
309
383
|
}
|
|
310
384
|
}
|
|
311
385
|
}
|
|
386
|
+
/**
|
|
387
|
+
* Validate and resolve presentation metadata (#3599), failing the build on
|
|
388
|
+
* a declaration no host could honor:
|
|
389
|
+
*
|
|
390
|
+
* - `@field({ ui: { widget } })` must name a known widget the field's type
|
|
391
|
+
* accepts (every widget is text-only; `currency` is an ISO 4217 code
|
|
392
|
+
* picker, not an amount).
|
|
393
|
+
* - `@smrt({ display: { label } })` must name an own, non-sensitive,
|
|
394
|
+
* non-transient, non-relationship field.
|
|
395
|
+
* - A selector slot's `selects` must resolve when it names this package.
|
|
396
|
+
*
|
|
397
|
+
* Also stamps each object's resolved `displayLabelField` (the declared field,
|
|
398
|
+
* else the first of name/title/label/code).
|
|
399
|
+
*/
|
|
400
|
+
applyUiMetadata(manifest) {
|
|
401
|
+
const failures = [];
|
|
402
|
+
for (const key of Object.keys(manifest.objects).sort(compareText)) {
|
|
403
|
+
const obj = manifest.objects[key];
|
|
404
|
+
const owner = obj.qualifiedName ?? key;
|
|
405
|
+
for (const [fieldName, field] of Object.entries(obj.fields)) {
|
|
406
|
+
const ui = field._meta?.ui;
|
|
407
|
+
if (!ui || typeof ui !== "object" || ui.widget === void 0) continue;
|
|
408
|
+
if (!isFieldUIWidget(ui.widget)) failures.push(`${owner}.${fieldName}: ui.widget ${JSON.stringify(ui.widget)} is not one of ${FIELD_UI_WIDGETS.join(", ")}.`);
|
|
409
|
+
else if (!FIELD_UI_WIDGET_TYPES[ui.widget].includes(field.type)) failures.push(`${owner}.${fieldName}: ui.widget "${ui.widget}" needs a field of type ${FIELD_UI_WIDGET_TYPES[ui.widget].join(" or ")}, but this field is ${field.type}.`);
|
|
410
|
+
}
|
|
411
|
+
const display = obj.decoratorConfig?.display;
|
|
412
|
+
let declared;
|
|
413
|
+
if (display !== void 0) {
|
|
414
|
+
const label = display && typeof display === "object" ? display.label : void 0;
|
|
415
|
+
if (label !== void 0 && (typeof label !== "string" || label === "")) failures.push(`${owner}: display.label must be the name of an own field (a string literal), not ${JSON.stringify(label)}.`);
|
|
416
|
+
else if (typeof label === "string") {
|
|
417
|
+
const problem = displayLabelFieldProblem(obj.fields, label);
|
|
418
|
+
if (problem) failures.push(`${owner}: display.label "${label}" cannot label a record: ${problem}.`);
|
|
419
|
+
else declared = label;
|
|
420
|
+
} else if (display === null || typeof display !== "object") failures.push(`${owner}: display must be an object ({ label }).`);
|
|
421
|
+
}
|
|
422
|
+
const resolved = resolveDisplayLabelField(obj.fields, declared);
|
|
423
|
+
if (resolved) obj.displayLabelField = resolved;
|
|
424
|
+
else delete obj.displayLabelField;
|
|
425
|
+
}
|
|
426
|
+
const own = /* @__PURE__ */ new Set();
|
|
427
|
+
for (const [key, obj] of Object.entries(manifest.objects)) own.add(obj.qualifiedName ?? key);
|
|
428
|
+
for (const [slotId, selector] of Object.entries(manifest.uiSelectors ?? {})) {
|
|
429
|
+
const target = selector.selects;
|
|
430
|
+
const targetPackage = target.slice(0, target.indexOf(":"));
|
|
431
|
+
if (manifest.packageName && targetPackage === manifest.packageName && !own.has(target)) failures.push(`UI slot "${slotId}" selects ${target}, which is not an object of ${manifest.packageName}.`);
|
|
432
|
+
}
|
|
433
|
+
if (failures.length > 0) throw new Error(`UI metadata invalid:\n${failures.map((f) => ` - ${f}`).join("\n")}`);
|
|
434
|
+
}
|
|
312
435
|
assertTenantScopedSchemaContract(manifest) {
|
|
313
436
|
const failures = [];
|
|
314
437
|
for (const objectDef of Object.values(manifest.objects)) {
|
|
@@ -1567,6 +1690,7 @@ ${fields}
|
|
|
1567
1690
|
if (field.max !== void 0) properties[name].maximum = field.max;
|
|
1568
1691
|
if (field.minLength !== void 0) properties[name].minLength = field.minLength;
|
|
1569
1692
|
if (field.maxLength !== void 0) properties[name].maxLength = field.maxLength;
|
|
1693
|
+
if (field.enum && field.enum.length > 0 && (field.type === "text" || field.type === "integer" || field.type === "decimal")) properties[name].enum = [...field.enum];
|
|
1570
1694
|
}
|
|
1571
1695
|
return properties;
|
|
1572
1696
|
}
|