@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,366 @@
1
+ /**
2
+ * Scaffold Command
3
+ *
4
+ * Generates component stubs for EIDE entity models using @eide/foir-renderer.
5
+ * Creates type-safe components that integrate with the EntityRenderer.
6
+ */
7
+ import chalk from 'chalk';
8
+ import ora from 'ora';
9
+ import { mkdir, writeFile, access } from 'fs/promises';
10
+ import { join } from 'path';
11
+ import { loadConfig } from '../config/load-config.js';
12
+ import { getSettings } from '../config/settings.js';
13
+ import { fetchEntityModels } from '../fetcher/fetch-schemas.js';
14
+ /**
15
+ * Convert kebab-case to PascalCase
16
+ */
17
+ function toPascalCase(str) {
18
+ return str
19
+ .split('-')
20
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
21
+ .join('');
22
+ }
23
+ /**
24
+ * Generate entity component (page, product, collection, etc.)
25
+ */
26
+ function generateEntityComponent(model) {
27
+ const componentName = toPascalCase(model.key);
28
+ const propsName = `${componentName}Props`;
29
+ return `/**
30
+ * ${model.name} Component
31
+ *
32
+ * Entity component for rendering ${model.key} content.
33
+ * ${model.description || ''}
34
+ *
35
+ * @generated by uniformgen scaffold - customize as needed
36
+ */
37
+
38
+ import type { EntityComponentProps } from '@eide/foir-renderer';
39
+ import type { ${componentName}Data } from '../types/models/${model.key}';
40
+
41
+ export type ${propsName} = EntityComponentProps<${componentName}Data>;
42
+
43
+ export function ${componentName}({
44
+ data,
45
+ zones,
46
+ metadata,
47
+ breadcrumbs,
48
+ breakpoint,
49
+ }: ${propsName}) {
50
+ return (
51
+ <article className="${model.key}" data-breakpoint={breakpoint}>
52
+ {/* Breadcrumbs */}
53
+ {breadcrumbs && breadcrumbs.length > 0 && (
54
+ <nav className="${model.key}__breadcrumbs" aria-label="Breadcrumb">
55
+ <ol>
56
+ {breadcrumbs.map((crumb, index) => (
57
+ <li key={crumb.url}>
58
+ {index < breadcrumbs.length - 1 ? (
59
+ <a href={crumb.url}>{crumb.label}</a>
60
+ ) : (
61
+ <span aria-current="page">{crumb.label}</span>
62
+ )}
63
+ </li>
64
+ ))}
65
+ </ol>
66
+ </nav>
67
+ )}
68
+
69
+ {/* Main content zone */}
70
+ {zones.default && (
71
+ <section className="${model.key}__content">
72
+ {zones.default}
73
+ </section>
74
+ )}
75
+
76
+ {/* Sidebar zone (if exists) */}
77
+ {zones.sidebar && (
78
+ <aside className="${model.key}__sidebar">
79
+ {zones.sidebar}
80
+ </aside>
81
+ )}
82
+
83
+ {/* Additional zones */}
84
+ {Object.entries(zones)
85
+ .filter(([key]) => !['default', 'sidebar'].includes(key))
86
+ .map(([key, content]) => (
87
+ <section key={key} className={\`${model.key}__\${key}\`}>
88
+ {content}
89
+ </section>
90
+ ))}
91
+ </article>
92
+ );
93
+ }
94
+ `;
95
+ }
96
+ /**
97
+ * Generate inline component (hero-banner, product-card, etc.)
98
+ */
99
+ function generateInlineComponent(model) {
100
+ const componentName = toPascalCase(model.key);
101
+ const propsName = `${componentName}Props`;
102
+ const fields = model.fields || [];
103
+ // Generate typed data interface
104
+ const dataFields = fields
105
+ .map((f) => {
106
+ const type = getFieldTypeString(f.type);
107
+ const optional = f.required ? '' : '?';
108
+ return ` ${f.key}${optional}: ${type};`;
109
+ })
110
+ .join('\n');
111
+ const dataType = fields.length > 0
112
+ ? `interface ${componentName}Data {\n${dataFields}\n}`
113
+ : `type ${componentName}Data = Record<string, unknown>`;
114
+ return `/**
115
+ * ${model.name} Component
116
+ *
117
+ * Inline component for rendering ${model.key} fields.
118
+ * ${model.description || ''}
119
+ *
120
+ * @generated by uniformgen scaffold - customize as needed
121
+ */
122
+
123
+ import type { InlineComponentProps } from '@eide/foir-renderer';
124
+
125
+ ${dataType}
126
+
127
+ export type ${propsName} = InlineComponentProps<${componentName}Data>;
128
+
129
+ export function ${componentName}({
130
+ data,
131
+ field,
132
+ layout,
133
+ breakpoint,
134
+ children,
135
+ }: ${propsName}) {
136
+ return (
137
+ <div
138
+ className="${model.key}"
139
+ data-field={field?.key}
140
+ data-breakpoint={breakpoint}
141
+ >
142
+ ${fields.map((f) => generateFieldRenderer(f, model.key)).join('\n')}
143
+
144
+ {/* Nested children (composites containing composites) */}
145
+ {children}
146
+ </div>
147
+ );
148
+ }
149
+ `;
150
+ }
151
+ /**
152
+ * Get TypeScript type string for a field type
153
+ */
154
+ function getFieldTypeString(type) {
155
+ switch (type) {
156
+ case 'text':
157
+ return 'string';
158
+ case 'richtext':
159
+ return 'string | { html: string; text?: string }';
160
+ case 'number':
161
+ return 'number';
162
+ case 'boolean':
163
+ return 'boolean';
164
+ case 'date':
165
+ return 'string | Date';
166
+ case 'image':
167
+ return '{ url: string; alt?: string; width?: number; height?: number }';
168
+ case 'video':
169
+ return '{ url: string; poster?: string }';
170
+ case 'select':
171
+ return 'string';
172
+ case 'list':
173
+ return 'unknown[]';
174
+ case 'json':
175
+ return 'Record<string, unknown>';
176
+ default:
177
+ // Custom field type (entity reference or composite)
178
+ return 'unknown';
179
+ }
180
+ }
181
+ /**
182
+ * Generate JSX for rendering a field
183
+ */
184
+ function generateFieldRenderer(field, parentKey) {
185
+ const className = `${parentKey}__${field.key}`;
186
+ const dataAccess = `data.${field.key}`;
187
+ switch (field.type) {
188
+ case 'text':
189
+ return ` {${dataAccess} && (
190
+ <div className="${className}">{${dataAccess}}</div>
191
+ )}`;
192
+ case 'richtext':
193
+ return ` {${dataAccess} && (
194
+ <div
195
+ className="${className}"
196
+ dangerouslySetInnerHTML={{
197
+ __html: typeof ${dataAccess} === 'string' ? ${dataAccess} : ${dataAccess}.html || ''
198
+ }}
199
+ />
200
+ )}`;
201
+ case 'image':
202
+ return ` {${dataAccess}?.url && (
203
+ <img
204
+ className="${className}"
205
+ src={${dataAccess}.url}
206
+ alt={${dataAccess}.alt || ''}
207
+ width={${dataAccess}.width}
208
+ height={${dataAccess}.height}
209
+ />
210
+ )}`;
211
+ case 'video':
212
+ return ` {${dataAccess}?.url && (
213
+ <video
214
+ className="${className}"
215
+ src={${dataAccess}.url}
216
+ poster={${dataAccess}.poster}
217
+ controls
218
+ />
219
+ )}`;
220
+ case 'boolean':
221
+ return ` {/* ${field.label || field.key}: ${dataAccess} */}`;
222
+ case 'number':
223
+ return ` {${dataAccess} !== undefined && (
224
+ <span className="${className}">{${dataAccess}}</span>
225
+ )}`;
226
+ default:
227
+ return ` {/* TODO: Render ${field.key} (${field.type}) */}`;
228
+ }
229
+ }
230
+ /**
231
+ * Generate component registry file
232
+ */
233
+ function generateRegistry(models) {
234
+ const entityModels = models.filter((m) => m.modes.records && m.modes.publicApi);
235
+ const inlineModels = models.filter((m) => m.modes.inline);
236
+ const imports = [
237
+ ...entityModels.map((m) => `import { ${toPascalCase(m.key)} } from './${m.key}';`),
238
+ ...inlineModels.map((m) => `import { ${toPascalCase(m.key)} } from './${m.key}';`),
239
+ ].join('\n');
240
+ const components = [
241
+ ...entityModels.map((m) => ` '${m.key}': ${toPascalCase(m.key)},`),
242
+ ...inlineModels.map((m) => ` '${m.key}': ${toPascalCase(m.key)},`),
243
+ ].join('\n');
244
+ return `/**
245
+ * Component Registry
246
+ *
247
+ * Maps entity model keys to React components for use with EntityRenderer.
248
+ *
249
+ * @generated by uniformgen scaffold - customize as needed
250
+ */
251
+
252
+ import { createRegistry } from '@eide/foir-renderer';
253
+ ${imports}
254
+
255
+ export const registry = createRegistry({
256
+ components: {
257
+ ${components}
258
+ },
259
+ layout: {
260
+ defaultMode: 'auto',
261
+ },
262
+ });
263
+
264
+ export default registry;
265
+ `;
266
+ }
267
+ /**
268
+ * Generate components index file
269
+ */
270
+ function generateComponentsIndex(models) {
271
+ const exports = models
272
+ .map((m) => `export { ${toPascalCase(m.key)} } from './${m.key}';`)
273
+ .join('\n');
274
+ return `/**
275
+ * Generated EIDE Components
276
+ *
277
+ * @generated by uniformgen scaffold - customize as needed
278
+ */
279
+
280
+ ${exports}
281
+ export { registry } from './registry';
282
+ `;
283
+ }
284
+ /**
285
+ * Main scaffold function
286
+ */
287
+ export async function scaffold(options) {
288
+ const spinner = ora();
289
+ try {
290
+ // Load configuration
291
+ spinner.start('Loading configuration...');
292
+ const config = await loadConfig(options.config, process.cwd());
293
+ // Override config with CLI options
294
+ if (options.apiUrl)
295
+ config.apiUrl = options.apiUrl;
296
+ // Get framework from settings or options
297
+ const settings = await getSettings();
298
+ const framework = options.framework || config.framework || settings.framework || 'react';
299
+ spinner.succeed('Configuration loaded');
300
+ // Fetch entity models
301
+ spinner.start(`Fetching entity models from ${config.apiUrl}...`);
302
+ let entityModels = await fetchEntityModels(config.apiUrl, config.accessToken, config.tenantId, config.projectId, { includeInline: true });
303
+ // Filter to specific models if --models provided
304
+ if (options.models) {
305
+ const modelKeys = options.models.split(',').map((k) => k.trim());
306
+ entityModels = entityModels.filter((m) => modelKeys.includes(m.key));
307
+ }
308
+ spinner.succeed(`Fetched ${entityModels.length} entity models`);
309
+ // Create output directory
310
+ const componentsDir = options.componentsDir || join(process.cwd(), 'src/components/foir');
311
+ await mkdir(componentsDir, { recursive: true });
312
+ // Generate component files
313
+ spinner.start(`Generating ${entityModels.length} component stubs...`);
314
+ const files = [];
315
+ for (const model of entityModels) {
316
+ const filePath = join(componentsDir, `${model.key}.tsx`);
317
+ // Check if file exists and skip unless --overwrite
318
+ if (!options.overwrite) {
319
+ try {
320
+ await access(filePath);
321
+ console.log(chalk.yellow(` Skipping ${model.key}.tsx (exists, use --overwrite to replace)`));
322
+ continue;
323
+ }
324
+ catch {
325
+ // File doesn't exist, proceed
326
+ }
327
+ }
328
+ // Generate appropriate component type
329
+ const content = model.modes.records && model.modes.publicApi
330
+ ? generateEntityComponent(model)
331
+ : generateInlineComponent(model);
332
+ files.push({ path: filePath, content });
333
+ }
334
+ // Generate registry
335
+ files.push({
336
+ path: join(componentsDir, 'registry.ts'),
337
+ content: generateRegistry(entityModels),
338
+ });
339
+ // Generate index
340
+ files.push({
341
+ path: join(componentsDir, 'index.ts'),
342
+ content: generateComponentsIndex(entityModels),
343
+ });
344
+ // Write files
345
+ for (const file of files) {
346
+ await writeFile(file.path, file.content, 'utf-8');
347
+ }
348
+ spinner.succeed(`Generated ${files.length} files`);
349
+ console.log(chalk.green('\n✓ Component scaffolding complete!'));
350
+ console.log(chalk.gray(` Output: ${componentsDir}`));
351
+ console.log(chalk.gray(` Framework: ${framework}`));
352
+ console.log('');
353
+ console.log(chalk.cyan('Next steps:'));
354
+ console.log(chalk.gray(' 1. Customize the generated components'));
355
+ console.log(chalk.gray(' 2. Import and use the registry with EntityRenderer:'));
356
+ console.log('');
357
+ console.log(chalk.gray(` import { EntityRenderer } from '@eide/foir-renderer';`));
358
+ console.log(chalk.gray(` import { registry } from '${componentsDir.replace(process.cwd(), '.')}';`));
359
+ console.log('');
360
+ console.log(chalk.gray(' <EntityRenderer data={resolvedRoute} registry={registry} />'));
361
+ }
362
+ catch (error) {
363
+ spinner.fail('Scaffolding failed');
364
+ throw error;
365
+ }
366
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Seed Command
3
+ *
4
+ * Seeds content data to a Foir project from local JSON/YAML files.
5
+ * Useful for bootstrapping starter content in templates.
6
+ */
7
+ export interface SeedOptions {
8
+ apiUrl: string;
9
+ seedDir: string;
10
+ pattern?: string;
11
+ publish?: boolean;
12
+ dryRun?: boolean;
13
+ upsert?: boolean;
14
+ config?: string;
15
+ }
16
+ /**
17
+ * Main seed function
18
+ */
19
+ export declare function seed(options: SeedOptions): Promise<void>;
20
+ //# sourceMappingURL=seed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/commands/seed.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAQH,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAyND;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAuP9D"}