@soda-gql/cli 0.0.1

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Shota Hatada
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env bun
2
+ //#region packages/cli/src/index.d.ts
3
+ declare const dispatch: (argv: readonly string[]) => Promise<number>;
4
+ //#endregion
5
+ export { dispatch };
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";;cAKM,uCAA4C"}
package/dist/index.js ADDED
@@ -0,0 +1,341 @@
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";
6
+ import { loadConfig } from "@soda-gql/config";
7
+ import { err, ok } from "neverthrow";
8
+ import { runMultiSchemaCodegen, writeInjectTemplate } from "@soda-gql/codegen";
9
+ import { z } from "zod";
10
+
11
+ //#region packages/cli/src/utils/format.ts
12
+ const formatters = {
13
+ json: (data) => JSON.stringify(data, null, 2),
14
+ human: (data) => {
15
+ if (typeof data === "string") return data;
16
+ if (data instanceof Error) return data.message;
17
+ return JSON.stringify(data, null, 2);
18
+ }
19
+ };
20
+ const formatOutput = (data, format = "human") => {
21
+ return formatters[format](data);
22
+ };
23
+ const formatError = (error, format = "human") => {
24
+ if (format === "json") return JSON.stringify({ error }, null, 2);
25
+ return error instanceof Error ? error.message : String(error);
26
+ };
27
+
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
+ //#endregion
188
+ //#region packages/cli/src/utils/parse-args.ts
189
+ const parseArgs = (args, schema) => {
190
+ const parsed = {};
191
+ const positional = [];
192
+ for (let i = 0; i < args.length; i++) {
193
+ const arg = args[i];
194
+ if (!arg) continue;
195
+ if (arg.startsWith("--")) {
196
+ const key = arg.slice(2);
197
+ const nextArg = args[i + 1];
198
+ if (!nextArg || nextArg.startsWith("--")) parsed[key] = true;
199
+ else {
200
+ parsed[key] = nextArg;
201
+ i++;
202
+ }
203
+ } else positional.push(arg);
204
+ }
205
+ if (positional.length > 0) parsed._ = positional;
206
+ const result = schema.safeParse(parsed);
207
+ if (!result.success) return err(result.error.issues.map((e) => e.message).join(", "));
208
+ return ok(result.data);
209
+ };
210
+
211
+ //#endregion
212
+ //#region packages/cli/src/commands/codegen.ts
213
+ const parseCodegenArgs = (argv) => {
214
+ const parsed = parseArgs([...argv], CodegenArgsSchema);
215
+ if (!parsed.isOk()) return err({
216
+ code: "EMIT_FAILED",
217
+ message: parsed.error,
218
+ outPath: ""
219
+ });
220
+ const args = parsed.value;
221
+ if (args["emit-inject-template"]) return ok({
222
+ kind: "emitInjectTemplate",
223
+ outPath: args["emit-inject-template"],
224
+ format: args.format ?? "human"
225
+ });
226
+ const configResult = loadConfig(args.config);
227
+ if (configResult.isErr()) return err({
228
+ code: "EMIT_FAILED",
229
+ message: `Failed to load config: ${configResult.error.message}`,
230
+ outPath: ""
231
+ });
232
+ const config = configResult.value;
233
+ if (!config.schemas || Object.keys(config.schemas).length === 0) return err({
234
+ code: "EMIT_FAILED",
235
+ message: "schemas configuration is required in soda-gql.config.ts",
236
+ outPath: ""
237
+ });
238
+ const schemas = {};
239
+ const runtimeAdapters = {};
240
+ const scalars = {};
241
+ for (const [name, schemaConfig] of Object.entries(config.schemas)) {
242
+ schemas[name] = schemaConfig.schema;
243
+ runtimeAdapters[name] = schemaConfig.runtimeAdapter;
244
+ scalars[name] = schemaConfig.scalars;
245
+ }
246
+ return ok({
247
+ kind: "multi",
248
+ schemas,
249
+ outPath: resolve(config.outdir, "index.ts"),
250
+ format: args.format ?? "human",
251
+ runtimeAdapters,
252
+ scalars
253
+ });
254
+ };
255
+ const formatMultiSchemaSuccess = (format, success) => {
256
+ if (format === "json") return formatOutput(success, "json");
257
+ const schemaNames = Object.keys(success.schemas).join(", ");
258
+ return `Generated ${Object.values(success.schemas).reduce((sum, s) => {
259
+ return sum + s.objects;
260
+ }, 0)} objects from schemas: ${schemaNames}\n TypeScript: ${success.outPath}\n CommonJS: ${success.cjsPath}`;
261
+ };
262
+ const formatTemplateSuccess = (format, outPath) => {
263
+ if (format === "json") return formatOutput({ outPath }, "json");
264
+ return `Created inject template → ${outPath}`;
265
+ };
266
+ const formatCodegenError = (format, error) => {
267
+ if (format === "json") return formatError(error, "json");
268
+ return `${error.code}: ${"message" in error ? error.message : "Unknown error"}`;
269
+ };
270
+ const codegenCommand = async (argv) => {
271
+ try {
272
+ const parsed = parseCodegenArgs(argv);
273
+ if (parsed.isErr()) {
274
+ process.stderr.write(`${formatCodegenError("json", parsed.error)}\n`);
275
+ return 1;
276
+ }
277
+ const command = parsed.value;
278
+ if (command.kind === "emitInjectTemplate") {
279
+ const outPath = resolve(command.outPath);
280
+ const result$1 = writeInjectTemplate(outPath);
281
+ if (result$1.isErr()) {
282
+ process.stderr.write(`${formatCodegenError(command.format, result$1.error)}\n`);
283
+ return 1;
284
+ }
285
+ process.stdout.write(`${formatTemplateSuccess(command.format, outPath)}\n`);
286
+ return 0;
287
+ }
288
+ const result = await runMultiSchemaCodegen({
289
+ schemas: Object.fromEntries(Object.entries(command.schemas).map(([name, path]) => [name, resolve(path)])),
290
+ outPath: resolve(command.outPath),
291
+ format: command.format,
292
+ runtimeAdapters: Object.fromEntries(Object.entries(command.runtimeAdapters).map(([name, path]) => [name, resolve(path)])),
293
+ scalars: Object.fromEntries(Object.entries(command.scalars).map(([name, path]) => [name, resolve(path)]))
294
+ });
295
+ if (result.isErr()) {
296
+ process.stderr.write(`${formatCodegenError(command.format, result.error)}\n`);
297
+ return 1;
298
+ }
299
+ process.stdout.write(`${formatMultiSchemaSuccess(command.format, result.value)}\n`);
300
+ return 0;
301
+ } catch (error) {
302
+ const unexpectedError = {
303
+ code: "EMIT_FAILED",
304
+ message: error instanceof Error ? error.message : String(error),
305
+ outPath: ""
306
+ };
307
+ process.stderr.write(`${formatCodegenError("json", unexpectedError)}\n`);
308
+ return 1;
309
+ }
310
+ };
311
+
312
+ //#endregion
313
+ //#region packages/cli/src/index.ts
314
+ const dispatch = async (argv) => {
315
+ const [command, ...rest] = argv;
316
+ if (!command || command === "--help" || command === "-h") {
317
+ process.stdout.write(`Usage: soda-gql <command> [options]\n`);
318
+ process.stdout.write(`\nCommands:\n`);
319
+ process.stdout.write(` codegen Generate graphql-system runtime module\n`);
320
+ process.stdout.write(` builder Build GraphQL runtime artifacts from entry points\n`);
321
+ return 0;
322
+ }
323
+ if (command === "codegen") return codegenCommand(rest);
324
+ if (command === "builder") return builderCommand(rest);
325
+ process.stderr.write(`Unknown command: ${command}\n`);
326
+ return 1;
327
+ };
328
+ if (import.meta.main) dispatch(Bun.argv.slice(2)).then((exitCode) => {
329
+ process.exitCode = exitCode;
330
+ }).catch((error) => {
331
+ const unexpectedError = {
332
+ code: "UNEXPECTED_ERROR",
333
+ message: error instanceof Error ? error.message : String(error)
334
+ };
335
+ process.stderr.write(`${formatError(unexpectedError, "json")}\n`);
336
+ process.exitCode = 1;
337
+ });
338
+
339
+ //#endregion
340
+ export { dispatch };
341
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
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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"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@soda-gql/cli",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "private": false,
6
+ "license": "MIT",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "bin": {
11
+ "soda-gql": "./dist/index.js"
12
+ },
13
+ "author": {
14
+ "name": "Shota Hatada",
15
+ "email": "shota.hatada@whatasoda.me",
16
+ "url": "https://github.com/whatasoda"
17
+ },
18
+ "main": "./dist/index.js",
19
+ "module": "./dist/index.js",
20
+ "types": "./dist/index.d.ts",
21
+ "exports": {
22
+ ".": {
23
+ "development": "./src/index.ts",
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.cjs",
27
+ "default": "./dist/index.js"
28
+ },
29
+ "./package.json": "./package.json"
30
+ },
31
+ "dependencies": {
32
+ "@soda-gql/codegen": "0.0.1",
33
+ "@soda-gql/builder": "0.0.1",
34
+ "neverthrow": "^8.1.1",
35
+ "zod": "^4.1.11"
36
+ },
37
+ "devDependencies": {},
38
+ "peerDependencies": {}
39
+ }