@eide/foir-cli 0.1.1 → 0.1.3

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.
Files changed (40) hide show
  1. package/dist/cli.js +8 -2
  2. package/dist/codegen/fetch-models.d.ts +40 -0
  3. package/dist/codegen/fetch-models.d.ts.map +1 -0
  4. package/dist/codegen/fetch-models.js +45 -0
  5. package/dist/codegen/field-mapping.d.ts +28 -0
  6. package/dist/codegen/field-mapping.d.ts.map +1 -0
  7. package/dist/codegen/field-mapping.js +194 -0
  8. package/dist/codegen/generators/config.d.ts +5 -0
  9. package/dist/codegen/generators/config.d.ts.map +1 -0
  10. package/dist/codegen/generators/config.js +82 -0
  11. package/dist/codegen/generators/documents.d.ts +6 -0
  12. package/dist/codegen/generators/documents.d.ts.map +1 -0
  13. package/dist/codegen/generators/documents.js +91 -0
  14. package/dist/codegen/generators/field-types.d.ts +5 -0
  15. package/dist/codegen/generators/field-types.d.ts.map +1 -0
  16. package/dist/codegen/generators/field-types.js +339 -0
  17. package/dist/codegen/generators/model-index.d.ts +6 -0
  18. package/dist/codegen/generators/model-index.d.ts.map +1 -0
  19. package/dist/codegen/generators/model-index.js +26 -0
  20. package/dist/codegen/generators/model-types.d.ts +12 -0
  21. package/dist/codegen/generators/model-types.d.ts.map +1 -0
  22. package/dist/codegen/generators/model-types.js +150 -0
  23. package/dist/codegen/write-files.d.ts +15 -0
  24. package/dist/codegen/write-files.d.ts.map +1 -0
  25. package/dist/codegen/write-files.js +35 -0
  26. package/dist/commands/models.d.ts.map +1 -1
  27. package/dist/commands/models.js +0 -6
  28. package/dist/commands/pull.d.ts +4 -0
  29. package/dist/commands/pull.d.ts.map +1 -0
  30. package/dist/commands/pull.js +118 -0
  31. package/dist/config/pull-config.d.ts +25 -0
  32. package/dist/config/pull-config.d.ts.map +1 -0
  33. package/dist/config/pull-config.js +65 -0
  34. package/dist/config/types.d.ts +31 -0
  35. package/dist/config/types.d.ts.map +1 -0
  36. package/dist/config/types.js +15 -0
  37. package/dist/graphql/queries.d.ts +1 -0
  38. package/dist/graphql/queries.d.ts.map +1 -1
  39. package/dist/graphql/queries.js +8 -0
  40. package/package.json +19 -13
@@ -0,0 +1,118 @@
1
+ import { resolve } from 'path';
2
+ import chalk from 'chalk';
3
+ import { withErrorHandler } from '../lib/errors.js';
4
+ import { createClient } from '../lib/client.js';
5
+ import { loadPullConfig } from '../config/pull-config.js';
6
+ import { fetchModelsForCodegen, filterModels } from '../codegen/fetch-models.js';
7
+ import { generateFieldTypesFile } from '../codegen/generators/field-types.js';
8
+ import { generateConfigFile } from '../codegen/generators/config.js';
9
+ import { generateModelTypes } from '../codegen/generators/model-types.js';
10
+ import { generateModelIndex } from '../codegen/generators/model-index.js';
11
+ import { generateModelDocuments } from '../codegen/generators/documents.js';
12
+ import { writeFiles } from '../codegen/write-files.js';
13
+ export function registerPullCommand(program, globalOpts) {
14
+ program
15
+ .command('pull')
16
+ .description('Generate TypeScript types and GraphQL documents from platform models')
17
+ .option('--config <path>', 'Path to config file')
18
+ .option('--only <models>', 'Comma-separated model keys to generate')
19
+ .option('--no-prettier', 'Skip Prettier formatting')
20
+ .option('--dry-run', 'Show what would be generated without writing')
21
+ .option('--out <dir>', 'Override output directory for types')
22
+ .action(withErrorHandler(globalOpts, async (cmdOpts) => {
23
+ const opts = globalOpts();
24
+ const flags = {
25
+ config: cmdOpts.config,
26
+ only: cmdOpts.only,
27
+ noPrettier: cmdOpts.prettier === false,
28
+ dryRun: !!cmdOpts.dryRun,
29
+ out: cmdOpts.out,
30
+ };
31
+ const config = await loadPullConfig(flags);
32
+ // Fetch models
33
+ const client = await createClient(opts);
34
+ console.log(chalk.dim('Fetching models…'));
35
+ const allModels = await fetchModelsForCodegen(client);
36
+ if (allModels.length === 0) {
37
+ console.log(chalk.yellow('No models found. Nothing to generate.'));
38
+ return;
39
+ }
40
+ const models = filterModels(allModels, {
41
+ only: config.only.length > 0 ? config.only : undefined,
42
+ includeInline: config.includeInline,
43
+ });
44
+ console.log(chalk.dim(`Found ${allModels.length} model(s), generating for ${models.length}.`));
45
+ // Collect files to write
46
+ const cwd = process.cwd();
47
+ const typesDir = resolve(cwd, config.output.types);
48
+ const docsDir = resolve(cwd, config.output.documents);
49
+ const files = [];
50
+ // 1. Static files
51
+ files.push({
52
+ path: resolve(typesDir, 'field-types.ts'),
53
+ content: generateFieldTypesFile(),
54
+ });
55
+ files.push({
56
+ path: resolve(typesDir, 'config.ts'),
57
+ content: generateConfigFile(),
58
+ });
59
+ // 2. Per-model type files
60
+ for (const model of models) {
61
+ files.push({
62
+ path: resolve(typesDir, 'models', `${model.key}.ts`),
63
+ content: generateModelTypes(model, models),
64
+ });
65
+ }
66
+ // 3. Model index
67
+ files.push({
68
+ path: resolve(typesDir, 'models', 'index.ts'),
69
+ content: generateModelIndex(models),
70
+ });
71
+ // 4. Per-model GraphQL documents (only for publicApi models with records)
72
+ const publicModels = models.filter((m) => m.config.publicApi && m.config.records);
73
+ for (const model of publicModels) {
74
+ files.push({
75
+ path: resolve(docsDir, `${model.key}.graphql`),
76
+ content: generateModelDocuments(model),
77
+ });
78
+ }
79
+ // 5. Main index
80
+ files.push({
81
+ path: resolve(typesDir, 'index.ts'),
82
+ content: generateMainIndex(),
83
+ });
84
+ // Dry run: list files
85
+ if (config.dryRun) {
86
+ console.log(chalk.bold('\nDry run — files that would be generated:\n'));
87
+ for (const file of files) {
88
+ const rel = file.path.replace(cwd + '/', '');
89
+ console.log(` ${chalk.green('+')} ${rel}`);
90
+ }
91
+ console.log(`\n${chalk.dim(`${files.length} file(s) total`)}`);
92
+ return;
93
+ }
94
+ // Write files
95
+ await writeFiles(files, config.prettier);
96
+ // Summary
97
+ const modelCount = models.length;
98
+ const docCount = publicModels.length;
99
+ console.log(chalk.green(`\nGenerated ${files.length} file(s)`) +
100
+ chalk.dim(` (${modelCount} model type(s), ${docCount} document(s))`));
101
+ console.log(chalk.dim(` Types: ${typesDir}`));
102
+ if (docCount > 0) {
103
+ console.log(chalk.dim(` Documents: ${docsDir}`));
104
+ }
105
+ }));
106
+ }
107
+ function generateMainIndex() {
108
+ return `/**
109
+ * Generated types and configs
110
+ *
111
+ * @generated by foir — DO NOT EDIT MANUALLY
112
+ */
113
+
114
+ export * from './field-types.js';
115
+ export * from './config.js';
116
+ export * from './models/index.js';
117
+ `;
118
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Pull config loader — searches for foir.config.ts / .foirrc.ts and merges with CLI flags.
3
+ */
4
+ export interface PullCliFlags {
5
+ config?: string;
6
+ only?: string;
7
+ noPrettier?: boolean;
8
+ dryRun?: boolean;
9
+ out?: string;
10
+ }
11
+ export interface ResolvedPullConfig {
12
+ output: {
13
+ types: string;
14
+ documents: string;
15
+ };
16
+ only: string[];
17
+ includeInline: boolean;
18
+ prettier: boolean;
19
+ dryRun: boolean;
20
+ }
21
+ /**
22
+ * Load and merge config from file + CLI flags.
23
+ */
24
+ export declare function loadPullConfig(flags: PullCliFlags): Promise<ResolvedPullConfig>;
25
+ //# sourceMappingURL=pull-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull-config.d.ts","sourceRoot":"","sources":["../../src/config/pull-config.ts"],"names":[],"mappings":"AAAA;;GAEG;AA+CH,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7C,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,cAAc,CAClC,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,kBAAkB,CAAC,CAuB7B"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * Pull config loader — searches for foir.config.ts / .foirrc.ts and merges with CLI flags.
3
+ */
4
+ import { resolve } from 'path';
5
+ import { pathToFileURL } from 'url';
6
+ import { existsSync } from 'fs';
7
+ const CONFIG_FILE_NAMES = [
8
+ 'foir.config.ts',
9
+ 'foir.config.js',
10
+ 'foir.config.mjs',
11
+ '.foirrc.ts',
12
+ '.foirrc.js',
13
+ '.foirrc.mjs',
14
+ ];
15
+ const DEFAULT_TYPES_DIR = './src/generated/types';
16
+ const DEFAULT_DOCS_DIR = './src/generated/documents';
17
+ /**
18
+ * Resolve a config file from the given directory (or cwd).
19
+ */
20
+ function findConfigFile(explicitPath) {
21
+ if (explicitPath) {
22
+ const abs = resolve(explicitPath);
23
+ if (existsSync(abs))
24
+ return abs;
25
+ throw new Error(`Config file not found: ${explicitPath}`);
26
+ }
27
+ const cwd = process.cwd();
28
+ for (const name of CONFIG_FILE_NAMES) {
29
+ const candidate = resolve(cwd, name);
30
+ if (existsSync(candidate))
31
+ return candidate;
32
+ }
33
+ return null;
34
+ }
35
+ /**
36
+ * Dynamically import a config file (supports .ts via tsx loader, .js, .mjs).
37
+ */
38
+ async function loadConfigFile(filePath) {
39
+ const url = pathToFileURL(filePath).href;
40
+ const mod = await import(url);
41
+ const config = mod.default ?? mod;
42
+ return config;
43
+ }
44
+ /**
45
+ * Load and merge config from file + CLI flags.
46
+ */
47
+ export async function loadPullConfig(flags) {
48
+ let fileConfig = {};
49
+ const configPath = findConfigFile(flags.config);
50
+ if (configPath) {
51
+ const full = await loadConfigFile(configPath);
52
+ fileConfig = full.pull ?? {};
53
+ }
54
+ // Merge: defaults ← file config ← CLI flags
55
+ const types = flags.out ?? fileConfig.output?.types ?? DEFAULT_TYPES_DIR;
56
+ const documents = fileConfig.output?.documents ?? DEFAULT_DOCS_DIR;
57
+ const output = { types, documents };
58
+ const only = flags.only
59
+ ? flags.only.split(',').map((s) => s.trim())
60
+ : fileConfig.only ?? [];
61
+ const includeInline = fileConfig.includeInline ?? true;
62
+ const prettier = flags.noPrettier ? false : (fileConfig.prettier ?? true);
63
+ const dryRun = flags.dryRun ?? false;
64
+ return { output, only, includeInline, prettier, dryRun };
65
+ }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Configuration types for foir-cli
3
+ */
4
+ export interface FoirPullConfig {
5
+ output?: {
6
+ /** Directory for generated TypeScript types (default: './src/generated/types') */
7
+ types?: string;
8
+ /** Directory for generated GraphQL documents (default: './src/generated/documents') */
9
+ documents?: string;
10
+ };
11
+ /** Filter to specific model keys */
12
+ only?: string[];
13
+ /** Include inline-only models for type resolution (default: true) */
14
+ includeInline?: boolean;
15
+ /** Format output with Prettier (default: true) */
16
+ prettier?: boolean;
17
+ }
18
+ export interface FoirConfig {
19
+ pull?: FoirPullConfig;
20
+ }
21
+ /**
22
+ * Helper to create a type-safe foir config.
23
+ * Used in foir.config.ts files:
24
+ *
25
+ * ```ts
26
+ * import { defineConfig } from '@eide/foir-cli/config';
27
+ * export default defineConfig({ pull: { output: { types: './src/generated' } } });
28
+ * ```
29
+ */
30
+ export declare function defineConfig(config: FoirConfig): FoirConfig;
31
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/config/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE;QACP,kFAAkF;QAClF,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,uFAAuF;QACvF,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,qEAAqE;IACrE,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,kDAAkD;IAClD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,CAE3D"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Configuration types for foir-cli
3
+ */
4
+ /**
5
+ * Helper to create a type-safe foir config.
6
+ * Used in foir.config.ts files:
7
+ *
8
+ * ```ts
9
+ * import { defineConfig } from '@eide/foir-cli/config';
10
+ * export default defineConfig({ pull: { output: { types: './src/generated' } } });
11
+ * ```
12
+ */
13
+ export function defineConfig(config) {
14
+ return config;
15
+ }
@@ -15,6 +15,7 @@ export declare const UNPUBLISH_RECORD = "\n mutation($id: ID!) { unpublishRecor
15
15
  export declare const DUPLICATE_RECORD = "\n mutation($input: DuplicateRecordInput!) { duplicateRecord(input: $input) { record { id modelKey naturalKey } variant { id variantKey } version { id versionNumber } } }\n";
16
16
  export declare const RECORD_VERSIONS = "\n query($parentId: ID!, $limit: Int, $offset: Int) { recordVersions(parentId: $parentId, limit: $limit, offset: $offset) { items { id versionNumber publishStatus data contentHash changeDescription createdAt createdBy } } }\n";
17
17
  export declare const RECORD_VARIANTS = "\n query($recordId: ID!, $limit: Int, $offset: Int) { recordVariants(recordId: $recordId, limit: $limit, offset: $offset) { items { id variantKey variantName isDefault priority createdAt } } }\n";
18
+ export declare const MODELS_FOR_CODEGEN = "\n query($limit: Int) {\n models(limit: $limit) {\n items { id key name pluralName description category fields config hooks }\n total\n }\n }\n";
18
19
  export declare const MODEL_BY_KEY = "\n query($key: String!) { modelByKey(key: $key) { id key name pluralName description category icon fields config hooks displayField extensionId systemEntity deletable editable currentVersionId publishedVersionNumber createdAt updatedAt } }\n";
19
20
  export declare const MODELS = "\n query($search: String, $category: String, $limit: Int, $offset: Int) {\n models(search: $search, category: $category, limit: $limit, offset: $offset) {\n items { id key name category config systemEntity createdAt updatedAt }\n total\n }\n }\n";
20
21
  export declare const CREATE_MODEL = "\n mutation($input: CreateModelInput!) { createModel(input: $input) { id key name fields config createdAt } }\n";
@@ -1 +1 @@
1
- {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/graphql/queries.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"queries.d.ts","sourceRoot":"","sources":["../../src/graphql/queries.ts"],"names":[],"mappings":"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"}
@@ -67,6 +67,14 @@ export const RECORD_VARIANTS = `
67
67
  query($recordId: ID!, $limit: Int, $offset: Int) { recordVariants(recordId: $recordId, limit: $limit, offset: $offset) { items { id variantKey variantName isDefault priority createdAt } } }
68
68
  `;
69
69
  // --- Models ---
70
+ export const MODELS_FOR_CODEGEN = `
71
+ query($limit: Int) {
72
+ models(limit: $limit) {
73
+ items { id key name pluralName description category fields config hooks }
74
+ total
75
+ }
76
+ }
77
+ `;
70
78
  export const MODEL_BY_KEY = `
71
79
  query($key: String!) { modelByKey(key: $key) { id key name pluralName description category icon fields config hooks displayField extensionId systemEntity deletable editable currentVersionId publishedVersionNumber createdAt updatedAt } }
72
80
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eide/foir-cli",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "Universal platform CLI for EIDE — scriptable, composable resource management",
5
5
  "type": "module",
6
6
  "publishConfig": {
@@ -13,26 +13,24 @@
13
13
  ".": {
14
14
  "types": "./dist/cli.js",
15
15
  "import": "./dist/cli.js"
16
+ },
17
+ "./config": {
18
+ "types": "./dist/config/types.js",
19
+ "import": "./dist/config/types.js"
16
20
  }
17
21
  },
18
22
  "files": [
19
23
  "dist",
20
24
  "README.md"
21
25
  ],
22
- "scripts": {
23
- "build": "tsc",
24
- "dev:cli": "tsx src/cli.ts",
25
- "check-types": "tsc --noEmit",
26
- "test": "vitest run",
27
- "test:watch": "vitest watch"
28
- },
29
26
  "keywords": [
30
27
  "foir",
31
28
  "eide",
32
29
  "cms",
33
30
  "cli",
34
31
  "graphql",
35
- "platform"
32
+ "platform",
33
+ "codegen"
36
34
  ],
37
35
  "author": "EIDE Team",
38
36
  "license": "UNLICENSED",
@@ -43,17 +41,25 @@
43
41
  "graphql-request": "^7.1.2",
44
42
  "inquirer": "^9.2.12",
45
43
  "open": "^10.1.0",
46
- "ora": "^8.1.1"
44
+ "ora": "^8.1.1",
45
+ "prettier": "^3.4.2"
47
46
  },
48
47
  "devDependencies": {
49
- "@foir/config": "workspace:*",
50
48
  "@types/inquirer": "^9.0.7",
51
49
  "@types/node": "^22.5.0",
52
50
  "tsx": "^4.20.0",
53
51
  "typescript": "5.9.2",
54
- "vitest": "^3.2.4"
52
+ "vitest": "^3.2.4",
53
+ "@foir/config": "0.0.1"
55
54
  },
56
55
  "engines": {
57
56
  "node": ">=18.0.0"
57
+ },
58
+ "scripts": {
59
+ "build": "tsc",
60
+ "dev:cli": "tsx src/cli.ts",
61
+ "check-types": "tsc --noEmit",
62
+ "test": "vitest run",
63
+ "test:watch": "vitest watch"
58
64
  }
59
- }
65
+ }