@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
package/dist/cli.js ADDED
@@ -0,0 +1,563 @@
1
+ #!/usr/bin/env node
2
+ // Load environment variables from .env.local
3
+ import { config } from 'dotenv';
4
+ import { resolve, dirname } from 'path';
5
+ import { fileURLToPath } from 'url';
6
+ const __filename = fileURLToPath(import.meta.url);
7
+ const __dirname = dirname(__filename);
8
+ // Load .env.local from package root
9
+ config({ path: resolve(__dirname, '../.env.local') });
10
+ import { Command } from 'commander';
11
+ import chalk from 'chalk';
12
+ import ora from 'ora';
13
+ import { join } from 'path';
14
+ import { loadConfig } from './config/load-config.js';
15
+ import { getSettings } from './config/settings.js';
16
+ import { fetchEntityModels, fetchContextDefinitions, } from './fetcher/fetch-schemas.js';
17
+ import { generateEntityModelTypes, generateEntityModelsIndex, } from './generators/types/entity-models.js';
18
+ import { generateFieldTypesFile } from './generators/types/field-types.js';
19
+ import { generateHooksFile } from './generators/types/hooks.js';
20
+ import { generateConfigFile } from './generators/types/config.js';
21
+ import { generateEntityModelDocuments } from './generators/documents/entity-models.js';
22
+ import { generateAgnosticHooks, generateAgnosticHooksIndex, generateReactHooks, generateReactHooksIndex, generateRemixHooks, generateRemixHooksIndex, } from './generators/hooks/index.js';
23
+ import { generatePlatformResolveReact, generatePlatformResolveRemix, generatePlatformResolveIndexReact, generatePlatformResolveIndexRemix, } from './generators/resolve/index.js';
24
+ // Phase 13: Admin layer generators
25
+ import { generateAdminHooksReact, generateAdminHooksRemix, generateAdminHooksIndexReact, generateAdminHooksIndexRemix, } from './generators/admin/index.js';
26
+ // Phase 13: CMS layer generators
27
+ import { getRoutableModels, generateCmsTypes, generateResolveRouteReact as generateCmsRouteReact, generateResolveRouteRemix as generateCmsRouteRemix, generateCmsIndexReact, generateCmsIndexRemix, } from './generators/cms/index.js';
28
+ import { generateModelFilters, generateFiltersIndex, } from './generators/filters/index.js';
29
+ import { generateContextsFile, generateEmptyContextsFile, } from './generators/contexts/index.js';
30
+ import { writeFiles } from './writer/write-files.js';
31
+ import { login } from './commands/login.js';
32
+ import { logout } from './commands/logout.js';
33
+ import { selectProject } from './commands/select-project.js';
34
+ import { whoami } from './commands/whoami.js';
35
+ import { setup } from './commands/setup.js';
36
+ import { push } from './commands/push.js';
37
+ import { init } from './commands/init.js';
38
+ import { sync } from './commands/sync.js';
39
+ import { scaffold } from './commands/scaffold.js';
40
+ import { seed } from './commands/seed.js';
41
+ import { defaultConfig } from './config/types.js';
42
+ // Use UNIFORMGEN_API_URL env var if set, otherwise fall back to defaultConfig
43
+ const apiUrlDefault = process.env.UNIFORMGEN_API_URL || defaultConfig.apiUrl;
44
+ const program = new Command();
45
+ program
46
+ .name('uniformgen')
47
+ .description('Type-safe code generator for EIDE CMS')
48
+ .version('0.1.0');
49
+ // ============================================================================
50
+ // Authentication Commands
51
+ // ============================================================================
52
+ program
53
+ .command('login')
54
+ .description('Authenticate via browser OAuth')
55
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
56
+ .action(async (options) => {
57
+ try {
58
+ await login({ apiUrl: options.apiUrl });
59
+ }
60
+ catch (error) {
61
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
62
+ process.exit(1);
63
+ }
64
+ });
65
+ program
66
+ .command('logout')
67
+ .description('Clear stored credentials')
68
+ .action(async () => {
69
+ try {
70
+ await logout();
71
+ }
72
+ catch (error) {
73
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
74
+ process.exit(1);
75
+ }
76
+ });
77
+ program
78
+ .command('select-project')
79
+ .description('Choose which project to work with')
80
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
81
+ .option('--project-id <id>', 'Project ID to select directly')
82
+ .action(async (options) => {
83
+ try {
84
+ await selectProject({
85
+ apiUrl: options.apiUrl,
86
+ projectId: options.projectId,
87
+ });
88
+ }
89
+ catch (error) {
90
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
91
+ process.exit(1);
92
+ }
93
+ });
94
+ program
95
+ .command('whoami')
96
+ .description('Show current authentication status')
97
+ .action(async () => {
98
+ try {
99
+ await whoami();
100
+ }
101
+ catch (error) {
102
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
103
+ process.exit(1);
104
+ }
105
+ });
106
+ program
107
+ .command('setup')
108
+ .description('Configure code generation preferences (framework, output paths)')
109
+ .action(async () => {
110
+ try {
111
+ await setup();
112
+ }
113
+ catch (error) {
114
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
115
+ process.exit(1);
116
+ }
117
+ });
118
+ // ============================================================================
119
+ // Generation Commands
120
+ // ============================================================================
121
+ program
122
+ .command('pull')
123
+ .description('Fetch entity models and generate types')
124
+ .option('-c, --config <path>', 'Path to config file')
125
+ .option('--api-url <url>', 'API endpoint URL')
126
+ .option('--project-key <key>', 'Project API key')
127
+ .option('--out <dir>', 'Output directory')
128
+ .option('--no-prettier', 'Disable Prettier formatting')
129
+ .option('--dry-run', 'Show what would be generated without writing files')
130
+ .option('--only <models>', 'Only generate for specific entity models (comma-separated keys)')
131
+ .option('--include-inline', 'Include inline-only entity models')
132
+ .option('-v, --verbose', 'Enable verbose logging')
133
+ .action(async (options) => {
134
+ const spinner = ora();
135
+ try {
136
+ // Load configuration
137
+ spinner.start('Loading configuration...');
138
+ const config = await loadConfig(options.config, process.cwd());
139
+ // Override config with CLI options
140
+ if (options.apiUrl)
141
+ config.apiUrl = options.apiUrl;
142
+ if (options.projectKey)
143
+ config.projectKey = options.projectKey;
144
+ if (options.out) {
145
+ config.output = {
146
+ types: join(options.out, 'types'),
147
+ documents: join(options.out, 'documents'),
148
+ hooks: join(options.out, 'hooks'),
149
+ };
150
+ }
151
+ if (options.prettier === false)
152
+ config.prettier = false;
153
+ spinner.succeed('Configuration loaded');
154
+ if (options.verbose) {
155
+ console.log(chalk.gray('Config:'), config);
156
+ }
157
+ // Fetch entity models from API
158
+ spinner.start(`Fetching entity models from ${config.apiUrl}...`);
159
+ let entityModels = await fetchEntityModels(config.apiUrl, config.accessToken, config.tenantId, config.projectId, {
160
+ includeInline: options.includeInline ?? true,
161
+ });
162
+ // Filter to specific models if --only provided
163
+ if (options.only) {
164
+ const onlyKeys = options.only.split(',').map((k) => k.trim());
165
+ entityModels = entityModels.filter((m) => onlyKeys.includes(m.key));
166
+ }
167
+ // Filter to only models with records: true (can create standalone records)
168
+ const recordModels = entityModels.filter((m) => m.modes.records);
169
+ spinner.succeed(`Fetched ${entityModels.length} entity models (${recordModels.length} with records)`);
170
+ if (options.verbose) {
171
+ console.log(chalk.gray('Entity models:'));
172
+ for (const model of entityModels) {
173
+ const tags = [];
174
+ if (model.modes.records)
175
+ tags.push('records');
176
+ if (model.modes.inline)
177
+ tags.push('inline');
178
+ console.log(chalk.gray(` - ${model.key} (${tags.join(', ')})`));
179
+ }
180
+ }
181
+ // Fetch context definitions (values are fetched at runtime, not generate time)
182
+ spinner.start('Fetching context definitions...');
183
+ const contextDefinitions = await fetchContextDefinitions(config.apiUrl, config.accessToken, config.tenantId, config.projectId);
184
+ // Map to generation format (just definitions, values fetched at runtime)
185
+ const contextsForGeneration = contextDefinitions.map((definition) => ({ definition }));
186
+ spinner.succeed(contextDefinitions.length > 0
187
+ ? `Fetched ${contextDefinitions.length} context definitions`
188
+ : 'No context definitions found (using defaults)');
189
+ if (options.verbose && contextDefinitions.length > 0) {
190
+ console.log(chalk.gray('Contexts (values fetched at runtime):'));
191
+ for (const ctx of contextsForGeneration) {
192
+ console.log(chalk.gray(` - ${ctx.definition.key} (linked to ${ctx.definition.entityModelKey})`));
193
+ }
194
+ }
195
+ // Generate files
196
+ const files = [];
197
+ // Generate base type files
198
+ spinner.start('Generating type definitions...');
199
+ files.push({
200
+ path: join(config.output.types, 'field-types.ts'),
201
+ content: generateFieldTypesFile(),
202
+ });
203
+ files.push({
204
+ path: join(config.output.types, 'hooks.ts'),
205
+ content: generateHooksFile(),
206
+ });
207
+ files.push({
208
+ path: join(config.output.types, 'config.ts'),
209
+ content: generateConfigFile(),
210
+ });
211
+ // Generate contexts file (with runtime query support) - in hooks folder
212
+ files.push({
213
+ path: join(config.output.hooks, 'contexts.ts'),
214
+ content: contextsForGeneration.length > 0
215
+ ? generateContextsFile(contextsForGeneration)
216
+ : generateEmptyContextsFile(),
217
+ });
218
+ spinner.succeed('Generated base type definitions');
219
+ // Generate entity model types (for all models - both records and inline)
220
+ if (entityModels.length > 0) {
221
+ const inlineOnlyModels = entityModels.filter((m) => m.modes.inline && !m.modes.records);
222
+ spinner.start(`Generating ${entityModels.length} entity models (${recordModels.length} configs + ${inlineOnlyModels.length} inline types)...`);
223
+ const modelsDir = join(config.output.types, 'models');
224
+ for (const model of entityModels) {
225
+ files.push({
226
+ path: join(modelsDir, `${model.key}.ts`),
227
+ content: generateEntityModelTypes(model, entityModels),
228
+ });
229
+ }
230
+ // Generate index for all types
231
+ files.push({
232
+ path: join(modelsDir, 'index.ts'),
233
+ content: generateEntityModelsIndex(entityModels),
234
+ });
235
+ spinner.succeed(`Generated ${entityModels.length} entity models (${recordModels.length} configs + ${inlineOnlyModels.length} inline types)`);
236
+ }
237
+ // Generate GraphQL documents (only for models with publicApi: true)
238
+ const publicApiModels = recordModels.filter((m) => m.modes.publicApi);
239
+ if (publicApiModels.length > 0) {
240
+ spinner.start(`Generating GraphQL documents for ${publicApiModels.length} public API models...`);
241
+ for (const model of publicApiModels) {
242
+ files.push({
243
+ path: join(config.output.documents, `${model.key}.graphql`),
244
+ content: generateEntityModelDocuments(model),
245
+ });
246
+ }
247
+ spinner.succeed(`Generated GraphQL documents for ${publicApiModels.length} public API models`);
248
+ }
249
+ // Generate typed hooks based on framework setting
250
+ const settings = await getSettings();
251
+ const framework = config.framework || settings.framework || 'agnostic';
252
+ if (publicApiModels.length > 0) {
253
+ spinner.start(`Generating ${framework} hooks for ${publicApiModels.length} models...`);
254
+ const hooksDir = config.output.hooks;
255
+ let generateHook;
256
+ let generateIndex;
257
+ switch (framework) {
258
+ case 'react':
259
+ generateHook = generateReactHooks;
260
+ generateIndex = generateReactHooksIndex;
261
+ break;
262
+ case 'remix':
263
+ generateHook = generateRemixHooks;
264
+ generateIndex = generateRemixHooksIndex;
265
+ break;
266
+ default:
267
+ generateHook = generateAgnosticHooks;
268
+ generateIndex = generateAgnosticHooksIndex;
269
+ }
270
+ for (const model of publicApiModels) {
271
+ const hookContent = generateHook(model, entityModels);
272
+ if (hookContent) {
273
+ files.push({
274
+ path: join(hooksDir, `${model.key}.ts`),
275
+ content: hookContent,
276
+ });
277
+ }
278
+ }
279
+ files.push({
280
+ path: join(hooksDir, 'index.ts'),
281
+ content: generateIndex(publicApiModels),
282
+ });
283
+ spinner.succeed(`Generated ${framework} hooks for ${publicApiModels.length} models`);
284
+ }
285
+ // ========================================================================
286
+ // Phase 13: Generate layered API structure
287
+ // ========================================================================
288
+ // Phase 13: Generate admin hooks (CRUD, versioning)
289
+ if (publicApiModels.length > 0 && framework !== 'agnostic') {
290
+ spinner.start(`Generating ${framework} admin hooks for ${publicApiModels.length} models...`);
291
+ const adminDir = join(config.output.hooks, 'admin');
292
+ const generateAdmin = framework === 'react' ? generateAdminHooksReact : generateAdminHooksRemix;
293
+ const generateAdminIndex = framework === 'react' ? generateAdminHooksIndexReact : generateAdminHooksIndexRemix;
294
+ for (const model of publicApiModels) {
295
+ const adminContent = generateAdmin(model, entityModels);
296
+ if (adminContent) {
297
+ files.push({
298
+ path: join(adminDir, `${model.key}.ts`),
299
+ content: adminContent,
300
+ });
301
+ }
302
+ }
303
+ files.push({
304
+ path: join(adminDir, 'index.ts'),
305
+ content: generateAdminIndex(publicApiModels),
306
+ });
307
+ spinner.succeed(`Generated ${framework} admin hooks for ${publicApiModels.length} models`);
308
+ }
309
+ // Phase 13: Generate platform resolve hooks (clean, no CMS features)
310
+ if (publicApiModels.length > 0 && framework !== 'agnostic') {
311
+ spinner.start(`Generating ${framework} platform resolve hooks for ${publicApiModels.length} models...`);
312
+ const platformResolveDir = join(config.output.hooks, 'resolve');
313
+ const generatePlatformResolve = framework === 'react' ? generatePlatformResolveReact : generatePlatformResolveRemix;
314
+ const generatePlatformIndex = framework === 'react' ? generatePlatformResolveIndexReact : generatePlatformResolveIndexRemix;
315
+ for (const model of publicApiModels) {
316
+ const resolveContent = generatePlatformResolve(model, entityModels);
317
+ if (resolveContent) {
318
+ files.push({
319
+ path: join(platformResolveDir, `${model.key}.ts`),
320
+ content: resolveContent,
321
+ });
322
+ }
323
+ }
324
+ files.push({
325
+ path: join(platformResolveDir, 'index.ts'),
326
+ content: generatePlatformIndex(publicApiModels),
327
+ });
328
+ spinner.succeed(`Generated ${framework} platform resolve hooks for ${publicApiModels.length} models`);
329
+ }
330
+ // Phase 13: Generate CMS hooks (only if cms.enabled models exist)
331
+ const routableModels = getRoutableModels(entityModels);
332
+ if (routableModels.length > 0 && framework !== 'agnostic') {
333
+ spinner.start(`Generating ${framework} CMS hooks for ${routableModels.length} routable models...`);
334
+ const cmsDir = join(config.output.hooks, 'cms');
335
+ const generateCmsRoute = framework === 'react' ? generateCmsRouteReact : generateCmsRouteRemix;
336
+ const generateCmsIndex = framework === 'react' ? generateCmsIndexReact : generateCmsIndexRemix;
337
+ // Generate CMS types
338
+ files.push({
339
+ path: join(cmsDir, 'types.ts'),
340
+ content: generateCmsTypes(),
341
+ });
342
+ // Generate resolveRoute hook/function
343
+ files.push({
344
+ path: join(cmsDir, 'route.ts'),
345
+ content: generateCmsRoute(routableModels),
346
+ });
347
+ // Generate CMS index
348
+ files.push({
349
+ path: join(cmsDir, 'index.ts'),
350
+ content: generateCmsIndex(entityModels),
351
+ });
352
+ spinner.succeed(`Generated ${framework} CMS hooks for ${routableModels.length} routable models`);
353
+ if (options.verbose) {
354
+ console.log(chalk.gray('Routable models (cms.enabled = true):'));
355
+ for (const model of routableModels) {
356
+ console.log(chalk.gray(` - ${model.key}`));
357
+ }
358
+ }
359
+ }
360
+ else if (options.verbose && framework !== 'agnostic') {
361
+ console.log(chalk.gray('No routable models found - skipping CMS hooks generation'));
362
+ }
363
+ // Generate typed filters
364
+ if (publicApiModels.length > 0) {
365
+ spinner.start(`Generating typed filters for ${publicApiModels.length} models...`);
366
+ const filtersDir = join(config.output.types, '..', 'filters');
367
+ for (const model of publicApiModels) {
368
+ const filterContent = generateModelFilters(model, entityModels);
369
+ if (filterContent) {
370
+ files.push({
371
+ path: join(filtersDir, `${model.key}.ts`),
372
+ content: filterContent,
373
+ });
374
+ }
375
+ }
376
+ files.push({
377
+ path: join(filtersDir, 'index.ts'),
378
+ content: generateFiltersIndex(publicApiModels),
379
+ });
380
+ spinner.succeed(`Generated typed filters for ${publicApiModels.length} models`);
381
+ }
382
+ // Generate main index
383
+ files.push({
384
+ path: join(config.output.types, 'index.ts'),
385
+ content: `/**
386
+ * Generated types for EIDE project
387
+ *
388
+ * @generated by UniformGen - DO NOT EDIT MANUALLY
389
+ */
390
+
391
+ export * from './field-types.js';
392
+ export * from './hooks.js';
393
+ export * from './config.js';
394
+ export * from './contexts.js';
395
+ ${entityModels.length > 0 ? "export * from './models/index.js';" : ''}
396
+ `,
397
+ });
398
+ // Dry run
399
+ if (options.dryRun) {
400
+ console.log(chalk.cyan('\nDry run - files that would be generated:'));
401
+ files.forEach((f) => console.log(chalk.gray(` - ${f.path}`)));
402
+ console.log(chalk.cyan(`\nTotal: ${files.length} files`));
403
+ return;
404
+ }
405
+ // Write files
406
+ spinner.start(`Writing ${files.length} files...`);
407
+ await writeFiles(files, config.prettier);
408
+ spinner.succeed(`Generated ${files.length} files`);
409
+ console.log(chalk.green('\n✓ Code generation complete!'));
410
+ console.log(chalk.gray(` Output: ${config.output.types}`));
411
+ }
412
+ catch (error) {
413
+ spinner.fail('Generation failed');
414
+ console.error(chalk.red('\nError:'), error instanceof Error ? error.message : String(error));
415
+ process.exit(1);
416
+ }
417
+ });
418
+ // ============================================================================
419
+ // Schema Management Commands
420
+ // ============================================================================
421
+ program
422
+ .command('push')
423
+ .description('Sync local schema files to platform')
424
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
425
+ .option('--schemas <dir>', 'Directory containing .schema.ts files', './schemas')
426
+ .option('--pattern <pattern>', 'Glob pattern for schema files', '**/*.schema.ts')
427
+ .option('--dry-run', 'Preview changes without applying')
428
+ .option('--publish', 'Publish schemas after pushing')
429
+ .action(async (options) => {
430
+ try {
431
+ await push({
432
+ apiUrl: options.apiUrl,
433
+ schemasDir: options.schemas,
434
+ pattern: options.pattern,
435
+ dryRun: options.dryRun,
436
+ publish: options.publish,
437
+ });
438
+ }
439
+ catch (error) {
440
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
441
+ process.exit(1);
442
+ }
443
+ });
444
+ program
445
+ .command('init')
446
+ .description('Generate local schema files from platform schemas')
447
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
448
+ .option('--schemas <dir>', 'Output directory for schema files', './schemas')
449
+ .option('--overwrite', 'Overwrite existing schema files')
450
+ .action(async (options) => {
451
+ try {
452
+ await init({
453
+ apiUrl: options.apiUrl,
454
+ schemasDir: options.schemas,
455
+ overwrite: options.overwrite,
456
+ });
457
+ }
458
+ catch (error) {
459
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
460
+ process.exit(1);
461
+ }
462
+ });
463
+ program
464
+ .command('sync')
465
+ .description('Push local schemas then pull generated types')
466
+ .option('-c, --config <path>', 'Path to config file')
467
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
468
+ .option('--schemas <dir>', 'Directory containing .schema.ts files', './schemas')
469
+ .option('--pattern <pattern>', 'Glob pattern for schema files', '**/*.schema.ts')
470
+ .option('--publish', 'Publish schemas after pushing')
471
+ .action(async (options) => {
472
+ try {
473
+ await sync({
474
+ apiUrl: options.apiUrl,
475
+ schemasDir: options.schemas,
476
+ pattern: options.pattern,
477
+ publish: options.publish,
478
+ config: options.config,
479
+ });
480
+ }
481
+ catch (error) {
482
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
483
+ process.exit(1);
484
+ }
485
+ });
486
+ // ============================================================================
487
+ // Component Scaffolding Commands
488
+ // ============================================================================
489
+ program
490
+ .command('scaffold')
491
+ .description('Generate React component stubs for @eide/foir-renderer')
492
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
493
+ .option('--components <dir>', 'Output directory for components', './src/components/foir')
494
+ .option('--models <models>', 'Only scaffold specific models (comma-separated keys)')
495
+ .option('--overwrite', 'Overwrite existing component files')
496
+ .option('--framework <framework>', 'Framework: react, remix, next', 'react')
497
+ .option('-c, --config <path>', 'Path to config file')
498
+ .action(async (options) => {
499
+ try {
500
+ await scaffold({
501
+ apiUrl: options.apiUrl,
502
+ componentsDir: options.components,
503
+ models: options.models,
504
+ overwrite: options.overwrite,
505
+ framework: options.framework,
506
+ config: options.config,
507
+ });
508
+ }
509
+ catch (error) {
510
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
511
+ process.exit(1);
512
+ }
513
+ });
514
+ // ============================================================================
515
+ // Content Seeding Commands
516
+ // ============================================================================
517
+ program
518
+ .command('seed')
519
+ .description('Seed content data from local JSON/YAML files')
520
+ .option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
521
+ .option('--seed <dir>', 'Directory containing seed files', './seed')
522
+ .option('--pattern <pattern>', 'Filter files by pattern')
523
+ .option('--publish', 'Publish records after creating')
524
+ .option('--upsert', 'Update existing records instead of skipping')
525
+ .option('--dry-run', 'Preview changes without applying')
526
+ .option('-c, --config <path>', 'Path to config file')
527
+ .action(async (options) => {
528
+ try {
529
+ await seed({
530
+ apiUrl: options.apiUrl,
531
+ seedDir: options.seed,
532
+ pattern: options.pattern,
533
+ publish: options.publish,
534
+ upsert: options.upsert,
535
+ dryRun: options.dryRun,
536
+ config: options.config,
537
+ });
538
+ }
539
+ catch (error) {
540
+ console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
541
+ process.exit(1);
542
+ }
543
+ });
544
+ // Default command (no subcommand = pull)
545
+ program
546
+ .option('-c, --config <path>', 'Path to config file')
547
+ .option('--api-url <url>', 'API endpoint URL')
548
+ .option('--project-key <key>', 'Project API key')
549
+ .option('--out <dir>', 'Output directory')
550
+ .option('--no-prettier', 'Disable Prettier formatting')
551
+ .option('--dry-run', 'Show what would be generated without writing files')
552
+ .option('--only <models>', 'Only generate for specific entity models (comma-separated keys)')
553
+ .option('--include-inline', 'Include inline-only entity models')
554
+ .option('-v, --verbose', 'Enable verbose logging')
555
+ .action(async (_options, command) => {
556
+ // If no subcommand and has arguments, run pull
557
+ if (command.args.length === 0) {
558
+ await command.parent?.commands
559
+ .find((c) => c.name() === 'pull')
560
+ ?.parseAsync(process.argv.slice(2), { from: 'user' });
561
+ }
562
+ });
563
+ program.parse();
@@ -0,0 +1,11 @@
1
+ interface InitOptions {
2
+ apiUrl: string;
3
+ schemasDir: string;
4
+ overwrite?: boolean;
5
+ }
6
+ /**
7
+ * Init command - generate local schema files from platform schemas
8
+ */
9
+ export declare function init(options: InitOptions): Promise<void>;
10
+ export {};
11
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D9D"}