@eide/uniformgen 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +356 -0
- package/dist/auth/credentials.d.ts +58 -0
- package/dist/auth/credentials.d.ts.map +1 -0
- package/dist/auth/credentials.js +107 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +563 -0
- package/dist/commands/init.d.ts +11 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +113 -0
- package/dist/commands/login.d.ts +9 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +158 -0
- package/dist/commands/logout.d.ts +5 -0
- package/dist/commands/logout.d.ts.map +1 -0
- package/dist/commands/logout.js +13 -0
- package/dist/commands/push.d.ts +13 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +328 -0
- package/dist/commands/scaffold.d.ts +19 -0
- package/dist/commands/scaffold.d.ts.map +1 -0
- package/dist/commands/scaffold.js +366 -0
- package/dist/commands/seed.d.ts +20 -0
- package/dist/commands/seed.d.ts.map +1 -0
- package/dist/commands/seed.js +380 -0
- package/dist/commands/select-project.d.ts +10 -0
- package/dist/commands/select-project.d.ts.map +1 -0
- package/dist/commands/select-project.js +277 -0
- package/dist/commands/setup.d.ts +5 -0
- package/dist/commands/setup.d.ts.map +1 -0
- package/dist/commands/setup.js +51 -0
- package/dist/commands/sync.d.ts +13 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +318 -0
- package/dist/commands/whoami.d.ts +5 -0
- package/dist/commands/whoami.d.ts.map +1 -0
- package/dist/commands/whoami.js +31 -0
- package/dist/config/load-config.d.ts +6 -0
- package/dist/config/load-config.d.ts.map +1 -0
- package/dist/config/load-config.js +103 -0
- package/dist/config/settings.d.ts +20 -0
- package/dist/config/settings.d.ts.map +1 -0
- package/dist/config/settings.js +64 -0
- package/dist/config/types.d.ts +152 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +94 -0
- package/dist/fetcher/fetch-schemas.d.ts +140 -0
- package/dist/fetcher/fetch-schemas.d.ts.map +1 -0
- package/dist/fetcher/fetch-schemas.js +223 -0
- package/dist/fetcher/fetch-workflows.d.ts +53 -0
- package/dist/fetcher/fetch-workflows.d.ts.map +1 -0
- package/dist/fetcher/fetch-workflows.js +164 -0
- package/dist/generated/hooks/customer-detail.d.ts +74 -0
- package/dist/generated/hooks/customer-detail.d.ts.map +1 -0
- package/dist/generated/hooks/customer-detail.js +113 -0
- package/dist/generated/hooks/design-system.d.ts +74 -0
- package/dist/generated/hooks/design-system.d.ts.map +1 -0
- package/dist/generated/hooks/design-system.js +109 -0
- package/dist/generated/hooks/index.d.ts +16 -0
- package/dist/generated/hooks/index.d.ts.map +1 -0
- package/dist/generated/hooks/index.js +14 -0
- package/dist/generated/hooks/shopify-collection.d.ts +74 -0
- package/dist/generated/hooks/shopify-collection.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-collection.js +113 -0
- package/dist/generated/hooks/shopify-market.d.ts +74 -0
- package/dist/generated/hooks/shopify-market.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-market.js +109 -0
- package/dist/generated/hooks/shopify-product.d.ts +74 -0
- package/dist/generated/hooks/shopify-product.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-product.js +113 -0
- package/dist/generated/hooks/shopify-variant.d.ts +74 -0
- package/dist/generated/hooks/shopify-variant.d.ts.map +1 -0
- package/dist/generated/hooks/shopify-variant.js +113 -0
- package/dist/generated/hooks/template.d.ts +74 -0
- package/dist/generated/hooks/template.d.ts.map +1 -0
- package/dist/generated/hooks/template.js +107 -0
- package/dist/generated/types/config.d.ts +88 -0
- package/dist/generated/types/config.d.ts.map +1 -0
- package/dist/generated/types/config.js +14 -0
- package/dist/generated/types/data-models/index.d.ts +7 -0
- package/dist/generated/types/data-models/index.d.ts.map +1 -0
- package/dist/generated/types/data-models/index.js +6 -0
- package/dist/generated/types/data-models/test.d.ts +29 -0
- package/dist/generated/types/data-models/test.d.ts.map +1 -0
- package/dist/generated/types/data-models/test.js +1 -0
- package/dist/generated/types/data-models/watch.d.ts +26 -0
- package/dist/generated/types/data-models/watch.d.ts.map +1 -0
- package/dist/generated/types/data-models/watch.js +1 -0
- package/dist/generated/types/field-types.d.ts +255 -0
- package/dist/generated/types/field-types.d.ts.map +1 -0
- package/dist/generated/types/field-types.js +35 -0
- package/dist/generated/types/hooks.d.ts +106 -0
- package/dist/generated/types/hooks.d.ts.map +1 -0
- package/dist/generated/types/hooks.js +9 -0
- package/dist/generated/types/index.d.ts +10 -0
- package/dist/generated/types/index.d.ts.map +1 -0
- package/dist/generated/types/index.js +9 -0
- package/dist/generated/types/models/button-variant.d.ts +16 -0
- package/dist/generated/types/models/button-variant.d.ts.map +1 -0
- package/dist/generated/types/models/button-variant.js +1 -0
- package/dist/generated/types/models/color-palette.d.ts +27 -0
- package/dist/generated/types/models/color-palette.d.ts.map +1 -0
- package/dist/generated/types/models/color-palette.js +1 -0
- package/dist/generated/types/models/color-with-scale.d.ts +15 -0
- package/dist/generated/types/models/color-with-scale.d.ts.map +1 -0
- package/dist/generated/types/models/color-with-scale.js +1 -0
- package/dist/generated/types/models/context.d.ts +53 -0
- package/dist/generated/types/models/context.d.ts.map +1 -0
- package/dist/generated/types/models/context.js +51 -0
- package/dist/generated/types/models/customer-detail.d.ts +32 -0
- package/dist/generated/types/models/customer-detail.d.ts.map +1 -0
- package/dist/generated/types/models/customer-detail.js +26 -0
- package/dist/generated/types/models/design-system-badges.d.ts +16 -0
- package/dist/generated/types/models/design-system-badges.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-badges.js +1 -0
- package/dist/generated/types/models/design-system-buttons.d.ts +17 -0
- package/dist/generated/types/models/design-system-buttons.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-buttons.js +1 -0
- package/dist/generated/types/models/design-system-cards.d.ts +16 -0
- package/dist/generated/types/models/design-system-cards.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-cards.js +1 -0
- package/dist/generated/types/models/design-system-colors.d.ts +12 -0
- package/dist/generated/types/models/design-system-colors.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-colors.js +1 -0
- package/dist/generated/types/models/design-system-dark-mode.d.ts +13 -0
- package/dist/generated/types/models/design-system-dark-mode.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-dark-mode.js +1 -0
- package/dist/generated/types/models/design-system-focus-ring.d.ts +14 -0
- package/dist/generated/types/models/design-system-focus-ring.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-focus-ring.js +1 -0
- package/dist/generated/types/models/design-system-grid.d.ts +18 -0
- package/dist/generated/types/models/design-system-grid.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-grid.js +1 -0
- package/dist/generated/types/models/design-system-inputs.d.ts +26 -0
- package/dist/generated/types/models/design-system-inputs.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-inputs.js +1 -0
- package/dist/generated/types/models/design-system-links.d.ts +16 -0
- package/dist/generated/types/models/design-system-links.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-links.js +1 -0
- package/dist/generated/types/models/design-system-shadows.d.ts +20 -0
- package/dist/generated/types/models/design-system-shadows.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-shadows.js +1 -0
- package/dist/generated/types/models/design-system-spacing.d.ts +13 -0
- package/dist/generated/types/models/design-system-spacing.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-spacing.js +1 -0
- package/dist/generated/types/models/design-system-transitions.d.ts +15 -0
- package/dist/generated/types/models/design-system-transitions.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-transitions.js +1 -0
- package/dist/generated/types/models/design-system-typography.d.ts +21 -0
- package/dist/generated/types/models/design-system-typography.d.ts.map +1 -0
- package/dist/generated/types/models/design-system-typography.js +1 -0
- package/dist/generated/types/models/design-system.d.ts +138 -0
- package/dist/generated/types/models/design-system.d.ts.map +1 -0
- package/dist/generated/types/models/design-system.js +64 -0
- package/dist/generated/types/models/experiment.d.ts +57 -0
- package/dist/generated/types/models/experiment.d.ts.map +1 -0
- package/dist/generated/types/models/experiment.js +55 -0
- package/dist/generated/types/models/font-file.d.ts +16 -0
- package/dist/generated/types/models/font-file.d.ts.map +1 -0
- package/dist/generated/types/models/font-file.js +1 -0
- package/dist/generated/types/models/index.d.ts +38 -0
- package/dist/generated/types/models/index.d.ts.map +1 -0
- package/dist/generated/types/models/index.js +12 -0
- package/dist/generated/types/models/integration.d.ts +32 -0
- package/dist/generated/types/models/integration.d.ts.map +1 -0
- package/dist/generated/types/models/integration.js +26 -0
- package/dist/generated/types/models/route-tree.d.ts +43 -0
- package/dist/generated/types/models/route-tree.d.ts.map +1 -0
- package/dist/generated/types/models/route-tree.js +39 -0
- package/dist/generated/types/models/segment.d.ts +57 -0
- package/dist/generated/types/models/segment.d.ts.map +1 -0
- package/dist/generated/types/models/segment.js +55 -0
- package/dist/generated/types/models/shopify-collection.d.ts +32 -0
- package/dist/generated/types/models/shopify-collection.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-collection.js +26 -0
- package/dist/generated/types/models/shopify-market.d.ts +32 -0
- package/dist/generated/types/models/shopify-market.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-market.js +26 -0
- package/dist/generated/types/models/shopify-product.d.ts +32 -0
- package/dist/generated/types/models/shopify-product.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-product.js +26 -0
- package/dist/generated/types/models/shopify-variant.d.ts +32 -0
- package/dist/generated/types/models/shopify-variant.d.ts.map +1 -0
- package/dist/generated/types/models/shopify-variant.js +26 -0
- package/dist/generated/types/models/template.d.ts +53 -0
- package/dist/generated/types/models/template.d.ts.map +1 -0
- package/dist/generated/types/models/template.js +40 -0
- package/dist/generated/types/models/typography-variant.d.ts +15 -0
- package/dist/generated/types/models/typography-variant.d.ts.map +1 -0
- package/dist/generated/types/models/typography-variant.js +1 -0
- package/dist/generated/types/scalars.d.ts +56 -0
- package/dist/generated/types/scalars.d.ts.map +1 -0
- package/dist/generated/types/scalars.js +6 -0
- package/dist/generators/admin/index.d.ts +32 -0
- package/dist/generators/admin/index.d.ts.map +1 -0
- package/dist/generators/admin/index.js +219 -0
- package/dist/generators/admin/mutations.d.ts +23 -0
- package/dist/generators/admin/mutations.d.ts.map +1 -0
- package/dist/generators/admin/mutations.js +424 -0
- package/dist/generators/admin/queries.d.ts +20 -0
- package/dist/generators/admin/queries.d.ts.map +1 -0
- package/dist/generators/admin/queries.js +476 -0
- package/dist/generators/admin/types.d.ts +28 -0
- package/dist/generators/admin/types.d.ts.map +1 -0
- package/dist/generators/admin/types.js +254 -0
- package/dist/generators/cms/index.d.ts +29 -0
- package/dist/generators/cms/index.d.ts.map +1 -0
- package/dist/generators/cms/index.js +126 -0
- package/dist/generators/cms/route.d.ts +27 -0
- package/dist/generators/cms/route.d.ts.map +1 -0
- package/dist/generators/cms/route.js +409 -0
- package/dist/generators/cms/types.d.ts +15 -0
- package/dist/generators/cms/types.d.ts.map +1 -0
- package/dist/generators/cms/types.js +137 -0
- package/dist/generators/contexts/index.d.ts +25 -0
- package/dist/generators/contexts/index.d.ts.map +1 -0
- package/dist/generators/contexts/index.js +591 -0
- package/dist/generators/documents/data-models.d.ts +6 -0
- package/dist/generators/documents/data-models.d.ts.map +1 -0
- package/dist/generators/documents/data-models.js +61 -0
- package/dist/generators/documents/entity-models.d.ts +7 -0
- package/dist/generators/documents/entity-models.d.ts.map +1 -0
- package/dist/generators/documents/entity-models.js +87 -0
- package/dist/generators/documents/workflows.d.ts +11 -0
- package/dist/generators/documents/workflows.d.ts.map +1 -0
- package/dist/generators/documents/workflows.js +101 -0
- package/dist/generators/filters/index.d.ts +16 -0
- package/dist/generators/filters/index.d.ts.map +1 -0
- package/dist/generators/filters/index.js +384 -0
- package/dist/generators/hooks/agnostic.d.ts +16 -0
- package/dist/generators/hooks/agnostic.d.ts.map +1 -0
- package/dist/generators/hooks/agnostic.js +248 -0
- package/dist/generators/hooks/index.d.ts +9 -0
- package/dist/generators/hooks/index.d.ts.map +1 -0
- package/dist/generators/hooks/index.js +8 -0
- package/dist/generators/hooks/react.d.ts +16 -0
- package/dist/generators/hooks/react.d.ts.map +1 -0
- package/dist/generators/hooks/react.js +394 -0
- package/dist/generators/hooks/remix.d.ts +16 -0
- package/dist/generators/hooks/remix.d.ts.map +1 -0
- package/dist/generators/hooks/remix.js +349 -0
- package/dist/generators/hooks/workflows.d.ts +23 -0
- package/dist/generators/hooks/workflows.d.ts.map +1 -0
- package/dist/generators/hooks/workflows.js +312 -0
- package/dist/generators/resolve/index.d.ts +13 -0
- package/dist/generators/resolve/index.d.ts.map +1 -0
- package/dist/generators/resolve/index.js +13 -0
- package/dist/generators/resolve/platform.d.ts +29 -0
- package/dist/generators/resolve/platform.d.ts.map +1 -0
- package/dist/generators/resolve/platform.js +479 -0
- package/dist/generators/types/config.d.ts +7 -0
- package/dist/generators/types/config.d.ts.map +1 -0
- package/dist/generators/types/config.js +113 -0
- package/dist/generators/types/data-models.d.ts +10 -0
- package/dist/generators/types/data-models.d.ts.map +1 -0
- package/dist/generators/types/data-models.js +100 -0
- package/dist/generators/types/entity-models.d.ts +13 -0
- package/dist/generators/types/entity-models.d.ts.map +1 -0
- package/dist/generators/types/entity-models.js +241 -0
- package/dist/generators/types/field-types.d.ts +9 -0
- package/dist/generators/types/field-types.d.ts.map +1 -0
- package/dist/generators/types/field-types.js +651 -0
- package/dist/generators/types/hooks.d.ts +7 -0
- package/dist/generators/types/hooks.d.ts.map +1 -0
- package/dist/generators/types/hooks.js +132 -0
- package/dist/generators/types/scalars.d.ts +6 -0
- package/dist/generators/types/scalars.d.ts.map +1 -0
- package/dist/generators/types/scalars.js +68 -0
- package/dist/generators/types/user-details.d.ts +6 -0
- package/dist/generators/types/user-details.d.ts.map +1 -0
- package/dist/generators/types/user-details.js +60 -0
- package/dist/generators/types/workflows.d.ts +15 -0
- package/dist/generators/types/workflows.d.ts.map +1 -0
- package/dist/generators/types/workflows.js +163 -0
- package/dist/graphql/generated/gql.d.ts +47 -0
- package/dist/graphql/generated/gql.d.ts.map +1 -0
- package/dist/graphql/generated/gql.js +10 -0
- package/dist/graphql/generated/graphql.d.ts +8455 -0
- package/dist/graphql/generated/graphql.d.ts.map +1 -0
- package/dist/graphql/generated/graphql.js +573 -0
- package/dist/graphql/generated/index.d.ts +2 -0
- package/dist/graphql/generated/index.d.ts.map +1 -0
- package/dist/graphql/generated/index.js +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +9 -0
- package/dist/schema/define-entity-model.d.ts +122 -0
- package/dist/schema/define-entity-model.d.ts.map +1 -0
- package/dist/schema/define-entity-model.js +59 -0
- package/dist/schema/schema-loader.d.ts +10 -0
- package/dist/schema/schema-loader.d.ts.map +1 -0
- package/dist/schema/schema-loader.js +91 -0
- package/dist/utils/field-mapping.d.ts +83 -0
- package/dist/utils/field-mapping.d.ts.map +1 -0
- package/dist/utils/field-mapping.js +334 -0
- package/dist/writer/write-files.d.ts +12 -0
- package/dist/writer/write-files.d.ts.map +1 -0
- package/dist/writer/write-files.js +35 -0
- package/package.json +70 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,563 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Load environment variables from .env.local
|
|
3
|
+
import { config } from 'dotenv';
|
|
4
|
+
import { resolve, dirname } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
7
|
+
const __dirname = dirname(__filename);
|
|
8
|
+
// Load .env.local from package root
|
|
9
|
+
config({ path: resolve(__dirname, '../.env.local') });
|
|
10
|
+
import { Command } from 'commander';
|
|
11
|
+
import chalk from 'chalk';
|
|
12
|
+
import ora from 'ora';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { loadConfig } from './config/load-config.js';
|
|
15
|
+
import { getSettings } from './config/settings.js';
|
|
16
|
+
import { fetchEntityModels, fetchContextDefinitions, } from './fetcher/fetch-schemas.js';
|
|
17
|
+
import { generateEntityModelTypes, generateEntityModelsIndex, } from './generators/types/entity-models.js';
|
|
18
|
+
import { generateFieldTypesFile } from './generators/types/field-types.js';
|
|
19
|
+
import { generateHooksFile } from './generators/types/hooks.js';
|
|
20
|
+
import { generateConfigFile } from './generators/types/config.js';
|
|
21
|
+
import { generateEntityModelDocuments } from './generators/documents/entity-models.js';
|
|
22
|
+
import { generateAgnosticHooks, generateAgnosticHooksIndex, generateReactHooks, generateReactHooksIndex, generateRemixHooks, generateRemixHooksIndex, } from './generators/hooks/index.js';
|
|
23
|
+
import { generatePlatformResolveReact, generatePlatformResolveRemix, generatePlatformResolveIndexReact, generatePlatformResolveIndexRemix, } from './generators/resolve/index.js';
|
|
24
|
+
// Phase 13: Admin layer generators
|
|
25
|
+
import { generateAdminHooksReact, generateAdminHooksRemix, generateAdminHooksIndexReact, generateAdminHooksIndexRemix, } from './generators/admin/index.js';
|
|
26
|
+
// Phase 13: CMS layer generators
|
|
27
|
+
import { getRoutableModels, generateCmsTypes, generateResolveRouteReact as generateCmsRouteReact, generateResolveRouteRemix as generateCmsRouteRemix, generateCmsIndexReact, generateCmsIndexRemix, } from './generators/cms/index.js';
|
|
28
|
+
import { generateModelFilters, generateFiltersIndex, } from './generators/filters/index.js';
|
|
29
|
+
import { generateContextsFile, generateEmptyContextsFile, } from './generators/contexts/index.js';
|
|
30
|
+
import { writeFiles } from './writer/write-files.js';
|
|
31
|
+
import { login } from './commands/login.js';
|
|
32
|
+
import { logout } from './commands/logout.js';
|
|
33
|
+
import { selectProject } from './commands/select-project.js';
|
|
34
|
+
import { whoami } from './commands/whoami.js';
|
|
35
|
+
import { setup } from './commands/setup.js';
|
|
36
|
+
import { push } from './commands/push.js';
|
|
37
|
+
import { init } from './commands/init.js';
|
|
38
|
+
import { sync } from './commands/sync.js';
|
|
39
|
+
import { scaffold } from './commands/scaffold.js';
|
|
40
|
+
import { seed } from './commands/seed.js';
|
|
41
|
+
import { defaultConfig } from './config/types.js';
|
|
42
|
+
// Use UNIFORMGEN_API_URL env var if set, otherwise fall back to defaultConfig
|
|
43
|
+
const apiUrlDefault = process.env.UNIFORMGEN_API_URL || defaultConfig.apiUrl;
|
|
44
|
+
const program = new Command();
|
|
45
|
+
program
|
|
46
|
+
.name('uniformgen')
|
|
47
|
+
.description('Type-safe code generator for EIDE CMS')
|
|
48
|
+
.version('0.1.0');
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Authentication Commands
|
|
51
|
+
// ============================================================================
|
|
52
|
+
program
|
|
53
|
+
.command('login')
|
|
54
|
+
.description('Authenticate via browser OAuth')
|
|
55
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
56
|
+
.action(async (options) => {
|
|
57
|
+
try {
|
|
58
|
+
await login({ apiUrl: options.apiUrl });
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
62
|
+
process.exit(1);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
program
|
|
66
|
+
.command('logout')
|
|
67
|
+
.description('Clear stored credentials')
|
|
68
|
+
.action(async () => {
|
|
69
|
+
try {
|
|
70
|
+
await logout();
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
program
|
|
78
|
+
.command('select-project')
|
|
79
|
+
.description('Choose which project to work with')
|
|
80
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
81
|
+
.option('--project-id <id>', 'Project ID to select directly')
|
|
82
|
+
.action(async (options) => {
|
|
83
|
+
try {
|
|
84
|
+
await selectProject({
|
|
85
|
+
apiUrl: options.apiUrl,
|
|
86
|
+
projectId: options.projectId,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
91
|
+
process.exit(1);
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
program
|
|
95
|
+
.command('whoami')
|
|
96
|
+
.description('Show current authentication status')
|
|
97
|
+
.action(async () => {
|
|
98
|
+
try {
|
|
99
|
+
await whoami();
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
program
|
|
107
|
+
.command('setup')
|
|
108
|
+
.description('Configure code generation preferences (framework, output paths)')
|
|
109
|
+
.action(async () => {
|
|
110
|
+
try {
|
|
111
|
+
await setup();
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
115
|
+
process.exit(1);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
// ============================================================================
|
|
119
|
+
// Generation Commands
|
|
120
|
+
// ============================================================================
|
|
121
|
+
program
|
|
122
|
+
.command('pull')
|
|
123
|
+
.description('Fetch entity models and generate types')
|
|
124
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
125
|
+
.option('--api-url <url>', 'API endpoint URL')
|
|
126
|
+
.option('--project-key <key>', 'Project API key')
|
|
127
|
+
.option('--out <dir>', 'Output directory')
|
|
128
|
+
.option('--no-prettier', 'Disable Prettier formatting')
|
|
129
|
+
.option('--dry-run', 'Show what would be generated without writing files')
|
|
130
|
+
.option('--only <models>', 'Only generate for specific entity models (comma-separated keys)')
|
|
131
|
+
.option('--include-inline', 'Include inline-only entity models')
|
|
132
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
133
|
+
.action(async (options) => {
|
|
134
|
+
const spinner = ora();
|
|
135
|
+
try {
|
|
136
|
+
// Load configuration
|
|
137
|
+
spinner.start('Loading configuration...');
|
|
138
|
+
const config = await loadConfig(options.config, process.cwd());
|
|
139
|
+
// Override config with CLI options
|
|
140
|
+
if (options.apiUrl)
|
|
141
|
+
config.apiUrl = options.apiUrl;
|
|
142
|
+
if (options.projectKey)
|
|
143
|
+
config.projectKey = options.projectKey;
|
|
144
|
+
if (options.out) {
|
|
145
|
+
config.output = {
|
|
146
|
+
types: join(options.out, 'types'),
|
|
147
|
+
documents: join(options.out, 'documents'),
|
|
148
|
+
hooks: join(options.out, 'hooks'),
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
if (options.prettier === false)
|
|
152
|
+
config.prettier = false;
|
|
153
|
+
spinner.succeed('Configuration loaded');
|
|
154
|
+
if (options.verbose) {
|
|
155
|
+
console.log(chalk.gray('Config:'), config);
|
|
156
|
+
}
|
|
157
|
+
// Fetch entity models from API
|
|
158
|
+
spinner.start(`Fetching entity models from ${config.apiUrl}...`);
|
|
159
|
+
let entityModels = await fetchEntityModels(config.apiUrl, config.accessToken, config.tenantId, config.projectId, {
|
|
160
|
+
includeInline: options.includeInline ?? true,
|
|
161
|
+
});
|
|
162
|
+
// Filter to specific models if --only provided
|
|
163
|
+
if (options.only) {
|
|
164
|
+
const onlyKeys = options.only.split(',').map((k) => k.trim());
|
|
165
|
+
entityModels = entityModels.filter((m) => onlyKeys.includes(m.key));
|
|
166
|
+
}
|
|
167
|
+
// Filter to only models with records: true (can create standalone records)
|
|
168
|
+
const recordModels = entityModels.filter((m) => m.modes.records);
|
|
169
|
+
spinner.succeed(`Fetched ${entityModels.length} entity models (${recordModels.length} with records)`);
|
|
170
|
+
if (options.verbose) {
|
|
171
|
+
console.log(chalk.gray('Entity models:'));
|
|
172
|
+
for (const model of entityModels) {
|
|
173
|
+
const tags = [];
|
|
174
|
+
if (model.modes.records)
|
|
175
|
+
tags.push('records');
|
|
176
|
+
if (model.modes.inline)
|
|
177
|
+
tags.push('inline');
|
|
178
|
+
console.log(chalk.gray(` - ${model.key} (${tags.join(', ')})`));
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// Fetch context definitions (values are fetched at runtime, not generate time)
|
|
182
|
+
spinner.start('Fetching context definitions...');
|
|
183
|
+
const contextDefinitions = await fetchContextDefinitions(config.apiUrl, config.accessToken, config.tenantId, config.projectId);
|
|
184
|
+
// Map to generation format (just definitions, values fetched at runtime)
|
|
185
|
+
const contextsForGeneration = contextDefinitions.map((definition) => ({ definition }));
|
|
186
|
+
spinner.succeed(contextDefinitions.length > 0
|
|
187
|
+
? `Fetched ${contextDefinitions.length} context definitions`
|
|
188
|
+
: 'No context definitions found (using defaults)');
|
|
189
|
+
if (options.verbose && contextDefinitions.length > 0) {
|
|
190
|
+
console.log(chalk.gray('Contexts (values fetched at runtime):'));
|
|
191
|
+
for (const ctx of contextsForGeneration) {
|
|
192
|
+
console.log(chalk.gray(` - ${ctx.definition.key} (linked to ${ctx.definition.entityModelKey})`));
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Generate files
|
|
196
|
+
const files = [];
|
|
197
|
+
// Generate base type files
|
|
198
|
+
spinner.start('Generating type definitions...');
|
|
199
|
+
files.push({
|
|
200
|
+
path: join(config.output.types, 'field-types.ts'),
|
|
201
|
+
content: generateFieldTypesFile(),
|
|
202
|
+
});
|
|
203
|
+
files.push({
|
|
204
|
+
path: join(config.output.types, 'hooks.ts'),
|
|
205
|
+
content: generateHooksFile(),
|
|
206
|
+
});
|
|
207
|
+
files.push({
|
|
208
|
+
path: join(config.output.types, 'config.ts'),
|
|
209
|
+
content: generateConfigFile(),
|
|
210
|
+
});
|
|
211
|
+
// Generate contexts file (with runtime query support) - in hooks folder
|
|
212
|
+
files.push({
|
|
213
|
+
path: join(config.output.hooks, 'contexts.ts'),
|
|
214
|
+
content: contextsForGeneration.length > 0
|
|
215
|
+
? generateContextsFile(contextsForGeneration)
|
|
216
|
+
: generateEmptyContextsFile(),
|
|
217
|
+
});
|
|
218
|
+
spinner.succeed('Generated base type definitions');
|
|
219
|
+
// Generate entity model types (for all models - both records and inline)
|
|
220
|
+
if (entityModels.length > 0) {
|
|
221
|
+
const inlineOnlyModels = entityModels.filter((m) => m.modes.inline && !m.modes.records);
|
|
222
|
+
spinner.start(`Generating ${entityModels.length} entity models (${recordModels.length} configs + ${inlineOnlyModels.length} inline types)...`);
|
|
223
|
+
const modelsDir = join(config.output.types, 'models');
|
|
224
|
+
for (const model of entityModels) {
|
|
225
|
+
files.push({
|
|
226
|
+
path: join(modelsDir, `${model.key}.ts`),
|
|
227
|
+
content: generateEntityModelTypes(model, entityModels),
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// Generate index for all types
|
|
231
|
+
files.push({
|
|
232
|
+
path: join(modelsDir, 'index.ts'),
|
|
233
|
+
content: generateEntityModelsIndex(entityModels),
|
|
234
|
+
});
|
|
235
|
+
spinner.succeed(`Generated ${entityModels.length} entity models (${recordModels.length} configs + ${inlineOnlyModels.length} inline types)`);
|
|
236
|
+
}
|
|
237
|
+
// Generate GraphQL documents (only for models with publicApi: true)
|
|
238
|
+
const publicApiModels = recordModels.filter((m) => m.modes.publicApi);
|
|
239
|
+
if (publicApiModels.length > 0) {
|
|
240
|
+
spinner.start(`Generating GraphQL documents for ${publicApiModels.length} public API models...`);
|
|
241
|
+
for (const model of publicApiModels) {
|
|
242
|
+
files.push({
|
|
243
|
+
path: join(config.output.documents, `${model.key}.graphql`),
|
|
244
|
+
content: generateEntityModelDocuments(model),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
spinner.succeed(`Generated GraphQL documents for ${publicApiModels.length} public API models`);
|
|
248
|
+
}
|
|
249
|
+
// Generate typed hooks based on framework setting
|
|
250
|
+
const settings = await getSettings();
|
|
251
|
+
const framework = config.framework || settings.framework || 'agnostic';
|
|
252
|
+
if (publicApiModels.length > 0) {
|
|
253
|
+
spinner.start(`Generating ${framework} hooks for ${publicApiModels.length} models...`);
|
|
254
|
+
const hooksDir = config.output.hooks;
|
|
255
|
+
let generateHook;
|
|
256
|
+
let generateIndex;
|
|
257
|
+
switch (framework) {
|
|
258
|
+
case 'react':
|
|
259
|
+
generateHook = generateReactHooks;
|
|
260
|
+
generateIndex = generateReactHooksIndex;
|
|
261
|
+
break;
|
|
262
|
+
case 'remix':
|
|
263
|
+
generateHook = generateRemixHooks;
|
|
264
|
+
generateIndex = generateRemixHooksIndex;
|
|
265
|
+
break;
|
|
266
|
+
default:
|
|
267
|
+
generateHook = generateAgnosticHooks;
|
|
268
|
+
generateIndex = generateAgnosticHooksIndex;
|
|
269
|
+
}
|
|
270
|
+
for (const model of publicApiModels) {
|
|
271
|
+
const hookContent = generateHook(model, entityModels);
|
|
272
|
+
if (hookContent) {
|
|
273
|
+
files.push({
|
|
274
|
+
path: join(hooksDir, `${model.key}.ts`),
|
|
275
|
+
content: hookContent,
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
files.push({
|
|
280
|
+
path: join(hooksDir, 'index.ts'),
|
|
281
|
+
content: generateIndex(publicApiModels),
|
|
282
|
+
});
|
|
283
|
+
spinner.succeed(`Generated ${framework} hooks for ${publicApiModels.length} models`);
|
|
284
|
+
}
|
|
285
|
+
// ========================================================================
|
|
286
|
+
// Phase 13: Generate layered API structure
|
|
287
|
+
// ========================================================================
|
|
288
|
+
// Phase 13: Generate admin hooks (CRUD, versioning)
|
|
289
|
+
if (publicApiModels.length > 0 && framework !== 'agnostic') {
|
|
290
|
+
spinner.start(`Generating ${framework} admin hooks for ${publicApiModels.length} models...`);
|
|
291
|
+
const adminDir = join(config.output.hooks, 'admin');
|
|
292
|
+
const generateAdmin = framework === 'react' ? generateAdminHooksReact : generateAdminHooksRemix;
|
|
293
|
+
const generateAdminIndex = framework === 'react' ? generateAdminHooksIndexReact : generateAdminHooksIndexRemix;
|
|
294
|
+
for (const model of publicApiModels) {
|
|
295
|
+
const adminContent = generateAdmin(model, entityModels);
|
|
296
|
+
if (adminContent) {
|
|
297
|
+
files.push({
|
|
298
|
+
path: join(adminDir, `${model.key}.ts`),
|
|
299
|
+
content: adminContent,
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
files.push({
|
|
304
|
+
path: join(adminDir, 'index.ts'),
|
|
305
|
+
content: generateAdminIndex(publicApiModels),
|
|
306
|
+
});
|
|
307
|
+
spinner.succeed(`Generated ${framework} admin hooks for ${publicApiModels.length} models`);
|
|
308
|
+
}
|
|
309
|
+
// Phase 13: Generate platform resolve hooks (clean, no CMS features)
|
|
310
|
+
if (publicApiModels.length > 0 && framework !== 'agnostic') {
|
|
311
|
+
spinner.start(`Generating ${framework} platform resolve hooks for ${publicApiModels.length} models...`);
|
|
312
|
+
const platformResolveDir = join(config.output.hooks, 'resolve');
|
|
313
|
+
const generatePlatformResolve = framework === 'react' ? generatePlatformResolveReact : generatePlatformResolveRemix;
|
|
314
|
+
const generatePlatformIndex = framework === 'react' ? generatePlatformResolveIndexReact : generatePlatformResolveIndexRemix;
|
|
315
|
+
for (const model of publicApiModels) {
|
|
316
|
+
const resolveContent = generatePlatformResolve(model, entityModels);
|
|
317
|
+
if (resolveContent) {
|
|
318
|
+
files.push({
|
|
319
|
+
path: join(platformResolveDir, `${model.key}.ts`),
|
|
320
|
+
content: resolveContent,
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
}
|
|
324
|
+
files.push({
|
|
325
|
+
path: join(platformResolveDir, 'index.ts'),
|
|
326
|
+
content: generatePlatformIndex(publicApiModels),
|
|
327
|
+
});
|
|
328
|
+
spinner.succeed(`Generated ${framework} platform resolve hooks for ${publicApiModels.length} models`);
|
|
329
|
+
}
|
|
330
|
+
// Phase 13: Generate CMS hooks (only if cms.enabled models exist)
|
|
331
|
+
const routableModels = getRoutableModels(entityModels);
|
|
332
|
+
if (routableModels.length > 0 && framework !== 'agnostic') {
|
|
333
|
+
spinner.start(`Generating ${framework} CMS hooks for ${routableModels.length} routable models...`);
|
|
334
|
+
const cmsDir = join(config.output.hooks, 'cms');
|
|
335
|
+
const generateCmsRoute = framework === 'react' ? generateCmsRouteReact : generateCmsRouteRemix;
|
|
336
|
+
const generateCmsIndex = framework === 'react' ? generateCmsIndexReact : generateCmsIndexRemix;
|
|
337
|
+
// Generate CMS types
|
|
338
|
+
files.push({
|
|
339
|
+
path: join(cmsDir, 'types.ts'),
|
|
340
|
+
content: generateCmsTypes(),
|
|
341
|
+
});
|
|
342
|
+
// Generate resolveRoute hook/function
|
|
343
|
+
files.push({
|
|
344
|
+
path: join(cmsDir, 'route.ts'),
|
|
345
|
+
content: generateCmsRoute(routableModels),
|
|
346
|
+
});
|
|
347
|
+
// Generate CMS index
|
|
348
|
+
files.push({
|
|
349
|
+
path: join(cmsDir, 'index.ts'),
|
|
350
|
+
content: generateCmsIndex(entityModels),
|
|
351
|
+
});
|
|
352
|
+
spinner.succeed(`Generated ${framework} CMS hooks for ${routableModels.length} routable models`);
|
|
353
|
+
if (options.verbose) {
|
|
354
|
+
console.log(chalk.gray('Routable models (cms.enabled = true):'));
|
|
355
|
+
for (const model of routableModels) {
|
|
356
|
+
console.log(chalk.gray(` - ${model.key}`));
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
else if (options.verbose && framework !== 'agnostic') {
|
|
361
|
+
console.log(chalk.gray('No routable models found - skipping CMS hooks generation'));
|
|
362
|
+
}
|
|
363
|
+
// Generate typed filters
|
|
364
|
+
if (publicApiModels.length > 0) {
|
|
365
|
+
spinner.start(`Generating typed filters for ${publicApiModels.length} models...`);
|
|
366
|
+
const filtersDir = join(config.output.types, '..', 'filters');
|
|
367
|
+
for (const model of publicApiModels) {
|
|
368
|
+
const filterContent = generateModelFilters(model, entityModels);
|
|
369
|
+
if (filterContent) {
|
|
370
|
+
files.push({
|
|
371
|
+
path: join(filtersDir, `${model.key}.ts`),
|
|
372
|
+
content: filterContent,
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
files.push({
|
|
377
|
+
path: join(filtersDir, 'index.ts'),
|
|
378
|
+
content: generateFiltersIndex(publicApiModels),
|
|
379
|
+
});
|
|
380
|
+
spinner.succeed(`Generated typed filters for ${publicApiModels.length} models`);
|
|
381
|
+
}
|
|
382
|
+
// Generate main index
|
|
383
|
+
files.push({
|
|
384
|
+
path: join(config.output.types, 'index.ts'),
|
|
385
|
+
content: `/**
|
|
386
|
+
* Generated types for EIDE project
|
|
387
|
+
*
|
|
388
|
+
* @generated by UniformGen - DO NOT EDIT MANUALLY
|
|
389
|
+
*/
|
|
390
|
+
|
|
391
|
+
export * from './field-types.js';
|
|
392
|
+
export * from './hooks.js';
|
|
393
|
+
export * from './config.js';
|
|
394
|
+
export * from './contexts.js';
|
|
395
|
+
${entityModels.length > 0 ? "export * from './models/index.js';" : ''}
|
|
396
|
+
`,
|
|
397
|
+
});
|
|
398
|
+
// Dry run
|
|
399
|
+
if (options.dryRun) {
|
|
400
|
+
console.log(chalk.cyan('\nDry run - files that would be generated:'));
|
|
401
|
+
files.forEach((f) => console.log(chalk.gray(` - ${f.path}`)));
|
|
402
|
+
console.log(chalk.cyan(`\nTotal: ${files.length} files`));
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
// Write files
|
|
406
|
+
spinner.start(`Writing ${files.length} files...`);
|
|
407
|
+
await writeFiles(files, config.prettier);
|
|
408
|
+
spinner.succeed(`Generated ${files.length} files`);
|
|
409
|
+
console.log(chalk.green('\n✓ Code generation complete!'));
|
|
410
|
+
console.log(chalk.gray(` Output: ${config.output.types}`));
|
|
411
|
+
}
|
|
412
|
+
catch (error) {
|
|
413
|
+
spinner.fail('Generation failed');
|
|
414
|
+
console.error(chalk.red('\nError:'), error instanceof Error ? error.message : String(error));
|
|
415
|
+
process.exit(1);
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
// ============================================================================
|
|
419
|
+
// Schema Management Commands
|
|
420
|
+
// ============================================================================
|
|
421
|
+
program
|
|
422
|
+
.command('push')
|
|
423
|
+
.description('Sync local schema files to platform')
|
|
424
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
425
|
+
.option('--schemas <dir>', 'Directory containing .schema.ts files', './schemas')
|
|
426
|
+
.option('--pattern <pattern>', 'Glob pattern for schema files', '**/*.schema.ts')
|
|
427
|
+
.option('--dry-run', 'Preview changes without applying')
|
|
428
|
+
.option('--publish', 'Publish schemas after pushing')
|
|
429
|
+
.action(async (options) => {
|
|
430
|
+
try {
|
|
431
|
+
await push({
|
|
432
|
+
apiUrl: options.apiUrl,
|
|
433
|
+
schemasDir: options.schemas,
|
|
434
|
+
pattern: options.pattern,
|
|
435
|
+
dryRun: options.dryRun,
|
|
436
|
+
publish: options.publish,
|
|
437
|
+
});
|
|
438
|
+
}
|
|
439
|
+
catch (error) {
|
|
440
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
441
|
+
process.exit(1);
|
|
442
|
+
}
|
|
443
|
+
});
|
|
444
|
+
program
|
|
445
|
+
.command('init')
|
|
446
|
+
.description('Generate local schema files from platform schemas')
|
|
447
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
448
|
+
.option('--schemas <dir>', 'Output directory for schema files', './schemas')
|
|
449
|
+
.option('--overwrite', 'Overwrite existing schema files')
|
|
450
|
+
.action(async (options) => {
|
|
451
|
+
try {
|
|
452
|
+
await init({
|
|
453
|
+
apiUrl: options.apiUrl,
|
|
454
|
+
schemasDir: options.schemas,
|
|
455
|
+
overwrite: options.overwrite,
|
|
456
|
+
});
|
|
457
|
+
}
|
|
458
|
+
catch (error) {
|
|
459
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
460
|
+
process.exit(1);
|
|
461
|
+
}
|
|
462
|
+
});
|
|
463
|
+
program
|
|
464
|
+
.command('sync')
|
|
465
|
+
.description('Push local schemas then pull generated types')
|
|
466
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
467
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
468
|
+
.option('--schemas <dir>', 'Directory containing .schema.ts files', './schemas')
|
|
469
|
+
.option('--pattern <pattern>', 'Glob pattern for schema files', '**/*.schema.ts')
|
|
470
|
+
.option('--publish', 'Publish schemas after pushing')
|
|
471
|
+
.action(async (options) => {
|
|
472
|
+
try {
|
|
473
|
+
await sync({
|
|
474
|
+
apiUrl: options.apiUrl,
|
|
475
|
+
schemasDir: options.schemas,
|
|
476
|
+
pattern: options.pattern,
|
|
477
|
+
publish: options.publish,
|
|
478
|
+
config: options.config,
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
catch (error) {
|
|
482
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
483
|
+
process.exit(1);
|
|
484
|
+
}
|
|
485
|
+
});
|
|
486
|
+
// ============================================================================
|
|
487
|
+
// Component Scaffolding Commands
|
|
488
|
+
// ============================================================================
|
|
489
|
+
program
|
|
490
|
+
.command('scaffold')
|
|
491
|
+
.description('Generate React component stubs for @eide/foir-renderer')
|
|
492
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
493
|
+
.option('--components <dir>', 'Output directory for components', './src/components/foir')
|
|
494
|
+
.option('--models <models>', 'Only scaffold specific models (comma-separated keys)')
|
|
495
|
+
.option('--overwrite', 'Overwrite existing component files')
|
|
496
|
+
.option('--framework <framework>', 'Framework: react, remix, next', 'react')
|
|
497
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
498
|
+
.action(async (options) => {
|
|
499
|
+
try {
|
|
500
|
+
await scaffold({
|
|
501
|
+
apiUrl: options.apiUrl,
|
|
502
|
+
componentsDir: options.components,
|
|
503
|
+
models: options.models,
|
|
504
|
+
overwrite: options.overwrite,
|
|
505
|
+
framework: options.framework,
|
|
506
|
+
config: options.config,
|
|
507
|
+
});
|
|
508
|
+
}
|
|
509
|
+
catch (error) {
|
|
510
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
511
|
+
process.exit(1);
|
|
512
|
+
}
|
|
513
|
+
});
|
|
514
|
+
// ============================================================================
|
|
515
|
+
// Content Seeding Commands
|
|
516
|
+
// ============================================================================
|
|
517
|
+
program
|
|
518
|
+
.command('seed')
|
|
519
|
+
.description('Seed content data from local JSON/YAML files')
|
|
520
|
+
.option('--api-url <url>', 'API endpoint URL', apiUrlDefault)
|
|
521
|
+
.option('--seed <dir>', 'Directory containing seed files', './seed')
|
|
522
|
+
.option('--pattern <pattern>', 'Filter files by pattern')
|
|
523
|
+
.option('--publish', 'Publish records after creating')
|
|
524
|
+
.option('--upsert', 'Update existing records instead of skipping')
|
|
525
|
+
.option('--dry-run', 'Preview changes without applying')
|
|
526
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
527
|
+
.action(async (options) => {
|
|
528
|
+
try {
|
|
529
|
+
await seed({
|
|
530
|
+
apiUrl: options.apiUrl,
|
|
531
|
+
seedDir: options.seed,
|
|
532
|
+
pattern: options.pattern,
|
|
533
|
+
publish: options.publish,
|
|
534
|
+
upsert: options.upsert,
|
|
535
|
+
dryRun: options.dryRun,
|
|
536
|
+
config: options.config,
|
|
537
|
+
});
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
console.error(chalk.red('Error:'), error instanceof Error ? error.message : String(error));
|
|
541
|
+
process.exit(1);
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
// Default command (no subcommand = pull)
|
|
545
|
+
program
|
|
546
|
+
.option('-c, --config <path>', 'Path to config file')
|
|
547
|
+
.option('--api-url <url>', 'API endpoint URL')
|
|
548
|
+
.option('--project-key <key>', 'Project API key')
|
|
549
|
+
.option('--out <dir>', 'Output directory')
|
|
550
|
+
.option('--no-prettier', 'Disable Prettier formatting')
|
|
551
|
+
.option('--dry-run', 'Show what would be generated without writing files')
|
|
552
|
+
.option('--only <models>', 'Only generate for specific entity models (comma-separated keys)')
|
|
553
|
+
.option('--include-inline', 'Include inline-only entity models')
|
|
554
|
+
.option('-v, --verbose', 'Enable verbose logging')
|
|
555
|
+
.action(async (_options, command) => {
|
|
556
|
+
// If no subcommand and has arguments, run pull
|
|
557
|
+
if (command.args.length === 0) {
|
|
558
|
+
await command.parent?.commands
|
|
559
|
+
.find((c) => c.name() === 'pull')
|
|
560
|
+
?.parseAsync(process.argv.slice(2), { from: 'user' });
|
|
561
|
+
}
|
|
562
|
+
});
|
|
563
|
+
program.parse();
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
interface InitOptions {
|
|
2
|
+
apiUrl: string;
|
|
3
|
+
schemasDir: string;
|
|
4
|
+
overwrite?: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Init command - generate local schema files from platform schemas
|
|
8
|
+
*/
|
|
9
|
+
export declare function init(options: InitOptions): Promise<void>;
|
|
10
|
+
export {};
|
|
11
|
+
//# sourceMappingURL=init.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAOA,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkED;;GAEG;AACH,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CA8D9D"}
|