@metaobjectsdev/codegen-ts 0.24.5 → 1.0.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -12
- package/dist/api-surface.d.ts +29 -0
- package/dist/api-surface.d.ts.map +1 -1
- package/dist/api-surface.js +47 -0
- package/dist/api-surface.js.map +1 -1
- package/dist/column-mapper.d.ts +12 -0
- package/dist/column-mapper.d.ts.map +1 -1
- package/dist/column-mapper.js +1 -0
- package/dist/column-mapper.js.map +1 -1
- package/dist/constants.d.ts +24 -11
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +54 -19
- package/dist/constants.js.map +1 -1
- package/dist/db-emitting.d.ts +6 -0
- package/dist/db-emitting.d.ts.map +1 -0
- package/dist/db-emitting.js +26 -0
- package/dist/db-emitting.js.map +1 -0
- package/dist/generator-registry.d.ts.map +1 -1
- package/dist/generator-registry.js +14 -1
- package/dist/generator-registry.js.map +1 -1
- package/dist/generator.d.ts +5 -0
- package/dist/generator.d.ts.map +1 -1
- package/dist/generator.js.map +1 -1
- package/dist/generators/agent-docs-file.d.ts +19 -0
- package/dist/generators/agent-docs-file.d.ts.map +1 -0
- package/dist/generators/agent-docs-file.js +257 -0
- package/dist/generators/agent-docs-file.js.map +1 -0
- package/dist/generators/agent-requirements-page.d.ts +22 -0
- package/dist/generators/agent-requirements-page.d.ts.map +1 -0
- package/dist/generators/agent-requirements-page.js +175 -0
- package/dist/generators/agent-requirements-page.js.map +1 -0
- package/dist/generators/agent-schema-input.d.ts +69 -0
- package/dist/generators/agent-schema-input.d.ts.map +1 -0
- package/dist/generators/agent-schema-input.js +23 -0
- package/dist/generators/agent-schema-input.js.map +1 -0
- package/dist/generators/agent-schema-page.d.ts +21 -0
- package/dist/generators/agent-schema-page.d.ts.map +1 -0
- package/dist/generators/agent-schema-page.js +241 -0
- package/dist/generators/agent-schema-page.js.map +1 -0
- package/dist/generators/agent-ui-page.d.ts +22 -0
- package/dist/generators/agent-ui-page.d.ts.map +1 -0
- package/dist/generators/agent-ui-page.js +253 -0
- package/dist/generators/agent-ui-page.js.map +1 -0
- package/dist/generators/api-docs-file.d.ts.map +1 -1
- package/dist/generators/api-docs-file.js +13 -6
- package/dist/generators/api-docs-file.js.map +1 -1
- package/dist/generators/api-model.d.ts +6 -0
- package/dist/generators/api-model.d.ts.map +1 -1
- package/dist/generators/api-model.js +54 -35
- package/dist/generators/api-model.js.map +1 -1
- package/dist/generators/callable-file.js +1 -1
- package/dist/generators/callable-file.js.map +1 -1
- package/dist/generators/docs-data-builder.d.ts.map +1 -1
- package/dist/generators/docs-data-builder.js +47 -2
- package/dist/generators/docs-data-builder.js.map +1 -1
- package/dist/generators/docs-data.d.ts +6 -2
- package/dist/generators/docs-data.d.ts.map +1 -1
- package/dist/generators/index.d.ts +3 -8
- package/dist/generators/index.d.ts.map +1 -1
- package/dist/generators/index.js +19 -14
- package/dist/generators/index.js.map +1 -1
- package/dist/generators/names-file.d.ts +17 -0
- package/dist/generators/names-file.d.ts.map +1 -0
- package/dist/generators/names-file.js +95 -0
- package/dist/generators/names-file.js.map +1 -0
- package/dist/generators/requirements-markdown.d.ts +18 -1
- package/dist/generators/requirements-markdown.d.ts.map +1 -1
- package/dist/generators/requirements-markdown.js +11 -9
- package/dist/generators/requirements-markdown.js.map +1 -1
- package/dist/generators/routes-file-hono.d.ts +17 -2
- package/dist/generators/routes-file-hono.d.ts.map +1 -1
- package/dist/generators/routes-file-hono.js +9 -11
- package/dist/generators/routes-file-hono.js.map +1 -1
- package/dist/generators/routes-file.d.ts +17 -2
- package/dist/generators/routes-file.d.ts.map +1 -1
- package/dist/generators/routes-file.js +10 -8
- package/dist/generators/routes-file.js.map +1 -1
- package/dist/generators/template-generator.d.ts.map +1 -1
- package/dist/generators/template-generator.js +20 -6
- package/dist/generators/template-generator.js.map +1 -1
- package/dist/index.d.ts +20 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +43 -4
- package/dist/index.js.map +1 -1
- package/dist/metaobjects-config.d.ts +38 -1
- package/dist/metaobjects-config.d.ts.map +1 -1
- package/dist/metaobjects-config.js +9 -1
- package/dist/metaobjects-config.js.map +1 -1
- package/dist/names.d.ts +275 -0
- package/dist/names.d.ts.map +1 -0
- package/dist/names.js +433 -0
- package/dist/names.js.map +1 -0
- package/dist/overwrite-policy.d.ts.map +1 -1
- package/dist/overwrite-policy.js +15 -3
- package/dist/overwrite-policy.js.map +1 -1
- package/dist/projection/extract-view-spec.d.ts +25 -1
- package/dist/projection/extract-view-spec.d.ts.map +1 -1
- package/dist/projection/extract-view-spec.js +79 -6
- package/dist/projection/extract-view-spec.js.map +1 -1
- package/dist/reference-templates.d.ts +1 -1
- package/dist/reference-templates.d.ts.map +1 -1
- package/dist/reference-templates.js +1 -1
- package/dist/reference-templates.js.map +1 -1
- package/dist/render-context.d.ts +12 -1
- package/dist/render-context.d.ts.map +1 -1
- package/dist/render-context.js +1 -0
- package/dist/render-context.js.map +1 -1
- package/dist/retired-codegen-attrs.d.ts +32 -0
- package/dist/retired-codegen-attrs.d.ts.map +1 -0
- package/dist/retired-codegen-attrs.js +47 -0
- package/dist/retired-codegen-attrs.js.map +1 -0
- package/dist/routes-expose.d.ts +63 -0
- package/dist/routes-expose.d.ts.map +1 -0
- package/dist/routes-expose.js +57 -0
- package/dist/routes-expose.js.map +1 -0
- package/dist/runner.d.ts +18 -0
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +109 -7
- package/dist/runner.js.map +1 -1
- package/dist/templates/callable-file.d.ts +7 -2
- package/dist/templates/callable-file.d.ts.map +1 -1
- package/dist/templates/callable-file.js +54 -9
- package/dist/templates/callable-file.js.map +1 -1
- package/dist/templates/drizzle-schema.d.ts.map +1 -1
- package/dist/templates/drizzle-schema.js +236 -65
- package/dist/templates/drizzle-schema.js.map +1 -1
- package/dist/templates/entity-constants.d.ts +15 -6
- package/dist/templates/entity-constants.d.ts.map +1 -1
- package/dist/templates/entity-constants.js +85 -161
- package/dist/templates/entity-constants.js.map +1 -1
- package/dist/templates/entity-file.d.ts.map +1 -1
- package/dist/templates/entity-file.js +38 -4
- package/dist/templates/entity-file.js.map +1 -1
- package/dist/templates/entity-meta-file.d.ts +15 -1
- package/dist/templates/entity-meta-file.d.ts.map +1 -1
- package/dist/templates/entity-meta-file.js +12 -2
- package/dist/templates/entity-meta-file.js.map +1 -1
- package/dist/templates/entity-ui-descriptor.d.ts +112 -0
- package/dist/templates/entity-ui-descriptor.d.ts.map +1 -0
- package/dist/templates/entity-ui-descriptor.js +238 -0
- package/dist/templates/entity-ui-descriptor.js.map +1 -0
- package/dist/templates/field-meta.d.ts +46 -9
- package/dist/templates/field-meta.d.ts.map +1 -1
- package/dist/templates/field-meta.js +95 -21
- package/dist/templates/field-meta.js.map +1 -1
- package/dist/templates/names-decl.d.ts +38 -0
- package/dist/templates/names-decl.d.ts.map +1 -0
- package/dist/templates/names-decl.js +104 -0
- package/dist/templates/names-decl.js.map +1 -0
- package/dist/templates/projection-decl.d.ts +21 -0
- package/dist/templates/projection-decl.d.ts.map +1 -1
- package/dist/templates/projection-decl.js +53 -29
- package/dist/templates/projection-decl.js.map +1 -1
- package/dist/templates/queries-file.d.ts.map +1 -1
- package/dist/templates/queries-file.js +17 -2
- package/dist/templates/queries-file.js.map +1 -1
- package/dist/templates/requirement-test.d.ts.map +1 -1
- package/dist/templates/requirement-test.js +13 -2
- package/dist/templates/requirement-test.js.map +1 -1
- package/dist/templates/routes-file-hono.d.ts +2 -1
- package/dist/templates/routes-file-hono.d.ts.map +1 -1
- package/dist/templates/routes-file-hono.js +11 -2
- package/dist/templates/routes-file-hono.js.map +1 -1
- package/dist/templates/routes-file.d.ts +2 -1
- package/dist/templates/routes-file.d.ts.map +1 -1
- package/dist/templates/routes-file.js +54 -21
- package/dist/templates/routes-file.js.map +1 -1
- package/dist/templates/value-object-file.d.ts.map +1 -1
- package/dist/templates/value-object-file.js +15 -1
- package/dist/templates/value-object-file.js.map +1 -1
- package/dist/templates/view-decl.d.ts +37 -1
- package/dist/templates/view-decl.d.ts.map +1 -1
- package/dist/templates/view-decl.js +27 -3
- package/dist/templates/view-decl.js.map +1 -1
- package/dist/templates/zod-validators.d.ts +21 -0
- package/dist/templates/zod-validators.d.ts.map +1 -1
- package/dist/templates/zod-validators.js +40 -5
- package/dist/templates/zod-validators.js.map +1 -1
- package/dist/view-context.d.ts +24 -0
- package/dist/view-context.d.ts.map +1 -0
- package/dist/view-context.js +81 -0
- package/dist/view-context.js.map +1 -0
- package/package.json +6 -6
- package/src/api-surface.ts +53 -0
- package/src/column-mapper.ts +13 -0
- package/src/constants.ts +91 -16
- package/src/db-emitting.ts +31 -0
- package/src/generator-registry.ts +14 -4
- package/src/generator.ts +5 -0
- package/src/generators/agent-docs-file.ts +297 -0
- package/src/generators/agent-requirements-page.ts +199 -0
- package/src/generators/agent-schema-input.ts +88 -0
- package/src/generators/agent-schema-page.ts +297 -0
- package/src/generators/agent-ui-page.ts +290 -0
- package/src/generators/api-docs-file.ts +13 -6
- package/src/generators/api-model.ts +63 -34
- package/src/generators/callable-file.ts +1 -1
- package/src/generators/docs-data-builder.ts +46 -2
- package/src/generators/docs-data.ts +6 -2
- package/src/generators/index.ts +25 -14
- package/src/generators/names-file.ts +98 -0
- package/src/generators/requirements-markdown.ts +36 -2
- package/src/generators/routes-file-hono.ts +19 -10
- package/src/generators/routes-file.ts +20 -7
- package/src/generators/template-generator.ts +20 -6
- package/src/index.ts +64 -4
- package/src/metaobjects-config.ts +48 -2
- package/src/names.ts +629 -0
- package/src/overwrite-policy.ts +15 -3
- package/src/projection/extract-view-spec.ts +85 -6
- package/src/reference/entity.ts +21 -2
- package/src/reference/names.ts +125 -0
- package/src/reference/queries.ts +19 -3
- package/src/reference/routes-hono.ts +19 -9
- package/src/reference/routes.ts +25 -9
- package/src/reference-templates.ts +1 -1
- package/src/render-context.ts +13 -1
- package/src/retired-codegen-attrs.ts +52 -0
- package/src/routes-expose.ts +86 -0
- package/src/runner.ts +122 -11
- package/src/templates/callable-file.ts +60 -8
- package/src/templates/drizzle-schema.ts +248 -60
- package/src/templates/entity-constants.ts +95 -184
- package/src/templates/entity-file.ts +46 -4
- package/src/templates/entity-meta-file.ts +16 -3
- package/src/templates/entity-ui-descriptor.ts +305 -0
- package/src/templates/field-meta.ts +100 -19
- package/src/templates/names-decl.ts +165 -0
- package/src/templates/projection-decl.ts +72 -31
- package/src/templates/queries-file.ts +17 -2
- package/src/templates/requirement-test.ts +13 -2
- package/src/templates/routes-file-hono.ts +14 -2
- package/src/templates/routes-file.ts +69 -24
- package/src/templates/value-object-file.ts +15 -1
- package/src/templates/view-decl.ts +53 -3
- package/src/templates/zod-validators.ts +41 -5
- package/src/view-context.ts +88 -0
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
// Selecting a field's view by the SURFACE that renders it (#356).
|
|
2
|
+
//
|
|
3
|
+
// A field may legally declare more than one `view.*` child and every one of them
|
|
4
|
+
// survives the load, so an emitter reading `field.views()[0]` let DECLARATION
|
|
5
|
+
// ORDER decide its output — and because several emitters read that same list,
|
|
6
|
+
// one declaration drove three unrelated surfaces at once. Declaring a
|
|
7
|
+
// `view.text` so a grid cell rendered as text silently degraded the generated
|
|
8
|
+
// FORM to an `<input>`, and swapping two lines of JSON with no semantic change
|
|
9
|
+
// flipped the form's `<select>` back. That is not a modelling mistake; it is the
|
|
10
|
+
// only possible outcome when one declaration serves three readers.
|
|
11
|
+
//
|
|
12
|
+
// The selector is the view's `name` — a reserved structural key already legal on
|
|
13
|
+
// every node — so this needs no new attribute, no provider and no
|
|
14
|
+
// `metamodelVersion` move (ADR-0037 step 0: the vocabulary existed, only the
|
|
15
|
+
// read was wrong). The same shape as #353's resolution.
|
|
16
|
+
//
|
|
17
|
+
// Two rules, and the second is the load-bearing one:
|
|
18
|
+
//
|
|
19
|
+
// 1. A field declaring ONE view keeps its exact current behaviour: that view
|
|
20
|
+
// applies to every surface, whatever it is named (or unnamed). Existing
|
|
21
|
+
// models are untouched by construction — a `name` is how a view is
|
|
22
|
+
// ADDRESSED by `extends` (ADR-0029 `Customer.priceCents.display`), and
|
|
23
|
+
// re-reading those names as surface names would break addressing.
|
|
24
|
+
//
|
|
25
|
+
// 2. A field declaring SEVERAL views must name one for the surface being
|
|
26
|
+
// rendered. No match is a hard error, not a fallback: falling back to
|
|
27
|
+
// `views()[0]` reinstates the positional read for exactly the multi-view
|
|
28
|
+
// case this exists to fix, and falling back to the inferred default turns a
|
|
29
|
+
// `name` typo ("forms") into a silently degraded control. A field cannot
|
|
30
|
+
// declare two views with the SAME name — the loader merges same-(type,
|
|
31
|
+
// name) siblings into one node — so a match is never ambiguous.
|
|
32
|
+
|
|
33
|
+
import type { MetaField, MetaView } from "@metaobjectsdev/metadata";
|
|
34
|
+
import { CodegenError } from "./errors.js";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The surface a generated artifact renders, and therefore the `name` its
|
|
38
|
+
* emitter looks for among a field's views.
|
|
39
|
+
*
|
|
40
|
+
* These are the only two surfaces the packaged generators render. An owned
|
|
41
|
+
* generator (FR-040) targeting a third may pass its own name — `viewForContext`
|
|
42
|
+
* takes any string — but it then owns telling its authors what to name.
|
|
43
|
+
*/
|
|
44
|
+
export const VIEW_CONTEXT_FORM = "form";
|
|
45
|
+
/** Both grid tiers (TanStack and Angular) render the same surface, so both ask for this. */
|
|
46
|
+
export const VIEW_CONTEXT_GRID = "grid";
|
|
47
|
+
|
|
48
|
+
/** Render `view.dropdown name="form"` / `view.text (no name)` for a diagnostic. */
|
|
49
|
+
function describe(view: MetaView): string {
|
|
50
|
+
return view.name.length > 0
|
|
51
|
+
? `view.${view.subType} name="${view.name}"`
|
|
52
|
+
: `view.${view.subType} (no name)`;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** `Entity.field`, or just the field name when the field has no parent object. */
|
|
56
|
+
function fieldPath(field: MetaField): string {
|
|
57
|
+
const owner = field.parent?.name;
|
|
58
|
+
return owner !== undefined && owner.length > 0 ? `${owner}.${field.name}` : field.name;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* The view a field declares for `context`, or `undefined` when it declares none
|
|
63
|
+
* at all (the caller's existing "no view" path — an inferred default — applies).
|
|
64
|
+
*
|
|
65
|
+
* Uses the RESOLVING accessor (ADR-0039): a view inherited through `extends` is
|
|
66
|
+
* as much the field's view as one declared on it.
|
|
67
|
+
*
|
|
68
|
+
* @throws CodegenError when the field declares several views and none is named
|
|
69
|
+
* for `context`. The remedy is in the message: name one of them.
|
|
70
|
+
*/
|
|
71
|
+
export function viewForContext(field: MetaField, context: string): MetaView | undefined {
|
|
72
|
+
const declared = field.views();
|
|
73
|
+
// One view (or none) is unambiguous: it applies to every surface, exactly as
|
|
74
|
+
// it did before this selector existed.
|
|
75
|
+
if (declared.length <= 1) return declared[0];
|
|
76
|
+
|
|
77
|
+
const match = declared.find((v) => v.name === context);
|
|
78
|
+
if (match !== undefined) return match;
|
|
79
|
+
|
|
80
|
+
throw new CodegenError(
|
|
81
|
+
`Field "${fieldPath(field)}" declares ${declared.length} views ` +
|
|
82
|
+
`(${declared.map(describe).join(", ")}) and none is named "${context}", so codegen ` +
|
|
83
|
+
`cannot tell which one renders the ${context}. Name one of them "${context}" — a ` +
|
|
84
|
+
`view's \`name\` selects the surface it renders ("${VIEW_CONTEXT_FORM}" or ` +
|
|
85
|
+
`"${VIEW_CONTEXT_GRID}"). A field declaring a SINGLE view needs no name: that view ` +
|
|
86
|
+
`applies to every surface.`,
|
|
87
|
+
);
|
|
88
|
+
}
|