@eide/uniformgen 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (299) hide show
  1. package/README.md +356 -0
  2. package/dist/auth/credentials.d.ts +58 -0
  3. package/dist/auth/credentials.d.ts.map +1 -0
  4. package/dist/auth/credentials.js +107 -0
  5. package/dist/cli.d.ts +3 -0
  6. package/dist/cli.d.ts.map +1 -0
  7. package/dist/cli.js +563 -0
  8. package/dist/commands/init.d.ts +11 -0
  9. package/dist/commands/init.d.ts.map +1 -0
  10. package/dist/commands/init.js +113 -0
  11. package/dist/commands/login.d.ts +9 -0
  12. package/dist/commands/login.d.ts.map +1 -0
  13. package/dist/commands/login.js +158 -0
  14. package/dist/commands/logout.d.ts +5 -0
  15. package/dist/commands/logout.d.ts.map +1 -0
  16. package/dist/commands/logout.js +13 -0
  17. package/dist/commands/push.d.ts +13 -0
  18. package/dist/commands/push.d.ts.map +1 -0
  19. package/dist/commands/push.js +328 -0
  20. package/dist/commands/scaffold.d.ts +19 -0
  21. package/dist/commands/scaffold.d.ts.map +1 -0
  22. package/dist/commands/scaffold.js +366 -0
  23. package/dist/commands/seed.d.ts +20 -0
  24. package/dist/commands/seed.d.ts.map +1 -0
  25. package/dist/commands/seed.js +380 -0
  26. package/dist/commands/select-project.d.ts +10 -0
  27. package/dist/commands/select-project.d.ts.map +1 -0
  28. package/dist/commands/select-project.js +277 -0
  29. package/dist/commands/setup.d.ts +5 -0
  30. package/dist/commands/setup.d.ts.map +1 -0
  31. package/dist/commands/setup.js +51 -0
  32. package/dist/commands/sync.d.ts +13 -0
  33. package/dist/commands/sync.d.ts.map +1 -0
  34. package/dist/commands/sync.js +318 -0
  35. package/dist/commands/whoami.d.ts +5 -0
  36. package/dist/commands/whoami.d.ts.map +1 -0
  37. package/dist/commands/whoami.js +31 -0
  38. package/dist/config/load-config.d.ts +6 -0
  39. package/dist/config/load-config.d.ts.map +1 -0
  40. package/dist/config/load-config.js +103 -0
  41. package/dist/config/settings.d.ts +20 -0
  42. package/dist/config/settings.d.ts.map +1 -0
  43. package/dist/config/settings.js +64 -0
  44. package/dist/config/types.d.ts +152 -0
  45. package/dist/config/types.d.ts.map +1 -0
  46. package/dist/config/types.js +94 -0
  47. package/dist/fetcher/fetch-schemas.d.ts +140 -0
  48. package/dist/fetcher/fetch-schemas.d.ts.map +1 -0
  49. package/dist/fetcher/fetch-schemas.js +223 -0
  50. package/dist/fetcher/fetch-workflows.d.ts +53 -0
  51. package/dist/fetcher/fetch-workflows.d.ts.map +1 -0
  52. package/dist/fetcher/fetch-workflows.js +164 -0
  53. package/dist/generated/hooks/customer-detail.d.ts +74 -0
  54. package/dist/generated/hooks/customer-detail.d.ts.map +1 -0
  55. package/dist/generated/hooks/customer-detail.js +113 -0
  56. package/dist/generated/hooks/design-system.d.ts +74 -0
  57. package/dist/generated/hooks/design-system.d.ts.map +1 -0
  58. package/dist/generated/hooks/design-system.js +109 -0
  59. package/dist/generated/hooks/index.d.ts +16 -0
  60. package/dist/generated/hooks/index.d.ts.map +1 -0
  61. package/dist/generated/hooks/index.js +14 -0
  62. package/dist/generated/hooks/shopify-collection.d.ts +74 -0
  63. package/dist/generated/hooks/shopify-collection.d.ts.map +1 -0
  64. package/dist/generated/hooks/shopify-collection.js +113 -0
  65. package/dist/generated/hooks/shopify-market.d.ts +74 -0
  66. package/dist/generated/hooks/shopify-market.d.ts.map +1 -0
  67. package/dist/generated/hooks/shopify-market.js +109 -0
  68. package/dist/generated/hooks/shopify-product.d.ts +74 -0
  69. package/dist/generated/hooks/shopify-product.d.ts.map +1 -0
  70. package/dist/generated/hooks/shopify-product.js +113 -0
  71. package/dist/generated/hooks/shopify-variant.d.ts +74 -0
  72. package/dist/generated/hooks/shopify-variant.d.ts.map +1 -0
  73. package/dist/generated/hooks/shopify-variant.js +113 -0
  74. package/dist/generated/hooks/template.d.ts +74 -0
  75. package/dist/generated/hooks/template.d.ts.map +1 -0
  76. package/dist/generated/hooks/template.js +107 -0
  77. package/dist/generated/types/config.d.ts +88 -0
  78. package/dist/generated/types/config.d.ts.map +1 -0
  79. package/dist/generated/types/config.js +14 -0
  80. package/dist/generated/types/data-models/index.d.ts +7 -0
  81. package/dist/generated/types/data-models/index.d.ts.map +1 -0
  82. package/dist/generated/types/data-models/index.js +6 -0
  83. package/dist/generated/types/data-models/test.d.ts +29 -0
  84. package/dist/generated/types/data-models/test.d.ts.map +1 -0
  85. package/dist/generated/types/data-models/test.js +1 -0
  86. package/dist/generated/types/data-models/watch.d.ts +26 -0
  87. package/dist/generated/types/data-models/watch.d.ts.map +1 -0
  88. package/dist/generated/types/data-models/watch.js +1 -0
  89. package/dist/generated/types/field-types.d.ts +255 -0
  90. package/dist/generated/types/field-types.d.ts.map +1 -0
  91. package/dist/generated/types/field-types.js +35 -0
  92. package/dist/generated/types/hooks.d.ts +106 -0
  93. package/dist/generated/types/hooks.d.ts.map +1 -0
  94. package/dist/generated/types/hooks.js +9 -0
  95. package/dist/generated/types/index.d.ts +10 -0
  96. package/dist/generated/types/index.d.ts.map +1 -0
  97. package/dist/generated/types/index.js +9 -0
  98. package/dist/generated/types/models/button-variant.d.ts +16 -0
  99. package/dist/generated/types/models/button-variant.d.ts.map +1 -0
  100. package/dist/generated/types/models/button-variant.js +1 -0
  101. package/dist/generated/types/models/color-palette.d.ts +27 -0
  102. package/dist/generated/types/models/color-palette.d.ts.map +1 -0
  103. package/dist/generated/types/models/color-palette.js +1 -0
  104. package/dist/generated/types/models/color-with-scale.d.ts +15 -0
  105. package/dist/generated/types/models/color-with-scale.d.ts.map +1 -0
  106. package/dist/generated/types/models/color-with-scale.js +1 -0
  107. package/dist/generated/types/models/context.d.ts +53 -0
  108. package/dist/generated/types/models/context.d.ts.map +1 -0
  109. package/dist/generated/types/models/context.js +51 -0
  110. package/dist/generated/types/models/customer-detail.d.ts +32 -0
  111. package/dist/generated/types/models/customer-detail.d.ts.map +1 -0
  112. package/dist/generated/types/models/customer-detail.js +26 -0
  113. package/dist/generated/types/models/design-system-badges.d.ts +16 -0
  114. package/dist/generated/types/models/design-system-badges.d.ts.map +1 -0
  115. package/dist/generated/types/models/design-system-badges.js +1 -0
  116. package/dist/generated/types/models/design-system-buttons.d.ts +17 -0
  117. package/dist/generated/types/models/design-system-buttons.d.ts.map +1 -0
  118. package/dist/generated/types/models/design-system-buttons.js +1 -0
  119. package/dist/generated/types/models/design-system-cards.d.ts +16 -0
  120. package/dist/generated/types/models/design-system-cards.d.ts.map +1 -0
  121. package/dist/generated/types/models/design-system-cards.js +1 -0
  122. package/dist/generated/types/models/design-system-colors.d.ts +12 -0
  123. package/dist/generated/types/models/design-system-colors.d.ts.map +1 -0
  124. package/dist/generated/types/models/design-system-colors.js +1 -0
  125. package/dist/generated/types/models/design-system-dark-mode.d.ts +13 -0
  126. package/dist/generated/types/models/design-system-dark-mode.d.ts.map +1 -0
  127. package/dist/generated/types/models/design-system-dark-mode.js +1 -0
  128. package/dist/generated/types/models/design-system-focus-ring.d.ts +14 -0
  129. package/dist/generated/types/models/design-system-focus-ring.d.ts.map +1 -0
  130. package/dist/generated/types/models/design-system-focus-ring.js +1 -0
  131. package/dist/generated/types/models/design-system-grid.d.ts +18 -0
  132. package/dist/generated/types/models/design-system-grid.d.ts.map +1 -0
  133. package/dist/generated/types/models/design-system-grid.js +1 -0
  134. package/dist/generated/types/models/design-system-inputs.d.ts +26 -0
  135. package/dist/generated/types/models/design-system-inputs.d.ts.map +1 -0
  136. package/dist/generated/types/models/design-system-inputs.js +1 -0
  137. package/dist/generated/types/models/design-system-links.d.ts +16 -0
  138. package/dist/generated/types/models/design-system-links.d.ts.map +1 -0
  139. package/dist/generated/types/models/design-system-links.js +1 -0
  140. package/dist/generated/types/models/design-system-shadows.d.ts +20 -0
  141. package/dist/generated/types/models/design-system-shadows.d.ts.map +1 -0
  142. package/dist/generated/types/models/design-system-shadows.js +1 -0
  143. package/dist/generated/types/models/design-system-spacing.d.ts +13 -0
  144. package/dist/generated/types/models/design-system-spacing.d.ts.map +1 -0
  145. package/dist/generated/types/models/design-system-spacing.js +1 -0
  146. package/dist/generated/types/models/design-system-transitions.d.ts +15 -0
  147. package/dist/generated/types/models/design-system-transitions.d.ts.map +1 -0
  148. package/dist/generated/types/models/design-system-transitions.js +1 -0
  149. package/dist/generated/types/models/design-system-typography.d.ts +21 -0
  150. package/dist/generated/types/models/design-system-typography.d.ts.map +1 -0
  151. package/dist/generated/types/models/design-system-typography.js +1 -0
  152. package/dist/generated/types/models/design-system.d.ts +138 -0
  153. package/dist/generated/types/models/design-system.d.ts.map +1 -0
  154. package/dist/generated/types/models/design-system.js +64 -0
  155. package/dist/generated/types/models/experiment.d.ts +57 -0
  156. package/dist/generated/types/models/experiment.d.ts.map +1 -0
  157. package/dist/generated/types/models/experiment.js +55 -0
  158. package/dist/generated/types/models/font-file.d.ts +16 -0
  159. package/dist/generated/types/models/font-file.d.ts.map +1 -0
  160. package/dist/generated/types/models/font-file.js +1 -0
  161. package/dist/generated/types/models/index.d.ts +38 -0
  162. package/dist/generated/types/models/index.d.ts.map +1 -0
  163. package/dist/generated/types/models/index.js +12 -0
  164. package/dist/generated/types/models/integration.d.ts +32 -0
  165. package/dist/generated/types/models/integration.d.ts.map +1 -0
  166. package/dist/generated/types/models/integration.js +26 -0
  167. package/dist/generated/types/models/route-tree.d.ts +43 -0
  168. package/dist/generated/types/models/route-tree.d.ts.map +1 -0
  169. package/dist/generated/types/models/route-tree.js +39 -0
  170. package/dist/generated/types/models/segment.d.ts +57 -0
  171. package/dist/generated/types/models/segment.d.ts.map +1 -0
  172. package/dist/generated/types/models/segment.js +55 -0
  173. package/dist/generated/types/models/shopify-collection.d.ts +32 -0
  174. package/dist/generated/types/models/shopify-collection.d.ts.map +1 -0
  175. package/dist/generated/types/models/shopify-collection.js +26 -0
  176. package/dist/generated/types/models/shopify-market.d.ts +32 -0
  177. package/dist/generated/types/models/shopify-market.d.ts.map +1 -0
  178. package/dist/generated/types/models/shopify-market.js +26 -0
  179. package/dist/generated/types/models/shopify-product.d.ts +32 -0
  180. package/dist/generated/types/models/shopify-product.d.ts.map +1 -0
  181. package/dist/generated/types/models/shopify-product.js +26 -0
  182. package/dist/generated/types/models/shopify-variant.d.ts +32 -0
  183. package/dist/generated/types/models/shopify-variant.d.ts.map +1 -0
  184. package/dist/generated/types/models/shopify-variant.js +26 -0
  185. package/dist/generated/types/models/template.d.ts +53 -0
  186. package/dist/generated/types/models/template.d.ts.map +1 -0
  187. package/dist/generated/types/models/template.js +40 -0
  188. package/dist/generated/types/models/typography-variant.d.ts +15 -0
  189. package/dist/generated/types/models/typography-variant.d.ts.map +1 -0
  190. package/dist/generated/types/models/typography-variant.js +1 -0
  191. package/dist/generated/types/scalars.d.ts +56 -0
  192. package/dist/generated/types/scalars.d.ts.map +1 -0
  193. package/dist/generated/types/scalars.js +6 -0
  194. package/dist/generators/admin/index.d.ts +32 -0
  195. package/dist/generators/admin/index.d.ts.map +1 -0
  196. package/dist/generators/admin/index.js +219 -0
  197. package/dist/generators/admin/mutations.d.ts +23 -0
  198. package/dist/generators/admin/mutations.d.ts.map +1 -0
  199. package/dist/generators/admin/mutations.js +424 -0
  200. package/dist/generators/admin/queries.d.ts +20 -0
  201. package/dist/generators/admin/queries.d.ts.map +1 -0
  202. package/dist/generators/admin/queries.js +476 -0
  203. package/dist/generators/admin/types.d.ts +28 -0
  204. package/dist/generators/admin/types.d.ts.map +1 -0
  205. package/dist/generators/admin/types.js +254 -0
  206. package/dist/generators/cms/index.d.ts +29 -0
  207. package/dist/generators/cms/index.d.ts.map +1 -0
  208. package/dist/generators/cms/index.js +126 -0
  209. package/dist/generators/cms/route.d.ts +27 -0
  210. package/dist/generators/cms/route.d.ts.map +1 -0
  211. package/dist/generators/cms/route.js +409 -0
  212. package/dist/generators/cms/types.d.ts +15 -0
  213. package/dist/generators/cms/types.d.ts.map +1 -0
  214. package/dist/generators/cms/types.js +137 -0
  215. package/dist/generators/contexts/index.d.ts +25 -0
  216. package/dist/generators/contexts/index.d.ts.map +1 -0
  217. package/dist/generators/contexts/index.js +591 -0
  218. package/dist/generators/documents/data-models.d.ts +6 -0
  219. package/dist/generators/documents/data-models.d.ts.map +1 -0
  220. package/dist/generators/documents/data-models.js +61 -0
  221. package/dist/generators/documents/entity-models.d.ts +7 -0
  222. package/dist/generators/documents/entity-models.d.ts.map +1 -0
  223. package/dist/generators/documents/entity-models.js +87 -0
  224. package/dist/generators/documents/workflows.d.ts +11 -0
  225. package/dist/generators/documents/workflows.d.ts.map +1 -0
  226. package/dist/generators/documents/workflows.js +101 -0
  227. package/dist/generators/filters/index.d.ts +16 -0
  228. package/dist/generators/filters/index.d.ts.map +1 -0
  229. package/dist/generators/filters/index.js +384 -0
  230. package/dist/generators/hooks/agnostic.d.ts +16 -0
  231. package/dist/generators/hooks/agnostic.d.ts.map +1 -0
  232. package/dist/generators/hooks/agnostic.js +248 -0
  233. package/dist/generators/hooks/index.d.ts +9 -0
  234. package/dist/generators/hooks/index.d.ts.map +1 -0
  235. package/dist/generators/hooks/index.js +8 -0
  236. package/dist/generators/hooks/react.d.ts +16 -0
  237. package/dist/generators/hooks/react.d.ts.map +1 -0
  238. package/dist/generators/hooks/react.js +394 -0
  239. package/dist/generators/hooks/remix.d.ts +16 -0
  240. package/dist/generators/hooks/remix.d.ts.map +1 -0
  241. package/dist/generators/hooks/remix.js +349 -0
  242. package/dist/generators/hooks/workflows.d.ts +23 -0
  243. package/dist/generators/hooks/workflows.d.ts.map +1 -0
  244. package/dist/generators/hooks/workflows.js +312 -0
  245. package/dist/generators/resolve/index.d.ts +13 -0
  246. package/dist/generators/resolve/index.d.ts.map +1 -0
  247. package/dist/generators/resolve/index.js +13 -0
  248. package/dist/generators/resolve/platform.d.ts +29 -0
  249. package/dist/generators/resolve/platform.d.ts.map +1 -0
  250. package/dist/generators/resolve/platform.js +479 -0
  251. package/dist/generators/types/config.d.ts +7 -0
  252. package/dist/generators/types/config.d.ts.map +1 -0
  253. package/dist/generators/types/config.js +113 -0
  254. package/dist/generators/types/data-models.d.ts +10 -0
  255. package/dist/generators/types/data-models.d.ts.map +1 -0
  256. package/dist/generators/types/data-models.js +100 -0
  257. package/dist/generators/types/entity-models.d.ts +13 -0
  258. package/dist/generators/types/entity-models.d.ts.map +1 -0
  259. package/dist/generators/types/entity-models.js +241 -0
  260. package/dist/generators/types/field-types.d.ts +9 -0
  261. package/dist/generators/types/field-types.d.ts.map +1 -0
  262. package/dist/generators/types/field-types.js +651 -0
  263. package/dist/generators/types/hooks.d.ts +7 -0
  264. package/dist/generators/types/hooks.d.ts.map +1 -0
  265. package/dist/generators/types/hooks.js +132 -0
  266. package/dist/generators/types/scalars.d.ts +6 -0
  267. package/dist/generators/types/scalars.d.ts.map +1 -0
  268. package/dist/generators/types/scalars.js +68 -0
  269. package/dist/generators/types/user-details.d.ts +6 -0
  270. package/dist/generators/types/user-details.d.ts.map +1 -0
  271. package/dist/generators/types/user-details.js +60 -0
  272. package/dist/generators/types/workflows.d.ts +15 -0
  273. package/dist/generators/types/workflows.d.ts.map +1 -0
  274. package/dist/generators/types/workflows.js +163 -0
  275. package/dist/graphql/generated/gql.d.ts +47 -0
  276. package/dist/graphql/generated/gql.d.ts.map +1 -0
  277. package/dist/graphql/generated/gql.js +10 -0
  278. package/dist/graphql/generated/graphql.d.ts +8455 -0
  279. package/dist/graphql/generated/graphql.d.ts.map +1 -0
  280. package/dist/graphql/generated/graphql.js +573 -0
  281. package/dist/graphql/generated/index.d.ts +2 -0
  282. package/dist/graphql/generated/index.d.ts.map +1 -0
  283. package/dist/graphql/generated/index.js +1 -0
  284. package/dist/index.d.ts +13 -0
  285. package/dist/index.d.ts.map +1 -0
  286. package/dist/index.js +9 -0
  287. package/dist/schema/define-entity-model.d.ts +122 -0
  288. package/dist/schema/define-entity-model.d.ts.map +1 -0
  289. package/dist/schema/define-entity-model.js +59 -0
  290. package/dist/schema/schema-loader.d.ts +10 -0
  291. package/dist/schema/schema-loader.d.ts.map +1 -0
  292. package/dist/schema/schema-loader.js +91 -0
  293. package/dist/utils/field-mapping.d.ts +83 -0
  294. package/dist/utils/field-mapping.d.ts.map +1 -0
  295. package/dist/utils/field-mapping.js +334 -0
  296. package/dist/writer/write-files.d.ts +12 -0
  297. package/dist/writer/write-files.d.ts.map +1 -0
  298. package/dist/writer/write-files.js +35 -0
  299. package/package.json +70 -0
@@ -0,0 +1,334 @@
1
+ /**
2
+ * Maps EIDE field types to TypeScript types
3
+ * Based on the field type mapping table in uniformgen-typesafe-entities.md
4
+ */
5
+ /**
6
+ * Primitive field types that are built-in
7
+ * Based on the current field type registry in packages/platform/src/entities/field-types/registry.ts
8
+ */
9
+ export const PRIMITIVE_FIELD_TYPES = new Set([
10
+ // Basic
11
+ 'text',
12
+ 'richtext',
13
+ 'number',
14
+ 'boolean',
15
+ // Validated (use text primitive with validation)
16
+ 'email',
17
+ 'phone',
18
+ 'url',
19
+ // DateTime
20
+ 'date',
21
+ // Media
22
+ 'image',
23
+ 'video',
24
+ 'file',
25
+ // Financial
26
+ 'currency',
27
+ // Choices
28
+ 'select',
29
+ 'multiselect',
30
+ // Complex
31
+ 'json',
32
+ 'list',
33
+ 'tree',
34
+ // References
35
+ 'entity-reference',
36
+ // Navigation
37
+ 'link',
38
+ // Styling
39
+ 'design-system-style',
40
+ ]);
41
+ /**
42
+ * Check if a field type is a primitive (built-in) type
43
+ */
44
+ export function isPrimitiveFieldType(type) {
45
+ return PRIMITIVE_FIELD_TYPES.has(type);
46
+ }
47
+ /**
48
+ * Field type to TypeScript type mapping
49
+ * Based on the current field type registry in packages/platform/src/entities/field-types/registry.ts
50
+ */
51
+ export const FIELD_TYPE_MAPPING = {
52
+ // Basic types
53
+ text: {
54
+ outputType: 'string',
55
+ inputType: 'string',
56
+ },
57
+ richtext: {
58
+ outputType: 'RichtextValue',
59
+ inputType: 'RichtextValue',
60
+ needsImport: 'field-types',
61
+ },
62
+ number: {
63
+ outputType: 'number',
64
+ inputType: 'number',
65
+ },
66
+ boolean: {
67
+ outputType: 'boolean',
68
+ inputType: 'boolean',
69
+ },
70
+ // Validated types (use text primitive with validation)
71
+ email: {
72
+ outputType: 'string',
73
+ inputType: 'string',
74
+ },
75
+ phone: {
76
+ outputType: 'string',
77
+ inputType: 'string',
78
+ },
79
+ url: {
80
+ outputType: 'string',
81
+ inputType: 'string',
82
+ },
83
+ // DateTime
84
+ date: {
85
+ outputType: 'Date',
86
+ inputType: 'string', // ISO date string
87
+ },
88
+ // Media types
89
+ image: {
90
+ outputType: 'ImageValue',
91
+ inputType: 'string', // Image ID
92
+ needsImport: 'field-types',
93
+ },
94
+ video: {
95
+ outputType: 'VideoValue',
96
+ inputType: 'string', // Video ID
97
+ needsImport: 'field-types',
98
+ },
99
+ file: {
100
+ outputType: 'FileValue',
101
+ inputType: 'string', // File ID
102
+ needsImport: 'field-types',
103
+ },
104
+ // Financial
105
+ currency: {
106
+ outputType: 'CurrencyValue',
107
+ inputType: 'CurrencyValue',
108
+ needsImport: 'field-types',
109
+ },
110
+ // Choice types
111
+ select: {
112
+ outputType: 'string', // Can be union type if choices provided
113
+ inputType: 'string',
114
+ },
115
+ multiselect: {
116
+ outputType: 'string[]',
117
+ inputType: 'string[]',
118
+ },
119
+ // Complex types
120
+ json: {
121
+ outputType: 'unknown',
122
+ inputType: 'unknown',
123
+ },
124
+ list: {
125
+ outputType: 'unknown[]', // Type depends on itemType
126
+ inputType: 'unknown[]',
127
+ },
128
+ tree: {
129
+ outputType: 'unknown[]', // Hierarchical array
130
+ inputType: 'unknown[]',
131
+ },
132
+ // References
133
+ 'entity-reference': {
134
+ outputType: 'ReferenceValue',
135
+ inputType: 'ReferenceValue',
136
+ needsImport: 'field-types',
137
+ },
138
+ // Navigation
139
+ link: {
140
+ outputType: 'LinkValue',
141
+ inputType: 'LinkValue',
142
+ needsImport: 'field-types',
143
+ },
144
+ // Styling
145
+ 'design-system-style': {
146
+ outputType: 'Record<string, string>',
147
+ inputType: 'Record<string, string>',
148
+ },
149
+ };
150
+ /**
151
+ * Get TypeScript type for a field
152
+ */
153
+ export function getFieldType(field, mode = 'output') {
154
+ const mapping = FIELD_TYPE_MAPPING[field.type];
155
+ // If not a primitive type, it's an inline schema reference
156
+ if (!mapping) {
157
+ if (isPrimitiveFieldType(field.type)) {
158
+ console.warn(`Unknown field type: ${field.type}, defaulting to 'unknown'`);
159
+ return 'unknown';
160
+ }
161
+ // Return PascalCase type name for inline schema reference
162
+ return toPascalCase(field.type);
163
+ }
164
+ let tsType = mode === 'output' ? mapping.outputType : mapping.inputType;
165
+ // Handle select with choices (create union type)
166
+ if (field.type === 'select' && field.options?.options) {
167
+ const options = field.options.options;
168
+ if (options.length > 0) {
169
+ const values = options.map((o) => `'${o.value}'`).join(' | ');
170
+ tsType = values;
171
+ }
172
+ }
173
+ // Handle multiselect with choices (create union type array)
174
+ if (field.type === 'multiselect' && field.options?.options) {
175
+ const options = field.options.options;
176
+ if (options.length > 0) {
177
+ const values = options.map((o) => `'${o.value}'`).join(' | ');
178
+ tsType = `(${values})[]`;
179
+ }
180
+ }
181
+ // Handle list with itemType
182
+ if ((field.type === 'list' || field.type === 'tree') && field.options?.itemType) {
183
+ const itemType = field.options.itemType;
184
+ const itemMapping = FIELD_TYPE_MAPPING[itemType];
185
+ if (itemMapping) {
186
+ const itemTsType = mode === 'output' ? itemMapping.outputType : itemMapping.inputType;
187
+ tsType = `${itemTsType}[]`;
188
+ }
189
+ else if (!isPrimitiveFieldType(itemType)) {
190
+ // Inline schema reference
191
+ tsType = `${toPascalCase(itemType)}[]`;
192
+ }
193
+ }
194
+ return tsType;
195
+ }
196
+ /**
197
+ * Get all imports needed for a set of fields
198
+ */
199
+ export function getRequiredImports(fields) {
200
+ const imports = new Set();
201
+ for (const field of fields) {
202
+ const mapping = FIELD_TYPE_MAPPING[field.type];
203
+ if (mapping?.needsImport) {
204
+ imports.add(mapping.needsImport);
205
+ }
206
+ // Check list/tree itemType
207
+ if ((field.type === 'list' || field.type === 'tree') && field.options?.itemType) {
208
+ const itemMapping = FIELD_TYPE_MAPPING[field.options.itemType];
209
+ if (itemMapping?.needsImport) {
210
+ imports.add(itemMapping.needsImport);
211
+ }
212
+ }
213
+ }
214
+ return imports;
215
+ }
216
+ /**
217
+ * Get all inline schema references from fields
218
+ * Returns the keys of entity models that are used as field types
219
+ */
220
+ export function getInlineSchemaReferences(fields) {
221
+ const references = new Set();
222
+ for (const field of fields) {
223
+ // Check if field type is an inline schema reference
224
+ if (!isPrimitiveFieldType(field.type)) {
225
+ references.add(field.type);
226
+ }
227
+ // Check list/tree itemType for inline schema references
228
+ if ((field.type === 'list' || field.type === 'tree') && field.options?.itemType) {
229
+ const itemType = field.options.itemType;
230
+ if (!isPrimitiveFieldType(itemType)) {
231
+ references.add(itemType);
232
+ }
233
+ }
234
+ }
235
+ return references;
236
+ }
237
+ /**
238
+ * Convert field ID to camelCase
239
+ */
240
+ export function toCamelCase(str) {
241
+ return str.replace(/[-_]([a-z])/g, (_, letter) => letter.toUpperCase());
242
+ }
243
+ /**
244
+ * Convert field ID to PascalCase
245
+ */
246
+ export function toPascalCase(str) {
247
+ const camel = toCamelCase(str);
248
+ return camel.charAt(0).toUpperCase() + camel.slice(1);
249
+ }
250
+ /**
251
+ * Sanitize field name for TypeScript
252
+ * Replaces special characters and spaces with underscores.
253
+ * Prefixes with underscore if name starts with a number.
254
+ */
255
+ export function sanitizeFieldName(name) {
256
+ // Replace all non-alphanumeric and non-underscore characters with underscores
257
+ let sanitized = name.replace(/[^a-zA-Z0-9_]/g, '_');
258
+ // If starts with a number, prefix with underscore
259
+ if (/^[0-9]/.test(sanitized)) {
260
+ sanitized = '_' + sanitized;
261
+ }
262
+ return sanitized;
263
+ }
264
+ /**
265
+ * Generate a strongly-typed field definition object string
266
+ * Returns a string that can be used in generated TypeScript code
267
+ */
268
+ export function generateFieldDef(field) {
269
+ const parts = [];
270
+ // Required properties
271
+ parts.push(`key: '${field.key}'`);
272
+ parts.push(`type: '${field.type}'`);
273
+ parts.push(`label: '${field.label.replace(/'/g, "\\'")}'`);
274
+ // Optional properties
275
+ if (field.required) {
276
+ parts.push('required: true');
277
+ }
278
+ if (field.helpText) {
279
+ parts.push(`helpText: '${field.helpText.replace(/'/g, "\\'")}'`);
280
+ }
281
+ // Handle field-type specific options
282
+ if (field.type === 'text' && field.options) {
283
+ if (field.options.maxLength) {
284
+ parts.push(`maxLength: ${field.options.maxLength}`);
285
+ }
286
+ if (field.options.minLength) {
287
+ parts.push(`minLength: ${field.options.minLength}`);
288
+ }
289
+ }
290
+ if (field.type === 'number' && field.options) {
291
+ if (field.options.min !== undefined) {
292
+ parts.push(`min: ${field.options.min}`);
293
+ }
294
+ if (field.options.max !== undefined) {
295
+ parts.push(`max: ${field.options.max}`);
296
+ }
297
+ if (field.options.step !== undefined) {
298
+ parts.push(`step: ${field.options.step}`);
299
+ }
300
+ }
301
+ if ((field.type === 'select' || field.type === 'multiselect') && field.options?.options) {
302
+ const options = field.options.options;
303
+ const optionsStr = options
304
+ .map((o) => `{ label: '${o.label.replace(/'/g, "\\'")}', value: '${o.value.replace(/'/g, "\\'")}' }`)
305
+ .join(', ');
306
+ parts.push(`options: [${optionsStr}]`);
307
+ }
308
+ if (field.type === 'entity-reference' && field.options?.referenceTypes) {
309
+ const refTypes = field.options.referenceTypes;
310
+ parts.push(`referenceTypes: [${refTypes.map((t) => `'${t}'`).join(', ')}]`);
311
+ if (field.options.multiple) {
312
+ parts.push('multiple: true');
313
+ }
314
+ }
315
+ if ((field.type === 'list' || field.type === 'tree') && field.options?.itemType) {
316
+ parts.push(`itemType: '${field.options.itemType}'`);
317
+ if (field.options.minItems !== undefined) {
318
+ parts.push(`minItems: ${field.options.minItems}`);
319
+ }
320
+ if (field.options.maxItems !== undefined) {
321
+ parts.push(`maxItems: ${field.options.maxItems}`);
322
+ }
323
+ }
324
+ if ((field.type === 'image' || field.type === 'video' || field.type === 'file') && field.options) {
325
+ if (field.options.allowedTypes) {
326
+ const types = field.options.allowedTypes;
327
+ parts.push(`allowedTypes: [${types.map((t) => `'${t}'`).join(', ')}]`);
328
+ }
329
+ if (field.options.maxSize) {
330
+ parts.push(`maxSize: ${field.options.maxSize}`);
331
+ }
332
+ }
333
+ return `{ ${parts.join(', ')} }`;
334
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Write a file to disk with optional Prettier formatting
3
+ */
4
+ export declare function writeGeneratedFile(filePath: string, content: string, usePrettier?: boolean): Promise<void>;
5
+ /**
6
+ * Write multiple files in batch
7
+ */
8
+ export declare function writeFiles(files: Array<{
9
+ path: string;
10
+ content: string;
11
+ }>, usePrettier?: boolean): Promise<void>;
12
+ //# sourceMappingURL=write-files.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"write-files.d.ts","sourceRoot":"","sources":["../../src/writer/write-files.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,MAAM,EACf,WAAW,GAAE,OAAc,GAC1B,OAAO,CAAC,IAAI,CAAC,CAyBf;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,EAC/C,WAAW,GAAE,OAAc,GAC1B,OAAO,CAAC,IAAI,CAAC,CAMf"}
@@ -0,0 +1,35 @@
1
+ import { mkdir, writeFile } from 'fs/promises';
2
+ import { dirname } from 'path';
3
+ import { format } from 'prettier';
4
+ /**
5
+ * Write a file to disk with optional Prettier formatting
6
+ */
7
+ export async function writeGeneratedFile(filePath, content, usePrettier = true) {
8
+ // Ensure directory exists
9
+ await mkdir(dirname(filePath), { recursive: true });
10
+ // Format with Prettier if enabled
11
+ let formattedContent = content;
12
+ if (usePrettier) {
13
+ try {
14
+ const parser = filePath.endsWith('.graphql') ? 'graphql' : 'typescript';
15
+ formattedContent = await format(content, {
16
+ parser,
17
+ semi: true,
18
+ singleQuote: true,
19
+ trailingComma: 'es5',
20
+ printWidth: 100,
21
+ });
22
+ }
23
+ catch (_error) {
24
+ console.warn(`Warning: Failed to format ${filePath}, writing unformatted`);
25
+ }
26
+ }
27
+ // Write file
28
+ await writeFile(filePath, formattedContent, 'utf-8');
29
+ }
30
+ /**
31
+ * Write multiple files in batch
32
+ */
33
+ export async function writeFiles(files, usePrettier = true) {
34
+ await Promise.all(files.map((file) => writeGeneratedFile(file.path, file.content, usePrettier)));
35
+ }
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "@eide/uniformgen",
3
+ "version": "0.1.0",
4
+ "description": "Type-safe code generator for Foir - generates TypeScript types and GraphQL operations from your project schemas",
5
+ "type": "module",
6
+ "publishConfig": {
7
+ "access": "public"
8
+ },
9
+ "bin": {
10
+ "uniformgen": "./dist/cli.js"
11
+ },
12
+ "exports": {
13
+ ".": {
14
+ "types": "./dist/index.js",
15
+ "import": "./dist/index.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "README.md"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "echo 'UniformGen is a CLI tool. Use ./test-uniformgen.sh to test it locally.'",
25
+ "dev:cli": "tsx src/cli.ts",
26
+ "dev:watch": "tsx watch src/cli.ts",
27
+ "check-types": "tsc --noEmit",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest watch",
30
+ "codegen": "graphql-codegen --config codegen.ts"
31
+ },
32
+ "keywords": [
33
+ "foir",
34
+ "eide",
35
+ "cms",
36
+ "codegen",
37
+ "typescript",
38
+ "graphql",
39
+ "type-safety"
40
+ ],
41
+ "author": "EIDE Team",
42
+ "license": "UNLICENSED",
43
+ "dependencies": {
44
+ "chalk": "^5.3.0",
45
+ "commander": "^12.1.0",
46
+ "dotenv": "^16.4.5",
47
+ "glob": "^10.3.10",
48
+ "graphql": "^16.9.0",
49
+ "graphql-request": "^7.1.2",
50
+ "inquirer": "^9.2.12",
51
+ "open": "^10.1.0",
52
+ "ora": "^8.1.1",
53
+ "prettier": "^3.4.2",
54
+ "zod": "^3.24.1"
55
+ },
56
+ "devDependencies": {
57
+ "@foir/config": "workspace:*",
58
+ "@graphql-codegen/cli": "^5.0.7",
59
+ "@graphql-codegen/client-preset": "^4.8.3",
60
+ "@graphql-typed-document-node/core": "^3.2.0",
61
+ "@types/inquirer": "^9.0.7",
62
+ "@types/node": "^22.5.0",
63
+ "tsx": "^4.20.0",
64
+ "typescript": "5.9.2",
65
+ "vitest": "^3.2.4"
66
+ },
67
+ "engines": {
68
+ "node": ">=18.0.0"
69
+ }
70
+ }