@soda-gql/cli 0.0.4 → 0.0.6

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,21 +1,21 @@
1
1
  #!/usr/bin/env node
2
- import { resolve } from "node:path";
3
- import { runMultiSchemaCodegen, writeInjectTemplate } from "@soda-gql/codegen";
4
- import { loadConfig } from "@soda-gql/config";
5
- import { err, ok } from "neverthrow";
6
- import { z } from "zod";
2
+ let node_path = require("node:path");
3
+ let __soda_gql_codegen = require("@soda-gql/codegen");
4
+ let __soda_gql_config = require("@soda-gql/config");
5
+ let neverthrow = require("neverthrow");
6
+ let zod = require("zod");
7
7
 
8
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()
9
+ const CodegenArgsSchema = zod.z.object({
10
+ config: zod.z.string().optional(),
11
+ format: zod.z.enum(["human", "json"]).optional(),
12
+ "emit-inject-template": zod.z.string().optional()
13
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")
14
+ const BuilderArgsSchema = zod.z.object({
15
+ mode: zod.z.enum(["runtime", "zero-runtime"]),
16
+ entry: zod.z.string(),
17
+ out: zod.z.string(),
18
+ format: zod.z.enum(["human", "json"]).optional().default("human")
19
19
  });
20
20
 
21
21
  //#endregion
@@ -56,33 +56,33 @@ const parseArgs = (args, schema) => {
56
56
  }
57
57
  if (positional.length > 0) parsed._ = positional;
58
58
  const result = schema.safeParse(parsed);
59
- if (!result.success) return err(result.error.issues.map((e) => e.message).join(", "));
60
- return ok(result.data);
59
+ if (!result.success) return (0, neverthrow.err)(result.error.issues.map((e) => e.message).join(", "));
60
+ return (0, neverthrow.ok)(result.data);
61
61
  };
62
62
 
63
63
  //#endregion
64
64
  //#region packages/cli/src/commands/codegen.ts
65
65
  const parseCodegenArgs = (argv) => {
66
66
  const parsed = parseArgs([...argv], CodegenArgsSchema);
67
- if (!parsed.isOk()) return err({
67
+ if (!parsed.isOk()) return (0, neverthrow.err)({
68
68
  code: "EMIT_FAILED",
69
69
  message: parsed.error,
70
70
  outPath: ""
71
71
  });
72
72
  const args = parsed.value;
73
- if (args["emit-inject-template"]) return ok({
73
+ if (args["emit-inject-template"]) return (0, neverthrow.ok)({
74
74
  kind: "emitInjectTemplate",
75
75
  outPath: args["emit-inject-template"],
76
76
  format: args.format ?? "human"
77
77
  });
78
- const configResult = loadConfig(args.config);
79
- if (configResult.isErr()) return err({
78
+ const configResult = (0, __soda_gql_config.loadConfig)(args.config);
79
+ if (configResult.isErr()) return (0, neverthrow.err)({
80
80
  code: "EMIT_FAILED",
81
81
  message: `Failed to load config: ${configResult.error.message}`,
82
82
  outPath: ""
83
83
  });
84
84
  const config = configResult.value;
85
- if (!config.schemas || Object.keys(config.schemas).length === 0) return err({
85
+ if (!config.schemas || Object.keys(config.schemas).length === 0) return (0, neverthrow.err)({
86
86
  code: "EMIT_FAILED",
87
87
  message: "schemas configuration is required in soda-gql.config.ts",
88
88
  outPath: ""
@@ -95,10 +95,10 @@ const parseCodegenArgs = (argv) => {
95
95
  runtimeAdapters[name] = schemaConfig.runtimeAdapter;
96
96
  scalars[name] = schemaConfig.scalars;
97
97
  }
98
- return ok({
98
+ return (0, neverthrow.ok)({
99
99
  kind: "multi",
100
100
  schemas,
101
- outPath: resolve(config.outdir, "index.ts"),
101
+ outPath: (0, node_path.resolve)(config.outdir, "index.ts"),
102
102
  format: args.format ?? "human",
103
103
  runtimeAdapters,
104
104
  scalars
@@ -128,8 +128,8 @@ const codegenCommand = async (argv) => {
128
128
  }
129
129
  const command = parsed.value;
130
130
  if (command.kind === "emitInjectTemplate") {
131
- const outPath = resolve(command.outPath);
132
- const result$1 = writeInjectTemplate(outPath);
131
+ const outPath = (0, node_path.resolve)(command.outPath);
132
+ const result$1 = (0, __soda_gql_codegen.writeInjectTemplate)(outPath);
133
133
  if (result$1.isErr()) {
134
134
  process.stderr.write(`${formatCodegenError(command.format, result$1.error)}\n`);
135
135
  return 1;
@@ -137,12 +137,12 @@ const codegenCommand = async (argv) => {
137
137
  process.stdout.write(`${formatTemplateSuccess(command.format, outPath)}\n`);
138
138
  return 0;
139
139
  }
140
- const result = await runMultiSchemaCodegen({
141
- schemas: Object.fromEntries(Object.entries(command.schemas).map(([name, path]) => [name, resolve(path)])),
142
- outPath: resolve(command.outPath),
140
+ const result = await (0, __soda_gql_codegen.runMultiSchemaCodegen)({
141
+ schemas: Object.fromEntries(Object.entries(command.schemas).map(([name, path]) => [name, (0, node_path.resolve)(path)])),
142
+ outPath: (0, node_path.resolve)(command.outPath),
143
143
  format: command.format,
144
- runtimeAdapters: Object.fromEntries(Object.entries(command.runtimeAdapters).map(([name, path]) => [name, resolve(path)])),
145
- scalars: Object.fromEntries(Object.entries(command.scalars).map(([name, path]) => [name, resolve(path)]))
144
+ runtimeAdapters: Object.fromEntries(Object.entries(command.runtimeAdapters).map(([name, path]) => [name, (0, node_path.resolve)(path)])),
145
+ scalars: Object.fromEntries(Object.entries(command.scalars).map(([name, path]) => [name, (0, node_path.resolve)(path)]))
146
146
  });
147
147
  if (result.isErr()) {
148
148
  process.stderr.write(`${formatCodegenError(command.format, result.error)}\n`);
@@ -175,7 +175,7 @@ const dispatch = async (argv) => {
175
175
  process.stderr.write(`Unknown command: ${command}\n`);
176
176
  return 1;
177
177
  };
178
- if (import.meta.main) dispatch(Bun.argv.slice(2)).then((exitCode) => {
178
+ dispatch(process.argv.slice(2)).then((exitCode) => {
179
179
  process.exitCode = exitCode;
180
180
  }).catch((error) => {
181
181
  const unexpectedError = {
@@ -187,5 +187,4 @@ if (import.meta.main) dispatch(Bun.argv.slice(2)).then((exitCode) => {
187
187
  });
188
188
 
189
189
  //#endregion
190
- export { dispatch };
191
- //# sourceMappingURL=index.mjs.map
190
+ exports.dispatch = dispatch;
@@ -2,4 +2,4 @@
2
2
  declare const dispatch: (argv: readonly string[]) => Promise<number>;
3
3
  //#endregion
4
4
  export { dispatch };
5
- //# sourceMappingURL=index.d.mts.map
5
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAGM,uCAA4C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soda-gql/cli",
3
- "version": "0.0.4",
3
+ "version": "0.0.6",
4
4
  "type": "module",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -8,29 +8,28 @@
8
8
  "dist"
9
9
  ],
10
10
  "bin": {
11
- "soda-gql": "./dist/index.js"
11
+ "soda-gql": "./dist/index.cjs"
12
12
  },
13
13
  "author": {
14
14
  "name": "Shota Hatada",
15
15
  "email": "shota.hatada@whatasoda.me",
16
16
  "url": "https://github.com/whatasoda"
17
17
  },
18
- "main": "./dist/index.mjs",
19
- "module": "./dist/index.mjs",
20
- "types": "./dist/index.d.ts",
18
+ "main": "./dist/index.cjs",
19
+ "module": "./dist/index.cjs",
20
+ "types": "./dist/index.d.cts",
21
21
  "exports": {
22
22
  ".": {
23
23
  "development": "./src/index.ts",
24
- "types": "./dist/index.d.ts",
25
- "import": "./dist/index.mjs",
24
+ "types": "./dist/index.d.cts",
26
25
  "require": "./dist/index.cjs",
27
- "default": "./dist/index.mjs"
26
+ "default": "./dist/index.cjs"
28
27
  },
29
28
  "./package.json": "./package.json"
30
29
  },
31
30
  "dependencies": {
32
- "@soda-gql/codegen": "0.0.4",
33
- "@soda-gql/builder": "0.0.4",
31
+ "@soda-gql/codegen": "0.0.6",
32
+ "@soda-gql/builder": "0.0.6",
34
33
  "neverthrow": "^8.1.1",
35
34
  "zod": "^4.1.11"
36
35
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/index.ts"],"sourcesContent":[],"mappings":";cAGM,uCAA4C"}
@@ -1 +0,0 @@
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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"}