@metaobjectsdev/codegen-ts 0.5.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.
Files changed (198) hide show
  1. package/LICENSE +189 -0
  2. package/README.md +101 -0
  3. package/dist/column-mapper.d.ts +38 -0
  4. package/dist/column-mapper.d.ts.map +1 -0
  5. package/dist/column-mapper.js +205 -0
  6. package/dist/column-mapper.js.map +1 -0
  7. package/dist/constants.d.ts +7 -0
  8. package/dist/constants.d.ts.map +1 -0
  9. package/dist/constants.js +8 -0
  10. package/dist/constants.js.map +1 -0
  11. package/dist/errors.d.ts +7 -0
  12. package/dist/errors.d.ts.map +1 -0
  13. package/dist/errors.js +11 -0
  14. package/dist/errors.js.map +1 -0
  15. package/dist/format.d.ts +2 -0
  16. package/dist/format.d.ts.map +1 -0
  17. package/dist/format.js +47 -0
  18. package/dist/format.js.map +1 -0
  19. package/dist/generator.d.ts +44 -0
  20. package/dist/generator.d.ts.map +1 -0
  21. package/dist/generator.js +17 -0
  22. package/dist/generator.js.map +1 -0
  23. package/dist/generators/barrel.d.ts +6 -0
  24. package/dist/generators/barrel.d.ts.map +1 -0
  25. package/dist/generators/barrel.js +17 -0
  26. package/dist/generators/barrel.js.map +1 -0
  27. package/dist/generators/entity-file.d.ts +8 -0
  28. package/dist/generators/entity-file.d.ts.map +1 -0
  29. package/dist/generators/entity-file.js +27 -0
  30. package/dist/generators/entity-file.js.map +1 -0
  31. package/dist/generators/index.d.ts +5 -0
  32. package/dist/generators/index.d.ts.map +1 -0
  33. package/dist/generators/index.js +5 -0
  34. package/dist/generators/index.js.map +1 -0
  35. package/dist/generators/queries-file.d.ts +8 -0
  36. package/dist/generators/queries-file.d.ts.map +1 -0
  37. package/dist/generators/queries-file.js +26 -0
  38. package/dist/generators/queries-file.js.map +1 -0
  39. package/dist/generators/routes-file.d.ts +12 -0
  40. package/dist/generators/routes-file.d.ts.map +1 -0
  41. package/dist/generators/routes-file.js +30 -0
  42. package/dist/generators/routes-file.js.map +1 -0
  43. package/dist/import-path.d.ts +41 -0
  44. package/dist/import-path.d.ts.map +1 -0
  45. package/dist/import-path.js +95 -0
  46. package/dist/import-path.js.map +1 -0
  47. package/dist/index.d.ts +29 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +21 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/metaobjects-config.d.ts +56 -0
  52. package/dist/metaobjects-config.d.ts.map +1 -0
  53. package/dist/metaobjects-config.js +42 -0
  54. package/dist/metaobjects-config.js.map +1 -0
  55. package/dist/naming.d.ts +29 -0
  56. package/dist/naming.d.ts.map +1 -0
  57. package/dist/naming.js +67 -0
  58. package/dist/naming.js.map +1 -0
  59. package/dist/overwrite-policy.d.ts +8 -0
  60. package/dist/overwrite-policy.d.ts.map +1 -0
  61. package/dist/overwrite-policy.js +23 -0
  62. package/dist/overwrite-policy.js.map +1 -0
  63. package/dist/pk-resolver.d.ts +18 -0
  64. package/dist/pk-resolver.d.ts.map +1 -0
  65. package/dist/pk-resolver.js +36 -0
  66. package/dist/pk-resolver.js.map +1 -0
  67. package/dist/projection/extract-view-spec.d.ts +18 -0
  68. package/dist/projection/extract-view-spec.d.ts.map +1 -0
  69. package/dist/projection/extract-view-spec.js +272 -0
  70. package/dist/projection/extract-view-spec.js.map +1 -0
  71. package/dist/projection/index.d.ts +5 -0
  72. package/dist/projection/index.d.ts.map +1 -0
  73. package/dist/projection/index.js +5 -0
  74. package/dist/projection/index.js.map +1 -0
  75. package/dist/projection/projection-detector.d.ts +4 -0
  76. package/dist/projection/projection-detector.d.ts.map +1 -0
  77. package/dist/projection/projection-detector.js +13 -0
  78. package/dist/projection/projection-detector.js.map +1 -0
  79. package/dist/projection/view-ddl-emit.d.ts +10 -0
  80. package/dist/projection/view-ddl-emit.d.ts.map +1 -0
  81. package/dist/projection/view-ddl-emit.js +47 -0
  82. package/dist/projection/view-ddl-emit.js.map +1 -0
  83. package/dist/projection/view-spec.d.ts +56 -0
  84. package/dist/projection/view-spec.d.ts.map +1 -0
  85. package/dist/projection/view-spec.js +2 -0
  86. package/dist/projection/view-spec.js.map +1 -0
  87. package/dist/relation-resolver.d.ts +21 -0
  88. package/dist/relation-resolver.d.ts.map +1 -0
  89. package/dist/relation-resolver.js +62 -0
  90. package/dist/relation-resolver.js.map +1 -0
  91. package/dist/render-context.d.ts +65 -0
  92. package/dist/render-context.d.ts.map +1 -0
  93. package/dist/render-context.js +28 -0
  94. package/dist/render-context.js.map +1 -0
  95. package/dist/runner.d.ts +17 -0
  96. package/dist/runner.d.ts.map +1 -0
  97. package/dist/runner.js +135 -0
  98. package/dist/runner.js.map +1 -0
  99. package/dist/templates/barrel.d.ts +8 -0
  100. package/dist/templates/barrel.d.ts.map +1 -0
  101. package/dist/templates/barrel.js +12 -0
  102. package/dist/templates/barrel.js.map +1 -0
  103. package/dist/templates/drizzle-schema.d.ts +13 -0
  104. package/dist/templates/drizzle-schema.d.ts.map +1 -0
  105. package/dist/templates/drizzle-schema.js +251 -0
  106. package/dist/templates/drizzle-schema.js.map +1 -0
  107. package/dist/templates/entity-constants.d.ts +4 -0
  108. package/dist/templates/entity-constants.d.ts.map +1 -0
  109. package/dist/templates/entity-constants.js +215 -0
  110. package/dist/templates/entity-constants.js.map +1 -0
  111. package/dist/templates/entity-file.d.ts +4 -0
  112. package/dist/templates/entity-file.d.ts.map +1 -0
  113. package/dist/templates/entity-file.js +45 -0
  114. package/dist/templates/entity-file.js.map +1 -0
  115. package/dist/templates/field-meta.d.ts +24 -0
  116. package/dist/templates/field-meta.d.ts.map +1 -0
  117. package/dist/templates/field-meta.js +117 -0
  118. package/dist/templates/field-meta.js.map +1 -0
  119. package/dist/templates/filter-allowlist.d.ts +5 -0
  120. package/dist/templates/filter-allowlist.d.ts.map +1 -0
  121. package/dist/templates/filter-allowlist.js +86 -0
  122. package/dist/templates/filter-allowlist.js.map +1 -0
  123. package/dist/templates/filter-shared.d.ts +15 -0
  124. package/dist/templates/filter-shared.d.ts.map +1 -0
  125. package/dist/templates/filter-shared.js +30 -0
  126. package/dist/templates/filter-shared.js.map +1 -0
  127. package/dist/templates/filter-type.d.ts +4 -0
  128. package/dist/templates/filter-type.d.ts.map +1 -0
  129. package/dist/templates/filter-type.js +78 -0
  130. package/dist/templates/filter-type.js.map +1 -0
  131. package/dist/templates/inferred-types.d.ts +4 -0
  132. package/dist/templates/inferred-types.d.ts.map +1 -0
  133. package/dist/templates/inferred-types.js +14 -0
  134. package/dist/templates/inferred-types.js.map +1 -0
  135. package/dist/templates/projection-decl.d.ts +21 -0
  136. package/dist/templates/projection-decl.d.ts.map +1 -0
  137. package/dist/templates/projection-decl.js +116 -0
  138. package/dist/templates/projection-decl.js.map +1 -0
  139. package/dist/templates/queries-file.d.ts +4 -0
  140. package/dist/templates/queries-file.d.ts.map +1 -0
  141. package/dist/templates/queries-file.js +39 -0
  142. package/dist/templates/queries-file.js.map +1 -0
  143. package/dist/templates/queries.d.ts +9 -0
  144. package/dist/templates/queries.d.ts.map +1 -0
  145. package/dist/templates/queries.js +115 -0
  146. package/dist/templates/queries.js.map +1 -0
  147. package/dist/templates/relations-block.d.ts +9 -0
  148. package/dist/templates/relations-block.d.ts.map +1 -0
  149. package/dist/templates/relations-block.js +45 -0
  150. package/dist/templates/relations-block.js.map +1 -0
  151. package/dist/templates/routes-file.d.ts +4 -0
  152. package/dist/templates/routes-file.d.ts.map +1 -0
  153. package/dist/templates/routes-file.js +158 -0
  154. package/dist/templates/routes-file.js.map +1 -0
  155. package/dist/templates/zod-validators.d.ts +4 -0
  156. package/dist/templates/zod-validators.d.ts.map +1 -0
  157. package/dist/templates/zod-validators.js +129 -0
  158. package/dist/templates/zod-validators.js.map +1 -0
  159. package/package.json +59 -0
  160. package/src/column-mapper.ts +266 -0
  161. package/src/constants.ts +10 -0
  162. package/src/errors.ts +10 -0
  163. package/src/format.ts +50 -0
  164. package/src/generator.ts +73 -0
  165. package/src/generators/barrel.ts +28 -0
  166. package/src/generators/entity-file.ts +33 -0
  167. package/src/generators/index.ts +4 -0
  168. package/src/generators/queries-file.ts +32 -0
  169. package/src/generators/routes-file.ts +36 -0
  170. package/src/import-path.ts +153 -0
  171. package/src/index.ts +45 -0
  172. package/src/metaobjects-config.ts +95 -0
  173. package/src/naming.ts +84 -0
  174. package/src/overwrite-policy.ts +39 -0
  175. package/src/pk-resolver.ts +47 -0
  176. package/src/projection/extract-view-spec.ts +372 -0
  177. package/src/projection/index.ts +4 -0
  178. package/src/projection/projection-detector.ts +26 -0
  179. package/src/projection/view-ddl-emit.ts +66 -0
  180. package/src/projection/view-spec.ts +62 -0
  181. package/src/relation-resolver.ts +87 -0
  182. package/src/render-context.ts +93 -0
  183. package/src/runner.ts +178 -0
  184. package/src/templates/barrel.ts +23 -0
  185. package/src/templates/drizzle-schema.ts +286 -0
  186. package/src/templates/entity-constants.ts +248 -0
  187. package/src/templates/entity-file.ts +51 -0
  188. package/src/templates/field-meta.ts +150 -0
  189. package/src/templates/filter-allowlist.ts +104 -0
  190. package/src/templates/filter-shared.ts +30 -0
  191. package/src/templates/filter-type.ts +93 -0
  192. package/src/templates/inferred-types.ts +16 -0
  193. package/src/templates/projection-decl.ts +146 -0
  194. package/src/templates/queries-file.ts +56 -0
  195. package/src/templates/queries.ts +132 -0
  196. package/src/templates/relations-block.ts +65 -0
  197. package/src/templates/routes-file.ts +179 -0
  198. package/src/templates/zod-validators.ts +140 -0
@@ -0,0 +1,140 @@
1
+ // Zod validators template — emits InsertSchema (for create) and UpdateSchema (for update).
2
+ // Auto-generated PKs are EXCLUDED from InsertSchema (caller doesn't provide them).
3
+ // @autoSet fields: INSERT → .optional().transform(() => new Date().toISOString())
4
+ // UPDATE → onCreate fields omitted entirely; onUpdate gets same transform
5
+
6
+ import { code, imp, type Code } from "ts-poet";
7
+ import { MetaObject, MetaField } from "@metaobjectsdev/metadata";
8
+ import {
9
+ FIELD_SUBTYPE_STRING, FIELD_SUBTYPE_INT, FIELD_SUBTYPE_LONG, FIELD_SUBTYPE_CURRENCY,
10
+ FIELD_SUBTYPE_BOOLEAN, FIELD_SUBTYPE_DOUBLE, FIELD_SUBTYPE_FLOAT,
11
+ FIELD_SUBTYPE_DATE, FIELD_SUBTYPE_TIME, FIELD_SUBTYPE_TIMESTAMP,
12
+ VALIDATOR_SUBTYPE_REQUIRED, VALIDATOR_SUBTYPE_LENGTH, VALIDATOR_SUBTYPE_REGEX,
13
+ IDENTITY_ATTR_FIELDS, IDENTITY_ATTR_GENERATION,
14
+ FIELD_ATTR_REQUIRED, FIELD_ATTR_MAX_LENGTH, FIELD_ATTR_DEFAULT,
15
+ FIELD_ATTR_AUTO_SET, AUTO_SET_ON_CREATE, AUTO_SET_ON_UPDATE,
16
+ VALIDATOR_ATTR_MAX, VALIDATOR_ATTR_MIN, VALIDATOR_ATTR_PATTERN,
17
+ GENERATION_INCREMENT, GENERATION_UUID,
18
+ } from "@metaobjectsdev/metadata";
19
+
20
+ export function renderZodValidators(obj: MetaObject): Code {
21
+ const z = imp("z@zod");
22
+ const primary = obj.primaryIdentity();
23
+ const autoGenPkFields = new Set<string>();
24
+ if (primary) {
25
+ const generation = primary.ownAttr(IDENTITY_ATTR_GENERATION);
26
+ if (generation === GENERATION_INCREMENT || generation === GENERATION_UUID) {
27
+ const fields = primary.ownAttr(IDENTITY_ATTR_FIELDS);
28
+ const fieldsList = Array.isArray(fields) ? fields : (typeof fields === "string" ? [fields] : []);
29
+ for (const f of fieldsList) autoGenPkFields.add(String(f));
30
+ }
31
+ }
32
+
33
+ const insertFieldLines: string[] = [];
34
+ const updateFieldLines: string[] = [];
35
+ for (const child of obj.fields()) {
36
+ if (autoGenPkFields.has(child.name)) continue;
37
+
38
+ const autoSet = child.ownAttr(FIELD_ATTR_AUTO_SET);
39
+
40
+ // Insert schema: @autoSet fields use transform (always override client input).
41
+ // NOTE: use "z" as a literal string here — these lines are embedded in the
42
+ // `code` template tag below which resolves the imp("z@zod") import.
43
+ if (autoSet === AUTO_SET_ON_CREATE || autoSet === AUTO_SET_ON_UPDATE) {
44
+ insertFieldLines.push(
45
+ ` ${child.name}: z.string().optional().transform(() => new Date().toISOString())`,
46
+ );
47
+ } else {
48
+ insertFieldLines.push(` ${child.name}: ${zodFieldExpr(child)}`);
49
+ }
50
+
51
+ // Update schema: @autoSet onCreate → omit entirely; onUpdate → transform
52
+ if (autoSet === AUTO_SET_ON_CREATE) {
53
+ // Omit: creation timestamps cannot be changed after creation
54
+ } else if (autoSet === AUTO_SET_ON_UPDATE) {
55
+ updateFieldLines.push(
56
+ ` ${child.name}: z.string().optional().transform(() => new Date().toISOString())`,
57
+ );
58
+ } else {
59
+ // All non-autoSet fields are optional in the update schema (PATCH semantics)
60
+ const expr = zodFieldExpr(child);
61
+ const optionalExpr = expr.endsWith(".optional()") ? expr : `${expr}.optional()`;
62
+ updateFieldLines.push(` ${child.name}: ${optionalExpr}`);
63
+ }
64
+ }
65
+
66
+ const insertSchemaName = `${obj.name}InsertSchema`;
67
+ const updateSchemaName = `${obj.name}UpdateSchema`;
68
+
69
+ return code`
70
+ export const ${insertSchemaName} = ${z}.object({
71
+ ${insertFieldLines.join(",\n")}
72
+ });
73
+
74
+ export const ${updateSchemaName} = ${z}.object({
75
+ ${updateFieldLines.join(",\n")}
76
+ });
77
+ `;
78
+ }
79
+
80
+ function zodFieldExpr(field: MetaField): string {
81
+ let base: string;
82
+ switch (field.subType) {
83
+ case FIELD_SUBTYPE_INT:
84
+ case FIELD_SUBTYPE_CURRENCY:
85
+ case FIELD_SUBTYPE_LONG:
86
+ base = "z.number().int()";
87
+ break;
88
+ case FIELD_SUBTYPE_DOUBLE:
89
+ case FIELD_SUBTYPE_FLOAT:
90
+ base = "z.number()";
91
+ break;
92
+ case FIELD_SUBTYPE_BOOLEAN:
93
+ base = "z.boolean()";
94
+ break;
95
+ case FIELD_SUBTYPE_DATE:
96
+ case FIELD_SUBTYPE_TIME:
97
+ case FIELD_SUBTYPE_TIMESTAMP:
98
+ base = "z.string()";
99
+ break;
100
+ case FIELD_SUBTYPE_STRING:
101
+ default:
102
+ base = "z.string()";
103
+ break;
104
+ }
105
+
106
+ if (field.isArray) base = `z.array(${base})`;
107
+
108
+ let isRequired = field.ownAttr(FIELD_ATTR_REQUIRED) === true;
109
+ let maxLen: number | undefined = field.ownAttr(FIELD_ATTR_MAX_LENGTH) as number | undefined;
110
+ let minLen: number | undefined;
111
+ let pattern: string | undefined;
112
+ for (const child of field.validators()) {
113
+ if (child.subType === VALIDATOR_SUBTYPE_REQUIRED) isRequired = true;
114
+ if (child.subType === VALIDATOR_SUBTYPE_LENGTH) {
115
+ const max = child.ownAttr(VALIDATOR_ATTR_MAX);
116
+ const min = child.ownAttr(VALIDATOR_ATTR_MIN);
117
+ if (typeof max === "number") maxLen = max;
118
+ if (typeof min === "number") minLen = min;
119
+ }
120
+ if (child.subType === VALIDATOR_SUBTYPE_REGEX) {
121
+ const p = child.ownAttr(VALIDATOR_ATTR_PATTERN);
122
+ if (typeof p === "string") pattern = p;
123
+ }
124
+ }
125
+
126
+ let chain = base;
127
+ if (field.subType === FIELD_SUBTYPE_STRING && !field.isArray) {
128
+ if (minLen !== undefined) chain += `.min(${minLen})`;
129
+ else if (isRequired) chain += `.min(1)`;
130
+ if (maxLen !== undefined) chain += `.max(${maxLen})`;
131
+ if (pattern !== undefined) chain += `.regex(new RegExp(${JSON.stringify(pattern)}))`;
132
+ }
133
+
134
+ // Fields with DB-level defaults are optional in the InsertSchema: the caller
135
+ // can omit them and the DB will fill in. Otherwise required-with-default
136
+ // would force callers to repeat the default at every call site.
137
+ const hasDefault = field.ownAttr(FIELD_ATTR_DEFAULT) !== undefined;
138
+ if (!isRequired || hasDefault) chain += `.optional()`;
139
+ return chain;
140
+ }