@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
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remix/Hydrogen Hooks Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates typed loader/action helpers for Remix and Shopify Hydrogen
|
|
5
|
+
* that work with the generic entity API.
|
|
6
|
+
*/
|
|
7
|
+
import type { EntityModel } from '../../fetcher/fetch-schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate Remix/Hydrogen helpers for an entity model
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateRemixHooks(model: EntityModel, _allModels: EntityModel[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate index file for Remix hooks
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateRemixHooksIndex(models: EntityModel[]): string;
|
|
16
|
+
//# sourceMappingURL=remix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remix.d.ts","sourceRoot":"","sources":["../../../src/generators/hooks/remix.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,gCAAgC,CAAC;AAoGvF;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CAuOR;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAwCrE"}
|
|
@@ -0,0 +1,349 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Remix/Hydrogen Hooks Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates typed loader/action helpers for Remix and Shopify Hydrogen
|
|
5
|
+
* that work with the generic entity API.
|
|
6
|
+
*/
|
|
7
|
+
import { toPascalCase, toCamelCase, sanitizeFieldName } from '../../utils/field-mapping.js';
|
|
8
|
+
/**
|
|
9
|
+
* Map metadata field type to TypeScript type
|
|
10
|
+
*/
|
|
11
|
+
function getMetadataValueType(fieldType) {
|
|
12
|
+
switch (fieldType) {
|
|
13
|
+
case 'string':
|
|
14
|
+
return 'string';
|
|
15
|
+
case 'number':
|
|
16
|
+
return 'number';
|
|
17
|
+
case 'boolean':
|
|
18
|
+
return 'boolean';
|
|
19
|
+
case 'date':
|
|
20
|
+
return 'string'; // ISO date string from JSON
|
|
21
|
+
case 'array':
|
|
22
|
+
return 'unknown[]';
|
|
23
|
+
case 'object':
|
|
24
|
+
return 'Record<string, unknown>';
|
|
25
|
+
default:
|
|
26
|
+
return 'unknown';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Build a nested TypeScript interface from dot-notation paths
|
|
31
|
+
*/
|
|
32
|
+
function buildNestedMetadataType(fields, depth = 0) {
|
|
33
|
+
// Group fields by their first path segment
|
|
34
|
+
const groups = new Map();
|
|
35
|
+
const directFields = [];
|
|
36
|
+
for (const field of fields) {
|
|
37
|
+
const parts = field.key.split('.');
|
|
38
|
+
if (parts.length === 1) {
|
|
39
|
+
directFields.push(field);
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
const firstPart = parts[0];
|
|
43
|
+
const remaining = {
|
|
44
|
+
...field,
|
|
45
|
+
key: parts.slice(1).join('.'),
|
|
46
|
+
};
|
|
47
|
+
if (!groups.has(firstPart)) {
|
|
48
|
+
groups.set(firstPart, []);
|
|
49
|
+
}
|
|
50
|
+
groups.get(firstPart).push(remaining);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const indent = ' '.repeat(depth + 1);
|
|
54
|
+
const lines = [];
|
|
55
|
+
// Add direct fields
|
|
56
|
+
for (const field of directFields) {
|
|
57
|
+
const valueType = getMetadataValueType(field.type);
|
|
58
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
59
|
+
const optional = field.required ? '' : '?';
|
|
60
|
+
lines.push(`${indent}${fieldName}${optional}: ${valueType};`);
|
|
61
|
+
}
|
|
62
|
+
// Add nested groups
|
|
63
|
+
for (const [groupName, groupFields] of groups) {
|
|
64
|
+
const nestedType = buildNestedMetadataType(groupFields, depth + 1);
|
|
65
|
+
if (nestedType !== '{}') {
|
|
66
|
+
const fieldName = sanitizeFieldName(groupName);
|
|
67
|
+
lines.push(`${indent}${fieldName}?: ${nestedType}`);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (lines.length === 0) {
|
|
71
|
+
return '{}';
|
|
72
|
+
}
|
|
73
|
+
const closeIndent = ' '.repeat(depth);
|
|
74
|
+
return `{\n${lines.join('\n')}\n${closeIndent}}`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Generate metadata type interface for a model
|
|
78
|
+
*/
|
|
79
|
+
function generateMetadataType(model) {
|
|
80
|
+
const metadataFields = model.metadataSchema?.fields;
|
|
81
|
+
if (!metadataFields || metadataFields.length === 0) {
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return buildNestedMetadataType(metadataFields, 0);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check if model is inline-only (no records mode)
|
|
88
|
+
*/
|
|
89
|
+
function isInlineOnlyModel(model) {
|
|
90
|
+
return model.modes.inline && !model.modes.records;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Generate Remix/Hydrogen helpers for an entity model
|
|
94
|
+
*/
|
|
95
|
+
export function generateRemixHooks(model, _allModels) {
|
|
96
|
+
// Skip inline-only models - they don't have standalone records
|
|
97
|
+
if (isInlineOnlyModel(model)) {
|
|
98
|
+
return '';
|
|
99
|
+
}
|
|
100
|
+
const typeName = toPascalCase(model.key);
|
|
101
|
+
const dataTypeName = `${typeName}Data`;
|
|
102
|
+
const camelName = toCamelCase(model.key);
|
|
103
|
+
const filtersTypeName = `${typeName}Filters`;
|
|
104
|
+
const lines = [];
|
|
105
|
+
// File header
|
|
106
|
+
lines.push(`/**`);
|
|
107
|
+
lines.push(` * ${model.name} - Remix/Hydrogen Helpers`);
|
|
108
|
+
lines.push(` *`);
|
|
109
|
+
lines.push(` * @generated by UniformGen - DO NOT EDIT MANUALLY`);
|
|
110
|
+
lines.push(` */`);
|
|
111
|
+
lines.push('');
|
|
112
|
+
// Imports
|
|
113
|
+
lines.push(`import type { ${dataTypeName} } from '../types/models/${model.key}.js';`);
|
|
114
|
+
lines.push(`import type { FilterInput, SortInput } from '../types/field-types.js';`);
|
|
115
|
+
lines.push(`import { type ${filtersTypeName}, build${typeName}Filters } from '../filters/${model.key}.js';`);
|
|
116
|
+
lines.push('');
|
|
117
|
+
// Re-export filter types for convenience
|
|
118
|
+
lines.push(`// Re-export filter types for convenience`);
|
|
119
|
+
lines.push(`export type { ${filtersTypeName} } from '../filters/${model.key}.js';`);
|
|
120
|
+
lines.push(`export { build${typeName}Filters } from '../filters/${model.key}.js';`);
|
|
121
|
+
lines.push('');
|
|
122
|
+
// Generate metadata type if model has metadataSchema
|
|
123
|
+
const metadataType = generateMetadataType(model);
|
|
124
|
+
const metadataTypeName = `${typeName}Metadata`;
|
|
125
|
+
if (metadataType) {
|
|
126
|
+
lines.push(`/** Typed metadata for ${model.name} */`);
|
|
127
|
+
lines.push(`export interface ${metadataTypeName} ${metadataType}`);
|
|
128
|
+
lines.push('');
|
|
129
|
+
}
|
|
130
|
+
// Typed record interface
|
|
131
|
+
lines.push(`/** Typed ${model.name} record */`);
|
|
132
|
+
lines.push(`export interface ${typeName}Record {`);
|
|
133
|
+
lines.push(` id: string;`);
|
|
134
|
+
lines.push(` modelKey: '${model.key}';`);
|
|
135
|
+
lines.push(` naturalKey?: string;`);
|
|
136
|
+
lines.push(` data: ${dataTypeName};`);
|
|
137
|
+
if (metadataType) {
|
|
138
|
+
lines.push(` metadata?: ${metadataTypeName};`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
lines.push(` metadata?: Record<string, unknown>;`);
|
|
142
|
+
}
|
|
143
|
+
lines.push(` versionNumber: number;`);
|
|
144
|
+
lines.push(` publishedVersionNumber?: number;`);
|
|
145
|
+
lines.push(` status: 'DRAFT' | 'PUBLISHED' | 'ARCHIVED';`);
|
|
146
|
+
lines.push(` createdAt: string;`);
|
|
147
|
+
lines.push(` updatedAt: string;`);
|
|
148
|
+
lines.push(`}`);
|
|
149
|
+
lines.push('');
|
|
150
|
+
// List result interface
|
|
151
|
+
lines.push(`/** Typed list result */`);
|
|
152
|
+
lines.push(`export interface ${typeName}ListResult {`);
|
|
153
|
+
lines.push(` items: ${typeName}Record[];`);
|
|
154
|
+
lines.push(` total: number;`);
|
|
155
|
+
lines.push(` hasMore: boolean;`);
|
|
156
|
+
lines.push(`}`);
|
|
157
|
+
lines.push('');
|
|
158
|
+
// GraphQL client type
|
|
159
|
+
lines.push(`/** GraphQL client interface (works with any fetch-based client) */`);
|
|
160
|
+
lines.push(`export interface GraphQLClient {`);
|
|
161
|
+
lines.push(` request<T>(query: string, variables?: Record<string, unknown>): Promise<T>;`);
|
|
162
|
+
lines.push(`}`);
|
|
163
|
+
lines.push('');
|
|
164
|
+
// Parse helper
|
|
165
|
+
lines.push(`/** Parse raw entity to typed record */`);
|
|
166
|
+
lines.push(`function parse${typeName}(entity: any): ${typeName}Record {`);
|
|
167
|
+
lines.push(` return {`);
|
|
168
|
+
lines.push(` ...entity,`);
|
|
169
|
+
lines.push(` modelKey: '${model.key}',`);
|
|
170
|
+
lines.push(` data: entity.data as ${dataTypeName},`);
|
|
171
|
+
if (metadataType) {
|
|
172
|
+
lines.push(` metadata: entity.metadata as ${metadataTypeName},`);
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
lines.push(` metadata: entity.metadata as Record<string, unknown>,`);
|
|
176
|
+
}
|
|
177
|
+
lines.push(` };`);
|
|
178
|
+
lines.push(`}`);
|
|
179
|
+
lines.push('');
|
|
180
|
+
// GraphQL queries as string constants
|
|
181
|
+
lines.push(`// GraphQL Queries`);
|
|
182
|
+
lines.push(`const GET_${typeName.toUpperCase()}_QUERY = \``);
|
|
183
|
+
lines.push(` query Get${typeName}($id: ID!, $preview: Boolean) {`);
|
|
184
|
+
lines.push(` entity(modelKey: "${model.key}", id: $id, preview: $preview) {`);
|
|
185
|
+
lines.push(` id`);
|
|
186
|
+
lines.push(` modelKey`);
|
|
187
|
+
lines.push(` naturalKey`);
|
|
188
|
+
lines.push(` data`);
|
|
189
|
+
lines.push(` metadata`);
|
|
190
|
+
lines.push(` versionNumber`);
|
|
191
|
+
lines.push(` publishedVersionNumber`);
|
|
192
|
+
lines.push(` status`);
|
|
193
|
+
lines.push(` createdAt`);
|
|
194
|
+
lines.push(` updatedAt`);
|
|
195
|
+
lines.push(` }`);
|
|
196
|
+
lines.push(` }`);
|
|
197
|
+
lines.push(`\`;`);
|
|
198
|
+
lines.push('');
|
|
199
|
+
lines.push(`const LIST_${typeName.toUpperCase()}S_QUERY = \``);
|
|
200
|
+
lines.push(` query List${typeName}s($limit: Int, $offset: Int, $filters: [FilterInput!], $sort: SortInput, $preview: Boolean) {`);
|
|
201
|
+
lines.push(` entities(modelKey: "${model.key}", limit: $limit, offset: $offset, filters: $filters, sort: $sort, preview: $preview) {`);
|
|
202
|
+
lines.push(` items {`);
|
|
203
|
+
lines.push(` id`);
|
|
204
|
+
lines.push(` modelKey`);
|
|
205
|
+
lines.push(` naturalKey`);
|
|
206
|
+
lines.push(` data`);
|
|
207
|
+
lines.push(` metadata`);
|
|
208
|
+
lines.push(` versionNumber`);
|
|
209
|
+
lines.push(` publishedVersionNumber`);
|
|
210
|
+
lines.push(` status`);
|
|
211
|
+
lines.push(` createdAt`);
|
|
212
|
+
lines.push(` updatedAt`);
|
|
213
|
+
lines.push(` }`);
|
|
214
|
+
lines.push(` total`);
|
|
215
|
+
lines.push(` hasMore`);
|
|
216
|
+
lines.push(` }`);
|
|
217
|
+
lines.push(` }`);
|
|
218
|
+
lines.push(`\`;`);
|
|
219
|
+
lines.push('');
|
|
220
|
+
// Fetch single entity
|
|
221
|
+
lines.push(`/**`);
|
|
222
|
+
lines.push(` * Fetch a single ${model.name} by ID`);
|
|
223
|
+
lines.push(` * Use in Remix loaders or server functions`);
|
|
224
|
+
lines.push(` */`);
|
|
225
|
+
lines.push(`export async function fetch${typeName}(`);
|
|
226
|
+
lines.push(` client: GraphQLClient,`);
|
|
227
|
+
lines.push(` id: string,`);
|
|
228
|
+
lines.push(` options?: { preview?: boolean }`);
|
|
229
|
+
lines.push(`): Promise<${typeName}Record | null> {`);
|
|
230
|
+
lines.push(` const result = await client.request<{ entity: any }>(GET_${typeName.toUpperCase()}_QUERY, {`);
|
|
231
|
+
lines.push(` id,`);
|
|
232
|
+
lines.push(` preview: options?.preview,`);
|
|
233
|
+
lines.push(` });`);
|
|
234
|
+
lines.push(` return result.entity ? parse${typeName}(result.entity) : null;`);
|
|
235
|
+
lines.push(`}`);
|
|
236
|
+
lines.push('');
|
|
237
|
+
// Fetch list with typed filters
|
|
238
|
+
lines.push(`/**`);
|
|
239
|
+
lines.push(` * Fetch a list of ${model.name} records`);
|
|
240
|
+
lines.push(` * Use in Remix loaders or server functions`);
|
|
241
|
+
lines.push(` * `);
|
|
242
|
+
lines.push(` * @example`);
|
|
243
|
+
lines.push(` * // Using typed filters (recommended)`);
|
|
244
|
+
lines.push(` * const result = await fetch${typeName}s(client, {`);
|
|
245
|
+
lines.push(` * filters: { title: { contains: 'example' } },`);
|
|
246
|
+
lines.push(` * });`);
|
|
247
|
+
lines.push(` * `);
|
|
248
|
+
lines.push(` * @example`);
|
|
249
|
+
lines.push(` * // Using raw FilterInput array`);
|
|
250
|
+
lines.push(` * const result = await fetch${typeName}s(client, {`);
|
|
251
|
+
lines.push(` * rawFilters: [{ field: 'data.title', operator: 'contains', value: 'example' }],`);
|
|
252
|
+
lines.push(` * });`);
|
|
253
|
+
lines.push(` */`);
|
|
254
|
+
lines.push(`export async function fetch${typeName}s(`);
|
|
255
|
+
lines.push(` client: GraphQLClient,`);
|
|
256
|
+
lines.push(` options?: {`);
|
|
257
|
+
lines.push(` limit?: number;`);
|
|
258
|
+
lines.push(` offset?: number;`);
|
|
259
|
+
lines.push(` /** Typed filters with autocomplete support */`);
|
|
260
|
+
lines.push(` filters?: ${filtersTypeName};`);
|
|
261
|
+
lines.push(` /** Raw filter array (use filters for type safety) */`);
|
|
262
|
+
lines.push(` rawFilters?: FilterInput[];`);
|
|
263
|
+
lines.push(` sort?: SortInput;`);
|
|
264
|
+
lines.push(` preview?: boolean;`);
|
|
265
|
+
lines.push(` }`);
|
|
266
|
+
lines.push(`): Promise<${typeName}ListResult> {`);
|
|
267
|
+
lines.push(` const { filters, rawFilters, ...rest } = options ?? {};`);
|
|
268
|
+
lines.push(` `);
|
|
269
|
+
lines.push(` // Convert typed filters to FilterInput array`);
|
|
270
|
+
lines.push(` const apiFilters = filters ? build${typeName}Filters(filters) : rawFilters;`);
|
|
271
|
+
lines.push(` `);
|
|
272
|
+
lines.push(` const result = await client.request<{ entities: any }>(LIST_${typeName.toUpperCase()}S_QUERY, {`);
|
|
273
|
+
lines.push(` ...rest,`);
|
|
274
|
+
lines.push(` filters: apiFilters,`);
|
|
275
|
+
lines.push(` });`);
|
|
276
|
+
lines.push(` return {`);
|
|
277
|
+
lines.push(` items: result.entities.items.map(parse${typeName}),`);
|
|
278
|
+
lines.push(` total: result.entities.total,`);
|
|
279
|
+
lines.push(` hasMore: result.entities.hasMore,`);
|
|
280
|
+
lines.push(` };`);
|
|
281
|
+
lines.push(`}`);
|
|
282
|
+
lines.push('');
|
|
283
|
+
// Fetch by natural key helper
|
|
284
|
+
lines.push(`/**`);
|
|
285
|
+
lines.push(` * Fetch a ${model.name} by natural key (slug/handle)`);
|
|
286
|
+
lines.push(` * Use in Remix loaders for dynamic routes`);
|
|
287
|
+
lines.push(` */`);
|
|
288
|
+
lines.push(`export async function fetch${typeName}ByNaturalKey(`);
|
|
289
|
+
lines.push(` client: GraphQLClient,`);
|
|
290
|
+
lines.push(` naturalKey: string,`);
|
|
291
|
+
lines.push(` options?: { preview?: boolean }`);
|
|
292
|
+
lines.push(`): Promise<${typeName}Record | null> {`);
|
|
293
|
+
lines.push(` const result = await fetch${typeName}s(client, {`);
|
|
294
|
+
lines.push(` rawFilters: [{ field: 'naturalKey', operator: 'eq', value: naturalKey }],`);
|
|
295
|
+
lines.push(` limit: 1,`);
|
|
296
|
+
lines.push(` preview: options?.preview,`);
|
|
297
|
+
lines.push(` });`);
|
|
298
|
+
lines.push(` return result.items[0] ?? null;`);
|
|
299
|
+
lines.push(`}`);
|
|
300
|
+
lines.push('');
|
|
301
|
+
// Loader helper with type inference
|
|
302
|
+
lines.push(`/**`);
|
|
303
|
+
lines.push(` * Create a typed loader data object`);
|
|
304
|
+
lines.push(` * Helps with type inference in Remix components`);
|
|
305
|
+
lines.push(` */`);
|
|
306
|
+
lines.push(`export function create${typeName}LoaderData<T extends { ${camelName}?: ${typeName}Record | null; ${camelName}s?: ${typeName}ListResult }>(data: T): T {`);
|
|
307
|
+
lines.push(` return data;`);
|
|
308
|
+
lines.push(`}`);
|
|
309
|
+
return lines.join('\n') + '\n';
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Generate index file for Remix hooks
|
|
313
|
+
*/
|
|
314
|
+
export function generateRemixHooksIndex(models) {
|
|
315
|
+
const recordModels = models.filter((m) => m.modes.records);
|
|
316
|
+
let indexCode = `/**
|
|
317
|
+
* Typed Remix/Hydrogen Helpers
|
|
318
|
+
*
|
|
319
|
+
* Server-side fetch helpers for Remix loaders and actions.
|
|
320
|
+
*
|
|
321
|
+
* @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
322
|
+
*/\n\n`;
|
|
323
|
+
// Re-export base types
|
|
324
|
+
indexCode += `// Re-export base filter and sort types\n`;
|
|
325
|
+
indexCode += `export type { FilterInput, SortInput } from '../types/field-types.js';\n\n`;
|
|
326
|
+
for (const model of recordModels) {
|
|
327
|
+
const typeName = toPascalCase(model.key);
|
|
328
|
+
const hasMetadata = model.metadataSchema?.fields && model.metadataSchema.fields.length > 0;
|
|
329
|
+
indexCode += `export {\n`;
|
|
330
|
+
indexCode += ` fetch${typeName},\n`;
|
|
331
|
+
indexCode += ` fetch${typeName}s,\n`;
|
|
332
|
+
indexCode += ` fetch${typeName}ByNaturalKey,\n`;
|
|
333
|
+
indexCode += ` create${typeName}LoaderData,\n`;
|
|
334
|
+
indexCode += ` type ${typeName}Record,\n`;
|
|
335
|
+
if (hasMetadata) {
|
|
336
|
+
indexCode += ` type ${typeName}Metadata,\n`;
|
|
337
|
+
}
|
|
338
|
+
indexCode += ` type ${typeName}ListResult,\n`;
|
|
339
|
+
indexCode += ` type ${typeName}Filters,\n`;
|
|
340
|
+
indexCode += ` build${typeName}Filters,\n`;
|
|
341
|
+
indexCode += `} from './${model.key}.js';\n`;
|
|
342
|
+
}
|
|
343
|
+
// Export GraphQL client type from first model
|
|
344
|
+
const firstModel = recordModels[0];
|
|
345
|
+
if (firstModel) {
|
|
346
|
+
indexCode += `\nexport type { GraphQLClient } from './${firstModel.key}.js';\n`;
|
|
347
|
+
}
|
|
348
|
+
return indexCode;
|
|
349
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Hooks Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates typed React hooks for workflow execution using Apollo Client.
|
|
5
|
+
*/
|
|
6
|
+
import type { WorkflowDefinition } from '../../fetcher/fetch-workflows.js';
|
|
7
|
+
/**
|
|
8
|
+
* Generate React hooks for a single workflow
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateWorkflowReactHooks(workflow: WorkflowDefinition): string;
|
|
11
|
+
/**
|
|
12
|
+
* Generate Remix server functions for a single workflow
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateWorkflowRemixHooks(workflow: WorkflowDefinition): string;
|
|
15
|
+
/**
|
|
16
|
+
* Generate index file for workflow React hooks
|
|
17
|
+
*/
|
|
18
|
+
export declare function generateWorkflowReactHooksIndex(workflows: WorkflowDefinition[]): string;
|
|
19
|
+
/**
|
|
20
|
+
* Generate index file for workflow Remix functions
|
|
21
|
+
*/
|
|
22
|
+
export declare function generateWorkflowRemixHooksIndex(workflows: WorkflowDefinition[]): string;
|
|
23
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/generators/hooks/workflows.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AAoB3E;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CAoI/E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,MAAM,CA0H/E;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAoBvF;AAED;;GAEG;AACH,wBAAgB,+BAA+B,CAAC,SAAS,EAAE,kBAAkB,EAAE,GAAG,MAAM,CAqBvF"}
|