@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,100 @@
|
|
|
1
|
+
import { getFieldType, getRequiredImports, sanitizeFieldName, toPascalCase, } from '../../utils/field-mapping.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate TypeScript types for a data model
|
|
4
|
+
*/
|
|
5
|
+
export function generateDataModelTypes(model, _useUnknownForJSON) {
|
|
6
|
+
const typeName = toPascalCase(model.handle);
|
|
7
|
+
const fields = model.fields || [];
|
|
8
|
+
// Get required imports
|
|
9
|
+
const imports = getRequiredImports(fields);
|
|
10
|
+
const importStatements = imports.size > 0
|
|
11
|
+
? `import type { ${Array.from(imports)
|
|
12
|
+
.map((i) => {
|
|
13
|
+
if (i === 'scalars') {
|
|
14
|
+
return Array.from(new Set(fields.map((f) => getFieldType(f, 'output'))))
|
|
15
|
+
.filter((t) => ![
|
|
16
|
+
'string',
|
|
17
|
+
'number',
|
|
18
|
+
'boolean',
|
|
19
|
+
'Date',
|
|
20
|
+
'unknown',
|
|
21
|
+
].includes(t) && !t.includes('[]'))
|
|
22
|
+
.join(', ');
|
|
23
|
+
}
|
|
24
|
+
return '';
|
|
25
|
+
})
|
|
26
|
+
.filter(Boolean)
|
|
27
|
+
.join(', ')} } from '../scalars.js';\n\n`
|
|
28
|
+
: '';
|
|
29
|
+
// Generate main interface
|
|
30
|
+
let interfaceCode = `/**
|
|
31
|
+
* ${model.name}${model.description ? `\n * ${model.description}` : ''}
|
|
32
|
+
*
|
|
33
|
+
* @generated from data model schema '${model.handle}'
|
|
34
|
+
*/
|
|
35
|
+
export interface ${typeName} {
|
|
36
|
+
id: string;\n`;
|
|
37
|
+
// Add fields
|
|
38
|
+
for (const field of fields) {
|
|
39
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
40
|
+
const fieldType = getFieldType(field, 'output');
|
|
41
|
+
const optional = field.required ? '' : '?';
|
|
42
|
+
const comment = field.helpText ? ` /** ${field.helpText} */\n` : '';
|
|
43
|
+
interfaceCode += comment;
|
|
44
|
+
interfaceCode += ` ${fieldName}${optional}: ${fieldType};\n`;
|
|
45
|
+
}
|
|
46
|
+
// Add system fields
|
|
47
|
+
interfaceCode += `
|
|
48
|
+
// System fields
|
|
49
|
+
createdAt: Date;
|
|
50
|
+
updatedAt: Date;
|
|
51
|
+
}\n\n`;
|
|
52
|
+
// Generate input type
|
|
53
|
+
interfaceCode += `/**
|
|
54
|
+
* Input type for creating/updating ${model.name}
|
|
55
|
+
*/
|
|
56
|
+
export interface ${typeName}Input {\n`;
|
|
57
|
+
for (const field of fields) {
|
|
58
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
59
|
+
const fieldType = getFieldType(field, 'input');
|
|
60
|
+
const optional = field.required ? '' : '?';
|
|
61
|
+
interfaceCode += ` ${fieldName}${optional}: ${fieldType};\n`;
|
|
62
|
+
}
|
|
63
|
+
interfaceCode += '}\n\n';
|
|
64
|
+
// Generate translations type if any fields are translatable
|
|
65
|
+
const translatableFields = fields.filter((f) => f.isTranslatable);
|
|
66
|
+
if (translatableFields.length > 0) {
|
|
67
|
+
interfaceCode += `/**
|
|
68
|
+
* Translatable fields for ${model.name}
|
|
69
|
+
*/
|
|
70
|
+
export interface ${typeName}Translations {\n`;
|
|
71
|
+
for (const field of translatableFields) {
|
|
72
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
73
|
+
const fieldType = getFieldType(field, 'output');
|
|
74
|
+
interfaceCode += ` ${fieldName}?: Record<string, ${fieldType}>; // locale -> content\n`;
|
|
75
|
+
}
|
|
76
|
+
interfaceCode += '}\n';
|
|
77
|
+
}
|
|
78
|
+
return importStatements + interfaceCode;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Generate index file for data models
|
|
82
|
+
*/
|
|
83
|
+
export function generateDataModelsIndex(models) {
|
|
84
|
+
let indexCode = `/**
|
|
85
|
+
* Data Models - Generated types
|
|
86
|
+
*
|
|
87
|
+
* @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
88
|
+
*/\n\n`;
|
|
89
|
+
for (const model of models) {
|
|
90
|
+
const typeName = toPascalCase(model.handle);
|
|
91
|
+
indexCode += `export type { ${typeName}, ${typeName}Input`;
|
|
92
|
+
// Add translations export if any fields are translatable
|
|
93
|
+
const hasTranslations = model.fields?.some((f) => f.isTranslatable);
|
|
94
|
+
if (hasTranslations) {
|
|
95
|
+
indexCode += `, ${typeName}Translations`;
|
|
96
|
+
}
|
|
97
|
+
indexCode += ` } from './${model.handle}.js';\n`;
|
|
98
|
+
}
|
|
99
|
+
return indexCode;
|
|
100
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { EntityModel } from '../../fetcher/fetch-schemas.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate TypeScript code for an entity model
|
|
4
|
+
*
|
|
5
|
+
* For models with records mode: generates config object + data interface
|
|
6
|
+
* For inline-only models: generates only data interface (no config)
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateEntityModelTypes(model: EntityModel, allModels: EntityModel[]): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generate index file for entity models
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateEntityModelsIndex(models: EntityModel[]): string;
|
|
13
|
+
//# sourceMappingURL=entity-models.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-models.d.ts","sourceRoot":"","sources":["../../../src/generators/types/entity-models.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAe,MAAM,gCAAgC,CAAC;AA+B/E;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACvB,MAAM,CAiCR;AA6ND;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAsBvE"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { getFieldType, getInlineSchemaReferences, generateFieldDef, sanitizeFieldName, toPascalCase, toCamelCase, FIELD_TYPE_MAPPING, } from '../../utils/field-mapping.js';
|
|
2
|
+
/**
|
|
3
|
+
* Check if model is inline-only (no records mode)
|
|
4
|
+
*/
|
|
5
|
+
function isInlineOnlyModel(model) {
|
|
6
|
+
return model.modes.inline && !model.modes.records;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Get the mode string for config
|
|
10
|
+
*/
|
|
11
|
+
function getModelMode(model) {
|
|
12
|
+
if (model.modes.inline && model.modes.records) {
|
|
13
|
+
return 'both';
|
|
14
|
+
}
|
|
15
|
+
if (model.modes.inline) {
|
|
16
|
+
return 'inline';
|
|
17
|
+
}
|
|
18
|
+
return 'records';
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate TypeScript code for an entity model
|
|
22
|
+
*
|
|
23
|
+
* For models with records mode: generates config object + data interface
|
|
24
|
+
* For inline-only models: generates only data interface (no config)
|
|
25
|
+
*/
|
|
26
|
+
export function generateEntityModelTypes(model, allModels) {
|
|
27
|
+
const typeName = toPascalCase(model.key);
|
|
28
|
+
const configName = toCamelCase(model.key) + 'Config';
|
|
29
|
+
const fields = model.fields || [];
|
|
30
|
+
// Get field type imports
|
|
31
|
+
const fieldTypeImports = getFieldTypeImportsForFields(fields);
|
|
32
|
+
// Get inline schema references
|
|
33
|
+
const inlineSchemaRefs = getInlineSchemaReferences(fields);
|
|
34
|
+
// Build imports
|
|
35
|
+
const importStatements = buildImportStatements(model, fieldTypeImports, inlineSchemaRefs, allModels);
|
|
36
|
+
let code = importStatements;
|
|
37
|
+
// For inline-only models, only generate the data interface
|
|
38
|
+
if (isInlineOnlyModel(model)) {
|
|
39
|
+
code += generateDataInterface(model, fields, typeName, allModels);
|
|
40
|
+
return code;
|
|
41
|
+
}
|
|
42
|
+
// For models with records mode, generate both config and data interface
|
|
43
|
+
code += generateConfigObject(model, fields, configName);
|
|
44
|
+
code += '\n';
|
|
45
|
+
code += generateDataInterface(model, fields, typeName + 'Data', allModels);
|
|
46
|
+
return code;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Build import statements for the generated file
|
|
50
|
+
*/
|
|
51
|
+
function buildImportStatements(model, fieldTypeImports, inlineSchemaRefs, allModels) {
|
|
52
|
+
const imports = [];
|
|
53
|
+
// Config import (only for non-inline-only models)
|
|
54
|
+
if (!isInlineOnlyModel(model)) {
|
|
55
|
+
imports.push("import type { EntityModelConfig } from '../config.js';");
|
|
56
|
+
}
|
|
57
|
+
// Field type value imports
|
|
58
|
+
if (fieldTypeImports.size > 0) {
|
|
59
|
+
const types = Array.from(fieldTypeImports).sort().join(', ');
|
|
60
|
+
imports.push(`import type { ${types} } from '../field-types.js';`);
|
|
61
|
+
}
|
|
62
|
+
// Inline schema imports
|
|
63
|
+
for (const refKey of inlineSchemaRefs) {
|
|
64
|
+
const refModel = allModels.find((m) => m.key === refKey);
|
|
65
|
+
if (refModel) {
|
|
66
|
+
const refTypeName = isInlineOnlyModel(refModel)
|
|
67
|
+
? toPascalCase(refKey)
|
|
68
|
+
: toPascalCase(refKey) + 'Data';
|
|
69
|
+
imports.push(`import type { ${refTypeName} } from './${refKey}.js';`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
if (imports.length > 0) {
|
|
73
|
+
return imports.join('\n') + '\n\n';
|
|
74
|
+
}
|
|
75
|
+
return '';
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Generate the config object for an entity model
|
|
79
|
+
*/
|
|
80
|
+
function generateConfigObject(model, fields, configName) {
|
|
81
|
+
const lines = [];
|
|
82
|
+
// JSDoc comment
|
|
83
|
+
lines.push('/**');
|
|
84
|
+
lines.push(` * ${model.name} Configuration`);
|
|
85
|
+
if (model.description) {
|
|
86
|
+
lines.push(` * ${model.description}`);
|
|
87
|
+
}
|
|
88
|
+
lines.push(` *`);
|
|
89
|
+
lines.push(` * @generated from entity model '${model.key}'`);
|
|
90
|
+
lines.push(' */');
|
|
91
|
+
// Config object
|
|
92
|
+
lines.push(`export const ${configName} = {`);
|
|
93
|
+
lines.push(` key: '${model.key}',`);
|
|
94
|
+
lines.push(` name: '${model.name.replace(/'/g, "\\'")}',`);
|
|
95
|
+
if (model.description) {
|
|
96
|
+
lines.push(` description: '${model.description.replace(/'/g, "\\'")}',`);
|
|
97
|
+
}
|
|
98
|
+
// Feature flags derived from tier
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push(' // Feature flags');
|
|
101
|
+
lines.push(` versions: ${model.tier >= 2},`);
|
|
102
|
+
lines.push(` variants: ${model.tier >= 3},`);
|
|
103
|
+
lines.push(` customFields: ${!(model.isInfrastructure ?? false)},`);
|
|
104
|
+
// Usage mode
|
|
105
|
+
lines.push('');
|
|
106
|
+
lines.push(' // Usage mode');
|
|
107
|
+
lines.push(` mode: '${getModelMode(model)}',`);
|
|
108
|
+
lines.push(` publicApi: ${model.modes.publicApi ?? false},`);
|
|
109
|
+
lines.push(` editorMode: '${model.editorMode ?? 'flat'}',`);
|
|
110
|
+
// Pages configuration (routing, default template, sitemap)
|
|
111
|
+
if (model.pages) {
|
|
112
|
+
lines.push('');
|
|
113
|
+
lines.push(' // Pages configuration');
|
|
114
|
+
const pagesParts = [];
|
|
115
|
+
pagesParts.push(`enabled: ${model.pages.enabled}`);
|
|
116
|
+
if (model.pages.defaultTemplate) {
|
|
117
|
+
pagesParts.push(`defaultTemplate: '${model.pages.defaultTemplate.naturalKey}'`);
|
|
118
|
+
}
|
|
119
|
+
if (model.pages.sitemap) {
|
|
120
|
+
const sitemapParts = [];
|
|
121
|
+
if (model.pages.sitemap.changefreq) {
|
|
122
|
+
sitemapParts.push(`changefreq: '${model.pages.sitemap.changefreq}'`);
|
|
123
|
+
}
|
|
124
|
+
if (model.pages.sitemap.priority !== undefined) {
|
|
125
|
+
sitemapParts.push(`priority: ${model.pages.sitemap.priority}`);
|
|
126
|
+
}
|
|
127
|
+
if (sitemapParts.length > 0) {
|
|
128
|
+
pagesParts.push(`sitemap: { ${sitemapParts.join(', ')} }`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
lines.push(` pages: { ${pagesParts.join(', ')} },`);
|
|
132
|
+
}
|
|
133
|
+
// Hooks
|
|
134
|
+
if (model.hooks && Object.keys(model.hooks).length > 0) {
|
|
135
|
+
lines.push('');
|
|
136
|
+
lines.push(' // Lifecycle hooks');
|
|
137
|
+
lines.push(` hooks: ${JSON.stringify(model.hooks, null, 4).replace(/\n/g, '\n ')},`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
lines.push('');
|
|
141
|
+
lines.push(' // Lifecycle hooks');
|
|
142
|
+
lines.push(' hooks: {},');
|
|
143
|
+
}
|
|
144
|
+
// Field definitions
|
|
145
|
+
lines.push('');
|
|
146
|
+
lines.push(' // Field definitions');
|
|
147
|
+
if (fields.length === 0) {
|
|
148
|
+
lines.push(' fieldDefs: [],');
|
|
149
|
+
}
|
|
150
|
+
else {
|
|
151
|
+
lines.push(' fieldDefs: [');
|
|
152
|
+
for (const field of fields) {
|
|
153
|
+
lines.push(` ${generateFieldDef(field)},`);
|
|
154
|
+
}
|
|
155
|
+
lines.push(' ],');
|
|
156
|
+
}
|
|
157
|
+
lines.push('} as const satisfies EntityModelConfig;');
|
|
158
|
+
return lines.join('\n') + '\n';
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Generate the data interface for field values
|
|
162
|
+
*/
|
|
163
|
+
function generateDataInterface(model, fields, interfaceName, allModels) {
|
|
164
|
+
const lines = [];
|
|
165
|
+
// JSDoc comment
|
|
166
|
+
lines.push('/**');
|
|
167
|
+
lines.push(` * ${model.name} Data`);
|
|
168
|
+
lines.push(` * Field values only - no system fields`);
|
|
169
|
+
lines.push(` *`);
|
|
170
|
+
lines.push(` * @generated from entity model '${model.key}'`);
|
|
171
|
+
lines.push(' */');
|
|
172
|
+
lines.push(`export interface ${interfaceName} {`);
|
|
173
|
+
for (const field of fields) {
|
|
174
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
175
|
+
let fieldType = getFieldType(field, 'output');
|
|
176
|
+
// Adjust type name for inline schema references to models with records mode
|
|
177
|
+
const refModel = allModels.find((m) => m.key === field.type);
|
|
178
|
+
if (refModel && !isInlineOnlyModel(refModel)) {
|
|
179
|
+
// Model has records mode, so use PascalCaseData instead of just PascalCase
|
|
180
|
+
fieldType = toPascalCase(field.type) + 'Data';
|
|
181
|
+
}
|
|
182
|
+
// Also handle list/tree itemType
|
|
183
|
+
if ((field.type === 'list' || field.type === 'tree') &&
|
|
184
|
+
field.options?.itemType) {
|
|
185
|
+
const itemRefModel = allModels.find((m) => m.key === field.options.itemType);
|
|
186
|
+
if (itemRefModel && !isInlineOnlyModel(itemRefModel)) {
|
|
187
|
+
fieldType = toPascalCase(field.options.itemType) + 'Data[]';
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const optional = field.required ? '' : '?';
|
|
191
|
+
const comment = field.helpText ? ` /** ${field.helpText} */\n` : '';
|
|
192
|
+
lines.push(comment + ` ${fieldName}${optional}: ${fieldType};`);
|
|
193
|
+
}
|
|
194
|
+
lines.push('}');
|
|
195
|
+
return lines.join('\n') + '\n';
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get field type value imports needed for a set of fields
|
|
199
|
+
*/
|
|
200
|
+
function getFieldTypeImportsForFields(fields) {
|
|
201
|
+
const imports = new Set();
|
|
202
|
+
for (const field of fields) {
|
|
203
|
+
const mapping = FIELD_TYPE_MAPPING[field.type];
|
|
204
|
+
if (mapping?.needsImport === 'field-types') {
|
|
205
|
+
imports.add(mapping.outputType);
|
|
206
|
+
}
|
|
207
|
+
// Check list/tree itemType
|
|
208
|
+
if ((field.type === 'list' || field.type === 'tree') &&
|
|
209
|
+
field.options?.itemType) {
|
|
210
|
+
const itemMapping = FIELD_TYPE_MAPPING[field.options.itemType];
|
|
211
|
+
if (itemMapping?.needsImport === 'field-types') {
|
|
212
|
+
imports.add(itemMapping.outputType);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return imports;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Generate index file for entity models
|
|
220
|
+
*/
|
|
221
|
+
export function generateEntityModelsIndex(models) {
|
|
222
|
+
let indexCode = `/**
|
|
223
|
+
* Entity Models - Generated types and configs
|
|
224
|
+
*
|
|
225
|
+
* @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
226
|
+
*/\n\n`;
|
|
227
|
+
for (const model of models) {
|
|
228
|
+
const typeName = toPascalCase(model.key);
|
|
229
|
+
const configName = toCamelCase(model.key) + 'Config';
|
|
230
|
+
if (isInlineOnlyModel(model)) {
|
|
231
|
+
// Inline-only: export only the data type
|
|
232
|
+
indexCode += `export type { ${typeName} } from './${model.key}.js';\n`;
|
|
233
|
+
}
|
|
234
|
+
else {
|
|
235
|
+
// Records mode: export config and data type
|
|
236
|
+
indexCode += `export { ${configName} } from './${model.key}.js';\n`;
|
|
237
|
+
indexCode += `export type { ${typeName}Data } from './${model.key}.js';\n`;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
return indexCode;
|
|
241
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generates the field-types.ts file with:
|
|
3
|
+
* - Value types for each field type (what the data looks like)
|
|
4
|
+
* - Field definition types (how to define fields in config)
|
|
5
|
+
*
|
|
6
|
+
* @generated by UniformGen
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateFieldTypesFile(): string;
|
|
9
|
+
//# sourceMappingURL=field-types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-types.d.ts","sourceRoot":"","sources":["../../../src/generators/types/field-types.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,wBAAgB,sBAAsB,IAAI,MAAM,CAmoB/C"}
|