@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.
- package/dist/{index.d.ts → index.d.mts} +1 -2
- package/dist/index.d.mts.map +1 -0
- package/dist/{index.js → index.mjs} +18 -168
- package/dist/index.mjs.map +1 -0
- package/package.json +3 -3
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
|
@@ -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
|
|
2
|
-
|
|
3
|
-
import {
|
|
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.
|
|
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.
|
|
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.
|
|
33
|
-
"@soda-gql/builder": "0.0.
|
|
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
|
},
|
package/dist/index.d.ts.map
DELETED
|
@@ -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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"}
|