@soda-gql/cli 0.0.1 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,5 @@
1
- #!/usr/bin/env bun
2
1
  //#region packages/cli/src/index.d.ts
3
2
  declare const dispatch: (argv: readonly string[]) => Promise<number>;
4
3
  //#endregion
5
4
  export { dispatch };
6
- //# sourceMappingURL=index.d.ts.map
5
+ //# sourceMappingURL=index.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAGM,uCAA4C"}
@@ -1,13 +1,24 @@
1
- #!/usr/bin/env bun
2
- #!/usr/bin/env bun
3
- import { mkdir, writeFile } from "node:fs/promises";
4
- import { dirname, resolve } from "node:path";
5
- import { createBuilderService } from "@soda-gql/builder";
1
+ #!/usr/bin/env node
2
+ import { resolve } from "node:path";
3
+ import { runMultiSchemaCodegen, writeInjectTemplate } from "@soda-gql/codegen";
6
4
  import { loadConfig } from "@soda-gql/config";
7
5
  import { err, ok } from "neverthrow";
8
- import { runMultiSchemaCodegen, writeInjectTemplate } from "@soda-gql/codegen";
9
6
  import { z } from "zod";
10
7
 
8
+ //#region packages/cli/src/schemas/args.ts
9
+ const CodegenArgsSchema = z.object({
10
+ config: z.string().optional(),
11
+ format: z.enum(["human", "json"]).optional(),
12
+ "emit-inject-template": z.string().optional()
13
+ });
14
+ const BuilderArgsSchema = z.object({
15
+ mode: z.enum(["runtime", "zero-runtime"]),
16
+ entry: z.string(),
17
+ out: z.string(),
18
+ format: z.enum(["human", "json"]).optional().default("human")
19
+ });
20
+
21
+ //#endregion
11
22
  //#region packages/cli/src/utils/format.ts
12
23
  const formatters = {
13
24
  json: (data) => JSON.stringify(data, null, 2),
@@ -25,165 +36,6 @@ const formatError = (error, format = "human") => {
25
36
  return error instanceof Error ? error.message : String(error);
26
37
  };
27
38
 
28
- //#endregion
29
- //#region packages/cli/src/commands/builder.ts
30
- const parseBuilderArgs = (argv) => {
31
- const args = [...argv];
32
- const entries = [];
33
- let outPath;
34
- let format = "human";
35
- while (args.length > 0) {
36
- const current = args.shift();
37
- if (!current) break;
38
- switch (current) {
39
- case "--entry": {
40
- const value = args.shift();
41
- if (!value) return err({
42
- code: "ENTRY_NOT_FOUND",
43
- message: "Missing value for --entry",
44
- entry: ""
45
- });
46
- entries.push(value);
47
- break;
48
- }
49
- case "--out": {
50
- const value = args.shift();
51
- if (!value) return err({
52
- code: "WRITE_FAILED",
53
- message: "Missing value for --out",
54
- outPath: ""
55
- });
56
- outPath = value;
57
- break;
58
- }
59
- case "--format": {
60
- const value = args.shift();
61
- if (!value || !["json", "human"].includes(value)) return err({
62
- code: "ENTRY_NOT_FOUND",
63
- message: `Unsupported format: ${value ?? ""}`,
64
- entry: ""
65
- });
66
- format = value;
67
- break;
68
- }
69
- default: break;
70
- }
71
- }
72
- if (entries.length === 0) return err({
73
- code: "ENTRY_NOT_FOUND",
74
- message: "No entry provided",
75
- entry: ""
76
- });
77
- if (!outPath) return err({
78
- code: "WRITE_FAILED",
79
- message: "Output path not provided",
80
- outPath: ""
81
- });
82
- return ok({
83
- entry: entries,
84
- outPath,
85
- format
86
- });
87
- };
88
- const formatBuilderSuccess = (format, success) => {
89
- if (format === "json") return formatOutput(success.artifact, "json");
90
- const { report, elements } = success.artifact;
91
- return [
92
- `Elements: ${Object.keys(elements).length}`,
93
- `Cache: hits ${report.stats.hits}, misses ${report.stats.misses}`,
94
- ...report.warnings,
95
- `Artifact: ${success.outPath}`
96
- ].join("\n");
97
- };
98
- const formatBuilderError = (format, error) => {
99
- if (format === "json") return formatError(error, "json");
100
- return `${error.code}: ${"message" in error ? error.message : ""}`;
101
- };
102
- const writeArtifact = async (artifact, outPath) => {
103
- await mkdir(dirname(outPath), { recursive: true });
104
- await writeFile(outPath, JSON.stringify(artifact, null, 2), "utf-8");
105
- };
106
- const builderCommand = async (argv) => {
107
- try {
108
- const configResult = loadConfig(void 0);
109
- if (configResult.isErr()) {
110
- const error = configResult.error;
111
- process.stderr.write(`${formatBuilderError("json", error)}\n`);
112
- return 1;
113
- }
114
- const config = configResult.value;
115
- const parsed = parseBuilderArgs(argv);
116
- if (parsed.isErr()) {
117
- process.stderr.write(`${formatBuilderError("json", parsed.error)}\n`);
118
- return 1;
119
- }
120
- const options = parsed.value;
121
- const service = createBuilderService({
122
- config,
123
- entrypointsOverride: options.entry
124
- });
125
- let result;
126
- try {
127
- result = await service.build();
128
- } catch (cause) {
129
- const error = cause && typeof cause === "object" && "code" in cause ? cause : {
130
- code: "RUNTIME_MODULE_LOAD_FAILED",
131
- message: cause instanceof Error ? cause.message : String(cause),
132
- filePath: "",
133
- astPath: "",
134
- cause
135
- };
136
- process.stderr.write(`${formatBuilderError(options.format, error)}\n`);
137
- return 1;
138
- }
139
- if (result.isErr()) {
140
- process.stderr.write(`${formatBuilderError(options.format, result.error)}\n`);
141
- return 1;
142
- }
143
- try {
144
- await writeArtifact(result.value, options.outPath);
145
- } catch (error) {
146
- const writeError = {
147
- code: "WRITE_FAILED",
148
- message: error instanceof Error ? error.message : "Failed to write artifact",
149
- outPath: options.outPath
150
- };
151
- process.stderr.write(`${formatBuilderError(options.format, writeError)}\n`);
152
- return 1;
153
- }
154
- const output = formatBuilderSuccess(options.format, {
155
- artifact: result.value,
156
- outPath: options.outPath
157
- });
158
- if (output) process.stdout.write(`${output}\n`);
159
- return 0;
160
- } catch (error) {
161
- const unexpectedError = {
162
- code: "RUNTIME_MODULE_LOAD_FAILED",
163
- message: error instanceof Error ? error.message : String(error),
164
- filePath: "",
165
- astPath: "",
166
- cause: error
167
- };
168
- process.stderr.write(`${formatBuilderError("json", unexpectedError)}\n`);
169
- return 1;
170
- }
171
- };
172
-
173
- //#endregion
174
- //#region packages/cli/src/schemas/args.ts
175
- const CodegenArgsSchema = z.object({
176
- config: z.string().optional(),
177
- format: z.enum(["human", "json"]).optional(),
178
- "emit-inject-template": z.string().optional()
179
- });
180
- const BuilderArgsSchema = z.object({
181
- mode: z.enum(["runtime", "zero-runtime"]),
182
- entry: z.string(),
183
- out: z.string(),
184
- format: z.enum(["human", "json"]).optional().default("human")
185
- });
186
-
187
39
  //#endregion
188
40
  //#region packages/cli/src/utils/parse-args.ts
189
41
  const parseArgs = (args, schema) => {
@@ -317,11 +169,9 @@ const dispatch = async (argv) => {
317
169
  process.stdout.write(`Usage: soda-gql <command> [options]\n`);
318
170
  process.stdout.write(`\nCommands:\n`);
319
171
  process.stdout.write(` codegen Generate graphql-system runtime module\n`);
320
- process.stdout.write(` builder Build GraphQL runtime artifacts from entry points\n`);
321
172
  return 0;
322
173
  }
323
174
  if (command === "codegen") return codegenCommand(rest);
324
- if (command === "builder") return builderCommand(rest);
325
175
  process.stderr.write(`Unknown command: ${command}\n`);
326
176
  return 1;
327
177
  };
@@ -338,4 +188,4 @@ if (import.meta.main) dispatch(Bun.argv.slice(2)).then((exitCode) => {
338
188
 
339
189
  //#endregion
340
190
  export { dispatch };
341
- //# sourceMappingURL=index.js.map
191
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","names":["parsed: Record<string, unknown>","positional: string[]","schemas: Record<string, string>","runtimeAdapters: Record<string, string>","scalars: Record<string, string>","result","unexpectedError: CodegenError"],"sources":["../src/schemas/args.ts","../src/utils/format.ts","../src/utils/parse-args.ts","../src/commands/codegen.ts","../src/index.ts"],"sourcesContent":["import { z } from \"zod\";\n\nexport const CodegenArgsSchema = z.object({\n config: z.string().optional(),\n format: z.enum([\"human\", \"json\"]).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 type CodegenArgs = z.infer<typeof CodegenArgsSchema>;\nexport type BuilderArgs = z.infer<typeof BuilderArgsSchema>;\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 { 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, CodegenFormat, MultiSchemaCodegenSuccess } from \"@soda-gql/codegen\";\nimport { runMultiSchemaCodegen, writeInjectTemplate } from \"@soda-gql/codegen\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { CodegenArgsSchema } from \"../schemas/args\";\nimport { formatError, formatOutput, type OutputFormat } from \"../utils/format\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype ParsedCommand =\n | {\n kind: \"emitInjectTemplate\";\n outPath: string;\n format: CodegenFormat;\n }\n | {\n kind: \"multi\";\n schemas: Record<string, string>;\n outPath: string;\n format: CodegenFormat;\n runtimeAdapters: Record<string, string>;\n scalars: Record<string, string>;\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 format: (args.format ?? \"human\") as CodegenFormat,\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 // Extract schemas, runtimeAdapters, and scalars from config\n const schemas: Record<string, string> = {};\n const runtimeAdapters: Record<string, string> = {};\n const scalars: Record<string, string> = {};\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n schemas[name] = schemaConfig.schema;\n runtimeAdapters[name] = schemaConfig.runtimeAdapter;\n scalars[name] = schemaConfig.scalars;\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: \"multi\",\n schemas,\n outPath,\n format: (args.format ?? \"human\") as CodegenFormat,\n runtimeAdapters,\n scalars,\n });\n};\n\nconst formatMultiSchemaSuccess = (format: OutputFormat, success: MultiSchemaCodegenSuccess) => {\n if (format === \"json\") {\n return formatOutput(success, \"json\");\n }\n const schemaNames = Object.keys(success.schemas).join(\", \");\n const totalObjects = Object.values(success.schemas).reduce((sum, s) => {\n // biome-ignore lint/suspicious/noExplicitAny: type assertion needed for schema stats\n return sum + (s as any).objects;\n }, 0);\n return `Generated ${totalObjects} objects from schemas: ${schemaNames}\\n TypeScript: ${success.outPath}\\n CommonJS: ${success.cjsPath}`;\n};\n\nconst formatTemplateSuccess = (format: OutputFormat, outPath: string) => {\n if (format === \"json\") {\n return formatOutput({ outPath }, \"json\");\n }\n return `Created inject template → ${outPath}`;\n};\n\nconst formatCodegenError = (format: OutputFormat, error: CodegenError) => {\n if (format === \"json\") {\n return formatError(error, \"json\");\n }\n return `${error.code}: ${\"message\" in error ? error.message : \"Unknown error\"}`;\n};\n\nexport const codegenCommand = async (argv: readonly string[]): Promise<number> => {\n try {\n const parsed = parseCodegenArgs(argv);\n\n if (parsed.isErr()) {\n process.stderr.write(`${formatCodegenError(\"json\", 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(command.format, result.error)}\\n`);\n return 1;\n }\n process.stdout.write(`${formatTemplateSuccess(command.format, outPath)}\\n`);\n return 0;\n }\n\n const result = await runMultiSchemaCodegen({\n schemas: Object.fromEntries(Object.entries(command.schemas).map(([name, path]) => [name, resolve(path)])),\n outPath: resolve(command.outPath),\n format: command.format,\n runtimeAdapters: Object.fromEntries(Object.entries(command.runtimeAdapters).map(([name, path]) => [name, resolve(path)])),\n scalars: Object.fromEntries(Object.entries(command.scalars).map(([name, path]) => [name, resolve(path)])),\n });\n\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(command.format, result.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatMultiSchemaSuccess(command.format, 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(\"json\", unexpectedError)}\\n`);\n return 1;\n }\n};\n","import { codegenCommand } from \"./commands/codegen\";\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(` codegen Generate graphql-system runtime module\\n`);\n return 0;\n }\n\n if (command === \"codegen\") {\n return codegenCommand(rest);\n }\n\n process.stderr.write(`Unknown command: ${command}\\n`);\n return 1;\n};\n\nif (import.meta.main) {\n dispatch(Bun.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}\n\nexport { dispatch };\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soda-gql/cli",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -29,8 +29,8 @@
29
29
  "./package.json": "./package.json"
30
30
  },
31
31
  "dependencies": {
32
- "@soda-gql/codegen": "0.0.1",
33
- "@soda-gql/builder": "0.0.1",
32
+ "@soda-gql/codegen": "0.0.3",
33
+ "@soda-gql/builder": "0.0.3",
34
34
  "neverthrow": "^8.1.1",
35
35
  "zod": "^4.1.11"
36
36
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;cAKM,uCAA4C"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["entries: string[]","outPath: string | undefined","format: BuilderFormat","result: Result<BuilderArtifact, BuilderError>","error: BuilderError","writeError: BuilderError","unexpectedError: BuilderError","parsed: Record<string, unknown>","positional: string[]","schemas: Record<string, string>","runtimeAdapters: Record<string, string>","scalars: Record<string, string>","result","unexpectedError: CodegenError"],"sources":["../src/utils/format.ts","../src/commands/builder.ts","../src/schemas/args.ts","../src/utils/parse-args.ts","../src/commands/codegen.ts","../src/index.ts"],"sourcesContent":["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 { mkdir, writeFile } from \"node:fs/promises\";\nimport { dirname } from \"node:path\";\n\nimport type { BuilderArtifact, BuilderError, BuilderFormat } from \"@soda-gql/builder\";\nimport { createBuilderService } from \"@soda-gql/builder\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { formatError, formatOutput, type OutputFormat } from \"../utils/format\";\n\ntype BuilderCommandOptions = {\n entry: string[];\n outPath: string;\n format: BuilderFormat;\n};\n\nconst parseBuilderArgs = (argv: readonly string[]) => {\n const args = [...argv];\n const entries: string[] = [];\n let outPath: string | undefined;\n let format: BuilderFormat = \"human\";\n\n while (args.length > 0) {\n const current = args.shift();\n if (!current) {\n break;\n }\n\n switch (current) {\n case \"--entry\": {\n const value = args.shift();\n if (!value) {\n return err<BuilderCommandOptions, BuilderError>({\n code: \"ENTRY_NOT_FOUND\",\n message: \"Missing value for --entry\",\n entry: \"\",\n });\n }\n entries.push(value);\n break;\n }\n case \"--out\": {\n const value = args.shift();\n if (!value) {\n return err<BuilderCommandOptions, BuilderError>({\n code: \"WRITE_FAILED\",\n message: \"Missing value for --out\",\n outPath: \"\",\n });\n }\n outPath = value;\n break;\n }\n case \"--format\": {\n const value = args.shift();\n const supportedFormats = [\"json\", \"human\"];\n if (!value || !supportedFormats.includes(value)) {\n return err<BuilderCommandOptions, BuilderError>({\n code: \"ENTRY_NOT_FOUND\",\n message: `Unsupported format: ${value ?? \"\"}`,\n entry: \"\",\n });\n }\n format = value as BuilderFormat;\n break;\n }\n default:\n break;\n }\n }\n\n if (entries.length === 0) {\n return err<BuilderCommandOptions, BuilderError>({\n code: \"ENTRY_NOT_FOUND\",\n message: \"No entry provided\",\n entry: \"\",\n });\n }\n\n if (!outPath) {\n return err<BuilderCommandOptions, BuilderError>({\n code: \"WRITE_FAILED\",\n message: \"Output path not provided\",\n outPath: \"\",\n });\n }\n\n return ok<BuilderCommandOptions, BuilderError>({\n entry: entries,\n outPath,\n format,\n });\n};\n\nconst formatBuilderSuccess = (\n format: OutputFormat,\n success: { readonly artifact: BuilderArtifact; readonly outPath: string },\n) => {\n if (format === \"json\") {\n return formatOutput(success.artifact, \"json\");\n }\n\n const { report, elements } = success.artifact;\n const lines = [\n `Elements: ${Object.keys(elements).length}`,\n `Cache: hits ${report.stats.hits}, misses ${report.stats.misses}`,\n ...report.warnings,\n `Artifact: ${success.outPath}`,\n ];\n\n return lines.join(\"\\n\");\n};\n\nconst formatBuilderError = (format: OutputFormat, error: BuilderError) => {\n if (format === \"json\") {\n return formatError(error, \"json\");\n }\n return `${error.code}: ${\"message\" in error ? error.message : \"\"}`;\n};\n\nconst writeArtifact = async (artifact: BuilderArtifact, outPath: string): Promise<void> => {\n const dir = dirname(outPath);\n await mkdir(dir, { recursive: true });\n const content = JSON.stringify(artifact, null, 2);\n await writeFile(outPath, content, \"utf-8\");\n};\n\nexport const builderCommand = async (argv: readonly string[]): Promise<number> => {\n try {\n // Load config first (now synchronous)\n const configResult = loadConfig(undefined);\n if (configResult.isErr()) {\n const error = configResult.error;\n process.stderr.write(`${formatBuilderError(\"json\", error as BuilderError)}\\n`);\n return 1;\n }\n const config = configResult.value;\n\n const parsed = parseBuilderArgs(argv);\n\n if (parsed.isErr()) {\n process.stderr.write(`${formatBuilderError(\"json\", parsed.error)}\\n`);\n return 1;\n }\n\n const options = parsed.value;\n\n // Single build\n const service = createBuilderService({ config, entrypointsOverride: options.entry });\n\n let result: Result<BuilderArtifact, BuilderError>;\n try {\n result = await service.build();\n } catch (cause) {\n const error: BuilderError =\n cause && typeof cause === \"object\" && \"code\" in cause\n ? (cause as BuilderError)\n : {\n code: \"RUNTIME_MODULE_LOAD_FAILED\",\n message: cause instanceof Error ? cause.message : String(cause),\n filePath: \"\",\n astPath: \"\",\n cause,\n };\n process.stderr.write(`${formatBuilderError(options.format, error)}\\n`);\n return 1;\n }\n\n if (result.isErr()) {\n process.stderr.write(`${formatBuilderError(options.format, result.error)}\\n`);\n return 1;\n }\n\n // Write artifact to disk\n try {\n await writeArtifact(result.value, options.outPath);\n } catch (error) {\n const writeError: BuilderError = {\n code: \"WRITE_FAILED\",\n message: error instanceof Error ? error.message : \"Failed to write artifact\",\n outPath: options.outPath,\n };\n process.stderr.write(`${formatBuilderError(options.format, writeError)}\\n`);\n return 1;\n }\n\n const output = formatBuilderSuccess(options.format, { artifact: result.value, outPath: options.outPath });\n if (output) {\n process.stdout.write(`${output}\\n`);\n }\n\n return 0;\n } catch (error) {\n // Catch unexpected errors and convert to structured format\n const unexpectedError: BuilderError = {\n code: \"RUNTIME_MODULE_LOAD_FAILED\",\n message: error instanceof Error ? error.message : String(error),\n filePath: \"\",\n astPath: \"\",\n cause: error,\n };\n process.stderr.write(`${formatBuilderError(\"json\", unexpectedError)}\\n`);\n return 1;\n }\n};\n","import { z } from \"zod\";\n\nexport const CodegenArgsSchema = z.object({\n config: z.string().optional(),\n format: z.enum([\"human\", \"json\"]).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 type CodegenArgs = z.infer<typeof CodegenArgsSchema>;\nexport type BuilderArgs = z.infer<typeof BuilderArgsSchema>;\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, CodegenFormat, MultiSchemaCodegenSuccess } from \"@soda-gql/codegen\";\nimport { runMultiSchemaCodegen, writeInjectTemplate } from \"@soda-gql/codegen\";\nimport { loadConfig } from \"@soda-gql/config\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { CodegenArgsSchema } from \"../schemas/args\";\nimport { formatError, formatOutput, type OutputFormat } from \"../utils/format\";\nimport { parseArgs } from \"../utils/parse-args\";\n\ntype ParsedCommand =\n | {\n kind: \"emitInjectTemplate\";\n outPath: string;\n format: CodegenFormat;\n }\n | {\n kind: \"multi\";\n schemas: Record<string, string>;\n outPath: string;\n format: CodegenFormat;\n runtimeAdapters: Record<string, string>;\n scalars: Record<string, string>;\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 format: (args.format ?? \"human\") as CodegenFormat,\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 // Extract schemas, runtimeAdapters, and scalars from config\n const schemas: Record<string, string> = {};\n const runtimeAdapters: Record<string, string> = {};\n const scalars: Record<string, string> = {};\n\n for (const [name, schemaConfig] of Object.entries(config.schemas)) {\n schemas[name] = schemaConfig.schema;\n runtimeAdapters[name] = schemaConfig.runtimeAdapter;\n scalars[name] = schemaConfig.scalars;\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: \"multi\",\n schemas,\n outPath,\n format: (args.format ?? \"human\") as CodegenFormat,\n runtimeAdapters,\n scalars,\n });\n};\n\nconst formatMultiSchemaSuccess = (format: OutputFormat, success: MultiSchemaCodegenSuccess) => {\n if (format === \"json\") {\n return formatOutput(success, \"json\");\n }\n const schemaNames = Object.keys(success.schemas).join(\", \");\n const totalObjects = Object.values(success.schemas).reduce((sum, s) => {\n // biome-ignore lint/suspicious/noExplicitAny: type assertion needed for schema stats\n return sum + (s as any).objects;\n }, 0);\n return `Generated ${totalObjects} objects from schemas: ${schemaNames}\\n TypeScript: ${success.outPath}\\n CommonJS: ${success.cjsPath}`;\n};\n\nconst formatTemplateSuccess = (format: OutputFormat, outPath: string) => {\n if (format === \"json\") {\n return formatOutput({ outPath }, \"json\");\n }\n return `Created inject template → ${outPath}`;\n};\n\nconst formatCodegenError = (format: OutputFormat, error: CodegenError) => {\n if (format === \"json\") {\n return formatError(error, \"json\");\n }\n return `${error.code}: ${\"message\" in error ? error.message : \"Unknown error\"}`;\n};\n\nexport const codegenCommand = async (argv: readonly string[]): Promise<number> => {\n try {\n const parsed = parseCodegenArgs(argv);\n\n if (parsed.isErr()) {\n process.stderr.write(`${formatCodegenError(\"json\", 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(command.format, result.error)}\\n`);\n return 1;\n }\n process.stdout.write(`${formatTemplateSuccess(command.format, outPath)}\\n`);\n return 0;\n }\n\n const result = await runMultiSchemaCodegen({\n schemas: Object.fromEntries(Object.entries(command.schemas).map(([name, path]) => [name, resolve(path)])),\n outPath: resolve(command.outPath),\n format: command.format,\n runtimeAdapters: Object.fromEntries(Object.entries(command.runtimeAdapters).map(([name, path]) => [name, resolve(path)])),\n scalars: Object.fromEntries(Object.entries(command.scalars).map(([name, path]) => [name, resolve(path)])),\n });\n\n if (result.isErr()) {\n process.stderr.write(`${formatCodegenError(command.format, result.error)}\\n`);\n return 1;\n }\n\n process.stdout.write(`${formatMultiSchemaSuccess(command.format, 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(\"json\", unexpectedError)}\\n`);\n return 1;\n }\n};\n","#!/usr/bin/env bun\nimport { builderCommand } from \"./commands/builder\";\nimport { codegenCommand } from \"./commands/codegen\";\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(` codegen Generate graphql-system runtime module\\n`);\n process.stdout.write(` builder Build GraphQL runtime artifacts from entry points\\n`);\n return 0;\n }\n\n if (command === \"codegen\") {\n return codegenCommand(rest);\n }\n\n if (command === \"builder\") {\n return builderCommand(rest);\n }\n\n process.stderr.write(`Unknown command: ${command}\\n`);\n return 1;\n};\n\nif (import.meta.main) {\n dispatch(Bun.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}\n\nexport { dispatch };\n"],"mappings":"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"}