@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/README.md ADDED
@@ -0,0 +1,356 @@
1
+ # @eide/uniformgen
2
+
3
+ Type-safe code generator for Foir CMS. Generates TypeScript types, GraphQL operations, and React hooks from your project schemas.
4
+
5
+ ## Features
6
+
7
+ - **Type Generation** - TypeScript interfaces for all your entity models
8
+ - **GraphQL Documents** - Queries, mutations, and fragments for your schemas
9
+ - **React Hooks** - Data fetching hooks with full type safety
10
+ - **Schema Sync** - Pull schemas from your Foir project
11
+ - **Schema Push** - Push local schema definitions to your project
12
+ - **Content Seeding** - Seed content from local files
13
+
14
+ ## Installation
15
+
16
+ ```bash
17
+ # Install globally
18
+ npm install -g @eide/uniformgen
19
+
20
+ # Or use with npx (no installation required)
21
+ npx @eide/uniformgen
22
+
23
+ # Or add as a dev dependency
24
+ npm install -D @eide/uniformgen
25
+ ```
26
+
27
+ ## Authentication
28
+
29
+ UniformGen uses interactive login to authenticate with your Foir project:
30
+
31
+ ```bash
32
+ # Login to your Foir account
33
+ uniformgen login
34
+
35
+ # Check current authentication status
36
+ uniformgen whoami
37
+
38
+ # Logout
39
+ uniformgen logout
40
+ ```
41
+
42
+ After logging in, select your project:
43
+
44
+ ```bash
45
+ uniformgen setup
46
+ ```
47
+
48
+ This stores your credentials securely and associates the current directory with your Foir project.
49
+
50
+ ## Quick Start
51
+
52
+ 1. **Login and setup**:
53
+
54
+ ```bash
55
+ uniformgen login
56
+ uniformgen setup
57
+ ```
58
+
59
+ 2. **Sync schemas from your project**:
60
+
61
+ ```bash
62
+ uniformgen sync
63
+ ```
64
+
65
+ 3. **Use the generated types in your app**:
66
+
67
+ ```typescript
68
+ import type { Page, HeroBanner } from './foir/types';
69
+ import { useGetPage } from './foir/hooks';
70
+
71
+ function PageComponent({ slug }: { slug: string }) {
72
+ const { data, loading } = useGetPage({ slug });
73
+
74
+ if (loading) return <div>Loading...</div>;
75
+
76
+ const page = data?.resolveRoute?.content as Page;
77
+ return <h1>{page.title}</h1>;
78
+ }
79
+ ```
80
+
81
+ ## Commands
82
+
83
+ ### `uniformgen login`
84
+
85
+ Authenticate with your Foir account via browser-based OAuth flow.
86
+
87
+ ```bash
88
+ uniformgen login
89
+ ```
90
+
91
+ ### `uniformgen setup`
92
+
93
+ Select a project to work with and configure the current directory.
94
+
95
+ ```bash
96
+ uniformgen setup
97
+ ```
98
+
99
+ ### `uniformgen sync`
100
+
101
+ Sync schemas from your Foir project and generate types, documents, and hooks.
102
+
103
+ ```bash
104
+ # Sync to default location (./foir)
105
+ uniformgen sync
106
+
107
+ # Sync to custom directory
108
+ uniformgen sync --output ./src/generated/foir
109
+
110
+ # Sync only schemas (no code generation)
111
+ uniformgen sync --schemas ./schemas
112
+ ```
113
+
114
+ **Options:**
115
+ - `--output, -o <dir>` - Output directory for generated code (default: `./foir`)
116
+ - `--schemas <dir>` - Output directory for schema files
117
+ - `--skip-types` - Skip TypeScript type generation
118
+ - `--skip-documents` - Skip GraphQL document generation
119
+ - `--skip-hooks` - Skip React hook generation
120
+
121
+ ### `uniformgen push`
122
+
123
+ Push local schema definitions to your Foir project.
124
+
125
+ ```bash
126
+ # Push schemas from default location
127
+ uniformgen push
128
+
129
+ # Push from custom directory
130
+ uniformgen push --schemas ./schemas
131
+ ```
132
+
133
+ **Options:**
134
+ - `--schemas <dir>` - Directory containing schema files (default: `./schemas`)
135
+ - `--dry-run` - Preview changes without applying them
136
+
137
+ ### `uniformgen seed`
138
+
139
+ Seed content from local files to your Foir project.
140
+
141
+ ```bash
142
+ # Seed content
143
+ uniformgen seed --seed ./seed
144
+
145
+ # Seed and publish
146
+ uniformgen seed --seed ./seed --publish
147
+
148
+ # Preview without making changes
149
+ uniformgen seed --seed ./seed --dry-run
150
+ ```
151
+
152
+ **Options:**
153
+ - `--seed <dir>` - Directory containing seed files (required)
154
+ - `--publish` - Publish seeded content after creation
155
+ - `--dry-run` - Preview changes without applying them
156
+
157
+ ### `uniformgen scaffold`
158
+
159
+ Generate component scaffolds for your entity models.
160
+
161
+ ```bash
162
+ uniformgen scaffold --components ./app/components/foir
163
+ ```
164
+
165
+ **Options:**
166
+ - `--components <dir>` - Output directory for component files
167
+
168
+ ### `uniformgen whoami`
169
+
170
+ Display current authentication status and project info.
171
+
172
+ ```bash
173
+ uniformgen whoami
174
+ ```
175
+
176
+ ### `uniformgen logout`
177
+
178
+ Clear stored credentials.
179
+
180
+ ```bash
181
+ uniformgen logout
182
+ ```
183
+
184
+ ## Configuration
185
+
186
+ Create a `.uniformrc.ts` or `.uniformrc.js` file for advanced configuration:
187
+
188
+ ```typescript
189
+ import { defineConfig } from '@eide/uniformgen';
190
+
191
+ export default defineConfig({
192
+ // Output configuration
193
+ output: {
194
+ types: './src/foir/types',
195
+ documents: './src/foir/documents',
196
+ hooks: './src/foir/hooks',
197
+ },
198
+
199
+ // Generation options
200
+ generate: {
201
+ types: true,
202
+ documents: true,
203
+ hooks: true,
204
+ contexts: true,
205
+ },
206
+
207
+ // Type options
208
+ typeOptions: {
209
+ useUnknownForJSON: true,
210
+ generateInputTypes: true,
211
+ },
212
+
213
+ // Formatting
214
+ prettier: true,
215
+ });
216
+ ```
217
+
218
+ ## Generated Output
219
+
220
+ ### Types
221
+
222
+ ```typescript
223
+ // foir/types/page.ts
224
+ export interface Page {
225
+ id: string;
226
+ title: string;
227
+ slug: string;
228
+ hero?: HeroBanner;
229
+ sections: ContentSection[];
230
+ seo?: SEOMetadata;
231
+ }
232
+
233
+ export interface HeroBanner {
234
+ heading: string;
235
+ subheading?: string;
236
+ image: FoirImage;
237
+ ctaText?: string;
238
+ ctaUrl?: string;
239
+ }
240
+ ```
241
+
242
+ ### GraphQL Documents
243
+
244
+ ```graphql
245
+ # foir/documents/page.graphql
246
+ fragment PageFields on EntityRecord {
247
+ id
248
+ naturalKey
249
+ modelKey
250
+ content
251
+ translations
252
+ }
253
+
254
+ query GetPage($slug: String!) {
255
+ resolveRoute(path: $slug) {
256
+ record {
257
+ ...PageFields
258
+ }
259
+ content
260
+ variant
261
+ }
262
+ }
263
+ ```
264
+
265
+ ### React Hooks
266
+
267
+ ```typescript
268
+ // foir/hooks/usePage.ts
269
+ export function useGetPage(variables: { slug: string }) {
270
+ return useQuery(GetPageDocument, { variables });
271
+ }
272
+
273
+ export function useCreatePage() {
274
+ return useMutation(CreatePageDocument);
275
+ }
276
+ ```
277
+
278
+ ## Framework Integration
279
+
280
+ ### Remix / React Router
281
+
282
+ ```typescript
283
+ // app/routes/($slug).tsx
284
+ import { useLoaderData } from '@remix-run/react';
285
+ import { EntityRenderer, createRegistry } from '@eide/foir-renderer';
286
+ import type { Page } from '~/foir/types';
287
+
288
+ export async function loader({ params }) {
289
+ const data = await foirClient.resolveRoute({ path: params.slug || '/' });
290
+ return { route: data };
291
+ }
292
+
293
+ export default function PageRoute() {
294
+ const { route } = useLoaderData<typeof loader>();
295
+ return <EntityRenderer data={route} registry={registry} />;
296
+ }
297
+ ```
298
+
299
+ ### Next.js
300
+
301
+ ```typescript
302
+ // app/[...slug]/page.tsx
303
+ import { EntityRenderer, createRegistry } from '@eide/foir-renderer';
304
+ import type { Page } from '@/foir/types';
305
+
306
+ export default async function Page({ params }) {
307
+ const route = await foirClient.resolveRoute({
308
+ path: params.slug?.join('/') || '/'
309
+ });
310
+
311
+ return <EntityRenderer data={route} registry={registry} />;
312
+ }
313
+ ```
314
+
315
+ ## CI/CD Integration
316
+
317
+ Add schema sync to your CI pipeline:
318
+
319
+ ```yaml
320
+ # .github/workflows/ci.yml
321
+ jobs:
322
+ build:
323
+ steps:
324
+ - uses: actions/checkout@v4
325
+
326
+ - name: Setup Node
327
+ uses: actions/setup-node@v4
328
+ with:
329
+ node-version: '20'
330
+
331
+ - name: Install dependencies
332
+ run: npm ci
333
+
334
+ - name: Sync Foir schemas
335
+ run: npx @eide/uniformgen sync
336
+ env:
337
+ FOIR_API_KEY: ${{ secrets.FOIR_API_KEY }}
338
+
339
+ - name: Type check
340
+ run: npm run typecheck
341
+ ```
342
+
343
+ For CI environments, set the `FOIR_API_KEY` environment variable instead of using interactive login.
344
+
345
+ ## Requirements
346
+
347
+ - Node.js 18.0.0 or higher
348
+ - A Foir CMS project
349
+
350
+ ## Documentation
351
+
352
+ For complete documentation, visit [docs.foir.dev](https://docs.foir.dev)
353
+
354
+ ## License
355
+
356
+ Proprietary - All rights reserved.
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Stored credentials structure
3
+ */
4
+ export interface StoredCredentials {
5
+ accessToken: string;
6
+ refreshToken: string;
7
+ expiresAt: string;
8
+ user: {
9
+ id: string;
10
+ email: string;
11
+ name: string;
12
+ };
13
+ selectedProject?: {
14
+ id: string;
15
+ name: string;
16
+ tenantId: string;
17
+ /** Auto-provisioned API key for public API access */
18
+ apiKey?: string;
19
+ /** API key ID (for rotation if needed) */
20
+ apiKeyId?: string;
21
+ };
22
+ }
23
+ /**
24
+ * Get the credentials directory path
25
+ */
26
+ export declare function getCredentialsDir(): string;
27
+ /**
28
+ * Get the credentials file path
29
+ */
30
+ export declare function getCredentialsPath(): string;
31
+ /**
32
+ * Read stored credentials
33
+ */
34
+ export declare function getCredentials(): Promise<StoredCredentials | null>;
35
+ /**
36
+ * Write credentials to file
37
+ */
38
+ export declare function writeCredentials(credentials: StoredCredentials): Promise<void>;
39
+ /**
40
+ * Update credentials with new values
41
+ */
42
+ export declare function updateCredentials(updates: Partial<StoredCredentials>): Promise<void>;
43
+ /**
44
+ * Delete credentials file
45
+ */
46
+ export declare function deleteCredentials(): Promise<void>;
47
+ /**
48
+ * Check if access token is expired (with 5 minute buffer)
49
+ */
50
+ export declare function isTokenExpired(credentials: StoredCredentials): boolean;
51
+ /**
52
+ * Get valid credentials, refreshing if necessary
53
+ */
54
+ export declare function getValidCredentials(refreshFn?: (refreshToken: string) => Promise<{
55
+ accessToken: string;
56
+ expiresAt: string;
57
+ }>): Promise<StoredCredentials | null>;
58
+ //# sourceMappingURL=credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../src/auth/credentials.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,KAAK,EAAE,MAAM,CAAC;QACd,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;IACF,eAAe,CAAC,EAAE;QAChB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,qDAAqD;QACrD,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,0CAA0C;QAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;CACH;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAgBD;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAUxE;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,iBAAiB,GAC7B,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAClC,OAAO,CAAC,IAAI,CAAC,CAMf;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,iBAAiB,GAAG,OAAO,CAItE;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,CAAC,EAAE,CACV,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,GACvD,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CAqBnC"}
@@ -0,0 +1,107 @@
1
+ import { promises as fs } from 'fs';
2
+ import { join } from 'path';
3
+ import { homedir } from 'os';
4
+ /**
5
+ * Get the credentials directory path
6
+ */
7
+ export function getCredentialsDir() {
8
+ return join(homedir(), '.uniformgen');
9
+ }
10
+ /**
11
+ * Get the credentials file path
12
+ */
13
+ export function getCredentialsPath() {
14
+ return join(getCredentialsDir(), 'credentials.json');
15
+ }
16
+ /**
17
+ * Ensure the credentials directory exists
18
+ */
19
+ async function ensureCredentialsDir() {
20
+ const dir = getCredentialsDir();
21
+ try {
22
+ await fs.mkdir(dir, { recursive: true, mode: 0o700 });
23
+ }
24
+ catch (error) {
25
+ if (error.code !== 'EEXIST') {
26
+ throw error;
27
+ }
28
+ }
29
+ }
30
+ /**
31
+ * Read stored credentials
32
+ */
33
+ export async function getCredentials() {
34
+ try {
35
+ const content = await fs.readFile(getCredentialsPath(), 'utf-8');
36
+ return JSON.parse(content);
37
+ }
38
+ catch (error) {
39
+ if (error.code === 'ENOENT') {
40
+ return null;
41
+ }
42
+ throw error;
43
+ }
44
+ }
45
+ /**
46
+ * Write credentials to file
47
+ */
48
+ export async function writeCredentials(credentials) {
49
+ await ensureCredentialsDir();
50
+ const path = getCredentialsPath();
51
+ await fs.writeFile(path, JSON.stringify(credentials, null, 2), {
52
+ mode: 0o600,
53
+ });
54
+ }
55
+ /**
56
+ * Update credentials with new values
57
+ */
58
+ export async function updateCredentials(updates) {
59
+ const existing = await getCredentials();
60
+ if (!existing) {
61
+ throw new Error('No credentials found. Run `uniformgen login` first.');
62
+ }
63
+ await writeCredentials({ ...existing, ...updates });
64
+ }
65
+ /**
66
+ * Delete credentials file
67
+ */
68
+ export async function deleteCredentials() {
69
+ try {
70
+ await fs.unlink(getCredentialsPath());
71
+ }
72
+ catch (error) {
73
+ if (error.code !== 'ENOENT') {
74
+ throw error;
75
+ }
76
+ }
77
+ }
78
+ /**
79
+ * Check if access token is expired (with 5 minute buffer)
80
+ */
81
+ export function isTokenExpired(credentials) {
82
+ const expiresAt = new Date(credentials.expiresAt);
83
+ const bufferMs = 5 * 60 * 1000; // 5 minutes
84
+ return Date.now() > expiresAt.getTime() - bufferMs;
85
+ }
86
+ /**
87
+ * Get valid credentials, refreshing if necessary
88
+ */
89
+ export async function getValidCredentials(refreshFn) {
90
+ const credentials = await getCredentials();
91
+ if (!credentials) {
92
+ return null;
93
+ }
94
+ if (isTokenExpired(credentials) && refreshFn) {
95
+ try {
96
+ const { accessToken, expiresAt } = await refreshFn(credentials.refreshToken);
97
+ const updated = { ...credentials, accessToken, expiresAt };
98
+ await writeCredentials(updated);
99
+ return updated;
100
+ }
101
+ catch {
102
+ // If refresh fails, credentials are invalid
103
+ return null;
104
+ }
105
+ }
106
+ return credentials;
107
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}