@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.
- package/README.md +356 -0
- package/dist/auth/credentials.d.ts +58 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +107 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +563 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +113 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +158 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +13 -0
- package/dist/commands/push.d.ts +13 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +328 -0
- package/dist/commands/scaffold.d.ts +19 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +366 -0
- package/dist/commands/seed.d.ts +20 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +380 -0
- package/dist/commands/select-project.d.ts +10 -0
- package/dist/commands/select-project.d.ts.map +1 -0
- package/dist/commands/select-project.js +277 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +51 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +318 -0
- package/dist/commands/whoami.d.ts +5 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +31 -0
- package/dist/config/load-config.d.ts +6 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +103 -0
- package/dist/config/settings.d.ts +20 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +64 -0
- package/dist/config/types.d.ts +152 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +94 -0
- package/dist/fetcher/fetch-schemas.d.ts +140 -0
- package/dist/fetcher/fetch-schemas.d.ts.map +1 -0
- package/dist/fetcher/fetch-schemas.js +223 -0
- package/dist/fetcher/fetch-workflows.d.ts +53 -0
- package/dist/fetcher/fetch-workflows.d.ts.map +1 -0
- package/dist/fetcher/fetch-workflows.js +164 -0
- package/dist/generated/hooks/customer-detail.d.ts +74 -0
- package/dist/generated/hooks/customer-detail.d.ts.map +1 -0
- package/dist/generated/hooks/customer-detail.js +113 -0
- package/dist/generated/hooks/design-system.d.ts +74 -0
- package/dist/generated/hooks/design-system.d.ts.map +1 -0
- package/dist/generated/hooks/design-system.js +109 -0
- package/dist/generated/hooks/index.d.ts +16 -0
- package/dist/generated/hooks/index.d.ts.map +1 -0
- package/dist/generated/hooks/index.js +14 -0
- package/dist/generated/hooks/shopify-collection.d.ts +74 -0
- package/dist/generated/hooks/shopify-collection.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-collection.js +113 -0
- package/dist/generated/hooks/shopify-market.d.ts +74 -0
- package/dist/generated/hooks/shopify-market.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-market.js +109 -0
- package/dist/generated/hooks/shopify-product.d.ts +74 -0
- package/dist/generated/hooks/shopify-product.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-product.js +113 -0
- package/dist/generated/hooks/shopify-variant.d.ts +74 -0
- package/dist/generated/hooks/shopify-variant.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-variant.js +113 -0
- package/dist/generated/hooks/template.d.ts +74 -0
- package/dist/generated/hooks/template.d.ts.map +1 -0
- package/dist/generated/hooks/template.js +107 -0
- package/dist/generated/types/config.d.ts +88 -0
- package/dist/generated/types/config.d.ts.map +1 -0
- package/dist/generated/types/config.js +14 -0
- package/dist/generated/types/data-models/index.d.ts +7 -0
- package/dist/generated/types/data-models/index.d.ts.map +1 -0
- package/dist/generated/types/data-models/index.js +6 -0
- package/dist/generated/types/data-models/test.d.ts +29 -0
- package/dist/generated/types/data-models/test.d.ts.map +1 -0
- package/dist/generated/types/data-models/test.js +1 -0
- package/dist/generated/types/data-models/watch.d.ts +26 -0
- package/dist/generated/types/data-models/watch.d.ts.map +1 -0
- package/dist/generated/types/data-models/watch.js +1 -0
- package/dist/generated/types/field-types.d.ts +255 -0
- package/dist/generated/types/field-types.d.ts.map +1 -0
- package/dist/generated/types/field-types.js +35 -0
- package/dist/generated/types/hooks.d.ts +106 -0
- package/dist/generated/types/hooks.d.ts.map +1 -0
- package/dist/generated/types/hooks.js +9 -0
- package/dist/generated/types/index.d.ts +10 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +9 -0
- package/dist/generated/types/models/button-variant.d.ts +16 -0
- package/dist/generated/types/models/button-variant.d.ts.map +1 -0
- package/dist/generated/types/models/button-variant.js +1 -0
- package/dist/generated/types/models/color-palette.d.ts +27 -0
- package/dist/generated/types/models/color-palette.d.ts.map +1 -0
- package/dist/generated/types/models/color-palette.js +1 -0
- package/dist/generated/types/models/color-with-scale.d.ts +15 -0
- package/dist/generated/types/models/color-with-scale.d.ts.map +1 -0
- package/dist/generated/types/models/color-with-scale.js +1 -0
- package/dist/generated/types/models/context.d.ts +53 -0
- package/dist/generated/types/models/context.d.ts.map +1 -0
- package/dist/generated/types/models/context.js +51 -0
- package/dist/generated/types/models/customer-detail.d.ts +32 -0
- package/dist/generated/types/models/customer-detail.d.ts.map +1 -0
- package/dist/generated/types/models/customer-detail.js +26 -0
- package/dist/generated/types/models/design-system-badges.d.ts +16 -0
- package/dist/generated/types/models/design-system-badges.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-badges.js +1 -0
- package/dist/generated/types/models/design-system-buttons.d.ts +17 -0
- package/dist/generated/types/models/design-system-buttons.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-buttons.js +1 -0
- package/dist/generated/types/models/design-system-cards.d.ts +16 -0
- package/dist/generated/types/models/design-system-cards.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-cards.js +1 -0
- package/dist/generated/types/models/design-system-colors.d.ts +12 -0
- package/dist/generated/types/models/design-system-colors.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-colors.js +1 -0
- package/dist/generated/types/models/design-system-dark-mode.d.ts +13 -0
- package/dist/generated/types/models/design-system-dark-mode.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-dark-mode.js +1 -0
- package/dist/generated/types/models/design-system-focus-ring.d.ts +14 -0
- package/dist/generated/types/models/design-system-focus-ring.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-focus-ring.js +1 -0
- package/dist/generated/types/models/design-system-grid.d.ts +18 -0
- package/dist/generated/types/models/design-system-grid.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-grid.js +1 -0
- package/dist/generated/types/models/design-system-inputs.d.ts +26 -0
- package/dist/generated/types/models/design-system-inputs.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-inputs.js +1 -0
- package/dist/generated/types/models/design-system-links.d.ts +16 -0
- package/dist/generated/types/models/design-system-links.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-links.js +1 -0
- package/dist/generated/types/models/design-system-shadows.d.ts +20 -0
- package/dist/generated/types/models/design-system-shadows.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-shadows.js +1 -0
- package/dist/generated/types/models/design-system-spacing.d.ts +13 -0
- package/dist/generated/types/models/design-system-spacing.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-spacing.js +1 -0
- package/dist/generated/types/models/design-system-transitions.d.ts +15 -0
- package/dist/generated/types/models/design-system-transitions.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-transitions.js +1 -0
- package/dist/generated/types/models/design-system-typography.d.ts +21 -0
- package/dist/generated/types/models/design-system-typography.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-typography.js +1 -0
- package/dist/generated/types/models/design-system.d.ts +138 -0
- package/dist/generated/types/models/design-system.d.ts.map +1 -0
- package/dist/generated/types/models/design-system.js +64 -0
- package/dist/generated/types/models/experiment.d.ts +57 -0
- package/dist/generated/types/models/experiment.d.ts.map +1 -0
- package/dist/generated/types/models/experiment.js +55 -0
- package/dist/generated/types/models/font-file.d.ts +16 -0
- package/dist/generated/types/models/font-file.d.ts.map +1 -0
- package/dist/generated/types/models/font-file.js +1 -0
- package/dist/generated/types/models/index.d.ts +38 -0
- package/dist/generated/types/models/index.d.ts.map +1 -0
- package/dist/generated/types/models/index.js +12 -0
- package/dist/generated/types/models/integration.d.ts +32 -0
- package/dist/generated/types/models/integration.d.ts.map +1 -0
- package/dist/generated/types/models/integration.js +26 -0
- package/dist/generated/types/models/route-tree.d.ts +43 -0
- package/dist/generated/types/models/route-tree.d.ts.map +1 -0
- package/dist/generated/types/models/route-tree.js +39 -0
- package/dist/generated/types/models/segment.d.ts +57 -0
- package/dist/generated/types/models/segment.d.ts.map +1 -0
- package/dist/generated/types/models/segment.js +55 -0
- package/dist/generated/types/models/shopify-collection.d.ts +32 -0
- package/dist/generated/types/models/shopify-collection.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-collection.js +26 -0
- package/dist/generated/types/models/shopify-market.d.ts +32 -0
- package/dist/generated/types/models/shopify-market.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-market.js +26 -0
- package/dist/generated/types/models/shopify-product.d.ts +32 -0
- package/dist/generated/types/models/shopify-product.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-product.js +26 -0
- package/dist/generated/types/models/shopify-variant.d.ts +32 -0
- package/dist/generated/types/models/shopify-variant.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-variant.js +26 -0
- package/dist/generated/types/models/template.d.ts +53 -0
- package/dist/generated/types/models/template.d.ts.map +1 -0
- package/dist/generated/types/models/template.js +40 -0
- package/dist/generated/types/models/typography-variant.d.ts +15 -0
- package/dist/generated/types/models/typography-variant.d.ts.map +1 -0
- package/dist/generated/types/models/typography-variant.js +1 -0
- package/dist/generated/types/scalars.d.ts +56 -0
- package/dist/generated/types/scalars.d.ts.map +1 -0
- package/dist/generated/types/scalars.js +6 -0
- package/dist/generators/admin/index.d.ts +32 -0
- package/dist/generators/admin/index.d.ts.map +1 -0
- package/dist/generators/admin/index.js +219 -0
- package/dist/generators/admin/mutations.d.ts +23 -0
- package/dist/generators/admin/mutations.d.ts.map +1 -0
- package/dist/generators/admin/mutations.js +424 -0
- package/dist/generators/admin/queries.d.ts +20 -0
- package/dist/generators/admin/queries.d.ts.map +1 -0
- package/dist/generators/admin/queries.js +476 -0
- package/dist/generators/admin/types.d.ts +28 -0
- package/dist/generators/admin/types.d.ts.map +1 -0
- package/dist/generators/admin/types.js +254 -0
- package/dist/generators/cms/index.d.ts +29 -0
- package/dist/generators/cms/index.d.ts.map +1 -0
- package/dist/generators/cms/index.js +126 -0
- package/dist/generators/cms/route.d.ts +27 -0
- package/dist/generators/cms/route.d.ts.map +1 -0
- package/dist/generators/cms/route.js +409 -0
- package/dist/generators/cms/types.d.ts +15 -0
- package/dist/generators/cms/types.d.ts.map +1 -0
- package/dist/generators/cms/types.js +137 -0
- package/dist/generators/contexts/index.d.ts +25 -0
- package/dist/generators/contexts/index.d.ts.map +1 -0
- package/dist/generators/contexts/index.js +591 -0
- package/dist/generators/documents/data-models.d.ts +6 -0
- package/dist/generators/documents/data-models.d.ts.map +1 -0
- package/dist/generators/documents/data-models.js +61 -0
- package/dist/generators/documents/entity-models.d.ts +7 -0
- package/dist/generators/documents/entity-models.d.ts.map +1 -0
- package/dist/generators/documents/entity-models.js +87 -0
- package/dist/generators/documents/workflows.d.ts +11 -0
- package/dist/generators/documents/workflows.d.ts.map +1 -0
- package/dist/generators/documents/workflows.js +101 -0
- package/dist/generators/filters/index.d.ts +16 -0
- package/dist/generators/filters/index.d.ts.map +1 -0
- package/dist/generators/filters/index.js +384 -0
- package/dist/generators/hooks/agnostic.d.ts +16 -0
- package/dist/generators/hooks/agnostic.d.ts.map +1 -0
- package/dist/generators/hooks/agnostic.js +248 -0
- package/dist/generators/hooks/index.d.ts +9 -0
- package/dist/generators/hooks/index.d.ts.map +1 -0
- package/dist/generators/hooks/index.js +8 -0
- package/dist/generators/hooks/react.d.ts +16 -0
- package/dist/generators/hooks/react.d.ts.map +1 -0
- package/dist/generators/hooks/react.js +394 -0
- package/dist/generators/hooks/remix.d.ts +16 -0
- package/dist/generators/hooks/remix.d.ts.map +1 -0
- package/dist/generators/hooks/remix.js +349 -0
- package/dist/generators/hooks/workflows.d.ts +23 -0
- package/dist/generators/hooks/workflows.d.ts.map +1 -0
- package/dist/generators/hooks/workflows.js +312 -0
- package/dist/generators/resolve/index.d.ts +13 -0
- package/dist/generators/resolve/index.d.ts.map +1 -0
- package/dist/generators/resolve/index.js +13 -0
- package/dist/generators/resolve/platform.d.ts +29 -0
- package/dist/generators/resolve/platform.d.ts.map +1 -0
- package/dist/generators/resolve/platform.js +479 -0
- package/dist/generators/types/config.d.ts +7 -0
- package/dist/generators/types/config.d.ts.map +1 -0
- package/dist/generators/types/config.js +113 -0
- package/dist/generators/types/data-models.d.ts +10 -0
- package/dist/generators/types/data-models.d.ts.map +1 -0
- package/dist/generators/types/data-models.js +100 -0
- package/dist/generators/types/entity-models.d.ts +13 -0
- package/dist/generators/types/entity-models.d.ts.map +1 -0
- package/dist/generators/types/entity-models.js +241 -0
- package/dist/generators/types/field-types.d.ts +9 -0
- package/dist/generators/types/field-types.d.ts.map +1 -0
- package/dist/generators/types/field-types.js +651 -0
- package/dist/generators/types/hooks.d.ts +7 -0
- package/dist/generators/types/hooks.d.ts.map +1 -0
- package/dist/generators/types/hooks.js +132 -0
- package/dist/generators/types/scalars.d.ts +6 -0
- package/dist/generators/types/scalars.d.ts.map +1 -0
- package/dist/generators/types/scalars.js +68 -0
- package/dist/generators/types/user-details.d.ts +6 -0
- package/dist/generators/types/user-details.d.ts.map +1 -0
- package/dist/generators/types/user-details.js +60 -0
- package/dist/generators/types/workflows.d.ts +15 -0
- package/dist/generators/types/workflows.d.ts.map +1 -0
- package/dist/generators/types/workflows.js +163 -0
- package/dist/graphql/generated/gql.d.ts +47 -0
- package/dist/graphql/generated/gql.d.ts.map +1 -0
- package/dist/graphql/generated/gql.js +10 -0
- package/dist/graphql/generated/graphql.d.ts +8455 -0
- package/dist/graphql/generated/graphql.d.ts.map +1 -0
- package/dist/graphql/generated/graphql.js +573 -0
- package/dist/graphql/generated/index.d.ts +2 -0
- package/dist/graphql/generated/index.d.ts.map +1 -0
- package/dist/graphql/generated/index.js +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/schema/define-entity-model.d.ts +122 -0
- package/dist/schema/define-entity-model.d.ts.map +1 -0
- package/dist/schema/define-entity-model.js +59 -0
- package/dist/schema/schema-loader.d.ts +10 -0
- package/dist/schema/schema-loader.d.ts.map +1 -0
- package/dist/schema/schema-loader.js +91 -0
- package/dist/utils/field-mapping.d.ts +83 -0
- package/dist/utils/field-mapping.d.ts.map +1 -0
- package/dist/utils/field-mapping.js +334 -0
- package/dist/writer/write-files.d.ts +12 -0
- package/dist/writer/write-files.d.ts.map +1 -0
- package/dist/writer/write-files.js +35 -0
- 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 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
|