@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,87 @@
|
|
|
1
|
+
import { toPascalCase } from '../../utils/field-mapping.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate GraphQL documents for an entity model
|
|
4
|
+
* Uses generic entity/entities operations
|
|
5
|
+
*/
|
|
6
|
+
export function generateEntityModelDocuments(model) {
|
|
7
|
+
const typeName = toPascalCase(model.key);
|
|
8
|
+
const pluralName = model.pluralName
|
|
9
|
+
? toPascalCase(model.pluralName.replace(/\s+/g, ''))
|
|
10
|
+
: `${typeName}s`;
|
|
11
|
+
return `# Generated GraphQL operations for ${model.name}
|
|
12
|
+
# @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
13
|
+
|
|
14
|
+
fragment ${typeName}Fields on EntityRecord {
|
|
15
|
+
id
|
|
16
|
+
modelKey
|
|
17
|
+
naturalKey
|
|
18
|
+
data
|
|
19
|
+
metadata
|
|
20
|
+
versionNumber
|
|
21
|
+
publishedVersionNumber
|
|
22
|
+
status
|
|
23
|
+
createdAt
|
|
24
|
+
updatedAt
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
query Get${typeName}($id: ID!, $preview: Boolean) {
|
|
28
|
+
entity(modelKey: "${model.key}", id: $id, preview: $preview) {
|
|
29
|
+
...${typeName}Fields
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
query List${pluralName}(
|
|
34
|
+
$limit: Int
|
|
35
|
+
$offset: Int
|
|
36
|
+
$filters: [FilterInput!]
|
|
37
|
+
$sort: SortInput
|
|
38
|
+
$preview: Boolean
|
|
39
|
+
) {
|
|
40
|
+
entities(
|
|
41
|
+
modelKey: "${model.key}"
|
|
42
|
+
limit: $limit
|
|
43
|
+
offset: $offset
|
|
44
|
+
filters: $filters
|
|
45
|
+
sort: $sort
|
|
46
|
+
preview: $preview
|
|
47
|
+
) {
|
|
48
|
+
items {
|
|
49
|
+
...${typeName}Fields
|
|
50
|
+
}
|
|
51
|
+
total
|
|
52
|
+
hasMore
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
mutation Create${typeName}($data: JSON!) {
|
|
57
|
+
createEntity(modelKey: "${model.key}", data: $data) {
|
|
58
|
+
...${typeName}Fields
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
mutation Update${typeName}($id: ID!, $data: JSON!) {
|
|
63
|
+
updateEntity(modelKey: "${model.key}", id: $id, data: $data) {
|
|
64
|
+
...${typeName}Fields
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
mutation Delete${typeName}($id: ID!) {
|
|
69
|
+
deleteEntity(modelKey: "${model.key}", id: $id) {
|
|
70
|
+
success
|
|
71
|
+
message
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
mutation Publish${typeName}($id: ID!, $versionId: ID) {
|
|
76
|
+
publishEntity(modelKey: "${model.key}", id: $id, versionId: $versionId) {
|
|
77
|
+
...${typeName}Fields
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
mutation Unpublish${typeName}($id: ID!) {
|
|
82
|
+
unpublishEntity(modelKey: "${model.key}", id: $id) {
|
|
83
|
+
...${typeName}Fields
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
`;
|
|
87
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Documents Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates shared GraphQL documents for workflow operations.
|
|
5
|
+
* These are used by both React hooks and Remix server functions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Generate the shared workflow GraphQL documents file
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateWorkflowDocuments(): string;
|
|
11
|
+
//# sourceMappingURL=workflows.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflows.d.ts","sourceRoot":"","sources":["../../../src/generators/documents/workflows.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAiGlD"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Documents Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates shared GraphQL documents for workflow operations.
|
|
5
|
+
* These are used by both React hooks and Remix server functions.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Generate the shared workflow GraphQL documents file
|
|
9
|
+
*/
|
|
10
|
+
export function generateWorkflowDocuments() {
|
|
11
|
+
const lines = [];
|
|
12
|
+
lines.push('/**');
|
|
13
|
+
lines.push(' * Workflow GraphQL Documents');
|
|
14
|
+
lines.push(' * @generated by UniformGen - DO NOT EDIT MANUALLY');
|
|
15
|
+
lines.push(' */');
|
|
16
|
+
lines.push('');
|
|
17
|
+
lines.push("import { gql } from 'graphql-request';");
|
|
18
|
+
lines.push('');
|
|
19
|
+
// Execute workflow mutation
|
|
20
|
+
lines.push('/**');
|
|
21
|
+
lines.push(' * Execute a workflow via the public API');
|
|
22
|
+
lines.push(' */');
|
|
23
|
+
lines.push('export const PublicExecuteWorkflowDocument = gql`');
|
|
24
|
+
lines.push(' mutation PublicExecuteWorkflow($input: PublicExecuteWorkflowInput!) {');
|
|
25
|
+
lines.push(' publicExecuteWorkflow(input: $input) {');
|
|
26
|
+
lines.push(' success');
|
|
27
|
+
lines.push(' executionId');
|
|
28
|
+
lines.push(' queued');
|
|
29
|
+
lines.push(' result');
|
|
30
|
+
lines.push(' error {');
|
|
31
|
+
lines.push(' code');
|
|
32
|
+
lines.push(' message');
|
|
33
|
+
lines.push(' }');
|
|
34
|
+
lines.push(' }');
|
|
35
|
+
lines.push(' }');
|
|
36
|
+
lines.push('`;');
|
|
37
|
+
lines.push('');
|
|
38
|
+
// Get workflow execution query
|
|
39
|
+
lines.push('/**');
|
|
40
|
+
lines.push(' * Get workflow execution status');
|
|
41
|
+
lines.push(' */');
|
|
42
|
+
lines.push('export const PublicWorkflowExecutionDocument = gql`');
|
|
43
|
+
lines.push(' query PublicWorkflowExecution($id: ID!) {');
|
|
44
|
+
lines.push(' publicWorkflowExecution(id: $id) {');
|
|
45
|
+
lines.push(' id');
|
|
46
|
+
lines.push(' workflowKey');
|
|
47
|
+
lines.push(' status');
|
|
48
|
+
lines.push(' result');
|
|
49
|
+
lines.push(' error {');
|
|
50
|
+
lines.push(' code');
|
|
51
|
+
lines.push(' message');
|
|
52
|
+
lines.push(' }');
|
|
53
|
+
lines.push(' createdAt');
|
|
54
|
+
lines.push(' completedAt');
|
|
55
|
+
lines.push(' }');
|
|
56
|
+
lines.push(' }');
|
|
57
|
+
lines.push('`;');
|
|
58
|
+
lines.push('');
|
|
59
|
+
// List workflow executions query
|
|
60
|
+
lines.push('/**');
|
|
61
|
+
lines.push(' * List workflow executions');
|
|
62
|
+
lines.push(' */');
|
|
63
|
+
lines.push('export const PublicWorkflowExecutionsDocument = gql`');
|
|
64
|
+
lines.push(' query PublicWorkflowExecutions(');
|
|
65
|
+
lines.push(' $workflowKey: String');
|
|
66
|
+
lines.push(' $status: PublicWorkflowExecutionStatus');
|
|
67
|
+
lines.push(' $limit: Int');
|
|
68
|
+
lines.push(' $offset: Int');
|
|
69
|
+
lines.push(' ) {');
|
|
70
|
+
lines.push(' publicWorkflowExecutions(');
|
|
71
|
+
lines.push(' workflowKey: $workflowKey');
|
|
72
|
+
lines.push(' status: $status');
|
|
73
|
+
lines.push(' limit: $limit');
|
|
74
|
+
lines.push(' offset: $offset');
|
|
75
|
+
lines.push(' ) {');
|
|
76
|
+
lines.push(' items {');
|
|
77
|
+
lines.push(' id');
|
|
78
|
+
lines.push(' workflowKey');
|
|
79
|
+
lines.push(' status');
|
|
80
|
+
lines.push(' createdAt');
|
|
81
|
+
lines.push(' completedAt');
|
|
82
|
+
lines.push(' }');
|
|
83
|
+
lines.push(' total');
|
|
84
|
+
lines.push(' }');
|
|
85
|
+
lines.push(' }');
|
|
86
|
+
lines.push('`;');
|
|
87
|
+
lines.push('');
|
|
88
|
+
// Cancel workflow execution mutation
|
|
89
|
+
lines.push('/**');
|
|
90
|
+
lines.push(' * Cancel a workflow execution');
|
|
91
|
+
lines.push(' */');
|
|
92
|
+
lines.push('export const PublicCancelWorkflowExecutionDocument = gql`');
|
|
93
|
+
lines.push(' mutation PublicCancelWorkflowExecution($id: ID!) {');
|
|
94
|
+
lines.push(' publicCancelWorkflowExecution(id: $id) {');
|
|
95
|
+
lines.push(' id');
|
|
96
|
+
lines.push(' status');
|
|
97
|
+
lines.push(' }');
|
|
98
|
+
lines.push(' }');
|
|
99
|
+
lines.push('`;');
|
|
100
|
+
return lines.join('\n') + '\n';
|
|
101
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Type Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates typed filter interfaces and buildFilters helpers
|
|
5
|
+
* with support for nested object filtering and metadata fields.
|
|
6
|
+
*/
|
|
7
|
+
import type { EntityModel } from '../../fetcher/fetch-schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate the filter types file for a model
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateModelFilters(model: EntityModel, allModels: EntityModel[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate index file for filters
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateFiltersIndex(models: EntityModel[]): string;
|
|
16
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/generators/filters/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAoC,MAAM,gCAAgC,CAAC;AAyPpG;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,WAAW,EAClB,SAAS,EAAE,WAAW,EAAE,GACvB,MAAM,CAgJR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAmClE"}
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Filter Type Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates typed filter interfaces and buildFilters helpers
|
|
5
|
+
* with support for nested object filtering and metadata fields.
|
|
6
|
+
*/
|
|
7
|
+
import { toPascalCase, sanitizeFieldName } from '../../utils/field-mapping.js';
|
|
8
|
+
import { PRIMITIVE_FIELD_TYPES } from '../../utils/field-mapping.js';
|
|
9
|
+
/**
|
|
10
|
+
* Map field type to filter type name
|
|
11
|
+
*/
|
|
12
|
+
function getFilterTypeName(fieldType, field) {
|
|
13
|
+
switch (fieldType) {
|
|
14
|
+
case 'text':
|
|
15
|
+
case 'richtext':
|
|
16
|
+
case 'email':
|
|
17
|
+
case 'phone':
|
|
18
|
+
case 'url':
|
|
19
|
+
return 'TextFilter';
|
|
20
|
+
case 'number':
|
|
21
|
+
case 'currency':
|
|
22
|
+
return 'NumberFilter';
|
|
23
|
+
case 'boolean':
|
|
24
|
+
return 'BooleanFilter';
|
|
25
|
+
case 'date':
|
|
26
|
+
return 'DateFilter';
|
|
27
|
+
case 'select':
|
|
28
|
+
// Check if we have options to create a literal union
|
|
29
|
+
if (field.options?.options && Array.isArray(field.options.options)) {
|
|
30
|
+
const values = field.options.options
|
|
31
|
+
.map((o) => `'${o.value}'`)
|
|
32
|
+
.join(' | ');
|
|
33
|
+
return `SelectFilter<${values}>`;
|
|
34
|
+
}
|
|
35
|
+
return 'SelectFilter';
|
|
36
|
+
case 'multiselect':
|
|
37
|
+
if (field.options?.options && Array.isArray(field.options.options)) {
|
|
38
|
+
const values = field.options.options
|
|
39
|
+
.map((o) => `'${o.value}'`)
|
|
40
|
+
.join(' | ');
|
|
41
|
+
return `MultiselectFilter<${values}>`;
|
|
42
|
+
}
|
|
43
|
+
return 'MultiselectFilter';
|
|
44
|
+
case 'entity-reference':
|
|
45
|
+
return 'ReferenceFilter';
|
|
46
|
+
case 'image':
|
|
47
|
+
case 'video':
|
|
48
|
+
case 'file':
|
|
49
|
+
case 'link':
|
|
50
|
+
case 'json':
|
|
51
|
+
case 'design-system-style':
|
|
52
|
+
// These types typically aren't filtered directly
|
|
53
|
+
return null;
|
|
54
|
+
default:
|
|
55
|
+
// Non-primitive type - could be inline schema reference
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Map metadata field type to filter type name
|
|
61
|
+
*/
|
|
62
|
+
function getMetadataFilterTypeName(fieldType) {
|
|
63
|
+
switch (fieldType) {
|
|
64
|
+
case 'string':
|
|
65
|
+
return 'TextFilter';
|
|
66
|
+
case 'number':
|
|
67
|
+
return 'NumberFilter';
|
|
68
|
+
case 'boolean':
|
|
69
|
+
return 'BooleanFilter';
|
|
70
|
+
case 'date':
|
|
71
|
+
return 'DateFilter';
|
|
72
|
+
case 'array':
|
|
73
|
+
case 'object':
|
|
74
|
+
// Complex types - not directly filterable but could contain nested paths
|
|
75
|
+
return null;
|
|
76
|
+
default:
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Check if a field type is filterable
|
|
82
|
+
*/
|
|
83
|
+
function isFilterableField(fieldType) {
|
|
84
|
+
const filterableTypes = [
|
|
85
|
+
'text',
|
|
86
|
+
'richtext',
|
|
87
|
+
'email',
|
|
88
|
+
'phone',
|
|
89
|
+
'url',
|
|
90
|
+
'number',
|
|
91
|
+
'currency',
|
|
92
|
+
'boolean',
|
|
93
|
+
'date',
|
|
94
|
+
'select',
|
|
95
|
+
'multiselect',
|
|
96
|
+
'entity-reference',
|
|
97
|
+
];
|
|
98
|
+
return filterableTypes.includes(fieldType);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Check if a field type is a primitive (built-in) type
|
|
102
|
+
*/
|
|
103
|
+
function isPrimitiveFieldType(type) {
|
|
104
|
+
return PRIMITIVE_FIELD_TYPES.has(type);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Build a nested object structure from dot-notation paths
|
|
108
|
+
* e.g., 'synced.shopifyProductId' -> { synced: { shopifyProductId: 'TextFilter' } }
|
|
109
|
+
*/
|
|
110
|
+
function buildNestedStructure(fields, depth = 0) {
|
|
111
|
+
// Group fields by their first path segment
|
|
112
|
+
const groups = new Map();
|
|
113
|
+
const directFields = [];
|
|
114
|
+
for (const field of fields) {
|
|
115
|
+
const parts = field.key.split('.');
|
|
116
|
+
if (parts.length === 1) {
|
|
117
|
+
directFields.push(field);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
const firstPart = parts[0]; // Guaranteed to exist when parts.length > 1
|
|
121
|
+
const remaining = {
|
|
122
|
+
...field,
|
|
123
|
+
key: parts.slice(1).join('.'),
|
|
124
|
+
};
|
|
125
|
+
if (!groups.has(firstPart)) {
|
|
126
|
+
groups.set(firstPart, []);
|
|
127
|
+
}
|
|
128
|
+
groups.get(firstPart).push(remaining);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
const indent = ' '.repeat(depth + 1);
|
|
132
|
+
const lines = [];
|
|
133
|
+
// Add direct fields
|
|
134
|
+
for (const field of directFields) {
|
|
135
|
+
const filterType = getMetadataFilterTypeName(field.type);
|
|
136
|
+
if (filterType) {
|
|
137
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
138
|
+
lines.push(`${indent}${fieldName}?: ${filterType};`);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Add nested groups
|
|
142
|
+
for (const [groupName, groupFields] of groups) {
|
|
143
|
+
const nestedStructure = buildNestedStructure(groupFields, depth + 1);
|
|
144
|
+
if (nestedStructure !== '{}') {
|
|
145
|
+
const fieldName = sanitizeFieldName(groupName);
|
|
146
|
+
lines.push(`${indent}${fieldName}?: ${nestedStructure}`);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (lines.length === 0) {
|
|
150
|
+
return '{}';
|
|
151
|
+
}
|
|
152
|
+
const closeIndent = ' '.repeat(depth);
|
|
153
|
+
return `{\n${lines.join('\n')}\n${closeIndent}}`;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Generate filter interface for metadata fields
|
|
157
|
+
*/
|
|
158
|
+
function generateMetadataFilterInterface(metadataFields, depth = 0) {
|
|
159
|
+
if (!metadataFields || metadataFields.length === 0) {
|
|
160
|
+
return '';
|
|
161
|
+
}
|
|
162
|
+
return buildNestedStructure(metadataFields, depth);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Generate filter interface for a model's fields, with nested support
|
|
166
|
+
*/
|
|
167
|
+
function generateFilterInterface(model, allModels, depth = 0, visited = new Set()) {
|
|
168
|
+
// Prevent infinite recursion
|
|
169
|
+
if (visited.has(model.key)) {
|
|
170
|
+
return '{}';
|
|
171
|
+
}
|
|
172
|
+
visited.add(model.key);
|
|
173
|
+
const indent = ' '.repeat(depth + 1);
|
|
174
|
+
const lines = [];
|
|
175
|
+
for (const field of model.fields) {
|
|
176
|
+
const fieldName = sanitizeFieldName(field.key);
|
|
177
|
+
// Check if it's a primitive filterable type
|
|
178
|
+
if (isPrimitiveFieldType(field.type) && isFilterableField(field.type)) {
|
|
179
|
+
const filterType = getFilterTypeName(field.type, field);
|
|
180
|
+
if (filterType) {
|
|
181
|
+
lines.push(`${indent}${fieldName}?: ${filterType};`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// Check if it's an inline schema reference
|
|
185
|
+
else if (!isPrimitiveFieldType(field.type)) {
|
|
186
|
+
const referencedModel = allModels.find((m) => m.key === field.type);
|
|
187
|
+
if (referencedModel && referencedModel.modes.inline) {
|
|
188
|
+
// Recursively generate nested filter structure
|
|
189
|
+
const nestedInterface = generateFilterInterface(referencedModel, allModels, depth + 1, new Set(visited));
|
|
190
|
+
if (nestedInterface !== '{}') {
|
|
191
|
+
lines.push(`${indent}${fieldName}?: ${nestedInterface}`);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Handle list fields with inline item types
|
|
196
|
+
else if (field.type === 'list' && field.options?.itemType) {
|
|
197
|
+
const itemType = field.options.itemType;
|
|
198
|
+
if (!isPrimitiveFieldType(itemType)) {
|
|
199
|
+
const referencedModel = allModels.find((m) => m.key === itemType);
|
|
200
|
+
if (referencedModel && referencedModel.modes.inline) {
|
|
201
|
+
const nestedInterface = generateFilterInterface(referencedModel, allModels, depth + 1, new Set(visited));
|
|
202
|
+
if (nestedInterface !== '{}') {
|
|
203
|
+
lines.push(`${indent}${fieldName}?: ${nestedInterface}`);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
if (lines.length === 0) {
|
|
210
|
+
return '{}';
|
|
211
|
+
}
|
|
212
|
+
const closeIndent = ' '.repeat(depth);
|
|
213
|
+
return `{\n${lines.join('\n')}\n${closeIndent}}`;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Generate the filter types file for a model
|
|
217
|
+
*/
|
|
218
|
+
export function generateModelFilters(model, allModels) {
|
|
219
|
+
// Skip inline-only models - they don't have standalone queries
|
|
220
|
+
if (model.modes.inline && !model.modes.records) {
|
|
221
|
+
return '';
|
|
222
|
+
}
|
|
223
|
+
const typeName = toPascalCase(model.key);
|
|
224
|
+
const lines = [];
|
|
225
|
+
// File header
|
|
226
|
+
lines.push(`/**`);
|
|
227
|
+
lines.push(` * ${model.name} - Typed Filters`);
|
|
228
|
+
lines.push(` *`);
|
|
229
|
+
lines.push(` * @generated by UniformGen - DO NOT EDIT MANUALLY`);
|
|
230
|
+
lines.push(` */`);
|
|
231
|
+
lines.push('');
|
|
232
|
+
// Imports
|
|
233
|
+
lines.push(`import type {`);
|
|
234
|
+
lines.push(` TextFilter,`);
|
|
235
|
+
lines.push(` NumberFilter,`);
|
|
236
|
+
lines.push(` BooleanFilter,`);
|
|
237
|
+
lines.push(` DateFilter,`);
|
|
238
|
+
lines.push(` SelectFilter,`);
|
|
239
|
+
lines.push(` MultiselectFilter,`);
|
|
240
|
+
lines.push(` ReferenceFilter,`);
|
|
241
|
+
lines.push(` FilterInput,`);
|
|
242
|
+
lines.push(`} from '../types/field-types.js';`);
|
|
243
|
+
lines.push('');
|
|
244
|
+
// Generate the data filter interface
|
|
245
|
+
const dataFilterInterface = generateFilterInterface(model, allModels, 1);
|
|
246
|
+
// Generate the metadata filter interface if metadataSchema exists
|
|
247
|
+
const metadataFields = model.metadataSchema?.fields || [];
|
|
248
|
+
const metadataFilterInterface = generateMetadataFilterInterface(metadataFields, 1);
|
|
249
|
+
const hasMetadataFilters = metadataFilterInterface && metadataFilterInterface !== '{}';
|
|
250
|
+
// Build the full filter interface
|
|
251
|
+
lines.push(`/**`);
|
|
252
|
+
lines.push(` * Typed filter interface for ${model.name}`);
|
|
253
|
+
lines.push(` * Supports filtering on data fields, nested objects, and metadata`);
|
|
254
|
+
lines.push(` */`);
|
|
255
|
+
lines.push(`export interface ${typeName}Filters {`);
|
|
256
|
+
// Add data fields section
|
|
257
|
+
if (dataFilterInterface !== '{}') {
|
|
258
|
+
lines.push(` /** Filter on content/data fields */`);
|
|
259
|
+
lines.push(` data?: ${dataFilterInterface}`);
|
|
260
|
+
}
|
|
261
|
+
// Add metadata fields section if available
|
|
262
|
+
if (hasMetadataFilters) {
|
|
263
|
+
lines.push(` /** Filter on metadata fields (synced data, system fields) */`);
|
|
264
|
+
lines.push(` metadata?: ${metadataFilterInterface}`);
|
|
265
|
+
}
|
|
266
|
+
// Add common record fields
|
|
267
|
+
lines.push(` /** Filter on record-level fields */`);
|
|
268
|
+
lines.push(` id?: TextFilter;`);
|
|
269
|
+
lines.push(` naturalKey?: TextFilter;`);
|
|
270
|
+
lines.push(` status?: SelectFilter<'DRAFT' | 'PUBLISHED' | 'ARCHIVED'>;`);
|
|
271
|
+
lines.push(` createdAt?: DateFilter;`);
|
|
272
|
+
lines.push(` updatedAt?: DateFilter;`);
|
|
273
|
+
lines.push(`}`);
|
|
274
|
+
lines.push('');
|
|
275
|
+
// Generate the buildFilters helper
|
|
276
|
+
lines.push(`/**`);
|
|
277
|
+
lines.push(` * Convert typed filters to API FilterInput array`);
|
|
278
|
+
lines.push(` * Handles nested objects by creating dot-notation field paths`);
|
|
279
|
+
lines.push(` */`);
|
|
280
|
+
lines.push(`export function build${typeName}Filters(filters: ${typeName}Filters): FilterInput[] {`);
|
|
281
|
+
lines.push(` const result: FilterInput[] = [];`);
|
|
282
|
+
lines.push('');
|
|
283
|
+
lines.push(` function processFilters(obj: Record<string, any>, prefix: string) {`);
|
|
284
|
+
lines.push(` for (const [key, value] of Object.entries(obj)) {`);
|
|
285
|
+
lines.push(` if (value === undefined || value === null) continue;`);
|
|
286
|
+
lines.push('');
|
|
287
|
+
lines.push(` const fieldPath = prefix ? \`\${prefix}.\${key}\` : key;`);
|
|
288
|
+
lines.push('');
|
|
289
|
+
lines.push(` // Check if this is a filter operator object`);
|
|
290
|
+
lines.push(` if (isFilterOperator(value)) {`);
|
|
291
|
+
lines.push(` // Convert each operator to a FilterInput`);
|
|
292
|
+
lines.push(` for (const [op, opValue] of Object.entries(value)) {`);
|
|
293
|
+
lines.push(` if (opValue !== undefined) {`);
|
|
294
|
+
lines.push(` result.push({`);
|
|
295
|
+
lines.push(` field: fieldPath,`);
|
|
296
|
+
lines.push(` operator: op,`);
|
|
297
|
+
lines.push(` value: opValue,`);
|
|
298
|
+
lines.push(` });`);
|
|
299
|
+
lines.push(` }`);
|
|
300
|
+
lines.push(` }`);
|
|
301
|
+
lines.push(` } else if (typeof value === 'object' && !Array.isArray(value)) {`);
|
|
302
|
+
lines.push(` // Nested object - recurse`);
|
|
303
|
+
lines.push(` processFilters(value, fieldPath);`);
|
|
304
|
+
lines.push(` }`);
|
|
305
|
+
lines.push(` }`);
|
|
306
|
+
lines.push(` }`);
|
|
307
|
+
lines.push('');
|
|
308
|
+
lines.push(` // Process data filters`);
|
|
309
|
+
lines.push(` if (filters.data) {`);
|
|
310
|
+
lines.push(` processFilters(filters.data, 'data');`);
|
|
311
|
+
lines.push(` }`);
|
|
312
|
+
lines.push('');
|
|
313
|
+
lines.push(` // Process metadata filters`);
|
|
314
|
+
lines.push(` if (filters.metadata) {`);
|
|
315
|
+
lines.push(` processFilters(filters.metadata, 'metadata');`);
|
|
316
|
+
lines.push(` }`);
|
|
317
|
+
lines.push('');
|
|
318
|
+
lines.push(` // Process record-level filters`);
|
|
319
|
+
lines.push(` const recordFields = ['id', 'naturalKey', 'status', 'createdAt', 'updatedAt'];`);
|
|
320
|
+
lines.push(` for (const field of recordFields) {`);
|
|
321
|
+
lines.push(` const value = (filters as any)[field];`);
|
|
322
|
+
lines.push(` if (value && isFilterOperator(value)) {`);
|
|
323
|
+
lines.push(` for (const [op, opValue] of Object.entries(value)) {`);
|
|
324
|
+
lines.push(` if (opValue !== undefined) {`);
|
|
325
|
+
lines.push(` result.push({ field, operator: op, value: opValue });`);
|
|
326
|
+
lines.push(` }`);
|
|
327
|
+
lines.push(` }`);
|
|
328
|
+
lines.push(` }`);
|
|
329
|
+
lines.push(` }`);
|
|
330
|
+
lines.push('');
|
|
331
|
+
lines.push(` return result;`);
|
|
332
|
+
lines.push(`}`);
|
|
333
|
+
lines.push('');
|
|
334
|
+
// Helper function to check if an object is a filter operator
|
|
335
|
+
lines.push(`/** Check if an object is a filter operator (has operator keys) */`);
|
|
336
|
+
lines.push(`function isFilterOperator(obj: unknown): boolean {`);
|
|
337
|
+
lines.push(` if (typeof obj !== 'object' || obj === null || Array.isArray(obj)) {`);
|
|
338
|
+
lines.push(` return false;`);
|
|
339
|
+
lines.push(` }`);
|
|
340
|
+
lines.push(` const filterOps = [`);
|
|
341
|
+
lines.push(` 'eq', 'ne', 'gt', 'gte', 'lt', 'lte',`);
|
|
342
|
+
lines.push(` 'contains', 'startsWith', 'endsWith',`);
|
|
343
|
+
lines.push(` 'in', 'notIn', 'isNull',`);
|
|
344
|
+
lines.push(` 'containsAny', 'containsAll',`);
|
|
345
|
+
lines.push(` ];`);
|
|
346
|
+
lines.push(` return Object.keys(obj).some(key => filterOps.includes(key));`);
|
|
347
|
+
lines.push(`}`);
|
|
348
|
+
return lines.join('\n') + '\n';
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Generate index file for filters
|
|
352
|
+
*/
|
|
353
|
+
export function generateFiltersIndex(models) {
|
|
354
|
+
const recordModels = models.filter((m) => m.modes.records);
|
|
355
|
+
let indexCode = `/**
|
|
356
|
+
* Typed Entity Filters
|
|
357
|
+
*
|
|
358
|
+
* Type-safe filter interfaces and builders for all entity models.
|
|
359
|
+
*
|
|
360
|
+
* @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
361
|
+
*/\n\n`;
|
|
362
|
+
// Re-export filter types from field-types
|
|
363
|
+
indexCode += `// Re-export base filter types\n`;
|
|
364
|
+
indexCode += `export type {\n`;
|
|
365
|
+
indexCode += ` TextFilter,\n`;
|
|
366
|
+
indexCode += ` NumberFilter,\n`;
|
|
367
|
+
indexCode += ` BooleanFilter,\n`;
|
|
368
|
+
indexCode += ` DateFilter,\n`;
|
|
369
|
+
indexCode += ` SelectFilter,\n`;
|
|
370
|
+
indexCode += ` MultiselectFilter,\n`;
|
|
371
|
+
indexCode += ` ReferenceFilter,\n`;
|
|
372
|
+
indexCode += ` FilterInput,\n`;
|
|
373
|
+
indexCode += ` SortInput,\n`;
|
|
374
|
+
indexCode += `} from '../types/field-types.js';\n\n`;
|
|
375
|
+
// Export each model's filters
|
|
376
|
+
for (const model of recordModels) {
|
|
377
|
+
const typeName = toPascalCase(model.key);
|
|
378
|
+
indexCode += `export {\n`;
|
|
379
|
+
indexCode += ` type ${typeName}Filters,\n`;
|
|
380
|
+
indexCode += ` build${typeName}Filters,\n`;
|
|
381
|
+
indexCode += `} from './${model.key}.js';\n`;
|
|
382
|
+
}
|
|
383
|
+
return indexCode;
|
|
384
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Agnostic Hooks Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates framework-agnostic typed helper functions that parse
|
|
5
|
+
* the generic entity API responses into strongly typed data.
|
|
6
|
+
*/
|
|
7
|
+
import type { EntityModel } from '../../fetcher/fetch-schemas.js';
|
|
8
|
+
/**
|
|
9
|
+
* Generate agnostic typed helpers for an entity model
|
|
10
|
+
*/
|
|
11
|
+
export declare function generateAgnosticHooks(model: EntityModel, _allModels: EntityModel[]): string;
|
|
12
|
+
/**
|
|
13
|
+
* Generate index file for agnostic hooks
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateAgnosticHooksIndex(models: EntityModel[]): string;
|
|
16
|
+
//# sourceMappingURL=agnostic.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agnostic.d.ts","sourceRoot":"","sources":["../../../src/generators/hooks/agnostic.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAuB,MAAM,gCAAgC,CAAC;AAoGvF;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,WAAW,EAClB,UAAU,EAAE,WAAW,EAAE,GACxB,MAAM,CAmIR;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,CAiCxE"}
|