@constructive-io/graphql-codegen 4.9.0 → 4.13.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.
Files changed (59) hide show
  1. package/core/codegen/cli/arg-mapper.d.ts +1 -1
  2. package/core/codegen/cli/arg-mapper.js +15 -11
  3. package/core/codegen/cli/command-map-generator.d.ts +1 -0
  4. package/core/codegen/cli/command-map-generator.js +4 -0
  5. package/core/codegen/cli/config-command-generator.d.ts +11 -0
  6. package/core/codegen/cli/config-command-generator.js +458 -0
  7. package/core/codegen/cli/custom-command-generator.js +4 -3
  8. package/core/codegen/cli/docs-generator.d.ts +6 -5
  9. package/core/codegen/cli/docs-generator.js +167 -64
  10. package/core/codegen/cli/helpers-generator.d.ts +15 -0
  11. package/core/codegen/cli/helpers-generator.js +119 -0
  12. package/core/codegen/cli/index.d.ts +4 -0
  13. package/core/codegen/cli/index.js +21 -3
  14. package/core/codegen/cli/table-command-generator.d.ts +15 -0
  15. package/core/codegen/cli/table-command-generator.js +20 -1
  16. package/core/codegen/docs-utils.d.ts +26 -1
  17. package/core/codegen/docs-utils.js +105 -0
  18. package/core/codegen/orm/index.js +3 -2
  19. package/core/codegen/orm/input-types-generator.d.ts +3 -1
  20. package/core/codegen/orm/input-types-generator.js +123 -17
  21. package/core/codegen/orm/model-generator.d.ts +6 -2
  22. package/core/codegen/orm/model-generator.js +59 -29
  23. package/core/codegen/orm/select-types.d.ts +4 -2
  24. package/core/codegen/scalars.js +8 -0
  25. package/core/codegen/templates/cli-entry.ts +2 -2
  26. package/core/codegen/templates/cli-utils.ts +28 -0
  27. package/core/codegen/templates/query-builder.ts +28 -5
  28. package/core/codegen/templates/select-types.ts +4 -2
  29. package/core/generate.js +14 -4
  30. package/esm/core/codegen/cli/arg-mapper.d.ts +1 -1
  31. package/esm/core/codegen/cli/arg-mapper.js +15 -11
  32. package/esm/core/codegen/cli/command-map-generator.d.ts +1 -0
  33. package/esm/core/codegen/cli/command-map-generator.js +4 -0
  34. package/esm/core/codegen/cli/config-command-generator.d.ts +11 -0
  35. package/esm/core/codegen/cli/config-command-generator.js +422 -0
  36. package/esm/core/codegen/cli/custom-command-generator.js +4 -3
  37. package/esm/core/codegen/cli/docs-generator.d.ts +6 -5
  38. package/esm/core/codegen/cli/docs-generator.js +168 -65
  39. package/esm/core/codegen/cli/helpers-generator.d.ts +15 -0
  40. package/esm/core/codegen/cli/helpers-generator.js +83 -0
  41. package/esm/core/codegen/cli/index.d.ts +4 -0
  42. package/esm/core/codegen/cli/index.js +18 -2
  43. package/esm/core/codegen/cli/table-command-generator.d.ts +15 -0
  44. package/esm/core/codegen/cli/table-command-generator.js +20 -3
  45. package/esm/core/codegen/docs-utils.d.ts +26 -1
  46. package/esm/core/codegen/docs-utils.js +102 -0
  47. package/esm/core/codegen/orm/index.js +3 -2
  48. package/esm/core/codegen/orm/input-types-generator.d.ts +3 -1
  49. package/esm/core/codegen/orm/input-types-generator.js +123 -17
  50. package/esm/core/codegen/orm/model-generator.d.ts +6 -2
  51. package/esm/core/codegen/orm/model-generator.js +59 -29
  52. package/esm/core/codegen/orm/select-types.d.ts +4 -2
  53. package/esm/core/codegen/scalars.js +8 -0
  54. package/esm/core/generate.js +14 -4
  55. package/esm/types/config.d.ts +9 -0
  56. package/esm/types/config.js +1 -0
  57. package/package.json +11 -11
  58. package/types/config.d.ts +9 -0
  59. package/types/config.js +1 -0
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.generateHelpersFile = generateHelpersFile;
37
+ const t = __importStar(require("@babel/types"));
38
+ const babel_ast_1 = require("../babel-ast");
39
+ const utils_1 = require("../utils");
40
+ function createImportDeclaration(moduleSpecifier, namedImports, typeOnly = false) {
41
+ const specifiers = namedImports.map((name) => t.importSpecifier(t.identifier(name), t.identifier(name)));
42
+ const decl = t.importDeclaration(specifiers, t.stringLiteral(moduleSpecifier));
43
+ decl.importKind = typeOnly ? 'type' : 'value';
44
+ return decl;
45
+ }
46
+ /**
47
+ * Generate helpers.ts with typed per-target client factories.
48
+ *
49
+ * Each target gets a `createXxxClient(contextName?)` function that uses
50
+ * `store.getClientConfig(targetName, contextName)` under the hood with
51
+ * 3-tier resolution: appstash store -> env vars -> throw.
52
+ *
53
+ * Also re-exports the store for direct config/var access.
54
+ */
55
+ function generateHelpersFile(toolName, targets) {
56
+ const statements = [];
57
+ // import { createConfigStore } from 'appstash';
58
+ statements.push(createImportDeclaration('appstash', ['createConfigStore']));
59
+ // import type { ClientConfig } from 'appstash';
60
+ statements.push(createImportDeclaration('appstash', ['ClientConfig'], true));
61
+ // Import createClient from each target's ORM
62
+ for (const target of targets) {
63
+ const aliasName = `create${target.name[0].toUpperCase()}${target.name.slice(1)}OrmClient`;
64
+ const specifier = t.importSpecifier(t.identifier(aliasName), t.identifier('createClient'));
65
+ statements.push(t.importDeclaration([specifier], t.stringLiteral(target.ormImportPath)));
66
+ }
67
+ // const store = createConfigStore('toolName');
68
+ statements.push(t.variableDeclaration('const', [
69
+ t.variableDeclarator(t.identifier('store'), t.callExpression(t.identifier('createConfigStore'), [
70
+ t.stringLiteral(toolName),
71
+ ])),
72
+ ]));
73
+ // export const getStore = () => store;
74
+ const getStoreExport = t.variableDeclaration('const', [
75
+ t.variableDeclarator(t.identifier('getStore'), t.arrowFunctionExpression([], t.identifier('store'))),
76
+ ]);
77
+ statements.push(t.exportNamedDeclaration(getStoreExport));
78
+ // export function getClientConfig(targetName: string, contextName?: string): ClientConfig
79
+ const targetNameParam = t.identifier('targetName');
80
+ targetNameParam.typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword());
81
+ const contextNameParam = t.identifier('contextName');
82
+ contextNameParam.optional = true;
83
+ contextNameParam.typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword());
84
+ const getClientConfigBody = t.blockStatement([
85
+ t.returnStatement(t.callExpression(t.memberExpression(t.identifier('store'), t.identifier('getClientConfig')), [t.identifier('targetName'), t.identifier('contextName')])),
86
+ ]);
87
+ const getClientConfigFunc = t.functionDeclaration(t.identifier('getClientConfig'), [targetNameParam, contextNameParam], getClientConfigBody);
88
+ // Add return type annotation
89
+ const returnTypeAnnotation = t.tsTypeAnnotation(t.tsTypeReference(t.identifier('ClientConfig')));
90
+ getClientConfigFunc.returnType = returnTypeAnnotation;
91
+ statements.push(t.exportNamedDeclaration(getClientConfigFunc));
92
+ // Generate typed factory for each target
93
+ for (const target of targets) {
94
+ const factoryName = `create${target.name[0].toUpperCase()}${target.name.slice(1)}Client`;
95
+ const ormAliasName = `create${target.name[0].toUpperCase()}${target.name.slice(1)}OrmClient`;
96
+ const ctxParam = t.identifier('contextName');
97
+ ctxParam.optional = true;
98
+ ctxParam.typeAnnotation = t.tsTypeAnnotation(t.tsStringKeyword());
99
+ const factoryBody = t.blockStatement([
100
+ t.variableDeclaration('const', [
101
+ t.variableDeclarator(t.identifier('config'), t.callExpression(t.memberExpression(t.identifier('store'), t.identifier('getClientConfig')), [t.stringLiteral(target.name), t.identifier('contextName')])),
102
+ ]),
103
+ t.returnStatement(t.callExpression(t.identifier(ormAliasName), [
104
+ t.objectExpression([
105
+ t.objectProperty(t.identifier('endpoint'), t.memberExpression(t.identifier('config'), t.identifier('endpoint'))),
106
+ t.objectProperty(t.identifier('headers'), t.memberExpression(t.identifier('config'), t.identifier('headers'))),
107
+ ]),
108
+ ])),
109
+ ]);
110
+ const factoryFunc = t.functionDeclaration(t.identifier(factoryName), [ctxParam], factoryBody);
111
+ statements.push(t.exportNamedDeclaration(factoryFunc));
112
+ }
113
+ const header = (0, utils_1.getGeneratedFileHeader)('SDK helpers — typed per-target client factories with 3-tier credential resolution');
114
+ const code = (0, babel_ast_1.generateCode)(statements);
115
+ return {
116
+ fileName: 'helpers.ts',
117
+ content: header + '\n' + code,
118
+ };
119
+ }
@@ -47,12 +47,16 @@ export interface GenerateMultiTargetCliOptions {
47
47
  export declare function resolveBuiltinNames(targetNames: string[], userOverrides?: BuiltinNames): {
48
48
  auth: string;
49
49
  context: string;
50
+ config: string;
50
51
  };
51
52
  export declare function generateMultiTargetCli(options: GenerateMultiTargetCliOptions): GenerateCliResult;
52
53
  export { generateExecutorFile, generateMultiTargetExecutorFile } from './executor-generator';
53
54
  export { generateTableCommand } from './table-command-generator';
54
55
  export { generateCustomCommand } from './custom-command-generator';
55
56
  export { generateCommandMap, generateMultiTargetCommandMap } from './command-map-generator';
57
+ export { generateConfigCommand } from './config-command-generator';
58
+ export { generateHelpersFile } from './helpers-generator';
59
+ export type { HelpersGeneratorInput } from './helpers-generator';
56
60
  export { generateContextCommand, generateAuthCommand, generateMultiTargetContextCommand, generateAuthCommandWithName, } from './infra-generator';
57
61
  export { generateReadme, generateAgentsDocs, getCliMcpTools, generateSkills, generateMultiTargetReadme, generateMultiTargetAgentsDocs, getMultiTargetCliMcpTools, generateMultiTargetSkills, } from './docs-generator';
58
62
  export type { MultiTargetDocsInput } from './docs-generator';
@@ -1,12 +1,14 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.generateEntryPointFile = exports.generateUtilsFile = exports.resolveDocsConfig = exports.generateMultiTargetSkills = exports.getMultiTargetCliMcpTools = exports.generateMultiTargetAgentsDocs = exports.generateMultiTargetReadme = exports.generateSkills = exports.getCliMcpTools = exports.generateAgentsDocs = exports.generateReadme = exports.generateAuthCommandWithName = exports.generateMultiTargetContextCommand = exports.generateAuthCommand = exports.generateContextCommand = exports.generateMultiTargetCommandMap = exports.generateCommandMap = exports.generateCustomCommand = exports.generateTableCommand = exports.generateMultiTargetExecutorFile = exports.generateExecutorFile = void 0;
3
+ exports.generateEntryPointFile = exports.generateUtilsFile = exports.resolveDocsConfig = exports.generateMultiTargetSkills = exports.getMultiTargetCliMcpTools = exports.generateMultiTargetAgentsDocs = exports.generateMultiTargetReadme = exports.generateSkills = exports.getCliMcpTools = exports.generateAgentsDocs = exports.generateReadme = exports.generateAuthCommandWithName = exports.generateMultiTargetContextCommand = exports.generateAuthCommand = exports.generateContextCommand = exports.generateHelpersFile = exports.generateConfigCommand = exports.generateMultiTargetCommandMap = exports.generateCommandMap = exports.generateCustomCommand = exports.generateTableCommand = exports.generateMultiTargetExecutorFile = exports.generateExecutorFile = void 0;
4
4
  exports.generateCli = generateCli;
5
5
  exports.resolveBuiltinNames = resolveBuiltinNames;
6
6
  exports.generateMultiTargetCli = generateMultiTargetCli;
7
7
  const command_map_generator_1 = require("./command-map-generator");
8
+ const config_command_generator_1 = require("./config-command-generator");
8
9
  const custom_command_generator_1 = require("./custom-command-generator");
9
10
  const executor_generator_1 = require("./executor-generator");
11
+ const helpers_generator_1 = require("./helpers-generator");
10
12
  const infra_generator_1 = require("./infra-generator");
11
13
  const table_command_generator_1 = require("./table-command-generator");
12
14
  const utils_generator_1 = require("./utils-generator");
@@ -68,13 +70,17 @@ function generateCli(options) {
68
70
  function resolveBuiltinNames(targetNames, userOverrides) {
69
71
  let authName = userOverrides?.auth ?? 'auth';
70
72
  let contextName = userOverrides?.context ?? 'context';
73
+ let configName = userOverrides?.config ?? 'config';
71
74
  if (targetNames.includes(authName) && !userOverrides?.auth) {
72
75
  authName = 'credentials';
73
76
  }
74
77
  if (targetNames.includes(contextName) && !userOverrides?.context) {
75
78
  contextName = 'env';
76
79
  }
77
- return { auth: authName, context: contextName };
80
+ if (targetNames.includes(configName) && !userOverrides?.config) {
81
+ configName = 'vars';
82
+ }
83
+ return { auth: authName, context: contextName, config: configName };
78
84
  }
79
85
  function generateMultiTargetCli(options) {
80
86
  const { toolName, targets } = options;
@@ -100,6 +106,14 @@ function generateMultiTargetCli(options) {
100
106
  files.push(contextFile);
101
107
  const authFile = (0, infra_generator_1.generateAuthCommandWithName)(toolName, builtinNames.auth);
102
108
  files.push(authFile);
109
+ const configFile = (0, config_command_generator_1.generateConfigCommand)(toolName, builtinNames.config);
110
+ files.push(configFile);
111
+ const helpersInputs = targets.map((t) => ({
112
+ name: t.name,
113
+ ormImportPath: t.ormImportPath,
114
+ }));
115
+ const helpersFile = (0, helpers_generator_1.generateHelpersFile)(toolName, helpersInputs);
116
+ files.push(helpersFile);
103
117
  let totalTables = 0;
104
118
  let totalQueries = 0;
105
119
  let totalMutations = 0;
@@ -151,7 +165,7 @@ function generateMultiTargetCli(options) {
151
165
  tables: totalTables,
152
166
  customQueries: totalQueries,
153
167
  customMutations: totalMutations,
154
- infraFiles: 4,
168
+ infraFiles: 6,
155
169
  totalFiles: files.length,
156
170
  },
157
171
  };
@@ -166,6 +180,10 @@ Object.defineProperty(exports, "generateCustomCommand", { enumerable: true, get:
166
180
  var command_map_generator_2 = require("./command-map-generator");
167
181
  Object.defineProperty(exports, "generateCommandMap", { enumerable: true, get: function () { return command_map_generator_2.generateCommandMap; } });
168
182
  Object.defineProperty(exports, "generateMultiTargetCommandMap", { enumerable: true, get: function () { return command_map_generator_2.generateMultiTargetCommandMap; } });
183
+ var config_command_generator_2 = require("./config-command-generator");
184
+ Object.defineProperty(exports, "generateConfigCommand", { enumerable: true, get: function () { return config_command_generator_2.generateConfigCommand; } });
185
+ var helpers_generator_2 = require("./helpers-generator");
186
+ Object.defineProperty(exports, "generateHelpersFile", { enumerable: true, get: function () { return helpers_generator_2.generateHelpersFile; } });
169
187
  var infra_generator_2 = require("./infra-generator");
170
188
  Object.defineProperty(exports, "generateContextCommand", { enumerable: true, get: function () { return infra_generator_2.generateContextCommand; } });
171
189
  Object.defineProperty(exports, "generateAuthCommand", { enumerable: true, get: function () { return infra_generator_2.generateAuthCommand; } });
@@ -1,5 +1,20 @@
1
1
  import type { CleanTable, TypeRegistry } from '../../../types/schema';
2
2
  import type { GeneratedFile } from './executor-generator';
3
+ /**
4
+ * Get the set of field names that have defaults in the create input type.
5
+ * Looks up the CreateXInput -> inner input type (e.g. DatabaseInput) in the
6
+ * TypeRegistry and checks each field's defaultValue from introspection.
7
+ */
8
+ /**
9
+ * Resolve the inner input type from a CreateXInput or UpdateXInput type.
10
+ * The CreateXInput has an inner field (e.g. "database" of type DatabaseInput)
11
+ * that contains the actual field definitions.
12
+ */
13
+ export declare function resolveInnerInputType(inputTypeName: string, typeRegistry: TypeRegistry): {
14
+ name: string;
15
+ fields: Set<string>;
16
+ } | null;
17
+ export declare function getFieldsWithDefaults(table: CleanTable, typeRegistry?: TypeRegistry): Set<string>;
3
18
  export interface TableCommandOptions {
4
19
  targetName?: string;
5
20
  executorImportPath?: string;
@@ -33,6 +33,8 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.resolveInnerInputType = resolveInnerInputType;
37
+ exports.getFieldsWithDefaults = getFieldsWithDefaults;
36
38
  exports.generateTableCommand = generateTableCommand;
37
39
  const t = __importStar(require("@babel/types"));
38
40
  const komoji_1 = require("komoji");
@@ -103,6 +105,22 @@ function getTsTypeForField(field) {
103
105
  return t.tsStringKeyword();
104
106
  }
105
107
  }
108
+ /**
109
+ * Maps a GraphQL scalar type to the appropriate inquirerer question type.
110
+ * Used by table CRUD commands to generate semantic prompts.
111
+ */
112
+ function getQuestionTypeForField(field) {
113
+ const gqlType = field.type.gqlType.replace(/!/g, '');
114
+ switch (gqlType) {
115
+ case 'Boolean':
116
+ return 'boolean';
117
+ case 'JSON':
118
+ case 'GeoJSON':
119
+ return 'json';
120
+ default:
121
+ return 'text';
122
+ }
123
+ }
106
124
  function buildFieldSchemaObject(table) {
107
125
  const fields = (0, utils_1.getScalarFields)(table);
108
126
  return t.objectExpression(fields.map((f) => {
@@ -342,8 +360,9 @@ function buildMutationHandler(table, operation, targetName, typeRegistry, ormTyp
342
360
  // For update: all fields are optional (user only updates what they want)
343
361
  const isRequired = operation === 'create' && !fieldsWithDefaults.has(field.name);
344
362
  const hasDefault = fieldsWithDefaults.has(field.name);
363
+ const questionType = getQuestionTypeForField(field);
345
364
  const questionProps = [
346
- t.objectProperty(t.identifier('type'), t.stringLiteral('text')),
365
+ t.objectProperty(t.identifier('type'), t.stringLiteral(questionType)),
347
366
  t.objectProperty(t.identifier('name'), t.stringLiteral(field.name)),
348
367
  t.objectProperty(t.identifier('message'), t.stringLiteral(field.name)),
349
368
  t.objectProperty(t.identifier('required'), t.booleanLiteral(isRequired)),
@@ -1,5 +1,5 @@
1
1
  import type { DocsConfig } from '../../types/config';
2
- import type { CleanField, CleanOperation, CleanTable } from '../../types/schema';
2
+ import type { CleanArgument, CleanField, CleanOperation, CleanTable, TypeRegistry } from '../../types/schema';
3
3
  export interface GeneratedDocFile {
4
4
  fileName: string;
5
5
  content: string;
@@ -36,6 +36,31 @@ export declare function resolveDocsConfig(docs: DocsConfig | boolean | undefined
36
36
  export declare function formatArgType(arg: CleanOperation['args'][number]): string;
37
37
  export declare function formatTypeRef(t: CleanOperation['args'][number]['type']): string;
38
38
  export declare function getEditableFields(table: CleanTable): CleanField[];
39
+ /**
40
+ * Represents a flattened argument for docs/skills generation.
41
+ * INPUT_OBJECT args are expanded to dot-notation fields.
42
+ */
43
+ export interface FlattenedArg {
44
+ /** Flag name for CLI usage, e.g. 'input.email' or 'clientMutationId' */
45
+ flag: string;
46
+ /** Human-readable type string */
47
+ type: string;
48
+ /** Whether the argument is required */
49
+ required: boolean;
50
+ /** Description from schema */
51
+ description?: string;
52
+ }
53
+ /**
54
+ * Strip internal type prefixes for cleaner docs display.
55
+ * e.g. 'ConstructiveInternalTypeEmail' -> 'Email'
56
+ */
57
+ export declare function cleanTypeName(name: string): string;
58
+ export declare function flattenArgs(args: CleanArgument[], registry?: TypeRegistry): FlattenedArg[];
59
+ /**
60
+ * Build CLI flags string from flattened args.
61
+ * e.g. '--input.email <value> --input.password <value>'
62
+ */
63
+ export declare function flattenedArgsToFlags(flatArgs: FlattenedArg[]): string;
39
64
  export declare function gqlTypeToJsonSchemaType(gqlType: string): string;
40
65
  export declare function buildSkillFile(skill: SkillDefinition, referenceNames?: string[]): string;
41
66
  export declare function buildSkillReference(ref: SkillReferenceDefinition): string;
@@ -6,6 +6,9 @@ exports.resolveDocsConfig = resolveDocsConfig;
6
6
  exports.formatArgType = formatArgType;
7
7
  exports.formatTypeRef = formatTypeRef;
8
8
  exports.getEditableFields = getEditableFields;
9
+ exports.cleanTypeName = cleanTypeName;
10
+ exports.flattenArgs = flattenArgs;
11
+ exports.flattenedArgsToFlags = flattenedArgsToFlags;
9
12
  exports.gqlTypeToJsonSchemaType = gqlTypeToJsonSchemaType;
10
13
  exports.buildSkillFile = buildSkillFile;
11
14
  exports.buildSkillReference = buildSkillReference;
@@ -78,6 +81,108 @@ function getEditableFields(table) {
78
81
  f.name !== 'createdAt' &&
79
82
  f.name !== 'updatedAt');
80
83
  }
84
+ function unwrapNonNull(typeRef) {
85
+ if (typeRef.kind === 'NON_NULL' && typeRef.ofType) {
86
+ return { inner: typeRef.ofType, required: true };
87
+ }
88
+ return { inner: typeRef, required: false };
89
+ }
90
+ function resolveBaseType(typeRef) {
91
+ if ((typeRef.kind === 'NON_NULL' || typeRef.kind === 'LIST') && typeRef.ofType) {
92
+ return resolveBaseType(typeRef.ofType);
93
+ }
94
+ return typeRef;
95
+ }
96
+ /**
97
+ * Strip internal type prefixes for cleaner docs display.
98
+ * e.g. 'ConstructiveInternalTypeEmail' -> 'Email'
99
+ */
100
+ function cleanTypeName(name) {
101
+ if (name.startsWith('ConstructiveInternalType')) {
102
+ return name.slice('ConstructiveInternalType'.length);
103
+ }
104
+ return name;
105
+ }
106
+ function getScalarTypeName(typeRef) {
107
+ const base = resolveBaseType(typeRef);
108
+ return cleanTypeName(base.name ?? 'String');
109
+ }
110
+ /**
111
+ * Flatten operation args for docs/skills, expanding INPUT_OBJECT types
112
+ * to dot-notation fields (e.g. input.email, input.password).
113
+ * Mirrors the logic in arg-mapper.ts buildQuestionsArray.
114
+ */
115
+ /**
116
+ * Resolve inputFields for an INPUT_OBJECT type.
117
+ * Checks the CleanTypeRef first, then falls back to the TypeRegistry.
118
+ */
119
+ function resolveInputFields(typeRef, registry) {
120
+ if (typeRef.inputFields && typeRef.inputFields.length > 0) {
121
+ return typeRef.inputFields;
122
+ }
123
+ if (registry && typeRef.name) {
124
+ const resolved = registry.get(typeRef.name);
125
+ if (resolved?.kind === 'INPUT_OBJECT' && resolved.inputFields && resolved.inputFields.length > 0) {
126
+ return resolved.inputFields;
127
+ }
128
+ }
129
+ return undefined;
130
+ }
131
+ function flattenArgs(args, registry) {
132
+ const result = [];
133
+ for (const arg of args) {
134
+ const { inner, required } = unwrapNonNull(arg.type);
135
+ const base = resolveBaseType(arg.type);
136
+ // Try to resolve inputFields from the inner type first (unwrapped NON_NULL)
137
+ const innerFields = inner.kind === 'INPUT_OBJECT'
138
+ ? resolveInputFields(inner, registry)
139
+ : undefined;
140
+ if (innerFields) {
141
+ for (const field of innerFields) {
142
+ const { required: fieldRequired } = unwrapNonNull(field.type);
143
+ result.push({
144
+ flag: `${arg.name}.${field.name}`,
145
+ type: getScalarTypeName(field.type),
146
+ required: required && fieldRequired,
147
+ description: field.description,
148
+ });
149
+ }
150
+ }
151
+ else {
152
+ // Try the base type (unwrapped LIST+NON_NULL)
153
+ const baseFields = base.kind === 'INPUT_OBJECT'
154
+ ? resolveInputFields(base, registry)
155
+ : undefined;
156
+ if (baseFields) {
157
+ for (const field of baseFields) {
158
+ const { required: fieldRequired } = unwrapNonNull(field.type);
159
+ result.push({
160
+ flag: `${arg.name}.${field.name}`,
161
+ type: getScalarTypeName(field.type),
162
+ required: required && fieldRequired,
163
+ description: field.description,
164
+ });
165
+ }
166
+ }
167
+ else {
168
+ result.push({
169
+ flag: arg.name,
170
+ type: getScalarTypeName(arg.type),
171
+ required,
172
+ description: arg.description,
173
+ });
174
+ }
175
+ }
176
+ }
177
+ return result;
178
+ }
179
+ /**
180
+ * Build CLI flags string from flattened args.
181
+ * e.g. '--input.email <value> --input.password <value>'
182
+ */
183
+ function flattenedArgsToFlags(flatArgs) {
184
+ return flatArgs.map((a) => `--${a.flag} <value>`).join(' ');
185
+ }
81
186
  function gqlTypeToJsonSchemaType(gqlType) {
82
187
  switch (gqlType) {
83
188
  case 'Int':
@@ -13,6 +13,7 @@ const model_generator_1 = require("./model-generator");
13
13
  function generateOrm(options) {
14
14
  const { tables, customOperations, sharedTypesPath } = options;
15
15
  const commentsEnabled = options.config.codegen?.comments !== false;
16
+ const conditionEnabled = options.config.codegen?.condition !== false;
16
17
  const files = [];
17
18
  // Use shared types when a sharedTypesPath is provided (unified output mode)
18
19
  const useSharedTypes = !!sharedTypesPath;
@@ -33,7 +34,7 @@ function generateOrm(options) {
33
34
  content: selectTypesFile.content,
34
35
  });
35
36
  // 2. Generate model files
36
- const modelFiles = (0, model_generator_1.generateAllModelFiles)(tables, useSharedTypes);
37
+ const modelFiles = (0, model_generator_1.generateAllModelFiles)(tables, useSharedTypes, { condition: conditionEnabled });
37
38
  for (const modelFile of modelFiles) {
38
39
  files.push({
39
40
  path: `models/${modelFile.fileName}`,
@@ -70,7 +71,7 @@ function generateOrm(options) {
70
71
  }
71
72
  }
72
73
  }
73
- const inputTypesFile = (0, input_types_generator_1.generateInputTypesFile)(typeRegistry ?? new Map(), usedInputTypes, tables, usedPayloadTypes, commentsEnabled);
74
+ const inputTypesFile = (0, input_types_generator_1.generateInputTypesFile)(typeRegistry ?? new Map(), usedInputTypes, tables, usedPayloadTypes, commentsEnabled, { condition: conditionEnabled });
74
75
  files.push({
75
76
  path: inputTypesFile.fileName,
76
77
  content: inputTypesFile.content,
@@ -18,4 +18,6 @@ export declare function collectPayloadTypeNames(operations: Array<{
18
18
  /**
19
19
  * Generate comprehensive input-types.ts file using Babel AST
20
20
  */
21
- export declare function generateInputTypesFile(typeRegistry: TypeRegistry, usedInputTypes: Set<string>, tables?: CleanTable[], usedPayloadTypes?: Set<string>, comments?: boolean): GeneratedInputTypesFile;
21
+ export declare function generateInputTypesFile(typeRegistry: TypeRegistry, usedInputTypes: Set<string>, tables?: CleanTable[], usedPayloadTypes?: Set<string>, comments?: boolean, options?: {
22
+ condition?: boolean;
23
+ }): GeneratedInputTypesFile;