@metaobjectsdev/codegen-ts-react 0.24.4 → 0.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -26,6 +26,14 @@ export default defineConfig({
26
26
  targets". The form imports the entity module from wherever `entityFile()` is
27
27
  routed (relative when same target, the entity-module target's `importBase` when not).
28
28
 
29
+ ### The generator is yours
30
+
31
+ `formFile()` has a reference template: `meta eject form` copies it into `codegen/generators/form.ts`
32
+ for you to own. The emitted component is React with react-hook-form — if your framework needs a
33
+ marker directive or a different import shape, compose the exported renderer and change that one
34
+ step. Inside the ejected file's existing `if (!ctx.renderContext) throw …` guard, change only the
35
+ `content:` line: `content: '"use client";\n' + renderFormFile(entity, ctx.renderContext)`.
36
+
29
37
  ## Pairs with
30
38
 
31
39
  - Runtime: [`@metaobjectsdev/react`](../../../../client/web/packages/react) — the generated forms import from here.
@@ -6,8 +6,12 @@ export interface FormFileOpts {
6
6
  }
7
7
  /**
8
8
  * Forms are opt-in: a user must add `formFile()` to config.generators.
9
- * Per-entity opt-out via `@emitForm: false` is honored.
10
9
  * .tsx files are not piped through formatTs (Biome only handles .ts here).
10
+ *
11
+ * Decide per generator what you consume: wire only the generators whose output you
12
+ * actually import, and narrow this one with its `filter` option. There is no `@emit*`
13
+ * metadata attribute — those were never registered vocabulary, so `meta verify` rejects
14
+ * them (ERR_UNKNOWN_ATTR).
11
15
  */
12
16
  export declare const formFile: GeneratorFactory<FormFileOpts>;
13
17
  //# sourceMappingURL=form-file.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"form-file.d.ts","sourceRoot":"","sources":["../src/form-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,OAAO,EAA6B,KAAK,gBAAgB,EAAwF,MAAM,4BAA4B,CAAC;AAGpL,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,EAwChB,gBAAgB,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"form-file.d.ts","sourceRoot":"","sources":["../src/form-file.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAA6B,KAAK,gBAAgB,EAA2D,MAAM,4BAA4B,CAAC;AAGvJ,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,eAAO,MAAM,QAAQ,EAoChB,gBAAgB,CAAC,YAAY,CAAC,CAAC"}
package/dist/form-file.js CHANGED
@@ -1,10 +1,13 @@
1
- import { OBJECT_ATTR_DISCRIMINATOR } from "@metaobjectsdev/metadata";
2
- import { perEntity, entityOutputPath, servesWriteApi, isProjection, isTphSubtype, CODEGEN_ATTR_EMIT_FORM } from "@metaobjectsdev/codegen-ts";
1
+ import { perEntity, entityOutputPath, hasGeneratedForm, withClientDirective } from "@metaobjectsdev/codegen-ts";
3
2
  import { renderFormFile } from "./templates/form-file.js";
4
3
  /**
5
4
  * Forms are opt-in: a user must add `formFile()` to config.generators.
6
- * Per-entity opt-out via `@emitForm: false` is honored.
7
5
  * .tsx files are not piped through formatTs (Biome only handles .ts here).
6
+ *
7
+ * Decide per generator what you consume: wire only the generators whose output you
8
+ * actually import, and narrow this one with its `filter` option. There is no `@emit*`
9
+ * metadata attribute — those were never registered vocabulary, so `meta verify` rejects
10
+ * them (ERR_UNKNOWN_ATTR).
8
11
  */
9
12
  export const formFile = function formFile(opts) {
10
13
  const userFilter = opts?.filter ?? (() => true);
@@ -12,29 +15,18 @@ export const formFile = function formFile(opts) {
12
15
  name: "form-file",
13
16
  // Always set: AND-composes the framework write-artifact guard
14
17
  // (skips abstract types — no instance — and read-only projections —
15
- // instantiable for read, never for write), the metadata opt-out, and
16
- // the optional user filter.
18
+ // instantiable for read, never for write) with the optional user filter.
17
19
  // FR-017 Tier 3: forms are ALWAYS per-subtype. The discriminator base gets
18
20
  // NO form (you can't create an abstract base), but each concrete subtype
19
21
  // does — even though it has no own writable source (it inherits the base's).
20
22
  filter: (e) => {
21
- // ADR-0039: resolving a concrete entity may inherit @emitForm via extends.
22
- if (e.attr(CODEGEN_ATTR_EMIT_FORM) === false)
23
- return false;
24
- if (!userFilter(e))
25
- return false;
26
- if (isTphSubtype(e))
27
- return true; // per-subtype form
28
- // A discriminator base is never form-rendered directly.
29
- // ADR-0039: own — @discriminator identifies a TPH base level (read own so a
30
- // subtype isn't mistaken for a base); e is already known not to be a subtype.
31
- if (typeof e.ownAttr(OBJECT_ATTR_DISCRIMINATOR) === "string")
32
- return false;
33
- // A form is a client of a WRITE endpoint. Ask whether one exists, not where the
34
- // data is stored — see api-surface.ts. `!isProjection` stays explicit here: a
35
- // read-only view is a UI-tier exclusion (nothing to submit), distinct from
36
- // whether write endpoints exist at all.
37
- return servesWriteApi(e) && !isProjection(e);
23
+ // `hasGeneratedForm` (api-surface.ts) holds the whole rule: per-subtype form for a
24
+ // TPH subtype, NO form for a discriminator base (you cannot create a base, and its
25
+ // polymorphic mount is read-only by construction), and a write endpoint that is not
26
+ // a read-only projection otherwise. It is shared with `agent/ui.md`, which has to
27
+ // say "there is deliberately no form here" for exactly the set skipped here — asking
28
+ // `servesWriteApi` there instead announced a form for every discriminator base.
29
+ return userFilter(e) && hasGeneratedForm(e);
38
30
  },
39
31
  generate: perEntity((entity, ctx) => {
40
32
  if (!ctx.renderContext) {
@@ -42,7 +34,7 @@ export const formFile = function formFile(opts) {
42
34
  }
43
35
  return {
44
36
  path: entityOutputPath(ctx.config.outputLayout ?? "flat", entity.package, `${entity.name}.form.tsx`),
45
- content: renderFormFile(entity, ctx.renderContext),
37
+ content: withClientDirective(renderFormFile(entity, ctx.renderContext), ctx.renderContext.clientDirective),
46
38
  };
47
39
  }),
48
40
  };
@@ -1 +1 @@
1
- {"version":3,"file":"form-file.js","sourceRoot":"","sources":["../src/form-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,SAAS,EAAyC,gBAAgB,EAAE,cAAc,EAAE,YAAY,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpL,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,QAAQ,CAAC,IAAmB;IAC3D,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,WAAW;QACjB,8DAA8D;QAC9D,oEAAoE;QACpE,qEAAqE;QACrE,4BAA4B;QAC5B,2EAA2E;QAC3E,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,EAAE,CAAC,CAAa,EAAE,EAAE;YACxB,6EAA6E;YAC7E,IAAI,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,KAAK,KAAK;gBAAE,OAAO,KAAK,CAAC;YAC3D,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;gBAAE,OAAO,KAAK,CAAC;YACjC,IAAI,YAAY,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC,CAAC,mBAAmB;YACrD,wDAAwD;YACxD,4EAA4E;YAC5E,8EAA8E;YAC9E,IAAI,OAAO,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,KAAK,QAAQ;gBAAE,OAAO,KAAK,CAAC;YAC3E,gFAAgF;YAChF,8EAA8E;YAC9E,2EAA2E;YAC3E,wCAAwC;YACxC,OAAO,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW,CAAC;gBACpG,OAAO,EAAE,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC;aACnD,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;IACF,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAmC,CAAC"}
1
+ {"version":3,"file":"form-file.js","sourceRoot":"","sources":["../src/form-file.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAyC,gBAAgB,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACvJ,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAO1D;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,SAAS,QAAQ,CAAC,IAAmB;IAC3D,MAAM,UAAU,GAAG,IAAI,EAAE,MAAM,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,SAAS,GAAc;QAC3B,IAAI,EAAE,WAAW;QACjB,8DAA8D;QAC9D,oEAAoE;QACpE,yEAAyE;QACzE,2EAA2E;QAC3E,yEAAyE;QACzE,6EAA6E;QAC7E,MAAM,EAAE,CAAC,CAAa,EAAE,EAAE;YACxB,mFAAmF;YACnF,mFAAmF;YACnF,oFAAoF;YACpF,kFAAkF;YAClF,qFAAqF;YACrF,gFAAgF;YAChF,OAAO,UAAU,CAAC,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;QAC9C,CAAC;QACD,QAAQ,EAAE,SAAS,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;YAClC,IAAI,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;YAC/E,CAAC;YACD,OAAO;gBACL,IAAI,EAAE,gBAAgB,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,IAAI,MAAM,EAAE,MAAM,CAAC,OAAO,EAAE,GAAG,MAAM,CAAC,IAAI,WAAW,CAAC;gBACpG,OAAO,EAAE,mBAAmB,CAC1B,cAAc,CAAC,MAAM,EAAE,GAAG,CAAC,aAAa,CAAC,EACzC,GAAG,CAAC,aAAa,CAAC,eAAe,CAClC;aACF,CAAC;QACJ,CAAC,CAAC;KACH,CAAC;IACF,IAAI,IAAI,EAAE,MAAM,EAAE,CAAC;QACjB,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAmC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,2 +1,5 @@
1
1
  export { formFile, type FormFileOpts } from "./form-file.js";
2
+ export { renderFormFile } from "./templates/form-file.js";
3
+ export { resolveReferenceRoot, readReferenceTemplate, REFERENCE_GENERATOR_NAMES } from "./reference-templates.js";
4
+ export type { ReferenceGeneratorName } from "./reference-templates.js";
2
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,KAAK,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAI7D,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAI1D,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAGlH,YAAY,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,9 @@
1
1
  // Public API surface for @metaobjectsdev/codegen-ts-react.
2
2
  export { formFile } from "./form-file.js";
3
+ // FR-040 §4.2(b) — public so an owned generator composes the engine rather than
4
+ // forking it. Signature is stable API: (entity, ctx) => string.
5
+ export { renderFormFile } from "./templates/form-file.js";
6
+ // FR-040 §4.1 — the copyable reference generator(s) this package ships in
7
+ // `src/reference/`, and the reader `meta init`/`meta eject` use to read them.
8
+ export { resolveReferenceRoot, readReferenceTemplate, REFERENCE_GENERATOR_NAMES } from "./reference-templates.js";
3
9
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EAAE,QAAQ,EAAqB,MAAM,gBAAgB,CAAC;AAE7D,gFAAgF;AAChF,gEAAgE;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAE1D,0EAA0E;AAC1E,8EAA8E;AAC9E,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare const REFERENCE_GENERATOR_NAMES: readonly ["form"];
2
+ export type ReferenceGeneratorName = (typeof REFERENCE_GENERATOR_NAMES)[number];
3
+ export declare function resolveReferenceRoot(): string;
4
+ export declare function readReferenceTemplate(name: ReferenceGeneratorName): string;
5
+ //# sourceMappingURL=reference-templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-templates.d.ts","sourceRoot":"","sources":["../src/reference-templates.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,yBAAyB,mBAAoB,CAAC;AAC3D,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,yBAAyB,CAAC,CAAC,MAAM,CAAC,CAAC;AAIhF,wBAAgB,oBAAoB,IAAI,MAAM,CAE7C;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,sBAAsB,GAAG,MAAM,CAE1E"}
@@ -0,0 +1,12 @@
1
+ // FR-040 §4.1 — this package hosts its own copyable reference generators in
2
+ // `src/reference/`, read through the shared factory so the resolver is not duplicated.
3
+ import { makeReferenceReader } from "@metaobjectsdev/codegen-ts";
4
+ export const REFERENCE_GENERATOR_NAMES = ["form"];
5
+ const reader = makeReferenceReader(import.meta.url, REFERENCE_GENERATOR_NAMES);
6
+ export function resolveReferenceRoot() {
7
+ return reader.resolveReferenceRoot();
8
+ }
9
+ export function readReferenceTemplate(name) {
10
+ return reader.readReferenceTemplate(name);
11
+ }
12
+ //# sourceMappingURL=reference-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reference-templates.js","sourceRoot":"","sources":["../src/reference-templates.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,uFAAuF;AACvF,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEjE,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,MAAM,CAAU,CAAC;AAG3D,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,yBAAyB,CAAC,CAAC;AAE/E,MAAM,UAAU,oBAAoB;IAClC,OAAO,MAAM,CAAC,oBAAoB,EAAE,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,IAA4B;IAChE,OAAO,MAAM,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"form-file.d.ts","sourceRoot":"","sources":["../../src/templates/form-file.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAa,UAAU,EAA0B,MAAM,0BAA0B,CAAC;AAiCzF,OAAO,EAAE,KAAK,aAAa,EAAgE,MAAM,4BAA4B,CAAC;AA8Q9H,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA4Q7E"}
1
+ {"version":3,"file":"form-file.d.ts","sourceRoot":"","sources":["../../src/templates/form-file.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAa,UAAU,EAAY,MAAM,0BAA0B,CAAC;AAgC3E,OAAO,EACL,KAAK,aAAa,EAQnB,MAAM,4BAA4B,CAAC;AAoQpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,EAAE,aAAa,GAAG,MAAM,CA+Q7E"}
@@ -17,12 +17,16 @@
17
17
  // - Fields with @formExclude: true on the metadata
18
18
  // - Fields auto-defaulted to CURRENT_TIMESTAMP at the DB
19
19
  //
20
- // Form generation is OPT-IN per entity via `@emitForm: true` on the
21
- // object metadata. Default off. Most projects don't need stock forms.
20
+ // Form generation is OPT-IN at PROJECT level: add `formFile()` to `generators`
21
+ // in metaobjects.config.ts. Most projects don't need stock forms. Narrow it to
22
+ // a subset with `formFile({ filter })`. There is no `@emitForm` metadata
23
+ // attribute — it was never registered vocabulary, so `meta verify` rejects it
24
+ // (ERR_UNKNOWN_ATTR); the doc line here used to claim it turned generation ON,
25
+ // while the filter beside it read it as an opt-OUT. Neither is true now.
22
26
  import { code, imp } from "ts-poet";
23
- import { MetaField, MetaObject, MetaView, stripPackage } from "@metaobjectsdev/metadata";
24
- import { IDENTITY_SUBTYPE_PRIMARY, IDENTITY_ATTR_FIELDS, FIELD_ATTR_DEFAULT, FIELD_SUBTYPE_OBJECT, FIELD_ATTR_OBJECT_REF, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_DECIMAL, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_DATE, FIELD_SUBTYPE_TIME, FIELD_SUBTYPE_TIMESTAMP, FIELD_ATTR_FORM_EXCLUDE, FIELD_ATTR_VALUES, FIELD_ATTR_REQUIRED, FIELD_SUBTYPE_ENUM, VIEW_SUBTYPE_TEXTAREA, VIEW_SUBTYPE_DROPDOWN, VIEW_SUBTYPE_CHECKBOX, VIEW_SUBTYPE_RADIO, VIEW_SUBTYPE_IMAGE, VIEW_TEXTAREA_ATTR_ROWS, VIEW_IMAGE_ATTR_ASPECT_RATIO, VIEW_IMAGE_ATTR_MAX_EDGE, VIEW_IMAGE_ATTR_STORE, VIEW_IMAGE_ATTR_ACCEPT, VIEW_IMAGE_ATTR_MAX_BYTES, } from "@metaobjectsdev/metadata";
25
- import { entityModuleSpecifier, GENERATED_HEADER, tphDiscriminatorPin } from "@metaobjectsdev/codegen-ts";
27
+ import { MetaField, MetaObject, MetaView } from "@metaobjectsdev/metadata";
28
+ import { IDENTITY_SUBTYPE_PRIMARY, IDENTITY_ATTR_FIELDS, FIELD_ATTR_DEFAULT, FIELD_SUBTYPE_OBJECT, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT, FIELD_SUBTYPE_DECIMAL, FIELD_SUBTYPE_CURRENCY, FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_DATE, FIELD_SUBTYPE_TIME, FIELD_SUBTYPE_TIMESTAMP, FIELD_ATTR_FORM_EXCLUDE, FIELD_ATTR_VALUES, FIELD_ATTR_REQUIRED, FIELD_SUBTYPE_ENUM, VIEW_SUBTYPE_TEXTAREA, VIEW_SUBTYPE_DROPDOWN, VIEW_SUBTYPE_CHECKBOX, VIEW_SUBTYPE_RADIO, VIEW_SUBTYPE_IMAGE, VIEW_TEXTAREA_ATTR_ROWS, VIEW_IMAGE_ATTR_ASPECT_RATIO, VIEW_IMAGE_ATTR_MAX_EDGE, VIEW_IMAGE_ATTR_STORE, VIEW_IMAGE_ATTR_ACCEPT, VIEW_IMAGE_ATTR_MAX_BYTES, } from "@metaobjectsdev/metadata";
29
+ import { entityModuleSpecifier, GENERATED_HEADER, humanize, tphDiscriminatorPin, valueObjectFor, viewForContext, VIEW_CONTEXT_FORM, } from "@metaobjectsdev/codegen-ts";
26
30
  function primaryFieldNames(entity) {
27
31
  const set = new Set();
28
32
  // identities() returns effective identities, so inherited identities (from extends:/super:) are included.
@@ -75,25 +79,13 @@ function visibleFields(entity, discField) {
75
79
  /** Max recursion depth for nested value objects — a backstop alongside the
76
80
  * per-branch visited-set cycle guard. */
77
81
  const MAX_VO_DEPTH = 5;
78
- /** Resolve a `field.object`'s `@objectRef` to the referenced value object from
79
- * the loaded root. Mirrors the resolution the Zod / inferred-type templates use
80
- * (read `@objectRef`, strip the package, look the bare name up on the root). */
82
+ /** Resolve a `field.object`'s `@objectRef` to the referenced value object from the loaded
83
+ * root `valueObjectFor`, in `@metaobjectsdev/codegen-ts`, because `agent/ui.md` has to
84
+ * ask the SAME question to document what this generator renders. When the two answered
85
+ * separately the page printed the field's view kind (`text`) as the control for a field
86
+ * this generator emits as a nested sub-form and no input at all. */
81
87
  function resolveValueObject(field, ctx) {
82
- if (field.subType !== FIELD_SUBTYPE_OBJECT)
83
- return undefined;
84
- const ref = field.attr(FIELD_ATTR_OBJECT_REF);
85
- if (typeof ref !== "string" || ref.length === 0)
86
- return undefined;
87
- const base = stripPackage(ref);
88
- return ctx.loadedRoot.objects().find((o) => o.name === base);
89
- }
90
- /** camelCase / PascalCase → human label ("llmConfig" → "Llm Config"). */
91
- function humanize(s) {
92
- return s
93
- .replace(/([a-z])([A-Z])/g, "$1 $2")
94
- .replace(/_/g, " ")
95
- .replace(/\b\w/g, (c) => c.toUpperCase())
96
- .trim();
88
+ return valueObjectFor(field, ctx.loadedRoot);
97
89
  }
98
90
  /** A real HTML <input type=...> for a scalar field subtype, or undefined (text). */
99
91
  function htmlTypeForSubType(subType) {
@@ -227,8 +219,8 @@ ${inner.join("\n")}
227
219
  /** The view kind that drives control selection: an explicit view child wins;
228
220
  * an enum with no view defaults to a dropdown; otherwise null (typed <input>).
229
221
  * Takes the already-resolved view (callers that also need view attrs, like
230
- * the textarea `@rows` lookup, fetch it once via `field.views()[0]` and
231
- * pass it through rather than re-deriving it here). */
222
+ * the textarea `@rows` lookup, fetch it once via `viewForContext(field,
223
+ * VIEW_CONTEXT_FORM)` and pass it through rather than re-deriving it here). */
232
224
  function viewKindFor(field, view) {
233
225
  if (view !== undefined)
234
226
  return view.subType;
@@ -263,7 +255,8 @@ function blankableOptionalFields(fields) {
263
255
  .filter((f) => f.attr(FIELD_ATTR_REQUIRED) !== true)
264
256
  .filter((f) => f.subType !== FIELD_SUBTYPE_OBJECT && !f.resolvedIsArray())
265
257
  .filter((f) => {
266
- const kind = viewKindFor(f, f.views()[0]); // resolving accessor (ADR-0039)
258
+ // #356 + ADR-0039: the view declared for the FORM, resolving through extends.
259
+ const kind = viewKindFor(f, viewForContext(f, VIEW_CONTEXT_FORM));
267
260
  return kind !== VIEW_SUBTYPE_CHECKBOX && kind !== VIEW_SUBTYPE_IMAGE;
268
261
  })
269
262
  .map((f) => f.name);
@@ -371,7 +364,8 @@ ${control}
371
364
  // scalarBlock's typed <input> bound via `form.input.<field>`.
372
365
  const fieldControlFor = (field) => {
373
366
  const name = field.name;
374
- const view = field.views()[0]; // resolving accessor (ADR-0039)
367
+ // #356 + ADR-0039: the view declared for the FORM, resolving through extends.
368
+ const view = viewForContext(field, VIEW_CONTEXT_FORM);
375
369
  const kind = viewKindFor(field, view);
376
370
  // Enum member symbols are validated to /^[A-Za-z_][A-Za-z0-9_]*$/, so raw
377
371
  // interpolation into JSX attribute/text positions is safe (no escaping).
@@ -446,7 +440,7 @@ ${control}
446
440
  // Only pull in Controller + ImageUpload when a view.image field needs them —
447
441
  // a native <input> can't drive a file-upload control's value/onChange
448
442
  // contract, so image fields are wrapped in react-hook-form's <Controller>.
449
- const hasImage = fields.some((f) => f.views()[0]?.subType === VIEW_SUBTYPE_IMAGE);
443
+ const hasImage = fields.some((f) => viewForContext(f, VIEW_CONTEXT_FORM)?.subType === VIEW_SUBTYPE_IMAGE);
450
444
  const imageImports = hasImage
451
445
  ? `import { Controller } from "react-hook-form";\nimport { ImageUpload } from "@metaobjectsdev/react";\n`
452
446
  : "";
@@ -1 +1 @@
1
- {"version":3,"file":"form-file.js","sourceRoot":"","sources":["../../src/templates/form-file.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"form-file.js","sourceRoot":"","sources":["../../src/templates/form-file.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metaobjectsdev/codegen-ts-react",
3
- "version": "0.24.4",
3
+ "version": "0.25.0",
4
4
  "description": "React codegen for metaobjects — emits <Entity>.form.tsx files using react-hook-form and @metaobjectsdev/react helpers.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -45,8 +45,8 @@
45
45
  "access": "public"
46
46
  },
47
47
  "dependencies": {
48
- "@metaobjectsdev/metadata": "0.24.4",
49
- "@metaobjectsdev/codegen-ts": "0.24.4",
48
+ "@metaobjectsdev/metadata": "0.25.0",
49
+ "@metaobjectsdev/codegen-ts": "0.25.0",
50
50
  "ts-poet": "^6.10.0"
51
51
  },
52
52
  "peerDependencies": {
package/src/form-file.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  import type { MetaObject } from "@metaobjectsdev/metadata";
2
- import { OBJECT_ATTR_DISCRIMINATOR } from "@metaobjectsdev/metadata";
3
- import { perEntity, type Generator, type GeneratorFactory, entityOutputPath, servesWriteApi, isProjection, isTphSubtype, CODEGEN_ATTR_EMIT_FORM } from "@metaobjectsdev/codegen-ts";
2
+ import { perEntity, type Generator, type GeneratorFactory, entityOutputPath, hasGeneratedForm, withClientDirective } from "@metaobjectsdev/codegen-ts";
4
3
  import { renderFormFile } from "./templates/form-file.js";
5
4
 
6
5
  export interface FormFileOpts {
@@ -10,8 +9,12 @@ export interface FormFileOpts {
10
9
 
11
10
  /**
12
11
  * Forms are opt-in: a user must add `formFile()` to config.generators.
13
- * Per-entity opt-out via `@emitForm: false` is honored.
14
12
  * .tsx files are not piped through formatTs (Biome only handles .ts here).
13
+ *
14
+ * Decide per generator what you consume: wire only the generators whose output you
15
+ * actually import, and narrow this one with its `filter` option. There is no `@emit*`
16
+ * metadata attribute — those were never registered vocabulary, so `meta verify` rejects
17
+ * them (ERR_UNKNOWN_ATTR).
15
18
  */
16
19
  export const formFile = function formFile(opts?: FormFileOpts): Generator {
17
20
  const userFilter = opts?.filter ?? (() => true);
@@ -19,25 +22,18 @@ export const formFile = function formFile(opts?: FormFileOpts): Generator {
19
22
  name: "form-file",
20
23
  // Always set: AND-composes the framework write-artifact guard
21
24
  // (skips abstract types — no instance — and read-only projections —
22
- // instantiable for read, never for write), the metadata opt-out, and
23
- // the optional user filter.
25
+ // instantiable for read, never for write) with the optional user filter.
24
26
  // FR-017 Tier 3: forms are ALWAYS per-subtype. The discriminator base gets
25
27
  // NO form (you can't create an abstract base), but each concrete subtype
26
28
  // does — even though it has no own writable source (it inherits the base's).
27
29
  filter: (e: MetaObject) => {
28
- // ADR-0039: resolving a concrete entity may inherit @emitForm via extends.
29
- if (e.attr(CODEGEN_ATTR_EMIT_FORM) === false) return false;
30
- if (!userFilter(e)) return false;
31
- if (isTphSubtype(e)) return true; // per-subtype form
32
- // A discriminator base is never form-rendered directly.
33
- // ADR-0039: own @discriminator identifies a TPH base level (read own so a
34
- // subtype isn't mistaken for a base); e is already known not to be a subtype.
35
- if (typeof e.ownAttr(OBJECT_ATTR_DISCRIMINATOR) === "string") return false;
36
- // A form is a client of a WRITE endpoint. Ask whether one exists, not where the
37
- // data is stored — see api-surface.ts. `!isProjection` stays explicit here: a
38
- // read-only view is a UI-tier exclusion (nothing to submit), distinct from
39
- // whether write endpoints exist at all.
40
- return servesWriteApi(e) && !isProjection(e);
30
+ // `hasGeneratedForm` (api-surface.ts) holds the whole rule: per-subtype form for a
31
+ // TPH subtype, NO form for a discriminator base (you cannot create a base, and its
32
+ // polymorphic mount is read-only by construction), and a write endpoint that is not
33
+ // a read-only projection otherwise. It is shared with `agent/ui.md`, which has to
34
+ // say "there is deliberately no form here" for exactly the set skipped here — asking
35
+ // `servesWriteApi` there instead announced a form for every discriminator base.
36
+ return userFilter(e) && hasGeneratedForm(e);
41
37
  },
42
38
  generate: perEntity((entity, ctx) => {
43
39
  if (!ctx.renderContext) {
@@ -45,7 +41,10 @@ export const formFile = function formFile(opts?: FormFileOpts): Generator {
45
41
  }
46
42
  return {
47
43
  path: entityOutputPath(ctx.config.outputLayout ?? "flat", entity.package, `${entity.name}.form.tsx`),
48
- content: renderFormFile(entity, ctx.renderContext),
44
+ content: withClientDirective(
45
+ renderFormFile(entity, ctx.renderContext),
46
+ ctx.renderContext.clientDirective,
47
+ ),
49
48
  };
50
49
  }),
51
50
  };
package/src/index.ts CHANGED
@@ -1,2 +1,13 @@
1
1
  // Public API surface for @metaobjectsdev/codegen-ts-react.
2
2
  export { formFile, type FormFileOpts } from "./form-file.js";
3
+
4
+ // FR-040 §4.2(b) — public so an owned generator composes the engine rather than
5
+ // forking it. Signature is stable API: (entity, ctx) => string.
6
+ export { renderFormFile } from "./templates/form-file.js";
7
+
8
+ // FR-040 §4.1 — the copyable reference generator(s) this package ships in
9
+ // `src/reference/`, and the reader `meta init`/`meta eject` use to read them.
10
+ export { resolveReferenceRoot, readReferenceTemplate, REFERENCE_GENERATOR_NAMES } from "./reference-templates.js";
11
+ // The name union travels with the names array — codegen-ts exports both, and a
12
+ // consumer keying anything by ejectable name needs the type as much as the values.
13
+ export type { ReferenceGeneratorName } from "./reference-templates.js";
@@ -0,0 +1,85 @@
1
+ // REFERENCE TEMPLATE — copy this into your repo (e.g. codegen/generators/form.ts) and own it.
2
+ // Then import it LOCALLY in metaobjects.config.ts:
3
+ // import { formFile } from "./codegen/generators/form.js";
4
+ //
5
+ // RUNTIME: this file executes under whatever runs `meta gen` — NODE, even in a Bun
6
+ // project. Do not reach for `Bun.*` globals here.
7
+ // targets: React with react-hook-form. The emitted component calls `useEntityForm`
8
+ // from `@metaobjectsdev/react`, so it is a CLIENT component.
9
+ // If your framework compiles server and client from one tree and resolves
10
+ // each half under different conditions, the emitted file may need a marker
11
+ // directive — prepend it to `renderFormFile`'s result below. That is a
12
+ // one-line change in THIS file and is the intended way to do it.
13
+ // use-when: you want a generated form per writable entity.
14
+ // emits: <target>/<Entity>.form.tsx
15
+ // customize: this generator is YOURS. `renderFormFile` (exported from
16
+ // @metaobjectsdev/codegen-ts-react) produces the component body — wrap it,
17
+ // prepend to it, or replace the call entirely with your own renderer.
18
+ // composes-with: entity.ts (imports the schemas the form validates against).
19
+
20
+ import type { MetaObject } from "@metaobjectsdev/metadata";
21
+ import {
22
+ perEntity,
23
+ type Generator,
24
+ type GeneratorFactory,
25
+ entityOutputPath,
26
+ hasGeneratedForm,
27
+ withClientDirective,
28
+ } from "@metaobjectsdev/codegen-ts";
29
+ import { renderFormFile } from "@metaobjectsdev/codegen-ts-react";
30
+
31
+ export interface FormFileOpts {
32
+ filter?: (entity: MetaObject) => boolean;
33
+ target?: string;
34
+ }
35
+
36
+ /**
37
+ * Forms are opt-in: a user must add `formFile()` to config.generators.
38
+ * .tsx files are not piped through formatTs (Biome only handles .ts here).
39
+ *
40
+ * Decide per generator what you consume: wire only the generators whose output you
41
+ * actually import, and narrow this one with its `filter` option. There is no `@emit*`
42
+ * metadata attribute — those were never registered vocabulary, so `meta verify` rejects
43
+ * them (ERR_UNKNOWN_ATTR).
44
+ */
45
+ export const formFile = function formFile(opts?: FormFileOpts): Generator {
46
+ const userFilter = opts?.filter ?? (() => true);
47
+ const generator: Generator = {
48
+ name: "form-file",
49
+ // Always set: AND-composes the framework write-artifact guard
50
+ // (skips abstract types — no instance — and read-only projections —
51
+ // instantiable for read, never for write) with the optional user filter.
52
+ // FR-017 Tier 3: forms are ALWAYS per-subtype. The discriminator base gets
53
+ // NO form (you can't create an abstract base), but each concrete subtype
54
+ // does — even though it has no own writable source (it inherits the base's).
55
+ filter: (e: MetaObject) => {
56
+ // `hasGeneratedForm` (api-surface.ts) holds the whole rule: per-subtype form for a
57
+ // TPH subtype, NO form for a discriminator base (you cannot create a base, and its
58
+ // polymorphic mount is read-only by construction), and a write endpoint that is not
59
+ // a read-only projection otherwise. It is shared with `agent/ui.md`, which has to
60
+ // say "there is deliberately no form here" for exactly the set skipped here — asking
61
+ // `servesWriteApi` there instead announced a form for every discriminator base.
62
+ return userFilter(e) && hasGeneratedForm(e);
63
+ },
64
+ generate: perEntity((entity, ctx) => {
65
+ if (!ctx.renderContext) {
66
+ throw new Error("form-file: renderContext is required (provided by runGen)");
67
+ }
68
+ // The framework-coupled seam. `withClientDirective` applies the project-level
69
+ // `clientDirective` config knob (FR-040 §6.4); for a directive your framework
70
+ // needs that MetaObjects does not model, prepend it right here.
71
+ const body = withClientDirective(
72
+ renderFormFile(entity, ctx.renderContext),
73
+ ctx.renderContext.clientDirective,
74
+ );
75
+ return {
76
+ path: entityOutputPath(ctx.config.outputLayout ?? "flat", entity.package, `${entity.name}.form.tsx`),
77
+ content: body,
78
+ };
79
+ }),
80
+ };
81
+ if (opts?.target) {
82
+ generator.target = opts.target;
83
+ }
84
+ return generator;
85
+ } as GeneratorFactory<FormFileOpts>;
@@ -0,0 +1,16 @@
1
+ // FR-040 §4.1 — this package hosts its own copyable reference generators in
2
+ // `src/reference/`, read through the shared factory so the resolver is not duplicated.
3
+ import { makeReferenceReader } from "@metaobjectsdev/codegen-ts";
4
+
5
+ export const REFERENCE_GENERATOR_NAMES = ["form"] as const;
6
+ export type ReferenceGeneratorName = (typeof REFERENCE_GENERATOR_NAMES)[number];
7
+
8
+ const reader = makeReferenceReader(import.meta.url, REFERENCE_GENERATOR_NAMES);
9
+
10
+ export function resolveReferenceRoot(): string {
11
+ return reader.resolveReferenceRoot();
12
+ }
13
+
14
+ export function readReferenceTemplate(name: ReferenceGeneratorName): string {
15
+ return reader.readReferenceTemplate(name);
16
+ }
@@ -17,17 +17,20 @@
17
17
  // - Fields with @formExclude: true on the metadata
18
18
  // - Fields auto-defaulted to CURRENT_TIMESTAMP at the DB
19
19
  //
20
- // Form generation is OPT-IN per entity via `@emitForm: true` on the
21
- // object metadata. Default off. Most projects don't need stock forms.
20
+ // Form generation is OPT-IN at PROJECT level: add `formFile()` to `generators`
21
+ // in metaobjects.config.ts. Most projects don't need stock forms. Narrow it to
22
+ // a subset with `formFile({ filter })`. There is no `@emitForm` metadata
23
+ // attribute — it was never registered vocabulary, so `meta verify` rejects it
24
+ // (ERR_UNKNOWN_ATTR); the doc line here used to claim it turned generation ON,
25
+ // while the filter beside it read it as an opt-OUT. Neither is true now.
22
26
 
23
27
  import { code, imp } from "ts-poet";
24
- import { MetaField, MetaObject, MetaView, stripPackage } from "@metaobjectsdev/metadata";
28
+ import { MetaField, MetaObject, MetaView } from "@metaobjectsdev/metadata";
25
29
  import {
26
30
  IDENTITY_SUBTYPE_PRIMARY,
27
31
  IDENTITY_ATTR_FIELDS,
28
32
  FIELD_ATTR_DEFAULT,
29
33
  FIELD_SUBTYPE_OBJECT,
30
- FIELD_ATTR_OBJECT_REF,
31
34
  FIELD_SUBTYPE_INT,
32
35
  FIELD_SUBTYPE_LONG,
33
36
  FIELD_SUBTYPE_DOUBLE,
@@ -54,7 +57,16 @@ import {
54
57
  VIEW_IMAGE_ATTR_ACCEPT,
55
58
  VIEW_IMAGE_ATTR_MAX_BYTES,
56
59
  } from "@metaobjectsdev/metadata";
57
- import { type RenderContext, entityModuleSpecifier, GENERATED_HEADER, tphDiscriminatorPin } from "@metaobjectsdev/codegen-ts";
60
+ import {
61
+ type RenderContext,
62
+ entityModuleSpecifier,
63
+ GENERATED_HEADER,
64
+ humanize,
65
+ tphDiscriminatorPin,
66
+ valueObjectFor,
67
+ viewForContext,
68
+ VIEW_CONTEXT_FORM,
69
+ } from "@metaobjectsdev/codegen-ts";
58
70
 
59
71
  function primaryFieldNames(entity: MetaObject): Set<string> {
60
72
  const set = new Set<string>();
@@ -105,24 +117,13 @@ function visibleFields(entity: MetaObject, discField?: string): MetaField[] {
105
117
  * per-branch visited-set cycle guard. */
106
118
  const MAX_VO_DEPTH = 5;
107
119
 
108
- /** Resolve a `field.object`'s `@objectRef` to the referenced value object from
109
- * the loaded root. Mirrors the resolution the Zod / inferred-type templates use
110
- * (read `@objectRef`, strip the package, look the bare name up on the root). */
120
+ /** Resolve a `field.object`'s `@objectRef` to the referenced value object from the loaded
121
+ * root `valueObjectFor`, in `@metaobjectsdev/codegen-ts`, because `agent/ui.md` has to
122
+ * ask the SAME question to document what this generator renders. When the two answered
123
+ * separately the page printed the field's view kind (`text`) as the control for a field
124
+ * this generator emits as a nested sub-form and no input at all. */
111
125
  function resolveValueObject(field: MetaField, ctx: RenderContext): MetaObject | undefined {
112
- if (field.subType !== FIELD_SUBTYPE_OBJECT) return undefined;
113
- const ref = field.attr(FIELD_ATTR_OBJECT_REF);
114
- if (typeof ref !== "string" || ref.length === 0) return undefined;
115
- const base = stripPackage(ref);
116
- return ctx.loadedRoot.objects().find((o) => o.name === base) as MetaObject | undefined;
117
- }
118
-
119
- /** camelCase / PascalCase → human label ("llmConfig" → "Llm Config"). */
120
- function humanize(s: string): string {
121
- return s
122
- .replace(/([a-z])([A-Z])/g, "$1 $2")
123
- .replace(/_/g, " ")
124
- .replace(/\b\w/g, (c) => c.toUpperCase())
125
- .trim();
126
+ return valueObjectFor(field, ctx.loadedRoot);
126
127
  }
127
128
 
128
129
  /** A real HTML <input type=...> for a scalar field subtype, or undefined (text). */
@@ -278,8 +279,8 @@ ${inner.join("\n")}
278
279
  /** The view kind that drives control selection: an explicit view child wins;
279
280
  * an enum with no view defaults to a dropdown; otherwise null (typed <input>).
280
281
  * Takes the already-resolved view (callers that also need view attrs, like
281
- * the textarea `@rows` lookup, fetch it once via `field.views()[0]` and
282
- * pass it through rather than re-deriving it here). */
282
+ * the textarea `@rows` lookup, fetch it once via `viewForContext(field,
283
+ * VIEW_CONTEXT_FORM)` and pass it through rather than re-deriving it here). */
283
284
  function viewKindFor(field: MetaField, view: MetaView | undefined): string | null {
284
285
  if (view !== undefined) return view.subType;
285
286
  if (field.subType === FIELD_SUBTYPE_ENUM) return VIEW_SUBTYPE_DROPDOWN;
@@ -314,7 +315,8 @@ function blankableOptionalFields(fields: readonly MetaField[]): string[] {
314
315
  .filter((f) => f.attr(FIELD_ATTR_REQUIRED) !== true)
315
316
  .filter((f) => f.subType !== FIELD_SUBTYPE_OBJECT && !f.resolvedIsArray())
316
317
  .filter((f) => {
317
- const kind = viewKindFor(f, f.views()[0]); // resolving accessor (ADR-0039)
318
+ // #356 + ADR-0039: the view declared for the FORM, resolving through extends.
319
+ const kind = viewKindFor(f, viewForContext(f, VIEW_CONTEXT_FORM));
318
320
  return kind !== VIEW_SUBTYPE_CHECKBOX && kind !== VIEW_SUBTYPE_IMAGE;
319
321
  })
320
322
  .map((f) => f.name);
@@ -436,7 +438,8 @@ ${control}
436
438
  // scalarBlock's typed <input> bound via `form.input.<field>`.
437
439
  const fieldControlFor = (field: MetaField): string => {
438
440
  const name = field.name;
439
- const view = field.views()[0]; // resolving accessor (ADR-0039)
441
+ // #356 + ADR-0039: the view declared for the FORM, resolving through extends.
442
+ const view = viewForContext(field, VIEW_CONTEXT_FORM);
440
443
  const kind = viewKindFor(field, view);
441
444
  // Enum member symbols are validated to /^[A-Za-z_][A-Za-z0-9_]*$/, so raw
442
445
  // interpolation into JSX attribute/text positions is safe (no escaping).
@@ -531,7 +534,9 @@ ${control}
531
534
  // Only pull in Controller + ImageUpload when a view.image field needs them —
532
535
  // a native <input> can't drive a file-upload control's value/onChange
533
536
  // contract, so image fields are wrapped in react-hook-form's <Controller>.
534
- const hasImage = fields.some((f) => f.views()[0]?.subType === VIEW_SUBTYPE_IMAGE);
537
+ const hasImage = fields.some(
538
+ (f) => viewForContext(f, VIEW_CONTEXT_FORM)?.subType === VIEW_SUBTYPE_IMAGE,
539
+ );
535
540
  const imageImports = hasImage
536
541
  ? `import { Controller } from "react-hook-form";\nimport { ImageUpload } from "@metaobjectsdev/react";\n`
537
542
  : "";