@soda-gql/cli 0.7.0 → 0.8.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/dist/index.cjs CHANGED
@@ -26,16 +26,196 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
26
26
  }) : target, mod));
27
27
 
28
28
  //#endregion
29
+ let node_fs_promises = require("node:fs/promises");
29
30
  let node_path = require("node:path");
30
- let __soda_gql_codegen = require("@soda-gql/codegen");
31
+ let __soda_gql_builder = require("@soda-gql/builder");
31
32
  let __soda_gql_config = require("@soda-gql/config");
33
+ let __soda_gql_codegen = require("@soda-gql/codegen");
32
34
  let neverthrow = require("neverthrow");
33
35
  let zod = require("zod");
34
- let node_fs_promises = require("node:fs/promises");
35
36
  let fast_glob = require("fast-glob");
36
37
  fast_glob = __toESM(fast_glob);
37
38
  let node_fs = require("node:fs");
38
39
 
40
+ //#region packages/cli/src/commands/artifact/build.ts
41
+ const BUILD_HELP = `Usage: soda-gql artifact build [options]
42
+
43
+ Build and validate soda-gql artifacts.
44
+
45
+ Options:
46
+ --config <path> Path to soda-gql.config.ts
47
+ --output, -o Output file path (default: ./soda-gql-artifact.json)
48
+ --version, -v Custom version string for the artifact (default: package version)
49
+ --dry-run Validate only, don't write output
50
+ --help, -h Show this help message
51
+
52
+ Examples:
53
+ soda-gql artifact build
54
+ soda-gql artifact build --output ./dist/artifact.json
55
+ soda-gql artifact build --version "1.0.0"
56
+ soda-gql artifact build --dry-run
57
+ soda-gql artifact build --config ./soda-gql.config.ts
58
+ `;
59
+ const DEFAULT_OUTPUT_PATH = "./soda-gql-artifact.json";
60
+ /**
61
+ * Parse build command arguments.
62
+ */
63
+ const parseBuildArgs = (argv) => {
64
+ const args = {
65
+ configPath: void 0,
66
+ outputPath: DEFAULT_OUTPUT_PATH,
67
+ version: void 0,
68
+ dryRun: false,
69
+ help: false
70
+ };
71
+ for (let i = 0; i < argv.length; i++) {
72
+ const arg = argv[i];
73
+ if (arg === "--config" || arg === "-c") args.configPath = argv[++i];
74
+ else if (arg === "--output" || arg === "-o") args.outputPath = argv[++i] ?? DEFAULT_OUTPUT_PATH;
75
+ else if (arg === "--version" || arg === "-v") args.version = argv[++i];
76
+ else if (arg === "--dry-run") args.dryRun = true;
77
+ else if (arg === "--help" || arg === "-h") args.help = true;
78
+ }
79
+ return args;
80
+ };
81
+ /**
82
+ * Build command - builds and validates soda-gql artifacts.
83
+ */
84
+ const buildCommand = async (argv) => {
85
+ const args = parseBuildArgs(argv);
86
+ if (args.help) {
87
+ process.stdout.write(BUILD_HELP);
88
+ return 0;
89
+ }
90
+ const configResult = (0, __soda_gql_config.loadConfig)(args.configPath);
91
+ if (configResult.isErr()) {
92
+ const error = configResult.error;
93
+ process.stderr.write(`Error: Failed to load config\n`);
94
+ process.stderr.write(` at ${error.filePath}\n`);
95
+ process.stderr.write(` ${error.message}\n`);
96
+ return 1;
97
+ }
98
+ const config = configResult.value;
99
+ const buildResult = await (0, __soda_gql_builder.createBuilderService)({ config }).buildAsync();
100
+ if (buildResult.isErr()) {
101
+ const formattedError = (0, __soda_gql_builder.formatBuilderErrorForCLI)(buildResult.error);
102
+ process.stderr.write(`${formattedError}\n`);
103
+ return 1;
104
+ }
105
+ const artifact = buildResult.value;
106
+ const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === "fragment").length;
107
+ const operationCount = Object.values(artifact.elements).filter((e) => e.type === "operation").length;
108
+ const meta = args.version ? {
109
+ version: args.version,
110
+ createdAt: (/* @__PURE__ */ new Date()).toISOString()
111
+ } : void 0;
112
+ const artifactWithMeta = {
113
+ ...meta ? { meta } : {},
114
+ ...artifact
115
+ };
116
+ if (args.dryRun) {
117
+ process.stdout.write(`Validation passed: ${fragmentCount} fragments, ${operationCount} operations\n`);
118
+ if (args.version) process.stdout.write(` Version: ${args.version}\n`);
119
+ } else {
120
+ const outputPath = (0, node_path.resolve)(process.cwd(), args.outputPath);
121
+ await (0, node_fs_promises.mkdir)((0, node_path.dirname)(outputPath), { recursive: true });
122
+ await (0, node_fs_promises.writeFile)(outputPath, JSON.stringify(artifactWithMeta, null, 2));
123
+ process.stdout.write(`Build complete: ${fragmentCount} fragments, ${operationCount} operations\n`);
124
+ if (args.version) process.stdout.write(` Version: ${args.version}\n`);
125
+ process.stdout.write(`Artifact written to: ${outputPath}\n`);
126
+ }
127
+ return 0;
128
+ };
129
+
130
+ //#endregion
131
+ //#region packages/cli/src/commands/artifact/validate.ts
132
+ const VALIDATE_HELP = `Usage: soda-gql artifact validate [options] <path>
133
+
134
+ Validate a pre-built soda-gql artifact file.
135
+
136
+ Arguments:
137
+ <path> Path to artifact JSON file
138
+
139
+ Options:
140
+ --help, -h Show this help message
141
+
142
+ Examples:
143
+ soda-gql artifact validate ./soda-gql-artifact.json
144
+ soda-gql artifact validate ./dist/artifact.json
145
+ `;
146
+ /**
147
+ * Parse validate command arguments.
148
+ */
149
+ const parseValidateArgs = (argv) => {
150
+ const args = {
151
+ artifactPath: void 0,
152
+ help: false
153
+ };
154
+ for (const arg of argv) if (arg === "--help" || arg === "-h") args.help = true;
155
+ else if (!arg.startsWith("-")) args.artifactPath = arg;
156
+ return args;
157
+ };
158
+ /**
159
+ * Validate command - validates a pre-built artifact file.
160
+ */
161
+ const validateCommand = async (argv) => {
162
+ const args = parseValidateArgs(argv);
163
+ if (args.help) {
164
+ process.stdout.write(VALIDATE_HELP);
165
+ return 0;
166
+ }
167
+ if (!args.artifactPath) {
168
+ process.stderr.write("Error: Missing artifact path argument\n\n");
169
+ process.stdout.write(VALIDATE_HELP);
170
+ return 1;
171
+ }
172
+ const result = await (0, __soda_gql_builder.loadArtifact)((0, node_path.resolve)(process.cwd(), args.artifactPath));
173
+ if (result.isErr()) {
174
+ const error = result.error;
175
+ process.stderr.write(`Validation failed: ${error.message}\n`);
176
+ if (error.filePath) process.stderr.write(` File: ${error.filePath}\n`);
177
+ return 1;
178
+ }
179
+ const artifact = result.value;
180
+ const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === "fragment").length;
181
+ const operationCount = Object.values(artifact.elements).filter((e) => e.type === "operation").length;
182
+ process.stdout.write(`Artifact valid: ${fragmentCount} fragments, ${operationCount} operations\n`);
183
+ if (artifact.meta) {
184
+ process.stdout.write(` Version: ${artifact.meta.version}\n`);
185
+ process.stdout.write(` Created: ${artifact.meta.createdAt}\n`);
186
+ } else process.stdout.write(` (No metadata - legacy artifact format)\n`);
187
+ return 0;
188
+ };
189
+
190
+ //#endregion
191
+ //#region packages/cli/src/commands/artifact/index.ts
192
+ const ARTIFACT_HELP = `Usage: soda-gql artifact <subcommand> [options]
193
+
194
+ Manage soda-gql artifacts.
195
+
196
+ Subcommands:
197
+ build Build artifacts (validate definitions)
198
+ validate Validate a pre-built artifact file
199
+
200
+ Run 'soda-gql artifact <subcommand> --help' for more information.
201
+ `;
202
+ /**
203
+ * Dispatcher for artifact subcommands.
204
+ */
205
+ const artifactCommand = async (argv) => {
206
+ const [subcommand, ...rest] = argv;
207
+ if (!subcommand || subcommand === "--help" || subcommand === "-h") {
208
+ process.stdout.write(ARTIFACT_HELP);
209
+ return 0;
210
+ }
211
+ if (subcommand === "build") return buildCommand(rest);
212
+ if (subcommand === "validate") return validateCommand(rest);
213
+ process.stderr.write(`Unknown subcommand: ${subcommand}\n`);
214
+ process.stderr.write(`Run 'soda-gql artifact --help' for available subcommands.\n`);
215
+ return 1;
216
+ };
217
+
218
+ //#endregion
39
219
  //#region packages/cli/src/schemas/args.ts
40
220
  const CodegenArgsSchema = zod.z.object({
41
221
  config: zod.z.string().optional(),
@@ -547,11 +727,13 @@ const dispatch = async (argv) => {
547
727
  process.stdout.write(` init Initialize a new soda-gql project\n`);
548
728
  process.stdout.write(` codegen Generate graphql-system runtime module\n`);
549
729
  process.stdout.write(` format Format soda-gql field selections\n`);
730
+ process.stdout.write(` artifact Manage soda-gql artifacts\n`);
550
731
  return 0;
551
732
  }
552
733
  if (command === "init") return initCommand(rest);
553
734
  if (command === "codegen") return codegenCommand(rest);
554
735
  if (command === "format") return formatCommand(rest);
736
+ if (command === "artifact") return artifactCommand(rest);
555
737
  process.stderr.write(`Unknown command: ${command}\n`);
556
738
  return 1;
557
739
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["z","parsed: Record<string, unknown>","positional: string[]","schemas: Record<string, CodegenSchemaConfig>","formatSuccess","errorHints: Record<string, string>","result","resolvedSchemas: Record<string, CodegenSchemaConfig>","unexpectedError: CodegenError","parts: string[]","files: string[]","error: FormatError","targetPatterns: readonly string[]","excludePatterns: readonly string[]","result: FormatResult","result","unformatted: string[]","createdPaths: string[]","error: InitError","files: FileToGenerate[]"],"sources":["../src/schemas/args.ts","../src/utils/parse-args.ts","../src/commands/codegen.ts","../src/commands/format.ts","../src/templates/config.template.ts","../src/templates/gitignore.template.ts","../src/templates/inject.template.ts","../src/templates/schema.template.ts","../src/commands/init.ts","../src/utils/format.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const CodegenArgsSchema = z.object({\n config: z.string().optional(),\n \"emit-inject-template\": z.string().optional(),\n});\n\nexport const BuilderArgsSchema = z.object({\n mode: z.enum([\"runtime\", \"zero-runtime\"]),\n entry: z.string(),\n out: z.string(),\n format: z.enum([\"human\", \"json\"]).optional().default(\"human\"),\n});\n\nexport const FormatArgsSchema = z.object({\n _: z.array(z.string()).optional(),\n config: z.string().optional(),\n check: z.boolean().optional(),\n});\n\nexport const InitArgsSchema = z.object({\n force: z.boolean().optional(),\n});\n\nexport type CodegenArgs = z.infer<typeof CodegenArgsSchema>;\nexport type BuilderArgs = z.infer<typeof BuilderArgsSchema>;\nexport type FormatArgs = z.infer<typeof FormatArgsSchema>;\nexport type InitArgs = z.infer<typeof InitArgsSchema>;\n","import { err, ok, type Result } from \"neverthrow\";\nimport type { z } from \"zod\";\n\nexport const parseArgs = <T extends z.ZodType>(args: string[], schema: T): Result<z.infer<T>, string> => {\n const parsed: Record<string, unknown> = {};\n const positional: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) continue;\n\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const nextArg = args[i + 1];\n\n if (!nextArg || nextArg.startsWith(\"--\")) {\n parsed[key] = true;\n } else {\n parsed[key] = nextArg;\n i++;\n }\n } else {\n positional.push(arg);\n }\n }\n\n if (positional.length > 0) {\n parsed._ = positional;\n }\n\n const result = schema.safeParse(parsed);\n if (!result.success) {\n return err(result.error.issues.map((e) => e.message).join(\", \"));\n }\n\n return ok(result.data);\n};\n","import { resolve } from \"node:path\";\nimport type { CodegenError, CodegenSchemaConfig, CodegenSuccess } from \"@soda-gql/codegen\";\nimport { runCodegen, writeInjectTemplate } from \"@soda-gql/codegen\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { CodegenArgsSchema } from \"../schemas/args\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype ParsedCommand =\n | {\n kind: \"emitInjectTemplate\";\n outPath: string;\n }\n | {\n kind: \"generate\";\n schemas: Record<string, CodegenSchemaConfig>;\n outPath: string;\n importExtension: boolean;\n };\n\nconst parseCodegenArgs = (argv: readonly string[]): Result<ParsedCommand, CodegenError> => {\n const parsed = parseArgs([...argv], CodegenArgsSchema);\n\n if (!parsed.isOk()) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: parsed.error,\n outPath: \"\",\n });\n }\n\n const args = parsed.value;\n\n // Handle emit inject template\n if (args[\"emit-inject-template\"]) {\n return ok<ParsedCommand, CodegenError>({\n kind: \"emitInjectTemplate\",\n outPath: args[\"emit-inject-template\"],\n });\n }\n\n // Load config from @soda-gql/config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: `Failed to load config: ${configResult.error.message}`,\n outPath: \"\",\n });\n }\n\n const config = configResult.value;\n\n // Check if schemas config exists\n if (!config.schemas || Object.keys(config.schemas).length === 0) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: \"schemas configuration is required in soda-gql.config.ts\",\n outPath: \"\",\n });\n }\n\n // Build schemas config with resolved paths\n const schemas: Record<string, CodegenSchemaConfig> = {};\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n schemas[name] = {\n schema: schemaConfig.schema,\n inject: schemaConfig.inject,\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n };\n }\n\n // Derive output path from outdir (default to index.ts)\n const outPath = resolve(config.outdir, \"index.ts\");\n\n return ok<ParsedCommand, CodegenError>({\n kind: \"generate\",\n schemas,\n outPath,\n importExtension: config.styles.importExtension,\n });\n};\n\nconst formatSuccess = (success: CodegenSuccess): string => {\n const schemaNames = Object.keys(success.schemas).join(\", \");\n const totalObjects = Object.values(success.schemas).reduce((sum, s) => sum + s.objects, 0);\n return `Generated ${totalObjects} objects from schemas: ${schemaNames}\\n TypeScript: ${success.outPath}\\n CommonJS: ${success.cjsPath}`;\n};\n\nconst formatTemplateSuccess = (outPath: string): string => {\n return `Created inject template → ${outPath}`;\n};\n\nconst errorHints: Record<string, string> = {\n SCHEMA_NOT_FOUND: \"Verify the schema path in soda-gql.config.ts\",\n SCHEMA_INVALID: \"Check your GraphQL schema for syntax errors\",\n INJECT_MODULE_NOT_FOUND: \"Run: soda-gql codegen --emit-inject-template <path>\",\n INJECT_MODULE_REQUIRED: \"Add inject configuration to your schema in soda-gql.config.ts\",\n INJECT_TEMPLATE_EXISTS: \"Delete the existing file to regenerate, or use a different path\",\n EMIT_FAILED: \"Check write permissions and that the output directory exists\",\n};\n\nconst formatCodegenError = (error: CodegenError): string => {\n const message = \"message\" in error ? error.message : \"Unknown error\";\n const hint = errorHints[error.code];\n const hintLine = hint ? `\\n Hint: ${hint}` : \"\";\n return `${error.code}: ${message}${hintLine}`;\n};\n\nconst CODEGEN_HELP = `Usage: soda-gql codegen [options]\n\nGenerate graphql-system runtime module from GraphQL schema.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --emit-inject-template <path> Create inject template file\n --help, -h Show this help message\n\nExamples:\n soda-gql codegen --config ./soda-gql.config.ts\n soda-gql codegen --emit-inject-template ./src/graphql/scalars.ts\n`;\n\nexport const codegenCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(CODEGEN_HELP);\n return 0;\n }\n\n try {\n const parsed = parseCodegenArgs(argv);\n\n if (parsed.isErr()) {\n process.stderr.write(`${formatCodegenError(parsed.error)}\\n`);\n return 1;\n }\n\n const command = parsed.value;\n\n if (command.kind === \"emitInjectTemplate\") {\n const outPath = resolve(command.outPath);\n const result = writeInjectTemplate(outPath);\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(result.error)}\\n`);\n return 1;\n }\n process.stdout.write(`${formatTemplateSuccess(outPath)}\\n`);\n return 0;\n }\n\n // Resolve all paths in schemas config\n const resolvedSchemas: Record<string, CodegenSchemaConfig> = {};\n for (const [name, schemaConfig] of Object.entries(command.schemas)) {\n resolvedSchemas[name] = {\n schema: resolve(schemaConfig.schema),\n inject: {\n scalars: resolve(schemaConfig.inject.scalars),\n ...(schemaConfig.inject.adapter ? { adapter: resolve(schemaConfig.inject.adapter) } : {}),\n },\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n };\n }\n\n const result = await runCodegen({\n schemas: resolvedSchemas,\n outPath: resolve(command.outPath),\n format: \"human\",\n importExtension: command.importExtension,\n });\n\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(result.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatSuccess(result.value)}\\n`);\n return 0;\n } catch (error) {\n // Catch unexpected errors and convert to structured format\n const unexpectedError: CodegenError = {\n code: \"EMIT_FAILED\",\n message: error instanceof Error ? error.message : String(error),\n outPath: \"\",\n };\n process.stderr.write(`${formatCodegenError(unexpectedError)}\\n`);\n return 1;\n }\n};\n","import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport fg from \"fast-glob\";\nimport { FormatArgsSchema } from \"../schemas/args\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype FormatterModule = typeof import(\"@soda-gql/formatter\");\n\nconst loadFormatter = async (): Promise<FormatterModule | null> => {\n try {\n return await import(\"@soda-gql/formatter\");\n } catch {\n return null;\n }\n};\n\ntype FormatError = {\n code: \"PARSE_ERROR\" | \"NO_PATTERNS\" | \"FORMAT_ERROR\" | \"FORMATTER_NOT_INSTALLED\";\n message: string;\n};\n\ntype FormatResult = {\n mode: \"format\" | \"check\";\n total: number;\n modified: number;\n unchanged: number;\n errors: number;\n unformatted: string[];\n};\n\nconst formatFormatError = (error: FormatError): string => {\n return `${error.code}: ${error.message}`;\n};\n\nconst formatResult = (result: FormatResult): string => {\n if (result.mode === \"check\") {\n if (result.unformatted.length > 0) {\n const files = result.unformatted.map((f) => ` ${f}`).join(\"\\n\");\n return `${result.unformatted.length} file(s) need formatting:\\n${files}`;\n }\n return `All ${result.total} file(s) are properly formatted`;\n }\n\n const parts: string[] = [];\n if (result.modified > 0) {\n parts.push(`${result.modified} formatted`);\n }\n if (result.unchanged > 0) {\n parts.push(`${result.unchanged} unchanged`);\n }\n if (result.errors > 0) {\n parts.push(`${result.errors} errors`);\n }\n return `${result.total} file(s) checked: ${parts.join(\", \")}`;\n};\n\nconst isGlobPattern = (pattern: string): boolean => {\n return /[*?[\\]{}]/.test(pattern);\n};\n\nconst expandGlobPatterns = async (patterns: readonly string[], excludePatterns: readonly string[] = []): Promise<string[]> => {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n if (!isGlobPattern(pattern)) {\n // Direct file path - check if it exists\n try {\n await access(pattern);\n files.push(pattern);\n } catch {\n // File doesn't exist, skip it\n }\n continue;\n }\n\n // Glob pattern - use fast-glob with ignore\n const matches = await fg(pattern, {\n absolute: true,\n ignore: [...excludePatterns],\n });\n files.push(...matches);\n }\n\n return [...new Set(files)];\n};\n\nconst FORMAT_HELP = `Usage: soda-gql format [patterns...] [options]\n\nFormat soda-gql field selections by inserting empty comments.\n\nOptions:\n --config <path> Path to soda-gql.config.ts (auto-detected if omitted)\n --check Check if files need formatting (exit 1 if unformatted)\n --help, -h Show this help message\n\nExamples:\n soda-gql format # Use config include/exclude\n soda-gql format \"src/**/*.ts\" # Override with explicit patterns\n soda-gql format --check # Check mode with config\n`;\n\nexport const formatCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(FORMAT_HELP);\n return 0;\n }\n\n const parsed = parseArgs([...argv], FormatArgsSchema);\n\n if (!parsed.isOk()) {\n const error: FormatError = {\n code: \"PARSE_ERROR\",\n message: parsed.error,\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n\n const args = parsed.value;\n const isCheckMode = args.check === true;\n const explicitPatterns = args._ ?? [];\n\n // Determine patterns: use explicit patterns or load from config\n let targetPatterns: readonly string[];\n let excludePatterns: readonly string[] = [];\n\n if (explicitPatterns.length > 0) {\n targetPatterns = explicitPatterns;\n } else {\n // Try to load patterns from config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n const error: FormatError = {\n code: \"NO_PATTERNS\",\n message: \"No patterns provided and config not found. Usage: soda-gql format [patterns...] [--check]\",\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n targetPatterns = configResult.value.include;\n excludePatterns = configResult.value.exclude;\n }\n\n // Load formatter lazily - it's an optional dependency\n const formatter = await loadFormatter();\n if (!formatter) {\n const error: FormatError = {\n code: \"FORMATTER_NOT_INSTALLED\",\n message: \"@soda-gql/formatter is not installed. Run: npm install @soda-gql/formatter\",\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n\n const files = await expandGlobPatterns(targetPatterns, excludePatterns);\n\n if (files.length === 0) {\n const result: FormatResult = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: 0,\n modified: 0,\n unchanged: 0,\n errors: 0,\n unformatted: [],\n };\n process.stdout.write(`${formatResult(result)}\\n`);\n return 0;\n }\n\n let modified = 0;\n let unchanged = 0;\n let errors = 0;\n const unformatted: string[] = [];\n\n for (const filePath of files) {\n const sourceCode = await readFile(filePath, \"utf-8\");\n\n if (isCheckMode) {\n const result = formatter.needsFormat({ sourceCode, filePath });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value) {\n unformatted.push(filePath);\n modified++;\n } else {\n unchanged++;\n }\n } else {\n const result = formatter.format({ sourceCode, filePath });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value.modified) {\n await writeFile(filePath, result.value.sourceCode, \"utf-8\");\n modified++;\n } else {\n unchanged++;\n }\n }\n }\n\n const result: FormatResult = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: files.length,\n modified,\n unchanged,\n errors,\n unformatted,\n };\n\n process.stdout.write(`${formatResult(result)}\\n`);\n\n if (isCheckMode && unformatted.length > 0) {\n return 1;\n }\n\n return errors > 0 ? 1 : 0;\n};\n","export const getConfigTemplate = (): string => `\\\nimport { defineConfig } from \"@soda-gql/config\";\n\nexport default defineConfig({\n outdir: \"./graphql-system\",\n include: [\"./src/**/*.ts\"],\n schemas: {\n default: {\n schema: \"./schema.graphql\",\n inject: \"./graphql-system/default.inject.ts\",\n },\n },\n});\n`;\n","export const getGitignoreTemplate = (): string => `\\\n/index.ts\n/index.cjs\n`;\n","export const getInjectTemplate = (): string => `\\\nimport { defineAdapter, defineScalar } from \"@soda-gql/core/adapter\";\n\nexport const scalar = {\n ...defineScalar<\"ID\", string, string>(\"ID\"),\n ...defineScalar<\"String\", string, string>(\"String\"),\n ...defineScalar<\"Int\", number, number>(\"Int\"),\n ...defineScalar<\"Float\", number, number>(\"Float\"),\n ...defineScalar<\"Boolean\", boolean, boolean>(\"Boolean\"),\n} as const;\n\nexport const adapter = defineAdapter({\n helpers: {},\n metadata: {\n aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n },\n});\n`;\n","export const getSchemaTemplate = (): string => `\\\ntype Query {\n hello: String!\n}\n`;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { err, ok, type Result } from \"neverthrow\";\n\nimport { InitArgsSchema } from \"../schemas/args\";\nimport { getConfigTemplate } from \"../templates/config.template\";\nimport { getGitignoreTemplate } from \"../templates/gitignore.template\";\nimport { getInjectTemplate } from \"../templates/inject.template\";\nimport { getSchemaTemplate } from \"../templates/schema.template\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype InitErrorCode = \"FILE_EXISTS\" | \"WRITE_FAILED\" | \"PARSE_ERROR\";\n\ntype InitError = {\n readonly code: InitErrorCode;\n readonly message: string;\n readonly filePath?: string;\n};\n\ntype FileToGenerate = {\n readonly path: string;\n readonly content: string;\n readonly description: string;\n};\n\ntype InitSuccess = {\n readonly filesCreated: readonly string[];\n};\n\nconst INIT_HELP = `Usage: soda-gql init [options]\n\nInitialize a new soda-gql project with starter configuration.\n\nOptions:\n --force Overwrite existing files\n --help, -h Show this help message\n\nGenerated files:\n soda-gql.config.ts Configuration file\n schema.graphql Sample GraphQL schema\n graphql-system/default.inject.ts Scalars, helpers, and metadata adapter\n graphql-system/.gitignore Ignore generated files\n`;\n\nconst checkFilesExist = (files: readonly FileToGenerate[], force: boolean): Result<void, InitError> => {\n if (force) {\n return ok(undefined);\n }\n\n for (const file of files) {\n if (existsSync(file.path)) {\n return err({\n code: \"FILE_EXISTS\",\n message: `File already exists: ${file.path}. Use --force to overwrite.`,\n filePath: file.path,\n });\n }\n }\n\n return ok(undefined);\n};\n\nconst writeFiles = (files: readonly FileToGenerate[]): Result<InitSuccess, InitError> => {\n const createdPaths: string[] = [];\n\n for (const file of files) {\n try {\n const dir = dirname(file.path);\n mkdirSync(dir, { recursive: true });\n writeFileSync(file.path, file.content);\n createdPaths.push(file.path);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"WRITE_FAILED\",\n message: `Failed to write ${file.description}: ${message}`,\n filePath: file.path,\n });\n }\n }\n\n return ok({ filesCreated: createdPaths });\n};\n\nconst formatSuccess = (result: InitSuccess): string => {\n const lines = [\"soda-gql project initialized successfully!\", \"\", \"Created files:\"];\n for (const file of result.filesCreated) {\n lines.push(` ${file}`);\n }\n lines.push(\"\", \"Next steps:\");\n lines.push(\" 1. Edit schema.graphql with your GraphQL types\");\n lines.push(\" 2. Run: soda-gql codegen\");\n lines.push(\" 3. Import gql from ./graphql-system\");\n return lines.join(\"\\n\");\n};\n\nconst formatInitError = (error: InitError): string => {\n return `${error.code}: ${error.message}`;\n};\n\nexport const initCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(INIT_HELP);\n return 0;\n }\n\n const parsed = parseArgs([...argv], InitArgsSchema);\n\n if (!parsed.isOk()) {\n const error: InitError = {\n code: \"PARSE_ERROR\",\n message: parsed.error,\n };\n process.stderr.write(`${formatInitError(error)}\\n`);\n return 1;\n }\n\n const args = parsed.value;\n const force = args.force === true;\n const cwd = process.cwd();\n\n const files: FileToGenerate[] = [\n {\n path: resolve(cwd, \"soda-gql.config.ts\"),\n content: getConfigTemplate(),\n description: \"configuration file\",\n },\n {\n path: resolve(cwd, \"schema.graphql\"),\n content: getSchemaTemplate(),\n description: \"GraphQL schema\",\n },\n {\n path: resolve(cwd, \"graphql-system/default.inject.ts\"),\n content: getInjectTemplate(),\n description: \"inject module\",\n },\n {\n path: resolve(cwd, \"graphql-system/.gitignore\"),\n content: getGitignoreTemplate(),\n description: \"gitignore file\",\n },\n ];\n\n const existsCheck = checkFilesExist(files, force);\n if (existsCheck.isErr()) {\n process.stderr.write(`${formatInitError(existsCheck.error)}\\n`);\n return 1;\n }\n\n const writeResult = writeFiles(files);\n if (writeResult.isErr()) {\n process.stderr.write(`${formatInitError(writeResult.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatSuccess(writeResult.value)}\\n`);\n return 0;\n};\n","export const formatters = {\n json: (data: unknown) => JSON.stringify(data, null, 2),\n human: (data: unknown) => {\n if (typeof data === \"string\") return data;\n if (data instanceof Error) return data.message;\n return JSON.stringify(data, null, 2);\n },\n} as const;\n\nexport type OutputFormat = keyof typeof formatters;\n\nexport const formatOutput = (data: unknown, format: OutputFormat = \"human\"): string => {\n return formatters[format](data);\n};\n\nexport const formatError = (error: unknown, format: OutputFormat = \"human\"): string => {\n if (format === \"json\") {\n return JSON.stringify(\n {\n error: error,\n },\n null,\n 2,\n );\n }\n return error instanceof Error ? error.message : String(error);\n};\n","import { codegenCommand } from \"./commands/codegen\";\nimport { formatCommand } from \"./commands/format\";\nimport { initCommand } from \"./commands/init\";\nimport { formatError } from \"./utils/format\";\n\nconst dispatch = async (argv: readonly string[]): Promise<number> => {\n const [command, ...rest] = argv;\n\n if (!command || command === \"--help\" || command === \"-h\") {\n process.stdout.write(`Usage: soda-gql <command> [options]\\n`);\n process.stdout.write(`\\nCommands:\\n`);\n process.stdout.write(` init Initialize a new soda-gql project\\n`);\n process.stdout.write(` codegen Generate graphql-system runtime module\\n`);\n process.stdout.write(` format Format soda-gql field selections\\n`);\n return 0;\n }\n\n if (command === \"init\") {\n return initCommand(rest);\n }\n\n if (command === \"codegen\") {\n return codegenCommand(rest);\n }\n\n if (command === \"format\") {\n return formatCommand(rest);\n }\n\n process.stderr.write(`Unknown command: ${command}\\n`);\n return 1;\n};\n\n// Run CLI when executed directly\ndispatch(process.argv.slice(2))\n .then((exitCode) => {\n process.exitCode = exitCode;\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n const unexpectedError = {\n code: \"UNEXPECTED_ERROR\",\n message,\n };\n process.stderr.write(`${formatError(unexpectedError, \"json\")}\\n`);\n process.exitCode = 1;\n });\n\nexport { dispatch };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAa,oBAAoBA,MAAE,OAAO;CACxC,QAAQA,MAAE,QAAQ,CAAC,UAAU;CAC7B,wBAAwBA,MAAE,QAAQ,CAAC,UAAU;CAC9C,CAAC;AAEF,MAAa,oBAAoBA,MAAE,OAAO;CACxC,MAAMA,MAAE,KAAK,CAAC,WAAW,eAAe,CAAC;CACzC,OAAOA,MAAE,QAAQ;CACjB,KAAKA,MAAE,QAAQ;CACf,QAAQA,MAAE,KAAK,CAAC,SAAS,OAAO,CAAC,CAAC,UAAU,CAAC,QAAQ,QAAQ;CAC9D,CAAC;AAEF,MAAa,mBAAmBA,MAAE,OAAO;CACvC,GAAGA,MAAE,MAAMA,MAAE,QAAQ,CAAC,CAAC,UAAU;CACjC,QAAQA,MAAE,QAAQ,CAAC,UAAU;CAC7B,OAAOA,MAAE,SAAS,CAAC,UAAU;CAC9B,CAAC;AAEF,MAAa,iBAAiBA,MAAE,OAAO,EACrC,OAAOA,MAAE,SAAS,CAAC,UAAU,EAC9B,CAAC;;;;ACnBF,MAAa,aAAkC,MAAgB,WAA0C;CACvG,MAAMC,SAAkC,EAAE;CAC1C,MAAMC,aAAuB,EAAE;AAE/B,MAAK,IAAI,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;EACpC,MAAM,MAAM,KAAK;AACjB,MAAI,CAAC,IAAK;AAEV,MAAI,IAAI,WAAW,KAAK,EAAE;GACxB,MAAM,MAAM,IAAI,MAAM,EAAE;GACxB,MAAM,UAAU,KAAK,IAAI;AAEzB,OAAI,CAAC,WAAW,QAAQ,WAAW,KAAK,CACtC,QAAO,OAAO;QACT;AACL,WAAO,OAAO;AACd;;QAGF,YAAW,KAAK,IAAI;;AAIxB,KAAI,WAAW,SAAS,EACtB,QAAO,IAAI;CAGb,MAAM,SAAS,OAAO,UAAU,OAAO;AACvC,KAAI,CAAC,OAAO,QACV,4BAAW,OAAO,MAAM,OAAO,KAAK,MAAM,EAAE,QAAQ,CAAC,KAAK,KAAK,CAAC;AAGlE,2BAAU,OAAO,KAAK;;;;;ACfxB,MAAM,oBAAoB,SAAiE;CACzF,MAAM,SAAS,UAAU,CAAC,GAAG,KAAK,EAAE,kBAAkB;AAEtD,KAAI,CAAC,OAAO,MAAM,CAChB,4BAAwC;EACtC,MAAM;EACN,SAAS,OAAO;EAChB,SAAS;EACV,CAAC;CAGJ,MAAM,OAAO,OAAO;AAGpB,KAAI,KAAK,wBACP,2BAAuC;EACrC,MAAM;EACN,SAAS,KAAK;EACf,CAAC;CAIJ,MAAM,iDAA0B,KAAK,OAAO;AAC5C,KAAI,aAAa,OAAO,CACtB,4BAAwC;EACtC,MAAM;EACN,SAAS,0BAA0B,aAAa,MAAM;EACtD,SAAS;EACV,CAAC;CAGJ,MAAM,SAAS,aAAa;AAG5B,KAAI,CAAC,OAAO,WAAW,OAAO,KAAK,OAAO,QAAQ,CAAC,WAAW,EAC5D,4BAAwC;EACtC,MAAM;EACN,SAAS;EACT,SAAS;EACV,CAAC;CAIJ,MAAMC,UAA+C,EAAE;AAEvD,MAAK,MAAM,CAAC,MAAM,iBAAiB,OAAO,QAAQ,OAAO,QAAQ,CAC/D,SAAQ,QAAQ;EACd,QAAQ,aAAa;EACrB,QAAQ,aAAa;EACrB,mBAAmB,aAAa;EAChC,qBAAqB,aAAa;EACnC;AAMH,2BAAuC;EACrC,MAAM;EACN;EACA,gCALsB,OAAO,QAAQ,WAAW;EAMhD,iBAAiB,OAAO,OAAO;EAChC,CAAC;;AAGJ,MAAMC,mBAAiB,YAAoC;CACzD,MAAM,cAAc,OAAO,KAAK,QAAQ,QAAQ,CAAC,KAAK,KAAK;AAE3D,QAAO,aADc,OAAO,OAAO,QAAQ,QAAQ,CAAC,QAAQ,KAAK,MAAM,MAAM,EAAE,SAAS,EAAE,CACzD,yBAAyB,YAAY,kBAAkB,QAAQ,QAAQ,gBAAgB,QAAQ;;AAGlI,MAAM,yBAAyB,YAA4B;AACzD,QAAO,6BAA6B;;AAGtC,MAAMC,aAAqC;CACzC,kBAAkB;CAClB,gBAAgB;CAChB,yBAAyB;CACzB,wBAAwB;CACxB,wBAAwB;CACxB,aAAa;CACd;AAED,MAAM,sBAAsB,UAAgC;CAC1D,MAAM,UAAU,aAAa,QAAQ,MAAM,UAAU;CACrD,MAAM,OAAO,WAAW,MAAM;CAC9B,MAAM,WAAW,OAAO,aAAa,SAAS;AAC9C,QAAO,GAAG,MAAM,KAAK,IAAI,UAAU;;AAGrC,MAAM,eAAe;;;;;;;;;;;;;AAcrB,MAAa,iBAAiB,OAAO,SAA6C;AAChF,KAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,KAAK,EAAE;AAClD,UAAQ,OAAO,MAAM,aAAa;AAClC,SAAO;;AAGT,KAAI;EACF,MAAM,SAAS,iBAAiB,KAAK;AAErC,MAAI,OAAO,OAAO,EAAE;AAClB,WAAQ,OAAO,MAAM,GAAG,mBAAmB,OAAO,MAAM,CAAC,IAAI;AAC7D,UAAO;;EAGT,MAAM,UAAU,OAAO;AAEvB,MAAI,QAAQ,SAAS,sBAAsB;GACzC,MAAM,iCAAkB,QAAQ,QAAQ;GACxC,MAAMC,uDAA6B,QAAQ;AAC3C,OAAIA,SAAO,OAAO,EAAE;AAClB,YAAQ,OAAO,MAAM,GAAG,mBAAmBA,SAAO,MAAM,CAAC,IAAI;AAC7D,WAAO;;AAET,WAAQ,OAAO,MAAM,GAAG,sBAAsB,QAAQ,CAAC,IAAI;AAC3D,UAAO;;EAIT,MAAMC,kBAAuD,EAAE;AAC/D,OAAK,MAAM,CAAC,MAAM,iBAAiB,OAAO,QAAQ,QAAQ,QAAQ,CAChE,iBAAgB,QAAQ;GACtB,+BAAgB,aAAa,OAAO;GACpC,QAAQ;IACN,gCAAiB,aAAa,OAAO,QAAQ;IAC7C,GAAI,aAAa,OAAO,UAAU,EAAE,gCAAiB,aAAa,OAAO,QAAQ,EAAE,GAAG,EAAE;IACzF;GACD,mBAAmB,aAAa;GAChC,qBAAqB,aAAa;GACnC;EAGH,MAAM,SAAS,yCAAiB;GAC9B,SAAS;GACT,gCAAiB,QAAQ,QAAQ;GACjC,QAAQ;GACR,iBAAiB,QAAQ;GAC1B,CAAC;AAEF,MAAI,OAAO,OAAO,EAAE;AAClB,WAAQ,OAAO,MAAM,GAAG,mBAAmB,OAAO,MAAM,CAAC,IAAI;AAC7D,UAAO;;AAGT,UAAQ,OAAO,MAAM,GAAGH,gBAAc,OAAO,MAAM,CAAC,IAAI;AACxD,SAAO;UACA,OAAO;EAEd,MAAMI,kBAAgC;GACpC,MAAM;GACN,SAAS,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;GAC/D,SAAS;GACV;AACD,UAAQ,OAAO,MAAM,GAAG,mBAAmB,gBAAgB,CAAC,IAAI;AAChE,SAAO;;;;;;ACpLX,MAAM,gBAAgB,YAA6C;AACjE,KAAI;AACF,SAAO,MAAM,OAAO;SACd;AACN,SAAO;;;AAkBX,MAAM,qBAAqB,UAA+B;AACxD,QAAO,GAAG,MAAM,KAAK,IAAI,MAAM;;AAGjC,MAAM,gBAAgB,WAAiC;AACrD,KAAI,OAAO,SAAS,SAAS;AAC3B,MAAI,OAAO,YAAY,SAAS,GAAG;GACjC,MAAM,QAAQ,OAAO,YAAY,KAAK,MAAM,KAAK,IAAI,CAAC,KAAK,KAAK;AAChE,UAAO,GAAG,OAAO,YAAY,OAAO,6BAA6B;;AAEnE,SAAO,OAAO,OAAO,MAAM;;CAG7B,MAAMC,QAAkB,EAAE;AAC1B,KAAI,OAAO,WAAW,EACpB,OAAM,KAAK,GAAG,OAAO,SAAS,YAAY;AAE5C,KAAI,OAAO,YAAY,EACrB,OAAM,KAAK,GAAG,OAAO,UAAU,YAAY;AAE7C,KAAI,OAAO,SAAS,EAClB,OAAM,KAAK,GAAG,OAAO,OAAO,SAAS;AAEvC,QAAO,GAAG,OAAO,MAAM,oBAAoB,MAAM,KAAK,KAAK;;AAG7D,MAAM,iBAAiB,YAA6B;AAClD,QAAO,YAAY,KAAK,QAAQ;;AAGlC,MAAM,qBAAqB,OAAO,UAA6B,kBAAqC,EAAE,KAAwB;CAC5H,MAAMC,QAAkB,EAAE;AAE1B,MAAK,MAAM,WAAW,UAAU;AAC9B,MAAI,CAAC,cAAc,QAAQ,EAAE;AAE3B,OAAI;AACF,uCAAa,QAAQ;AACrB,UAAM,KAAK,QAAQ;WACb;AAGR;;EAIF,MAAM,UAAU,6BAAS,SAAS;GAChC,UAAU;GACV,QAAQ,CAAC,GAAG,gBAAgB;GAC7B,CAAC;AACF,QAAM,KAAK,GAAG,QAAQ;;AAGxB,QAAO,CAAC,GAAG,IAAI,IAAI,MAAM,CAAC;;AAG5B,MAAM,cAAc;;;;;;;;;;;;;;AAepB,MAAa,gBAAgB,OAAO,SAA6C;AAC/E,KAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,KAAK,EAAE;AAClD,UAAQ,OAAO,MAAM,YAAY;AACjC,SAAO;;CAGT,MAAM,SAAS,UAAU,CAAC,GAAG,KAAK,EAAE,iBAAiB;AAErD,KAAI,CAAC,OAAO,MAAM,EAAE;EAClB,MAAMC,QAAqB;GACzB,MAAM;GACN,SAAS,OAAO;GACjB;AACD,UAAQ,OAAO,MAAM,GAAG,kBAAkB,MAAM,CAAC,IAAI;AACrD,SAAO;;CAGT,MAAM,OAAO,OAAO;CACpB,MAAM,cAAc,KAAK,UAAU;CACnC,MAAM,mBAAmB,KAAK,KAAK,EAAE;CAGrC,IAAIC;CACJ,IAAIC,kBAAqC,EAAE;AAE3C,KAAI,iBAAiB,SAAS,EAC5B,kBAAiB;MACZ;EAEL,MAAM,iDAA0B,KAAK,OAAO;AAC5C,MAAI,aAAa,OAAO,EAAE;AAKxB,WAAQ,OAAO,MAAM,GAAG,kBAJG;IACzB,MAAM;IACN,SAAS;IACV,CAC+C,CAAC,IAAI;AACrD,UAAO;;AAET,mBAAiB,aAAa,MAAM;AACpC,oBAAkB,aAAa,MAAM;;CAIvC,MAAM,YAAY,MAAM,eAAe;AACvC,KAAI,CAAC,WAAW;AAKd,UAAQ,OAAO,MAAM,GAAG,kBAJG;GACzB,MAAM;GACN,SAAS;GACV,CAC+C,CAAC,IAAI;AACrD,SAAO;;CAGT,MAAM,QAAQ,MAAM,mBAAmB,gBAAgB,gBAAgB;AAEvE,KAAI,MAAM,WAAW,GAAG;EACtB,MAAMC,WAAuB;GAC3B,MAAM,cAAc,UAAU;GAC9B,OAAO;GACP,UAAU;GACV,WAAW;GACX,QAAQ;GACR,aAAa,EAAE;GAChB;AACD,UAAQ,OAAO,MAAM,GAAG,aAAaC,SAAO,CAAC,IAAI;AACjD,SAAO;;CAGT,IAAI,WAAW;CACf,IAAI,YAAY;CAChB,IAAI,SAAS;CACb,MAAMC,cAAwB,EAAE;AAEhC,MAAK,MAAM,YAAY,OAAO;EAC5B,MAAM,aAAa,qCAAe,UAAU,QAAQ;AAEpD,MAAI,aAAa;GACf,MAAMD,WAAS,UAAU,YAAY;IAAE;IAAY;IAAU,CAAC;AAC9D,OAAIA,SAAO,OAAO,EAAE;AAClB;AACA;;AAEF,OAAIA,SAAO,OAAO;AAChB,gBAAY,KAAK,SAAS;AAC1B;SAEA;SAEG;GACL,MAAMA,WAAS,UAAU,OAAO;IAAE;IAAY;IAAU,CAAC;AACzD,OAAIA,SAAO,OAAO,EAAE;AAClB;AACA;;AAEF,OAAIA,SAAO,MAAM,UAAU;AACzB,0CAAgB,UAAUA,SAAO,MAAM,YAAY,QAAQ;AAC3D;SAEA;;;CAKN,MAAMD,SAAuB;EAC3B,MAAM,cAAc,UAAU;EAC9B,OAAO,MAAM;EACb;EACA;EACA;EACA;EACD;AAED,SAAQ,OAAO,MAAM,GAAG,aAAa,OAAO,CAAC,IAAI;AAEjD,KAAI,eAAe,YAAY,SAAS,EACtC,QAAO;AAGT,QAAO,SAAS,IAAI,IAAI;;;;;AC3N1B,MAAa,0BAAkC;;;;;;;;;;;;;;;;;ACA/C,MAAa,6BAAqC;;;;;;;ACAlD,MAAa,0BAAkC;;;;;;;;;;;;;;;;;;;;;ACA/C,MAAa,0BAAkC;;;;;;;;AC6B/C,MAAM,YAAY;;;;;;;;;;;;;;AAelB,MAAM,mBAAmB,OAAkC,UAA4C;AACrG,KAAI,MACF,2BAAU,OAAU;AAGtB,MAAK,MAAM,QAAQ,MACjB,6BAAe,KAAK,KAAK,CACvB,4BAAW;EACT,MAAM;EACN,SAAS,wBAAwB,KAAK,KAAK;EAC3C,UAAU,KAAK;EAChB,CAAC;AAIN,2BAAU,OAAU;;AAGtB,MAAM,cAAc,UAAqE;CACvF,MAAMG,eAAyB,EAAE;AAEjC,MAAK,MAAM,QAAQ,MACjB,KAAI;AAEF,gDADoB,KAAK,KAAK,EACf,EAAE,WAAW,MAAM,CAAC;AACnC,6BAAc,KAAK,MAAM,KAAK,QAAQ;AACtC,eAAa,KAAK,KAAK,KAAK;UACrB,OAAO;EACd,MAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACtE,6BAAW;GACT,MAAM;GACN,SAAS,mBAAmB,KAAK,YAAY,IAAI;GACjD,UAAU,KAAK;GAChB,CAAC;;AAIN,2BAAU,EAAE,cAAc,cAAc,CAAC;;AAG3C,MAAM,iBAAiB,WAAgC;CACrD,MAAM,QAAQ;EAAC;EAA8C;EAAI;EAAiB;AAClF,MAAK,MAAM,QAAQ,OAAO,aACxB,OAAM,KAAK,KAAK,OAAO;AAEzB,OAAM,KAAK,IAAI,cAAc;AAC7B,OAAM,KAAK,mDAAmD;AAC9D,OAAM,KAAK,6BAA6B;AACxC,OAAM,KAAK,wCAAwC;AACnD,QAAO,MAAM,KAAK,KAAK;;AAGzB,MAAM,mBAAmB,UAA6B;AACpD,QAAO,GAAG,MAAM,KAAK,IAAI,MAAM;;AAGjC,MAAa,cAAc,OAAO,SAA6C;AAC7E,KAAI,KAAK,SAAS,SAAS,IAAI,KAAK,SAAS,KAAK,EAAE;AAClD,UAAQ,OAAO,MAAM,UAAU;AAC/B,SAAO;;CAGT,MAAM,SAAS,UAAU,CAAC,GAAG,KAAK,EAAE,eAAe;AAEnD,KAAI,CAAC,OAAO,MAAM,EAAE;EAClB,MAAMC,QAAmB;GACvB,MAAM;GACN,SAAS,OAAO;GACjB;AACD,UAAQ,OAAO,MAAM,GAAG,gBAAgB,MAAM,CAAC,IAAI;AACnD,SAAO;;CAIT,MAAM,QADO,OAAO,MACD,UAAU;CAC7B,MAAM,MAAM,QAAQ,KAAK;CAEzB,MAAMC,QAA0B;EAC9B;GACE,6BAAc,KAAK,qBAAqB;GACxC,SAAS,mBAAmB;GAC5B,aAAa;GACd;EACD;GACE,6BAAc,KAAK,iBAAiB;GACpC,SAAS,mBAAmB;GAC5B,aAAa;GACd;EACD;GACE,6BAAc,KAAK,mCAAmC;GACtD,SAAS,mBAAmB;GAC5B,aAAa;GACd;EACD;GACE,6BAAc,KAAK,4BAA4B;GAC/C,SAAS,sBAAsB;GAC/B,aAAa;GACd;EACF;CAED,MAAM,cAAc,gBAAgB,OAAO,MAAM;AACjD,KAAI,YAAY,OAAO,EAAE;AACvB,UAAQ,OAAO,MAAM,GAAG,gBAAgB,YAAY,MAAM,CAAC,IAAI;AAC/D,SAAO;;CAGT,MAAM,cAAc,WAAW,MAAM;AACrC,KAAI,YAAY,OAAO,EAAE;AACvB,UAAQ,OAAO,MAAM,GAAG,gBAAgB,YAAY,MAAM,CAAC,IAAI;AAC/D,SAAO;;AAGT,SAAQ,OAAO,MAAM,GAAG,cAAc,YAAY,MAAM,CAAC,IAAI;AAC7D,QAAO;;;;;AC9IT,MAAa,eAAe,OAAgB,SAAuB,YAAoB;AACrF,KAAI,WAAW,OACb,QAAO,KAAK,UACV,EACS,OACR,EACD,MACA,EACD;AAEH,QAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;;;;;ACpB/D,MAAM,WAAW,OAAO,SAA6C;CACnE,MAAM,CAAC,SAAS,GAAG,QAAQ;AAE3B,KAAI,CAAC,WAAW,YAAY,YAAY,YAAY,MAAM;AACxD,UAAQ,OAAO,MAAM,wCAAwC;AAC7D,UAAQ,OAAO,MAAM,gBAAgB;AACrC,UAAQ,OAAO,MAAM,mDAAmD;AACxE,UAAQ,OAAO,MAAM,wDAAwD;AAC7E,UAAQ,OAAO,MAAM,kDAAkD;AACvE,SAAO;;AAGT,KAAI,YAAY,OACd,QAAO,YAAY,KAAK;AAG1B,KAAI,YAAY,UACd,QAAO,eAAe,KAAK;AAG7B,KAAI,YAAY,SACd,QAAO,cAAc,KAAK;AAG5B,SAAQ,OAAO,MAAM,oBAAoB,QAAQ,IAAI;AACrD,QAAO;;AAIT,SAAS,QAAQ,KAAK,MAAM,EAAE,CAAC,CAC5B,MAAM,aAAa;AAClB,SAAQ,WAAW;EACnB,CACD,OAAO,UAAU;CAEhB,MAAM,kBAAkB;EACtB,MAAM;EACN,SAHc,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;EAIrE;AACD,SAAQ,OAAO,MAAM,GAAG,YAAY,iBAAiB,OAAO,CAAC,IAAI;AACjE,SAAQ,WAAW;EACnB"}
1
+ {"version":3,"file":"index.cjs","names":["args: BuildArgs","meta: BuilderArtifactMeta | undefined","artifactWithMeta: BuilderArtifact","args: ValidateArgs","z","parsed: Record<string, unknown>","positional: string[]","schemas: Record<string, CodegenSchemaConfig>","formatSuccess","errorHints: Record<string, string>","result","resolvedSchemas: Record<string, CodegenSchemaConfig>","unexpectedError: CodegenError","parts: string[]","files: string[]","error: FormatError","targetPatterns: readonly string[]","excludePatterns: readonly string[]","result: FormatResult","result","unformatted: string[]","createdPaths: string[]","error: InitError","files: FileToGenerate[]"],"sources":["../src/commands/artifact/build.ts","../src/commands/artifact/validate.ts","../src/commands/artifact/index.ts","../src/schemas/args.ts","../src/utils/parse-args.ts","../src/commands/codegen.ts","../src/commands/format.ts","../src/templates/config.template.ts","../src/templates/gitignore.template.ts","../src/templates/inject.template.ts","../src/templates/schema.template.ts","../src/commands/init.ts","../src/utils/format.ts","../src/index.ts"],"sourcesContent":["import { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname, resolve } from \"node:path\";\nimport type { BuilderArtifact, BuilderArtifactMeta } from \"@soda-gql/builder\";\nimport { createBuilderService, formatBuilderErrorForCLI } from \"@soda-gql/builder\";\nimport { loadConfig } from \"@soda-gql/config\";\n\nconst BUILD_HELP = `Usage: soda-gql artifact build [options]\n\nBuild and validate soda-gql artifacts.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --output, -o Output file path (default: ./soda-gql-artifact.json)\n --version, -v Custom version string for the artifact (default: package version)\n --dry-run Validate only, don't write output\n --help, -h Show this help message\n\nExamples:\n soda-gql artifact build\n soda-gql artifact build --output ./dist/artifact.json\n soda-gql artifact build --version \"1.0.0\"\n soda-gql artifact build --dry-run\n soda-gql artifact build --config ./soda-gql.config.ts\n`;\n\ntype BuildArgs = {\n configPath?: string;\n outputPath: string;\n version?: string;\n dryRun: boolean;\n help: boolean;\n};\n\nconst DEFAULT_OUTPUT_PATH = \"./soda-gql-artifact.json\";\n\n/**\n * Parse build command arguments.\n */\nconst parseBuildArgs = (argv: readonly string[]): BuildArgs => {\n const args: BuildArgs = {\n configPath: undefined,\n outputPath: DEFAULT_OUTPUT_PATH,\n version: undefined,\n dryRun: false,\n help: false,\n };\n\n for (let i = 0; i < argv.length; i++) {\n const arg = argv[i];\n if (arg === \"--config\" || arg === \"-c\") {\n args.configPath = argv[++i];\n } else if (arg === \"--output\" || arg === \"-o\") {\n args.outputPath = argv[++i] ?? DEFAULT_OUTPUT_PATH;\n } else if (arg === \"--version\" || arg === \"-v\") {\n args.version = argv[++i];\n } else if (arg === \"--dry-run\") {\n args.dryRun = true;\n } else if (arg === \"--help\" || arg === \"-h\") {\n args.help = true;\n }\n }\n\n return args;\n};\n\n/**\n * Build command - builds and validates soda-gql artifacts.\n */\nexport const buildCommand = async (argv: readonly string[]): Promise<number> => {\n const args = parseBuildArgs(argv);\n\n if (args.help) {\n process.stdout.write(BUILD_HELP);\n return 0;\n }\n\n // Load config\n const configResult = loadConfig(args.configPath);\n if (configResult.isErr()) {\n const error = configResult.error;\n process.stderr.write(`Error: Failed to load config\\n`);\n process.stderr.write(` at ${error.filePath}\\n`);\n process.stderr.write(` ${error.message}\\n`);\n return 1;\n }\n\n const config = configResult.value;\n\n // Create builder service and build\n const service = createBuilderService({ config });\n const buildResult = await service.buildAsync();\n\n if (buildResult.isErr()) {\n const formattedError = formatBuilderErrorForCLI(buildResult.error);\n process.stderr.write(`${formattedError}\\n`);\n return 1;\n }\n\n const artifact = buildResult.value;\n const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === \"fragment\").length;\n const operationCount = Object.values(artifact.elements).filter((e) => e.type === \"operation\").length;\n\n // Create artifact with metadata (only if version is specified)\n const meta: BuilderArtifactMeta | undefined = args.version\n ? {\n version: args.version,\n createdAt: new Date().toISOString(),\n }\n : undefined;\n const artifactWithMeta: BuilderArtifact = {\n ...(meta ? { meta } : {}),\n ...artifact,\n };\n\n if (args.dryRun) {\n process.stdout.write(`Validation passed: ${fragmentCount} fragments, ${operationCount} operations\\n`);\n if (args.version) {\n process.stdout.write(` Version: ${args.version}\\n`);\n }\n } else {\n // Write artifact to output file\n const outputPath = resolve(process.cwd(), args.outputPath);\n const outputDir = dirname(outputPath);\n await mkdir(outputDir, { recursive: true });\n await writeFile(outputPath, JSON.stringify(artifactWithMeta, null, 2));\n\n process.stdout.write(`Build complete: ${fragmentCount} fragments, ${operationCount} operations\\n`);\n if (args.version) {\n process.stdout.write(` Version: ${args.version}\\n`);\n }\n process.stdout.write(`Artifact written to: ${outputPath}\\n`);\n }\n\n return 0;\n};\n","import { resolve } from \"node:path\";\nimport { loadArtifact } from \"@soda-gql/builder\";\n\nconst VALIDATE_HELP = `Usage: soda-gql artifact validate [options] <path>\n\nValidate a pre-built soda-gql artifact file.\n\nArguments:\n <path> Path to artifact JSON file\n\nOptions:\n --help, -h Show this help message\n\nExamples:\n soda-gql artifact validate ./soda-gql-artifact.json\n soda-gql artifact validate ./dist/artifact.json\n`;\n\ntype ValidateArgs = {\n artifactPath?: string;\n help: boolean;\n};\n\n/**\n * Parse validate command arguments.\n */\nconst parseValidateArgs = (argv: readonly string[]): ValidateArgs => {\n const args: ValidateArgs = {\n artifactPath: undefined,\n help: false,\n };\n\n for (const arg of argv) {\n if (arg === \"--help\" || arg === \"-h\") {\n args.help = true;\n } else if (!arg.startsWith(\"-\")) {\n args.artifactPath = arg;\n }\n }\n\n return args;\n};\n\n/**\n * Validate command - validates a pre-built artifact file.\n */\nexport const validateCommand = async (argv: readonly string[]): Promise<number> => {\n const args = parseValidateArgs(argv);\n\n if (args.help) {\n process.stdout.write(VALIDATE_HELP);\n return 0;\n }\n\n if (!args.artifactPath) {\n process.stderr.write(\"Error: Missing artifact path argument\\n\\n\");\n process.stdout.write(VALIDATE_HELP);\n return 1;\n }\n\n const artifactPath = resolve(process.cwd(), args.artifactPath);\n const result = await loadArtifact(artifactPath);\n\n if (result.isErr()) {\n const error = result.error;\n process.stderr.write(`Validation failed: ${error.message}\\n`);\n if (error.filePath) {\n process.stderr.write(` File: ${error.filePath}\\n`);\n }\n return 1;\n }\n\n const artifact = result.value;\n const fragmentCount = Object.values(artifact.elements).filter((e) => e.type === \"fragment\").length;\n const operationCount = Object.values(artifact.elements).filter((e) => e.type === \"operation\").length;\n\n process.stdout.write(`Artifact valid: ${fragmentCount} fragments, ${operationCount} operations\\n`);\n\n if (artifact.meta) {\n process.stdout.write(` Version: ${artifact.meta.version}\\n`);\n process.stdout.write(` Created: ${artifact.meta.createdAt}\\n`);\n } else {\n process.stdout.write(` (No metadata - legacy artifact format)\\n`);\n }\n\n return 0;\n};\n","import { buildCommand } from \"./build\";\nimport { validateCommand } from \"./validate\";\n\nconst ARTIFACT_HELP = `Usage: soda-gql artifact <subcommand> [options]\n\nManage soda-gql artifacts.\n\nSubcommands:\n build Build artifacts (validate definitions)\n validate Validate a pre-built artifact file\n\nRun 'soda-gql artifact <subcommand> --help' for more information.\n`;\n\n/**\n * Dispatcher for artifact subcommands.\n */\nexport const artifactCommand = async (argv: readonly string[]): Promise<number> => {\n const [subcommand, ...rest] = argv;\n\n if (!subcommand || subcommand === \"--help\" || subcommand === \"-h\") {\n process.stdout.write(ARTIFACT_HELP);\n return 0;\n }\n\n if (subcommand === \"build\") {\n return buildCommand(rest);\n }\n\n if (subcommand === \"validate\") {\n return validateCommand(rest);\n }\n\n process.stderr.write(`Unknown subcommand: ${subcommand}\\n`);\n process.stderr.write(`Run 'soda-gql artifact --help' for available subcommands.\\n`);\n return 1;\n};\n","import { z } from \"zod\";\n\nexport const CodegenArgsSchema = z.object({\n config: z.string().optional(),\n \"emit-inject-template\": z.string().optional(),\n});\n\nexport const BuilderArgsSchema = z.object({\n mode: z.enum([\"runtime\", \"zero-runtime\"]),\n entry: z.string(),\n out: z.string(),\n format: z.enum([\"human\", \"json\"]).optional().default(\"human\"),\n});\n\nexport const FormatArgsSchema = z.object({\n _: z.array(z.string()).optional(),\n config: z.string().optional(),\n check: z.boolean().optional(),\n});\n\nexport const InitArgsSchema = z.object({\n force: z.boolean().optional(),\n});\n\nexport type CodegenArgs = z.infer<typeof CodegenArgsSchema>;\nexport type BuilderArgs = z.infer<typeof BuilderArgsSchema>;\nexport type FormatArgs = z.infer<typeof FormatArgsSchema>;\nexport type InitArgs = z.infer<typeof InitArgsSchema>;\n","import { err, ok, type Result } from \"neverthrow\";\nimport type { z } from \"zod\";\n\nexport const parseArgs = <T extends z.ZodType>(args: string[], schema: T): Result<z.infer<T>, string> => {\n const parsed: Record<string, unknown> = {};\n const positional: string[] = [];\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (!arg) continue;\n\n if (arg.startsWith(\"--\")) {\n const key = arg.slice(2);\n const nextArg = args[i + 1];\n\n if (!nextArg || nextArg.startsWith(\"--\")) {\n parsed[key] = true;\n } else {\n parsed[key] = nextArg;\n i++;\n }\n } else {\n positional.push(arg);\n }\n }\n\n if (positional.length > 0) {\n parsed._ = positional;\n }\n\n const result = schema.safeParse(parsed);\n if (!result.success) {\n return err(result.error.issues.map((e) => e.message).join(\", \"));\n }\n\n return ok(result.data);\n};\n","import { resolve } from \"node:path\";\nimport type { CodegenError, CodegenSchemaConfig, CodegenSuccess } from \"@soda-gql/codegen\";\nimport { runCodegen, writeInjectTemplate } from \"@soda-gql/codegen\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { CodegenArgsSchema } from \"../schemas/args\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype ParsedCommand =\n | {\n kind: \"emitInjectTemplate\";\n outPath: string;\n }\n | {\n kind: \"generate\";\n schemas: Record<string, CodegenSchemaConfig>;\n outPath: string;\n importExtension: boolean;\n };\n\nconst parseCodegenArgs = (argv: readonly string[]): Result<ParsedCommand, CodegenError> => {\n const parsed = parseArgs([...argv], CodegenArgsSchema);\n\n if (!parsed.isOk()) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: parsed.error,\n outPath: \"\",\n });\n }\n\n const args = parsed.value;\n\n // Handle emit inject template\n if (args[\"emit-inject-template\"]) {\n return ok<ParsedCommand, CodegenError>({\n kind: \"emitInjectTemplate\",\n outPath: args[\"emit-inject-template\"],\n });\n }\n\n // Load config from @soda-gql/config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: `Failed to load config: ${configResult.error.message}`,\n outPath: \"\",\n });\n }\n\n const config = configResult.value;\n\n // Check if schemas config exists\n if (!config.schemas || Object.keys(config.schemas).length === 0) {\n return err<ParsedCommand, CodegenError>({\n code: \"EMIT_FAILED\",\n message: \"schemas configuration is required in soda-gql.config.ts\",\n outPath: \"\",\n });\n }\n\n // Build schemas config with resolved paths\n const schemas: Record<string, CodegenSchemaConfig> = {};\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n schemas[name] = {\n schema: schemaConfig.schema,\n inject: schemaConfig.inject,\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n };\n }\n\n // Derive output path from outdir (default to index.ts)\n const outPath = resolve(config.outdir, \"index.ts\");\n\n return ok<ParsedCommand, CodegenError>({\n kind: \"generate\",\n schemas,\n outPath,\n importExtension: config.styles.importExtension,\n });\n};\n\nconst formatSuccess = (success: CodegenSuccess): string => {\n const schemaNames = Object.keys(success.schemas).join(\", \");\n const totalObjects = Object.values(success.schemas).reduce((sum, s) => sum + s.objects, 0);\n return `Generated ${totalObjects} objects from schemas: ${schemaNames}\\n TypeScript: ${success.outPath}\\n CommonJS: ${success.cjsPath}`;\n};\n\nconst formatTemplateSuccess = (outPath: string): string => {\n return `Created inject template → ${outPath}`;\n};\n\nconst errorHints: Record<string, string> = {\n SCHEMA_NOT_FOUND: \"Verify the schema path in soda-gql.config.ts\",\n SCHEMA_INVALID: \"Check your GraphQL schema for syntax errors\",\n INJECT_MODULE_NOT_FOUND: \"Run: soda-gql codegen --emit-inject-template <path>\",\n INJECT_MODULE_REQUIRED: \"Add inject configuration to your schema in soda-gql.config.ts\",\n INJECT_TEMPLATE_EXISTS: \"Delete the existing file to regenerate, or use a different path\",\n EMIT_FAILED: \"Check write permissions and that the output directory exists\",\n};\n\nconst formatCodegenError = (error: CodegenError): string => {\n const message = \"message\" in error ? error.message : \"Unknown error\";\n const hint = errorHints[error.code];\n const hintLine = hint ? `\\n Hint: ${hint}` : \"\";\n return `${error.code}: ${message}${hintLine}`;\n};\n\nconst CODEGEN_HELP = `Usage: soda-gql codegen [options]\n\nGenerate graphql-system runtime module from GraphQL schema.\n\nOptions:\n --config <path> Path to soda-gql.config.ts\n --emit-inject-template <path> Create inject template file\n --help, -h Show this help message\n\nExamples:\n soda-gql codegen --config ./soda-gql.config.ts\n soda-gql codegen --emit-inject-template ./src/graphql/scalars.ts\n`;\n\nexport const codegenCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(CODEGEN_HELP);\n return 0;\n }\n\n try {\n const parsed = parseCodegenArgs(argv);\n\n if (parsed.isErr()) {\n process.stderr.write(`${formatCodegenError(parsed.error)}\\n`);\n return 1;\n }\n\n const command = parsed.value;\n\n if (command.kind === \"emitInjectTemplate\") {\n const outPath = resolve(command.outPath);\n const result = writeInjectTemplate(outPath);\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(result.error)}\\n`);\n return 1;\n }\n process.stdout.write(`${formatTemplateSuccess(outPath)}\\n`);\n return 0;\n }\n\n // Resolve all paths in schemas config\n const resolvedSchemas: Record<string, CodegenSchemaConfig> = {};\n for (const [name, schemaConfig] of Object.entries(command.schemas)) {\n resolvedSchemas[name] = {\n schema: resolve(schemaConfig.schema),\n inject: {\n scalars: resolve(schemaConfig.inject.scalars),\n ...(schemaConfig.inject.adapter ? { adapter: resolve(schemaConfig.inject.adapter) } : {}),\n },\n defaultInputDepth: schemaConfig.defaultInputDepth,\n inputDepthOverrides: schemaConfig.inputDepthOverrides,\n };\n }\n\n const result = await runCodegen({\n schemas: resolvedSchemas,\n outPath: resolve(command.outPath),\n format: \"human\",\n importExtension: command.importExtension,\n });\n\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(result.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatSuccess(result.value)}\\n`);\n return 0;\n } catch (error) {\n // Catch unexpected errors and convert to structured format\n const unexpectedError: CodegenError = {\n code: \"EMIT_FAILED\",\n message: error instanceof Error ? error.message : String(error),\n outPath: \"\",\n };\n process.stderr.write(`${formatCodegenError(unexpectedError)}\\n`);\n return 1;\n }\n};\n","import { access, readFile, writeFile } from \"node:fs/promises\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport fg from \"fast-glob\";\nimport { FormatArgsSchema } from \"../schemas/args\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype FormatterModule = typeof import(\"@soda-gql/formatter\");\n\nconst loadFormatter = async (): Promise<FormatterModule | null> => {\n try {\n return await import(\"@soda-gql/formatter\");\n } catch {\n return null;\n }\n};\n\ntype FormatError = {\n code: \"PARSE_ERROR\" | \"NO_PATTERNS\" | \"FORMAT_ERROR\" | \"FORMATTER_NOT_INSTALLED\";\n message: string;\n};\n\ntype FormatResult = {\n mode: \"format\" | \"check\";\n total: number;\n modified: number;\n unchanged: number;\n errors: number;\n unformatted: string[];\n};\n\nconst formatFormatError = (error: FormatError): string => {\n return `${error.code}: ${error.message}`;\n};\n\nconst formatResult = (result: FormatResult): string => {\n if (result.mode === \"check\") {\n if (result.unformatted.length > 0) {\n const files = result.unformatted.map((f) => ` ${f}`).join(\"\\n\");\n return `${result.unformatted.length} file(s) need formatting:\\n${files}`;\n }\n return `All ${result.total} file(s) are properly formatted`;\n }\n\n const parts: string[] = [];\n if (result.modified > 0) {\n parts.push(`${result.modified} formatted`);\n }\n if (result.unchanged > 0) {\n parts.push(`${result.unchanged} unchanged`);\n }\n if (result.errors > 0) {\n parts.push(`${result.errors} errors`);\n }\n return `${result.total} file(s) checked: ${parts.join(\", \")}`;\n};\n\nconst isGlobPattern = (pattern: string): boolean => {\n return /[*?[\\]{}]/.test(pattern);\n};\n\nconst expandGlobPatterns = async (patterns: readonly string[], excludePatterns: readonly string[] = []): Promise<string[]> => {\n const files: string[] = [];\n\n for (const pattern of patterns) {\n if (!isGlobPattern(pattern)) {\n // Direct file path - check if it exists\n try {\n await access(pattern);\n files.push(pattern);\n } catch {\n // File doesn't exist, skip it\n }\n continue;\n }\n\n // Glob pattern - use fast-glob with ignore\n const matches = await fg(pattern, {\n absolute: true,\n ignore: [...excludePatterns],\n });\n files.push(...matches);\n }\n\n return [...new Set(files)];\n};\n\nconst FORMAT_HELP = `Usage: soda-gql format [patterns...] [options]\n\nFormat soda-gql field selections by inserting empty comments.\n\nOptions:\n --config <path> Path to soda-gql.config.ts (auto-detected if omitted)\n --check Check if files need formatting (exit 1 if unformatted)\n --help, -h Show this help message\n\nExamples:\n soda-gql format # Use config include/exclude\n soda-gql format \"src/**/*.ts\" # Override with explicit patterns\n soda-gql format --check # Check mode with config\n`;\n\nexport const formatCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(FORMAT_HELP);\n return 0;\n }\n\n const parsed = parseArgs([...argv], FormatArgsSchema);\n\n if (!parsed.isOk()) {\n const error: FormatError = {\n code: \"PARSE_ERROR\",\n message: parsed.error,\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n\n const args = parsed.value;\n const isCheckMode = args.check === true;\n const explicitPatterns = args._ ?? [];\n\n // Determine patterns: use explicit patterns or load from config\n let targetPatterns: readonly string[];\n let excludePatterns: readonly string[] = [];\n\n if (explicitPatterns.length > 0) {\n targetPatterns = explicitPatterns;\n } else {\n // Try to load patterns from config\n const configResult = loadConfig(args.config);\n if (configResult.isErr()) {\n const error: FormatError = {\n code: \"NO_PATTERNS\",\n message: \"No patterns provided and config not found. Usage: soda-gql format [patterns...] [--check]\",\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n targetPatterns = configResult.value.include;\n excludePatterns = configResult.value.exclude;\n }\n\n // Load formatter lazily - it's an optional dependency\n const formatter = await loadFormatter();\n if (!formatter) {\n const error: FormatError = {\n code: \"FORMATTER_NOT_INSTALLED\",\n message: \"@soda-gql/formatter is not installed. Run: npm install @soda-gql/formatter\",\n };\n process.stderr.write(`${formatFormatError(error)}\\n`);\n return 1;\n }\n\n const files = await expandGlobPatterns(targetPatterns, excludePatterns);\n\n if (files.length === 0) {\n const result: FormatResult = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: 0,\n modified: 0,\n unchanged: 0,\n errors: 0,\n unformatted: [],\n };\n process.stdout.write(`${formatResult(result)}\\n`);\n return 0;\n }\n\n let modified = 0;\n let unchanged = 0;\n let errors = 0;\n const unformatted: string[] = [];\n\n for (const filePath of files) {\n const sourceCode = await readFile(filePath, \"utf-8\");\n\n if (isCheckMode) {\n const result = formatter.needsFormat({ sourceCode, filePath });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value) {\n unformatted.push(filePath);\n modified++;\n } else {\n unchanged++;\n }\n } else {\n const result = formatter.format({ sourceCode, filePath });\n if (result.isErr()) {\n errors++;\n continue;\n }\n if (result.value.modified) {\n await writeFile(filePath, result.value.sourceCode, \"utf-8\");\n modified++;\n } else {\n unchanged++;\n }\n }\n }\n\n const result: FormatResult = {\n mode: isCheckMode ? \"check\" : \"format\",\n total: files.length,\n modified,\n unchanged,\n errors,\n unformatted,\n };\n\n process.stdout.write(`${formatResult(result)}\\n`);\n\n if (isCheckMode && unformatted.length > 0) {\n return 1;\n }\n\n return errors > 0 ? 1 : 0;\n};\n","export const getConfigTemplate = (): string => `\\\nimport { defineConfig } from \"@soda-gql/config\";\n\nexport default defineConfig({\n outdir: \"./graphql-system\",\n include: [\"./src/**/*.ts\"],\n schemas: {\n default: {\n schema: \"./schema.graphql\",\n inject: \"./graphql-system/default.inject.ts\",\n },\n },\n});\n`;\n","export const getGitignoreTemplate = (): string => `\\\n/index.ts\n/index.cjs\n`;\n","export const getInjectTemplate = (): string => `\\\nimport { defineAdapter, defineScalar } from \"@soda-gql/core/adapter\";\n\nexport const scalar = {\n ...defineScalar<\"ID\", string, string>(\"ID\"),\n ...defineScalar<\"String\", string, string>(\"String\"),\n ...defineScalar<\"Int\", number, number>(\"Int\"),\n ...defineScalar<\"Float\", number, number>(\"Float\"),\n ...defineScalar<\"Boolean\", boolean, boolean>(\"Boolean\"),\n} as const;\n\nexport const adapter = defineAdapter({\n helpers: {},\n metadata: {\n aggregateFragmentMetadata: (fragments) => fragments.map((m) => m.metadata),\n },\n});\n`;\n","export const getSchemaTemplate = (): string => `\\\ntype Query {\n hello: String!\n}\n`;\n","import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\nimport { err, ok, type Result } from \"neverthrow\";\n\nimport { InitArgsSchema } from \"../schemas/args\";\nimport { getConfigTemplate } from \"../templates/config.template\";\nimport { getGitignoreTemplate } from \"../templates/gitignore.template\";\nimport { getInjectTemplate } from \"../templates/inject.template\";\nimport { getSchemaTemplate } from \"../templates/schema.template\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype InitErrorCode = \"FILE_EXISTS\" | \"WRITE_FAILED\" | \"PARSE_ERROR\";\n\ntype InitError = {\n readonly code: InitErrorCode;\n readonly message: string;\n readonly filePath?: string;\n};\n\ntype FileToGenerate = {\n readonly path: string;\n readonly content: string;\n readonly description: string;\n};\n\ntype InitSuccess = {\n readonly filesCreated: readonly string[];\n};\n\nconst INIT_HELP = `Usage: soda-gql init [options]\n\nInitialize a new soda-gql project with starter configuration.\n\nOptions:\n --force Overwrite existing files\n --help, -h Show this help message\n\nGenerated files:\n soda-gql.config.ts Configuration file\n schema.graphql Sample GraphQL schema\n graphql-system/default.inject.ts Scalars, helpers, and metadata adapter\n graphql-system/.gitignore Ignore generated files\n`;\n\nconst checkFilesExist = (files: readonly FileToGenerate[], force: boolean): Result<void, InitError> => {\n if (force) {\n return ok(undefined);\n }\n\n for (const file of files) {\n if (existsSync(file.path)) {\n return err({\n code: \"FILE_EXISTS\",\n message: `File already exists: ${file.path}. Use --force to overwrite.`,\n filePath: file.path,\n });\n }\n }\n\n return ok(undefined);\n};\n\nconst writeFiles = (files: readonly FileToGenerate[]): Result<InitSuccess, InitError> => {\n const createdPaths: string[] = [];\n\n for (const file of files) {\n try {\n const dir = dirname(file.path);\n mkdirSync(dir, { recursive: true });\n writeFileSync(file.path, file.content);\n createdPaths.push(file.path);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return err({\n code: \"WRITE_FAILED\",\n message: `Failed to write ${file.description}: ${message}`,\n filePath: file.path,\n });\n }\n }\n\n return ok({ filesCreated: createdPaths });\n};\n\nconst formatSuccess = (result: InitSuccess): string => {\n const lines = [\"soda-gql project initialized successfully!\", \"\", \"Created files:\"];\n for (const file of result.filesCreated) {\n lines.push(` ${file}`);\n }\n lines.push(\"\", \"Next steps:\");\n lines.push(\" 1. Edit schema.graphql with your GraphQL types\");\n lines.push(\" 2. Run: soda-gql codegen\");\n lines.push(\" 3. Import gql from ./graphql-system\");\n return lines.join(\"\\n\");\n};\n\nconst formatInitError = (error: InitError): string => {\n return `${error.code}: ${error.message}`;\n};\n\nexport const initCommand = async (argv: readonly string[]): Promise<number> => {\n if (argv.includes(\"--help\") || argv.includes(\"-h\")) {\n process.stdout.write(INIT_HELP);\n return 0;\n }\n\n const parsed = parseArgs([...argv], InitArgsSchema);\n\n if (!parsed.isOk()) {\n const error: InitError = {\n code: \"PARSE_ERROR\",\n message: parsed.error,\n };\n process.stderr.write(`${formatInitError(error)}\\n`);\n return 1;\n }\n\n const args = parsed.value;\n const force = args.force === true;\n const cwd = process.cwd();\n\n const files: FileToGenerate[] = [\n {\n path: resolve(cwd, \"soda-gql.config.ts\"),\n content: getConfigTemplate(),\n description: \"configuration file\",\n },\n {\n path: resolve(cwd, \"schema.graphql\"),\n content: getSchemaTemplate(),\n description: \"GraphQL schema\",\n },\n {\n path: resolve(cwd, \"graphql-system/default.inject.ts\"),\n content: getInjectTemplate(),\n description: \"inject module\",\n },\n {\n path: resolve(cwd, \"graphql-system/.gitignore\"),\n content: getGitignoreTemplate(),\n description: \"gitignore file\",\n },\n ];\n\n const existsCheck = checkFilesExist(files, force);\n if (existsCheck.isErr()) {\n process.stderr.write(`${formatInitError(existsCheck.error)}\\n`);\n return 1;\n }\n\n const writeResult = writeFiles(files);\n if (writeResult.isErr()) {\n process.stderr.write(`${formatInitError(writeResult.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatSuccess(writeResult.value)}\\n`);\n return 0;\n};\n","export const formatters = {\n json: (data: unknown) => JSON.stringify(data, null, 2),\n human: (data: unknown) => {\n if (typeof data === \"string\") return data;\n if (data instanceof Error) return data.message;\n return JSON.stringify(data, null, 2);\n },\n} as const;\n\nexport type OutputFormat = keyof typeof formatters;\n\nexport const formatOutput = (data: unknown, format: OutputFormat = \"human\"): string => {\n return formatters[format](data);\n};\n\nexport const formatError = (error: unknown, format: OutputFormat = \"human\"): string => {\n if (format === \"json\") {\n return JSON.stringify(\n {\n error: error,\n },\n null,\n 2,\n );\n }\n return error instanceof Error ? error.message : String(error);\n};\n","import { artifactCommand } from \"./commands/artifact\";\nimport { codegenCommand } from \"./commands/codegen\";\nimport { formatCommand } from \"./commands/format\";\nimport { initCommand } from \"./commands/init\";\nimport { formatError } from \"./utils/format\";\n\nconst dispatch = async (argv: readonly string[]): Promise<number> => {\n const [command, ...rest] = argv;\n\n if (!command || command === \"--help\" || command === \"-h\") {\n process.stdout.write(`Usage: soda-gql <command> [options]\\n`);\n process.stdout.write(`\\nCommands:\\n`);\n process.stdout.write(` init Initialize a new soda-gql project\\n`);\n process.stdout.write(` codegen Generate graphql-system runtime module\\n`);\n process.stdout.write(` format Format soda-gql field selections\\n`);\n process.stdout.write(` artifact Manage soda-gql artifacts\\n`);\n return 0;\n }\n\n if (command === \"init\") {\n return initCommand(rest);\n }\n\n if (command === \"codegen\") {\n return codegenCommand(rest);\n }\n\n if (command === \"format\") {\n return formatCommand(rest);\n }\n\n if (command === \"artifact\") {\n return artifactCommand(rest);\n }\n\n process.stderr.write(`Unknown command: ${command}\\n`);\n return 1;\n};\n\n// Run CLI when executed directly\ndispatch(process.argv.slice(2))\n .then((exitCode) => {\n process.exitCode = exitCode;\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n const unexpectedError = {\n code: \"UNEXPECTED_ERROR\",\n message,\n };\n process.stderr.write(`${formatError(unexpectedError, \"json\")}\\n`);\n process.exitCode = 1;\n });\n\nexport { dispatch };\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAKM,uCAA4C"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAMM,uCAA4C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soda-gql/cli",
3
- "version": "0.7.0",
3
+ "version": "0.8.0",
4
4
  "description": "Command-line interface for soda-gql",
5
5
  "type": "module",
6
6
  "private": false,
@@ -48,8 +48,8 @@
48
48
  "./package.json": "./package.json"
49
49
  },
50
50
  "dependencies": {
51
- "@soda-gql/codegen": "~0.7.0",
52
- "@soda-gql/builder": "~0.7.0",
51
+ "@soda-gql/codegen": "~0.8.0",
52
+ "@soda-gql/builder": "~0.8.0",
53
53
  "fast-glob": "^3.3.3",
54
54
  "neverthrow": "^8.1.1",
55
55
  "zod": "^4.1.11"
@@ -57,6 +57,6 @@
57
57
  "devDependencies": {},
58
58
  "peerDependencies": {},
59
59
  "optionalDependencies": {
60
- "@soda-gql/formatter": "~0.7.0"
60
+ "@soda-gql/formatter": "~0.8.0"
61
61
  }
62
62
  }