@soda-gql/config 0.12.0 → 0.12.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -47,7 +47,6 @@ let node_path = require("node:path");
47
47
  let node_module = require("node:module");
48
48
  let node_path_posix = require("node:path/posix");
49
49
  let node_vm = require("node:vm");
50
- let __swc_core = require("@swc/core");
51
50
 
52
51
  //#region packages/config/src/errors.ts
53
52
  const configError = ({ code, message, filePath, cause }) => ({
@@ -142,14 +141,28 @@ function validateConfig(config) {
142
141
 
143
142
  //#endregion
144
143
  //#region packages/config/src/evaluation.ts
144
+ /** Lazily resolve @swc/core from the config file's directory, falling back to package resolution. */
145
+ const resolveSwc = (configPath) => {
146
+ try {
147
+ const localRequire = (0, node_module.createRequire)(configPath);
148
+ return localRequire("@swc/core").transformSync;
149
+ } catch (primaryError) {
150
+ if (typeof require("url").pathToFileURL(__filename).href !== "string") {
151
+ throw primaryError;
152
+ }
153
+ const packageRequire = (0, node_module.createRequire)(require("url").pathToFileURL(__filename).href);
154
+ return packageRequire("@swc/core").transformSync;
155
+ }
156
+ };
145
157
  /**
146
158
  * Load and execute TypeScript config file synchronously using SWC + VM.
147
159
  */
148
160
  function executeConfigFile(configPath) {
149
161
  const filePath = (0, node_path_posix.resolve)(configPath);
150
162
  try {
163
+ const transformSync = resolveSwc(filePath);
151
164
  const source = (0, node_fs.readFileSync)(filePath, "utf-8");
152
- const result = (0, __swc_core.transformSync)(source, {
165
+ const result = transformSync(source, {
153
166
  filename: filePath,
154
167
  jsc: { parser: { syntax: "typescript" } },
155
168
  module: { type: "commonjs" },
@@ -189,9 +202,10 @@ function executeConfigFile(configPath) {
189
202
  }
190
203
  return (0, neverthrow.ok)(config);
191
204
  } catch (error) {
205
+ const message = error instanceof Error && error.message.includes("Cannot find module '@swc/core'") ? "@swc/core not found. Install it in your project: bun add -D @swc/core" : `Failed to load config: ${error instanceof Error ? error.message : String(error)}`;
192
206
  return (0, neverthrow.err)(configError({
193
207
  code: "CONFIG_LOAD_FAILED",
194
- message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,
208
+ message,
195
209
  filePath,
196
210
  cause: error
197
211
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["config: SodaGqlConfig","InjectConfigSchema: z.ZodType<InjectConfig>","z","SchemaInputSchema: z.ZodType<SchemaInput>","TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined>","mod: { exports: unknown }","require","configModule","Script","Result","resolved: ResolvedSodaGqlConfig","results: string[]","entries: string[]"],"sources":["../src/errors.ts","../src/helper.ts","../src/evaluation.ts","../src/normalize.ts","../src/loader.ts","../src/index.ts"],"sourcesContent":["export type ConfigErrorCode = \"CONFIG_NOT_FOUND\" | \"CONFIG_LOAD_FAILED\" | \"CONFIG_VALIDATION_FAILED\" | \"CONFIG_INVALID_PATH\";\n\nexport type ConfigError = {\n readonly code: ConfigErrorCode;\n readonly message: string;\n readonly filePath?: string;\n readonly cause?: unknown;\n};\n\nexport const configError = ({\n code,\n message,\n filePath,\n cause,\n}: {\n code: ConfigErrorCode;\n message: string;\n filePath?: string;\n cause?: unknown;\n}): ConfigError => ({\n code,\n message,\n filePath,\n cause,\n});\n","import { defineSchemaFor } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport z from \"zod\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n ArtifactConfig,\n CodegenConfig,\n GraphqlCompatConfig,\n InjectConfig,\n SchemaConfig,\n SchemaInput,\n SodaGqlConfig,\n StylesConfig,\n TypeFilterConfig,\n} from \"./types\";\n\n/**\n * Thin wrapper class to simplify the validation of exported value from config file.\n * As we use SWC + VM to execute the config file, the exported value is not typed.\n * This wrapper class ensures the exported value is a valid soda-gql config object.\n */\nexport class SodaGqlConfigContainer {\n private constructor(public readonly config: SodaGqlConfig) {}\n\n public static create(config: SodaGqlConfig): SodaGqlConfigContainer {\n return new SodaGqlConfigContainer(config);\n }\n}\n\n/**\n * Type-safe helper for defining soda-gql configuration.\n * Supports both static and dynamic (async) configs.\n *\n * @example Static config with object inject\n * ```ts\n * import { defineConfig } from \"@soda-gql/config\";\n *\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: { scalars: \"./scalars.ts\" },\n * },\n * },\n * });\n * ```\n *\n * @example Static config with string inject (single file)\n * ```ts\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: \"./inject.ts\", // exports scalar, adapter?\n * },\n * },\n * });\n * ```\n */\nexport function defineConfig(config: SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: () => SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: SodaGqlConfig | (() => SodaGqlConfig)): SodaGqlConfigContainer {\n const validated = validateConfig(typeof config === \"function\" ? config() : config);\n if (validated.isErr()) {\n throw validated.error;\n }\n return SodaGqlConfigContainer.create(validated.value);\n}\n\n// InjectConfig is a union type (string | object), so we define the schema directly\n// rather than using defineSchemaFor which requires object types\nconst InjectConfigSchema: z.ZodType<InjectConfig> = z.union([\n z.string().min(1),\n z.object({\n scalars: z.string().min(1),\n adapter: z.string().min(1).optional(),\n }),\n]);\n\n// SchemaInput supports string, array of strings, or function returning array of strings\n// Function return value validation is deferred to normalize time\nconst SchemaInputSchema: z.ZodType<SchemaInput> = z.union([\n z.string().min(1),\n z.array(z.string().min(1)).min(1),\n z.custom<() => readonly string[]>((val) => typeof val === \"function\"),\n]);\n\n// TypeCategory enum for type filtering\nconst TypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"union\", \"scalar\"]);\n\n// TypeFilterRule validates pattern and optional category\nconst TypeFilterRuleSchema = z.object({\n pattern: z.string().min(1),\n category: z.union([TypeCategorySchema, z.array(TypeCategorySchema).min(1)]).optional(),\n});\n\n// TypeFilterConfig supports function or object with exclude rules\n// Function signature validation is deferred to runtime (compileTypeFilter)\nconst TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined> = z\n .union([\n z.custom<TypeFilterConfig>((val) => typeof val === \"function\"),\n z.object({\n exclude: z.array(TypeFilterRuleSchema).min(1),\n }),\n ])\n .optional();\n\nconst SchemaConfigSchema = defineSchemaFor<SchemaConfig>()({\n schema: SchemaInputSchema,\n inject: InjectConfigSchema,\n defaultInputDepth: z.number().int().positive().max(10).optional(),\n inputDepthOverrides: z.record(z.string(), z.number().int().positive()).optional(),\n typeFilter: TypeFilterConfigSchema,\n});\n\nconst StylesConfigSchema = defineSchemaFor<StylesConfig>()({\n importExtension: z.boolean().optional(),\n});\n\nconst CodegenConfigSchema = defineSchemaFor<CodegenConfig>()({\n chunkSize: z.number().int().positive().optional(),\n});\n\nconst GraphqlCompatConfigSchema = defineSchemaFor<GraphqlCompatConfig>()({\n input: z.array(z.string().min(1)),\n schema: z.string().min(1).optional(),\n suffix: z.string().min(1).optional(),\n});\n\nconst ArtifactConfigSchema = defineSchemaFor<ArtifactConfig>()({\n path: z.string().min(1).optional(),\n});\n\nconst SodaGqlConfigSchema = defineSchemaFor<SodaGqlConfig>()({\n analyzer: z.enum([\"ts\", \"swc\"]).optional(),\n outdir: z.string().min(1),\n graphqlSystemAliases: z.array(z.string()).optional(),\n tsconfigPath: z.string().min(1).optional(),\n include: z.array(z.string().min(1)),\n exclude: z.array(z.string().min(1)).optional(),\n schemas: z.record(z.string(), SchemaConfigSchema),\n styles: StylesConfigSchema.optional(),\n codegen: CodegenConfigSchema.optional(),\n plugins: z.record(z.string(), z.unknown()).optional(),\n graphqlCompat: GraphqlCompatConfigSchema.optional(),\n artifact: ArtifactConfigSchema.optional(),\n});\n\nexport function validateConfig(config: unknown): Result<SodaGqlConfig, ConfigError> {\n const result = SodaGqlConfigSchema.safeParse(config);\n\n if (!result.success) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `Invalid config: ${result.error.message}`,\n }),\n );\n }\n\n return ok(result.data satisfies SodaGqlConfig);\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path/posix\";\nimport { Script } from \"node:vm\";\nimport { resolveRelativeImportWithExistenceCheck } from \"@soda-gql/common\";\nimport { transformSync } from \"@swc/core\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport { SodaGqlConfigContainer } from \"./helper\";\n// TODO: split config package into definition and evaluation parts\nimport * as configModule from \"./index\";\nimport type { SodaGqlConfig } from \"./types\";\n\n/**\n * Load and execute TypeScript config file synchronously using SWC + VM.\n */\nexport function executeConfigFile(configPath: string): Result<SodaGqlConfig, ConfigError> {\n const filePath = resolve(configPath);\n try {\n // Read the config file\n const source = readFileSync(filePath, \"utf-8\");\n\n // Transform TypeScript to CommonJS using SWC\n const result = transformSync(source, {\n filename: filePath,\n jsc: {\n parser: {\n syntax: \"typescript\",\n },\n },\n module: {\n type: \"commonjs\",\n },\n sourceMaps: false,\n minify: false,\n });\n\n // Create CommonJS context\n const mod: { exports: unknown } = { exports: {} };\n\n const requireInner = createRequire(filePath);\n const require = (specifier: string) => {\n if (specifier === \"@soda-gql/config\") {\n return configModule;\n }\n\n // Handle external modules normally\n if (!specifier.startsWith(\".\")) {\n return requireInner(specifier);\n }\n\n // Resolve relative imports with existence check\n const resolvedPath = resolveRelativeImportWithExistenceCheck({ filePath, specifier });\n if (!resolvedPath) {\n throw new Error(`Module not found: ${specifier}`);\n }\n return requireInner(resolvedPath);\n };\n\n // Execute in VM context\n new Script(result.code, { filename: filePath }).runInNewContext({\n require,\n module: mod,\n exports: mod.exports,\n __dirname: dirname(filePath),\n __filename: filePath,\n console,\n process,\n });\n\n const config =\n mod.exports &&\n typeof mod.exports === \"object\" &&\n \"default\" in mod.exports &&\n mod.exports.default instanceof SodaGqlConfigContainer\n ? mod.exports.default.config\n : null;\n\n if (!config) {\n throw new Error(\"Invalid config module\");\n }\n\n return ok(config);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: filePath,\n cause: error,\n }),\n );\n }\n}\n","import { dirname, resolve } from \"node:path\";\nimport { readTsconfigPaths } from \"@soda-gql/common\";\nimport { err, ok, Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n GraphqlCompatConfig,\n InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedInjectConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaInput,\n SodaGqlConfig,\n} from \"./types\";\n\n/**\n * Normalize schema input to resolved array form.\n * String is converted to single-element array.\n * Function is executed to get the array.\n * All paths are resolved relative to config directory.\n */\nfunction normalizeSchemaInput(schema: SchemaInput, configDir: string): Result<readonly string[], ConfigError> {\n // Execute function if provided\n const paths = typeof schema === \"function\" ? schema() : schema;\n // Normalize single string to array\n const pathArray = typeof paths === \"string\" ? [paths] : paths;\n\n // Runtime validation: empty array check\n if (pathArray.length === 0) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"Schema paths cannot be empty\",\n }),\n );\n }\n\n return ok(pathArray.map((p) => resolve(configDir, p)));\n}\n\n/**\n * Normalize inject config to resolved object form.\n * String form is converted to object with same path for all fields.\n */\nfunction normalizeInject(inject: InjectConfig, configDir: string): ResolvedInjectConfig {\n if (typeof inject === \"string\") {\n const resolvedPath = resolve(configDir, inject);\n return {\n scalars: resolvedPath,\n adapter: resolvedPath,\n };\n }\n return {\n scalars: resolve(configDir, inject.scalars),\n ...(inject.adapter ? { adapter: resolve(configDir, inject.adapter) } : {}),\n };\n}\n\n/**\n * Resolve a glob pattern relative to the config directory.\n * Handles negation patterns (e.g., \"!./path/to/exclude\") by preserving the \"!\" prefix.\n */\nfunction resolvePattern(pattern: string, configDir: string): string {\n if (pattern.startsWith(\"!\")) {\n // Preserve the negation prefix, resolve the rest\n return `!${resolve(configDir, pattern.slice(1))}`;\n }\n return resolve(configDir, pattern);\n}\n\n/**\n * Normalize artifact config to resolved form.\n * Returns undefined if no path is specified.\n */\nfunction normalizeArtifact(artifact: SodaGqlConfig[\"artifact\"], configDir: string): ResolvedArtifactConfig | undefined {\n if (!artifact?.path) {\n return undefined;\n }\n return {\n path: resolve(configDir, artifact.path),\n };\n}\n\n/**\n * Normalize tsconfig paths configuration.\n * Reads tsconfig.json and extracts paths if defined.\n * Returns undefined if no tsconfigPath is specified or no paths are defined.\n */\nfunction normalizeTsconfigPaths(\n tsconfigPath: string | undefined,\n configDir: string,\n): Result<ResolvedTsconfigPaths | undefined, ConfigError> {\n if (!tsconfigPath) {\n return ok(undefined);\n }\n\n const resolvedPath = resolve(configDir, tsconfigPath);\n const result = readTsconfigPaths(resolvedPath);\n\n if (result.isErr()) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: result.error.message,\n }),\n );\n }\n\n // Return undefined if no paths defined in tsconfig\n if (result.value === null) {\n return ok(undefined);\n }\n\n return ok(result.value);\n}\n\n/**\n * Normalize graphql-compat config to resolved form.\n * Resolves glob patterns and validates schema name.\n */\nfunction normalizeGraphqlCompat(\n graphqlCompat: GraphqlCompatConfig | undefined,\n schemaNames: readonly string[],\n configDir: string,\n): Result<ResolvedGraphqlCompatConfig | undefined, ConfigError> {\n if (!graphqlCompat) {\n return ok(undefined);\n }\n\n let schemaName = graphqlCompat.schema;\n if (!schemaName) {\n if (schemaNames.length !== 1 || !schemaNames[0]) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"graphqlCompat.schema is required when multiple schemas are configured\",\n }),\n );\n }\n schemaName = schemaNames[0];\n }\n\n if (!schemaNames.includes(schemaName)) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `graphqlCompat.schema \"${schemaName}\" not found in schemas config`,\n }),\n );\n }\n\n return ok({\n input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),\n schema: schemaName,\n suffix: graphqlCompat.suffix ?? \".compat.ts\",\n });\n}\n\n/**\n * Normalize codegen config to resolved form with defaults.\n */\nfunction normalizeCodegen(codegen: SodaGqlConfig[\"codegen\"]): ResolvedCodegenConfig {\n return {\n chunkSize: codegen?.chunkSize ?? 100,\n };\n}\n\n/**\n * Resolve and normalize config with defaults.\n * Paths in the config are resolved relative to the config file's directory.\n */\nexport function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configDir = dirname(configPath);\n // Default analyzer to \"ts\"\n const analyzer = config.analyzer ?? \"ts\";\n\n // Default graphqlSystemAliases to [\"@/graphql-system\"]\n const graphqlSystemAliases = config.graphqlSystemAliases ?? [\"@/graphql-system\"];\n\n // Default exclude to empty array\n const exclude = config.exclude ?? [];\n\n // Normalize artifact config (only if path is specified)\n const artifact = normalizeArtifact(config.artifact, configDir);\n\n // Normalize tsconfig paths (only if path is specified and paths exist)\n const tsconfigPathsResult = normalizeTsconfigPaths(config.tsconfigPath, configDir);\n if (tsconfigPathsResult.isErr()) {\n return err(tsconfigPathsResult.error);\n }\n const tsconfigPaths = tsconfigPathsResult.value;\n\n // Normalize schemas with error handling\n const schemaEntries = Object.entries(config.schemas).map(([name, schemaConfig]) =>\n normalizeSchemaInput(schemaConfig.schema, configDir).map(\n (schema) =>\n [\n name,\n {\n schema,\n inject: normalizeInject(schemaConfig.inject, configDir),\n defaultInputDepth: schemaConfig.defaultInputDepth ?? 3,\n inputDepthOverrides: schemaConfig.inputDepthOverrides ?? {},\n ...(schemaConfig.typeFilter ? { typeFilter: schemaConfig.typeFilter } : {}),\n },\n ] as const,\n ),\n );\n\n const combinedResult = Result.combine(schemaEntries);\n if (combinedResult.isErr()) {\n return err(combinedResult.error);\n }\n const normalizedSchemas = Object.fromEntries(combinedResult.value);\n\n // Normalize graphql-compat config\n const schemaNames = Object.keys(config.schemas);\n const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);\n if (graphqlCompatResult.isErr()) {\n return err(graphqlCompatResult.error);\n }\n const graphqlCompat = graphqlCompatResult.value;\n\n const resolved: ResolvedSodaGqlConfig = {\n analyzer,\n baseDir: configDir,\n outdir: resolve(configDir, config.outdir),\n graphqlSystemAliases,\n include: config.include.map((pattern) => resolvePattern(pattern, configDir)),\n exclude: exclude.map((pattern) => resolvePattern(pattern, configDir)),\n schemas: normalizedSchemas,\n styles: {\n importExtension: config.styles?.importExtension ?? false,\n },\n codegen: normalizeCodegen(config.codegen),\n plugins: config.plugins ?? {},\n ...(graphqlCompat ? { graphqlCompat } : {}),\n ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Result } from \"neverthrow\";\nimport { err } from \"neverthrow\";\nimport type { ConfigError } from \"./errors\";\nimport { configError } from \"./errors\";\nimport { executeConfigFile } from \"./evaluation\";\nimport { normalizeConfig } from \"./normalize\";\nimport type { ResolvedSodaGqlConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG_FILENAMES = [\n \"soda-gql.config.ts\",\n \"soda-gql.config.mts\",\n \"soda-gql.config.js\",\n \"soda-gql.config.mjs\",\n] as const;\n\n/**\n * Find config file by walking up directory tree.\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir;\n while (currentDir !== dirname(currentDir)) {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n currentDir = dirname(currentDir);\n }\n return null;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"dist\"]);\n\n/**\n * Find all config files by walking down from rootDir.\n * Discovers every soda-gql config file in the directory tree,\n * skipping node_modules, dist, and dot-prefixed directories.\n */\nexport function findAllConfigFiles(rootDir: string): readonly string[] {\n const results: string[] = [];\n\n const walk = (dir: string): void => {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(dir, filename);\n if (existsSync(configPath)) {\n results.push(configPath);\n break; // Only one config per directory\n }\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry) || entry.startsWith(\".\")) {\n continue;\n }\n const fullPath = join(dir, entry);\n try {\n if (statSync(fullPath).isDirectory()) {\n walk(fullPath);\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n };\n\n walk(rootDir);\n return results;\n}\n\n/**\n * Load config with Result type (for library use).\n */\nexport function loadConfig(configPath: string | undefined): Result<ResolvedSodaGqlConfig, ConfigError> {\n const resolvedPath = configPath ?? findConfigFile();\n\n if (!resolvedPath) {\n return err(configError({ code: \"CONFIG_NOT_FOUND\", message: \"Config file not found\" }));\n }\n\n try {\n const result = executeConfigFile(resolvedPath);\n if (result.isErr()) {\n return err(result.error);\n }\n return normalizeConfig(result.value, resolvedPath);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: resolvedPath,\n cause: error,\n }),\n );\n }\n}\n\n/**\n * Load config from specific directory.\n */\nexport function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configPath = findConfigFile(dir);\n return loadConfig(configPath ?? undefined);\n}\n","export type { ConfigError, ConfigErrorCode } from \"./errors\";\nexport { configError } from \"./errors\";\nexport {\n defineConfig,\n type SodaGqlConfigContainer,\n validateConfig,\n} from \"./helper\";\nexport { findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n GraphqlCompatConfig,\n PluginConfig,\n ResolvedArtifactConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaConfig,\n SodaGqlConfig,\n TypeCategory,\n TypeFilterConfig,\n TypeFilterRule,\n} from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["config: SodaGqlConfig","InjectConfigSchema: z.ZodType<InjectConfig>","z","SchemaInputSchema: z.ZodType<SchemaInput>","TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined>","mod: { exports: unknown }","require","configModule","Script","Result","resolved: ResolvedSodaGqlConfig","results: string[]","entries: string[]"],"sources":["../src/errors.ts","../src/helper.ts","../src/evaluation.ts","../src/normalize.ts","../src/loader.ts","../src/index.ts"],"sourcesContent":["export type ConfigErrorCode = \"CONFIG_NOT_FOUND\" | \"CONFIG_LOAD_FAILED\" | \"CONFIG_VALIDATION_FAILED\" | \"CONFIG_INVALID_PATH\";\n\nexport type ConfigError = {\n readonly code: ConfigErrorCode;\n readonly message: string;\n readonly filePath?: string;\n readonly cause?: unknown;\n};\n\nexport const configError = ({\n code,\n message,\n filePath,\n cause,\n}: {\n code: ConfigErrorCode;\n message: string;\n filePath?: string;\n cause?: unknown;\n}): ConfigError => ({\n code,\n message,\n filePath,\n cause,\n});\n","import { defineSchemaFor } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport z from \"zod\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n ArtifactConfig,\n CodegenConfig,\n GraphqlCompatConfig,\n InjectConfig,\n SchemaConfig,\n SchemaInput,\n SodaGqlConfig,\n StylesConfig,\n TypeFilterConfig,\n} from \"./types\";\n\n/**\n * Thin wrapper class to simplify the validation of exported value from config file.\n * As we use SWC + VM to execute the config file, the exported value is not typed.\n * This wrapper class ensures the exported value is a valid soda-gql config object.\n */\nexport class SodaGqlConfigContainer {\n private constructor(public readonly config: SodaGqlConfig) {}\n\n public static create(config: SodaGqlConfig): SodaGqlConfigContainer {\n return new SodaGqlConfigContainer(config);\n }\n}\n\n/**\n * Type-safe helper for defining soda-gql configuration.\n * Supports both static and dynamic (async) configs.\n *\n * @example Static config with object inject\n * ```ts\n * import { defineConfig } from \"@soda-gql/config\";\n *\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: { scalars: \"./scalars.ts\" },\n * },\n * },\n * });\n * ```\n *\n * @example Static config with string inject (single file)\n * ```ts\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: \"./inject.ts\", // exports scalar, adapter?\n * },\n * },\n * });\n * ```\n */\nexport function defineConfig(config: SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: () => SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: SodaGqlConfig | (() => SodaGqlConfig)): SodaGqlConfigContainer {\n const validated = validateConfig(typeof config === \"function\" ? config() : config);\n if (validated.isErr()) {\n throw validated.error;\n }\n return SodaGqlConfigContainer.create(validated.value);\n}\n\n// InjectConfig is a union type (string | object), so we define the schema directly\n// rather than using defineSchemaFor which requires object types\nconst InjectConfigSchema: z.ZodType<InjectConfig> = z.union([\n z.string().min(1),\n z.object({\n scalars: z.string().min(1),\n adapter: z.string().min(1).optional(),\n }),\n]);\n\n// SchemaInput supports string, array of strings, or function returning array of strings\n// Function return value validation is deferred to normalize time\nconst SchemaInputSchema: z.ZodType<SchemaInput> = z.union([\n z.string().min(1),\n z.array(z.string().min(1)).min(1),\n z.custom<() => readonly string[]>((val) => typeof val === \"function\"),\n]);\n\n// TypeCategory enum for type filtering\nconst TypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"union\", \"scalar\"]);\n\n// TypeFilterRule validates pattern and optional category\nconst TypeFilterRuleSchema = z.object({\n pattern: z.string().min(1),\n category: z.union([TypeCategorySchema, z.array(TypeCategorySchema).min(1)]).optional(),\n});\n\n// TypeFilterConfig supports function or object with exclude rules\n// Function signature validation is deferred to runtime (compileTypeFilter)\nconst TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined> = z\n .union([\n z.custom<TypeFilterConfig>((val) => typeof val === \"function\"),\n z.object({\n exclude: z.array(TypeFilterRuleSchema).min(1),\n }),\n ])\n .optional();\n\nconst SchemaConfigSchema = defineSchemaFor<SchemaConfig>()({\n schema: SchemaInputSchema,\n inject: InjectConfigSchema,\n defaultInputDepth: z.number().int().positive().max(10).optional(),\n inputDepthOverrides: z.record(z.string(), z.number().int().positive()).optional(),\n typeFilter: TypeFilterConfigSchema,\n});\n\nconst StylesConfigSchema = defineSchemaFor<StylesConfig>()({\n importExtension: z.boolean().optional(),\n});\n\nconst CodegenConfigSchema = defineSchemaFor<CodegenConfig>()({\n chunkSize: z.number().int().positive().optional(),\n});\n\nconst GraphqlCompatConfigSchema = defineSchemaFor<GraphqlCompatConfig>()({\n input: z.array(z.string().min(1)),\n schema: z.string().min(1).optional(),\n suffix: z.string().min(1).optional(),\n});\n\nconst ArtifactConfigSchema = defineSchemaFor<ArtifactConfig>()({\n path: z.string().min(1).optional(),\n});\n\nconst SodaGqlConfigSchema = defineSchemaFor<SodaGqlConfig>()({\n analyzer: z.enum([\"ts\", \"swc\"]).optional(),\n outdir: z.string().min(1),\n graphqlSystemAliases: z.array(z.string()).optional(),\n tsconfigPath: z.string().min(1).optional(),\n include: z.array(z.string().min(1)),\n exclude: z.array(z.string().min(1)).optional(),\n schemas: z.record(z.string(), SchemaConfigSchema),\n styles: StylesConfigSchema.optional(),\n codegen: CodegenConfigSchema.optional(),\n plugins: z.record(z.string(), z.unknown()).optional(),\n graphqlCompat: GraphqlCompatConfigSchema.optional(),\n artifact: ArtifactConfigSchema.optional(),\n});\n\nexport function validateConfig(config: unknown): Result<SodaGqlConfig, ConfigError> {\n const result = SodaGqlConfigSchema.safeParse(config);\n\n if (!result.success) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `Invalid config: ${result.error.message}`,\n }),\n );\n }\n\n return ok(result.data satisfies SodaGqlConfig);\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path/posix\";\nimport { Script } from \"node:vm\";\nimport { resolveRelativeImportWithExistenceCheck } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport { SodaGqlConfigContainer } from \"./helper\";\n// TODO: split config package into definition and evaluation parts\nimport * as configModule from \"./index\";\nimport type { SodaGqlConfig } from \"./types\";\n\ntype TransformSync = typeof import(\"@swc/core\").transformSync;\n\n/** Lazily resolve @swc/core from the config file's directory, falling back to package resolution. */\nconst resolveSwc = (configPath: string): TransformSync => {\n try {\n const localRequire = createRequire(configPath);\n return localRequire(\"@swc/core\").transformSync;\n } catch (primaryError) {\n // import.meta.url is undefined in CJS bundles (esbuild replaces import.meta with {})\n if (typeof import.meta.url !== \"string\") {\n throw primaryError;\n }\n // Fall back to package-level resolution (e.g., during tests or when user relies on bundled swc)\n const packageRequire = createRequire(import.meta.url);\n return packageRequire(\"@swc/core\").transformSync;\n }\n};\n\n/**\n * Load and execute TypeScript config file synchronously using SWC + VM.\n */\nexport function executeConfigFile(configPath: string): Result<SodaGqlConfig, ConfigError> {\n const filePath = resolve(configPath);\n try {\n const transformSync = resolveSwc(filePath);\n\n // Read the config file\n const source = readFileSync(filePath, \"utf-8\");\n\n // Transform TypeScript to CommonJS using SWC\n const result = transformSync(source, {\n filename: filePath,\n jsc: {\n parser: {\n syntax: \"typescript\",\n },\n },\n module: {\n type: \"commonjs\",\n },\n sourceMaps: false,\n minify: false,\n });\n\n // Create CommonJS context\n const mod: { exports: unknown } = { exports: {} };\n\n const requireInner = createRequire(filePath);\n const require = (specifier: string) => {\n if (specifier === \"@soda-gql/config\") {\n return configModule;\n }\n\n // Handle external modules normally\n if (!specifier.startsWith(\".\")) {\n return requireInner(specifier);\n }\n\n // Resolve relative imports with existence check\n const resolvedPath = resolveRelativeImportWithExistenceCheck({ filePath, specifier });\n if (!resolvedPath) {\n throw new Error(`Module not found: ${specifier}`);\n }\n return requireInner(resolvedPath);\n };\n\n // Execute in VM context\n new Script(result.code, { filename: filePath }).runInNewContext({\n require,\n module: mod,\n exports: mod.exports,\n __dirname: dirname(filePath),\n __filename: filePath,\n console,\n process,\n });\n\n const config =\n mod.exports &&\n typeof mod.exports === \"object\" &&\n \"default\" in mod.exports &&\n mod.exports.default instanceof SodaGqlConfigContainer\n ? mod.exports.default.config\n : null;\n\n if (!config) {\n throw new Error(\"Invalid config module\");\n }\n\n return ok(config);\n } catch (error) {\n const message =\n error instanceof Error && error.message.includes(\"Cannot find module '@swc/core'\")\n ? \"@swc/core not found. Install it in your project: bun add -D @swc/core\"\n : `Failed to load config: ${error instanceof Error ? error.message : String(error)}`;\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message,\n filePath: filePath,\n cause: error,\n }),\n );\n }\n}\n","import { dirname, resolve } from \"node:path\";\nimport { readTsconfigPaths } from \"@soda-gql/common\";\nimport { err, ok, Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n GraphqlCompatConfig,\n InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedInjectConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaInput,\n SodaGqlConfig,\n} from \"./types\";\n\n/**\n * Normalize schema input to resolved array form.\n * String is converted to single-element array.\n * Function is executed to get the array.\n * All paths are resolved relative to config directory.\n */\nfunction normalizeSchemaInput(schema: SchemaInput, configDir: string): Result<readonly string[], ConfigError> {\n // Execute function if provided\n const paths = typeof schema === \"function\" ? schema() : schema;\n // Normalize single string to array\n const pathArray = typeof paths === \"string\" ? [paths] : paths;\n\n // Runtime validation: empty array check\n if (pathArray.length === 0) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"Schema paths cannot be empty\",\n }),\n );\n }\n\n return ok(pathArray.map((p) => resolve(configDir, p)));\n}\n\n/**\n * Normalize inject config to resolved object form.\n * String form is converted to object with same path for all fields.\n */\nfunction normalizeInject(inject: InjectConfig, configDir: string): ResolvedInjectConfig {\n if (typeof inject === \"string\") {\n const resolvedPath = resolve(configDir, inject);\n return {\n scalars: resolvedPath,\n adapter: resolvedPath,\n };\n }\n return {\n scalars: resolve(configDir, inject.scalars),\n ...(inject.adapter ? { adapter: resolve(configDir, inject.adapter) } : {}),\n };\n}\n\n/**\n * Resolve a glob pattern relative to the config directory.\n * Handles negation patterns (e.g., \"!./path/to/exclude\") by preserving the \"!\" prefix.\n */\nfunction resolvePattern(pattern: string, configDir: string): string {\n if (pattern.startsWith(\"!\")) {\n // Preserve the negation prefix, resolve the rest\n return `!${resolve(configDir, pattern.slice(1))}`;\n }\n return resolve(configDir, pattern);\n}\n\n/**\n * Normalize artifact config to resolved form.\n * Returns undefined if no path is specified.\n */\nfunction normalizeArtifact(artifact: SodaGqlConfig[\"artifact\"], configDir: string): ResolvedArtifactConfig | undefined {\n if (!artifact?.path) {\n return undefined;\n }\n return {\n path: resolve(configDir, artifact.path),\n };\n}\n\n/**\n * Normalize tsconfig paths configuration.\n * Reads tsconfig.json and extracts paths if defined.\n * Returns undefined if no tsconfigPath is specified or no paths are defined.\n */\nfunction normalizeTsconfigPaths(\n tsconfigPath: string | undefined,\n configDir: string,\n): Result<ResolvedTsconfigPaths | undefined, ConfigError> {\n if (!tsconfigPath) {\n return ok(undefined);\n }\n\n const resolvedPath = resolve(configDir, tsconfigPath);\n const result = readTsconfigPaths(resolvedPath);\n\n if (result.isErr()) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: result.error.message,\n }),\n );\n }\n\n // Return undefined if no paths defined in tsconfig\n if (result.value === null) {\n return ok(undefined);\n }\n\n return ok(result.value);\n}\n\n/**\n * Normalize graphql-compat config to resolved form.\n * Resolves glob patterns and validates schema name.\n */\nfunction normalizeGraphqlCompat(\n graphqlCompat: GraphqlCompatConfig | undefined,\n schemaNames: readonly string[],\n configDir: string,\n): Result<ResolvedGraphqlCompatConfig | undefined, ConfigError> {\n if (!graphqlCompat) {\n return ok(undefined);\n }\n\n let schemaName = graphqlCompat.schema;\n if (!schemaName) {\n if (schemaNames.length !== 1 || !schemaNames[0]) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"graphqlCompat.schema is required when multiple schemas are configured\",\n }),\n );\n }\n schemaName = schemaNames[0];\n }\n\n if (!schemaNames.includes(schemaName)) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `graphqlCompat.schema \"${schemaName}\" not found in schemas config`,\n }),\n );\n }\n\n return ok({\n input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),\n schema: schemaName,\n suffix: graphqlCompat.suffix ?? \".compat.ts\",\n });\n}\n\n/**\n * Normalize codegen config to resolved form with defaults.\n */\nfunction normalizeCodegen(codegen: SodaGqlConfig[\"codegen\"]): ResolvedCodegenConfig {\n return {\n chunkSize: codegen?.chunkSize ?? 100,\n };\n}\n\n/**\n * Resolve and normalize config with defaults.\n * Paths in the config are resolved relative to the config file's directory.\n */\nexport function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configDir = dirname(configPath);\n // Default analyzer to \"ts\"\n const analyzer = config.analyzer ?? \"ts\";\n\n // Default graphqlSystemAliases to [\"@/graphql-system\"]\n const graphqlSystemAliases = config.graphqlSystemAliases ?? [\"@/graphql-system\"];\n\n // Default exclude to empty array\n const exclude = config.exclude ?? [];\n\n // Normalize artifact config (only if path is specified)\n const artifact = normalizeArtifact(config.artifact, configDir);\n\n // Normalize tsconfig paths (only if path is specified and paths exist)\n const tsconfigPathsResult = normalizeTsconfigPaths(config.tsconfigPath, configDir);\n if (tsconfigPathsResult.isErr()) {\n return err(tsconfigPathsResult.error);\n }\n const tsconfigPaths = tsconfigPathsResult.value;\n\n // Normalize schemas with error handling\n const schemaEntries = Object.entries(config.schemas).map(([name, schemaConfig]) =>\n normalizeSchemaInput(schemaConfig.schema, configDir).map(\n (schema) =>\n [\n name,\n {\n schema,\n inject: normalizeInject(schemaConfig.inject, configDir),\n defaultInputDepth: schemaConfig.defaultInputDepth ?? 3,\n inputDepthOverrides: schemaConfig.inputDepthOverrides ?? {},\n ...(schemaConfig.typeFilter ? { typeFilter: schemaConfig.typeFilter } : {}),\n },\n ] as const,\n ),\n );\n\n const combinedResult = Result.combine(schemaEntries);\n if (combinedResult.isErr()) {\n return err(combinedResult.error);\n }\n const normalizedSchemas = Object.fromEntries(combinedResult.value);\n\n // Normalize graphql-compat config\n const schemaNames = Object.keys(config.schemas);\n const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);\n if (graphqlCompatResult.isErr()) {\n return err(graphqlCompatResult.error);\n }\n const graphqlCompat = graphqlCompatResult.value;\n\n const resolved: ResolvedSodaGqlConfig = {\n analyzer,\n baseDir: configDir,\n outdir: resolve(configDir, config.outdir),\n graphqlSystemAliases,\n include: config.include.map((pattern) => resolvePattern(pattern, configDir)),\n exclude: exclude.map((pattern) => resolvePattern(pattern, configDir)),\n schemas: normalizedSchemas,\n styles: {\n importExtension: config.styles?.importExtension ?? false,\n },\n codegen: normalizeCodegen(config.codegen),\n plugins: config.plugins ?? {},\n ...(graphqlCompat ? { graphqlCompat } : {}),\n ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Result } from \"neverthrow\";\nimport { err } from \"neverthrow\";\nimport type { ConfigError } from \"./errors\";\nimport { configError } from \"./errors\";\nimport { executeConfigFile } from \"./evaluation\";\nimport { normalizeConfig } from \"./normalize\";\nimport type { ResolvedSodaGqlConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG_FILENAMES = [\n \"soda-gql.config.ts\",\n \"soda-gql.config.mts\",\n \"soda-gql.config.js\",\n \"soda-gql.config.mjs\",\n] as const;\n\n/**\n * Find config file by walking up directory tree.\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir;\n while (currentDir !== dirname(currentDir)) {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n currentDir = dirname(currentDir);\n }\n return null;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"dist\"]);\n\n/**\n * Find all config files by walking down from rootDir.\n * Discovers every soda-gql config file in the directory tree,\n * skipping node_modules, dist, and dot-prefixed directories.\n */\nexport function findAllConfigFiles(rootDir: string): readonly string[] {\n const results: string[] = [];\n\n const walk = (dir: string): void => {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(dir, filename);\n if (existsSync(configPath)) {\n results.push(configPath);\n break; // Only one config per directory\n }\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry) || entry.startsWith(\".\")) {\n continue;\n }\n const fullPath = join(dir, entry);\n try {\n if (statSync(fullPath).isDirectory()) {\n walk(fullPath);\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n };\n\n walk(rootDir);\n return results;\n}\n\n/**\n * Load config with Result type (for library use).\n */\nexport function loadConfig(configPath: string | undefined): Result<ResolvedSodaGqlConfig, ConfigError> {\n const resolvedPath = configPath ?? findConfigFile();\n\n if (!resolvedPath) {\n return err(configError({ code: \"CONFIG_NOT_FOUND\", message: \"Config file not found\" }));\n }\n\n try {\n const result = executeConfigFile(resolvedPath);\n if (result.isErr()) {\n return err(result.error);\n }\n return normalizeConfig(result.value, resolvedPath);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: resolvedPath,\n cause: error,\n }),\n );\n }\n}\n\n/**\n * Load config from specific directory.\n */\nexport function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configPath = findConfigFile(dir);\n return loadConfig(configPath ?? undefined);\n}\n","export type { ConfigError, ConfigErrorCode } from \"./errors\";\nexport { configError } from \"./errors\";\nexport {\n defineConfig,\n type SodaGqlConfigContainer,\n validateConfig,\n} from \"./helper\";\nexport { findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n GraphqlCompatConfig,\n PluginConfig,\n ResolvedArtifactConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaConfig,\n SodaGqlConfig,\n TypeCategory,\n TypeFilterConfig,\n TypeFilterRule,\n} from \"./types\";\n"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -6,7 +6,6 @@ import { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
6
6
  import { dirname, join, resolve } from "node:path";
7
7
  import { dirname as dirname$1, resolve as resolve$1 } from "node:path/posix";
8
8
  import { Script } from "node:vm";
9
- import { transformSync } from "@swc/core";
10
9
 
11
10
  //#region rolldown:runtime
12
11
  var __defProp = Object.defineProperty;
@@ -118,12 +117,26 @@ function validateConfig(config) {
118
117
 
119
118
  //#endregion
120
119
  //#region packages/config/src/evaluation.ts
120
+ /** Lazily resolve @swc/core from the config file's directory, falling back to package resolution. */
121
+ const resolveSwc = (configPath) => {
122
+ try {
123
+ const localRequire = createRequire(configPath);
124
+ return localRequire("@swc/core").transformSync;
125
+ } catch (primaryError) {
126
+ if (typeof import.meta.url !== "string") {
127
+ throw primaryError;
128
+ }
129
+ const packageRequire = createRequire(import.meta.url);
130
+ return packageRequire("@swc/core").transformSync;
131
+ }
132
+ };
121
133
  /**
122
134
  * Load and execute TypeScript config file synchronously using SWC + VM.
123
135
  */
124
136
  function executeConfigFile(configPath) {
125
137
  const filePath = resolve$1(configPath);
126
138
  try {
139
+ const transformSync = resolveSwc(filePath);
127
140
  const source = readFileSync(filePath, "utf-8");
128
141
  const result = transformSync(source, {
129
142
  filename: filePath,
@@ -165,9 +178,10 @@ function executeConfigFile(configPath) {
165
178
  }
166
179
  return ok(config);
167
180
  } catch (error) {
181
+ const message = error instanceof Error && error.message.includes("Cannot find module '@swc/core'") ? "@swc/core not found. Install it in your project: bun add -D @swc/core" : `Failed to load config: ${error instanceof Error ? error.message : String(error)}`;
168
182
  return err(configError({
169
183
  code: "CONFIG_LOAD_FAILED",
170
- message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,
184
+ message,
171
185
  filePath,
172
186
  cause: error
173
187
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["config: SodaGqlConfig","InjectConfigSchema: z.ZodType<InjectConfig>","SchemaInputSchema: z.ZodType<SchemaInput>","TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined>","resolve","mod: { exports: unknown }","configModule","dirname","resolved: ResolvedSodaGqlConfig","results: string[]","entries: string[]"],"sources":["../src/errors.ts","../src/helper.ts","../src/evaluation.ts","../src/normalize.ts","../src/loader.ts","../src/index.ts"],"sourcesContent":["export type ConfigErrorCode = \"CONFIG_NOT_FOUND\" | \"CONFIG_LOAD_FAILED\" | \"CONFIG_VALIDATION_FAILED\" | \"CONFIG_INVALID_PATH\";\n\nexport type ConfigError = {\n readonly code: ConfigErrorCode;\n readonly message: string;\n readonly filePath?: string;\n readonly cause?: unknown;\n};\n\nexport const configError = ({\n code,\n message,\n filePath,\n cause,\n}: {\n code: ConfigErrorCode;\n message: string;\n filePath?: string;\n cause?: unknown;\n}): ConfigError => ({\n code,\n message,\n filePath,\n cause,\n});\n","import { defineSchemaFor } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport z from \"zod\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n ArtifactConfig,\n CodegenConfig,\n GraphqlCompatConfig,\n InjectConfig,\n SchemaConfig,\n SchemaInput,\n SodaGqlConfig,\n StylesConfig,\n TypeFilterConfig,\n} from \"./types\";\n\n/**\n * Thin wrapper class to simplify the validation of exported value from config file.\n * As we use SWC + VM to execute the config file, the exported value is not typed.\n * This wrapper class ensures the exported value is a valid soda-gql config object.\n */\nexport class SodaGqlConfigContainer {\n private constructor(public readonly config: SodaGqlConfig) {}\n\n public static create(config: SodaGqlConfig): SodaGqlConfigContainer {\n return new SodaGqlConfigContainer(config);\n }\n}\n\n/**\n * Type-safe helper for defining soda-gql configuration.\n * Supports both static and dynamic (async) configs.\n *\n * @example Static config with object inject\n * ```ts\n * import { defineConfig } from \"@soda-gql/config\";\n *\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: { scalars: \"./scalars.ts\" },\n * },\n * },\n * });\n * ```\n *\n * @example Static config with string inject (single file)\n * ```ts\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: \"./inject.ts\", // exports scalar, adapter?\n * },\n * },\n * });\n * ```\n */\nexport function defineConfig(config: SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: () => SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: SodaGqlConfig | (() => SodaGqlConfig)): SodaGqlConfigContainer {\n const validated = validateConfig(typeof config === \"function\" ? config() : config);\n if (validated.isErr()) {\n throw validated.error;\n }\n return SodaGqlConfigContainer.create(validated.value);\n}\n\n// InjectConfig is a union type (string | object), so we define the schema directly\n// rather than using defineSchemaFor which requires object types\nconst InjectConfigSchema: z.ZodType<InjectConfig> = z.union([\n z.string().min(1),\n z.object({\n scalars: z.string().min(1),\n adapter: z.string().min(1).optional(),\n }),\n]);\n\n// SchemaInput supports string, array of strings, or function returning array of strings\n// Function return value validation is deferred to normalize time\nconst SchemaInputSchema: z.ZodType<SchemaInput> = z.union([\n z.string().min(1),\n z.array(z.string().min(1)).min(1),\n z.custom<() => readonly string[]>((val) => typeof val === \"function\"),\n]);\n\n// TypeCategory enum for type filtering\nconst TypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"union\", \"scalar\"]);\n\n// TypeFilterRule validates pattern and optional category\nconst TypeFilterRuleSchema = z.object({\n pattern: z.string().min(1),\n category: z.union([TypeCategorySchema, z.array(TypeCategorySchema).min(1)]).optional(),\n});\n\n// TypeFilterConfig supports function or object with exclude rules\n// Function signature validation is deferred to runtime (compileTypeFilter)\nconst TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined> = z\n .union([\n z.custom<TypeFilterConfig>((val) => typeof val === \"function\"),\n z.object({\n exclude: z.array(TypeFilterRuleSchema).min(1),\n }),\n ])\n .optional();\n\nconst SchemaConfigSchema = defineSchemaFor<SchemaConfig>()({\n schema: SchemaInputSchema,\n inject: InjectConfigSchema,\n defaultInputDepth: z.number().int().positive().max(10).optional(),\n inputDepthOverrides: z.record(z.string(), z.number().int().positive()).optional(),\n typeFilter: TypeFilterConfigSchema,\n});\n\nconst StylesConfigSchema = defineSchemaFor<StylesConfig>()({\n importExtension: z.boolean().optional(),\n});\n\nconst CodegenConfigSchema = defineSchemaFor<CodegenConfig>()({\n chunkSize: z.number().int().positive().optional(),\n});\n\nconst GraphqlCompatConfigSchema = defineSchemaFor<GraphqlCompatConfig>()({\n input: z.array(z.string().min(1)),\n schema: z.string().min(1).optional(),\n suffix: z.string().min(1).optional(),\n});\n\nconst ArtifactConfigSchema = defineSchemaFor<ArtifactConfig>()({\n path: z.string().min(1).optional(),\n});\n\nconst SodaGqlConfigSchema = defineSchemaFor<SodaGqlConfig>()({\n analyzer: z.enum([\"ts\", \"swc\"]).optional(),\n outdir: z.string().min(1),\n graphqlSystemAliases: z.array(z.string()).optional(),\n tsconfigPath: z.string().min(1).optional(),\n include: z.array(z.string().min(1)),\n exclude: z.array(z.string().min(1)).optional(),\n schemas: z.record(z.string(), SchemaConfigSchema),\n styles: StylesConfigSchema.optional(),\n codegen: CodegenConfigSchema.optional(),\n plugins: z.record(z.string(), z.unknown()).optional(),\n graphqlCompat: GraphqlCompatConfigSchema.optional(),\n artifact: ArtifactConfigSchema.optional(),\n});\n\nexport function validateConfig(config: unknown): Result<SodaGqlConfig, ConfigError> {\n const result = SodaGqlConfigSchema.safeParse(config);\n\n if (!result.success) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `Invalid config: ${result.error.message}`,\n }),\n );\n }\n\n return ok(result.data satisfies SodaGqlConfig);\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path/posix\";\nimport { Script } from \"node:vm\";\nimport { resolveRelativeImportWithExistenceCheck } from \"@soda-gql/common\";\nimport { transformSync } from \"@swc/core\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport { SodaGqlConfigContainer } from \"./helper\";\n// TODO: split config package into definition and evaluation parts\nimport * as configModule from \"./index\";\nimport type { SodaGqlConfig } from \"./types\";\n\n/**\n * Load and execute TypeScript config file synchronously using SWC + VM.\n */\nexport function executeConfigFile(configPath: string): Result<SodaGqlConfig, ConfigError> {\n const filePath = resolve(configPath);\n try {\n // Read the config file\n const source = readFileSync(filePath, \"utf-8\");\n\n // Transform TypeScript to CommonJS using SWC\n const result = transformSync(source, {\n filename: filePath,\n jsc: {\n parser: {\n syntax: \"typescript\",\n },\n },\n module: {\n type: \"commonjs\",\n },\n sourceMaps: false,\n minify: false,\n });\n\n // Create CommonJS context\n const mod: { exports: unknown } = { exports: {} };\n\n const requireInner = createRequire(filePath);\n const require = (specifier: string) => {\n if (specifier === \"@soda-gql/config\") {\n return configModule;\n }\n\n // Handle external modules normally\n if (!specifier.startsWith(\".\")) {\n return requireInner(specifier);\n }\n\n // Resolve relative imports with existence check\n const resolvedPath = resolveRelativeImportWithExistenceCheck({ filePath, specifier });\n if (!resolvedPath) {\n throw new Error(`Module not found: ${specifier}`);\n }\n return requireInner(resolvedPath);\n };\n\n // Execute in VM context\n new Script(result.code, { filename: filePath }).runInNewContext({\n require,\n module: mod,\n exports: mod.exports,\n __dirname: dirname(filePath),\n __filename: filePath,\n console,\n process,\n });\n\n const config =\n mod.exports &&\n typeof mod.exports === \"object\" &&\n \"default\" in mod.exports &&\n mod.exports.default instanceof SodaGqlConfigContainer\n ? mod.exports.default.config\n : null;\n\n if (!config) {\n throw new Error(\"Invalid config module\");\n }\n\n return ok(config);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: filePath,\n cause: error,\n }),\n );\n }\n}\n","import { dirname, resolve } from \"node:path\";\nimport { readTsconfigPaths } from \"@soda-gql/common\";\nimport { err, ok, Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n GraphqlCompatConfig,\n InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedInjectConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaInput,\n SodaGqlConfig,\n} from \"./types\";\n\n/**\n * Normalize schema input to resolved array form.\n * String is converted to single-element array.\n * Function is executed to get the array.\n * All paths are resolved relative to config directory.\n */\nfunction normalizeSchemaInput(schema: SchemaInput, configDir: string): Result<readonly string[], ConfigError> {\n // Execute function if provided\n const paths = typeof schema === \"function\" ? schema() : schema;\n // Normalize single string to array\n const pathArray = typeof paths === \"string\" ? [paths] : paths;\n\n // Runtime validation: empty array check\n if (pathArray.length === 0) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"Schema paths cannot be empty\",\n }),\n );\n }\n\n return ok(pathArray.map((p) => resolve(configDir, p)));\n}\n\n/**\n * Normalize inject config to resolved object form.\n * String form is converted to object with same path for all fields.\n */\nfunction normalizeInject(inject: InjectConfig, configDir: string): ResolvedInjectConfig {\n if (typeof inject === \"string\") {\n const resolvedPath = resolve(configDir, inject);\n return {\n scalars: resolvedPath,\n adapter: resolvedPath,\n };\n }\n return {\n scalars: resolve(configDir, inject.scalars),\n ...(inject.adapter ? { adapter: resolve(configDir, inject.adapter) } : {}),\n };\n}\n\n/**\n * Resolve a glob pattern relative to the config directory.\n * Handles negation patterns (e.g., \"!./path/to/exclude\") by preserving the \"!\" prefix.\n */\nfunction resolvePattern(pattern: string, configDir: string): string {\n if (pattern.startsWith(\"!\")) {\n // Preserve the negation prefix, resolve the rest\n return `!${resolve(configDir, pattern.slice(1))}`;\n }\n return resolve(configDir, pattern);\n}\n\n/**\n * Normalize artifact config to resolved form.\n * Returns undefined if no path is specified.\n */\nfunction normalizeArtifact(artifact: SodaGqlConfig[\"artifact\"], configDir: string): ResolvedArtifactConfig | undefined {\n if (!artifact?.path) {\n return undefined;\n }\n return {\n path: resolve(configDir, artifact.path),\n };\n}\n\n/**\n * Normalize tsconfig paths configuration.\n * Reads tsconfig.json and extracts paths if defined.\n * Returns undefined if no tsconfigPath is specified or no paths are defined.\n */\nfunction normalizeTsconfigPaths(\n tsconfigPath: string | undefined,\n configDir: string,\n): Result<ResolvedTsconfigPaths | undefined, ConfigError> {\n if (!tsconfigPath) {\n return ok(undefined);\n }\n\n const resolvedPath = resolve(configDir, tsconfigPath);\n const result = readTsconfigPaths(resolvedPath);\n\n if (result.isErr()) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: result.error.message,\n }),\n );\n }\n\n // Return undefined if no paths defined in tsconfig\n if (result.value === null) {\n return ok(undefined);\n }\n\n return ok(result.value);\n}\n\n/**\n * Normalize graphql-compat config to resolved form.\n * Resolves glob patterns and validates schema name.\n */\nfunction normalizeGraphqlCompat(\n graphqlCompat: GraphqlCompatConfig | undefined,\n schemaNames: readonly string[],\n configDir: string,\n): Result<ResolvedGraphqlCompatConfig | undefined, ConfigError> {\n if (!graphqlCompat) {\n return ok(undefined);\n }\n\n let schemaName = graphqlCompat.schema;\n if (!schemaName) {\n if (schemaNames.length !== 1 || !schemaNames[0]) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"graphqlCompat.schema is required when multiple schemas are configured\",\n }),\n );\n }\n schemaName = schemaNames[0];\n }\n\n if (!schemaNames.includes(schemaName)) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `graphqlCompat.schema \"${schemaName}\" not found in schemas config`,\n }),\n );\n }\n\n return ok({\n input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),\n schema: schemaName,\n suffix: graphqlCompat.suffix ?? \".compat.ts\",\n });\n}\n\n/**\n * Normalize codegen config to resolved form with defaults.\n */\nfunction normalizeCodegen(codegen: SodaGqlConfig[\"codegen\"]): ResolvedCodegenConfig {\n return {\n chunkSize: codegen?.chunkSize ?? 100,\n };\n}\n\n/**\n * Resolve and normalize config with defaults.\n * Paths in the config are resolved relative to the config file's directory.\n */\nexport function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configDir = dirname(configPath);\n // Default analyzer to \"ts\"\n const analyzer = config.analyzer ?? \"ts\";\n\n // Default graphqlSystemAliases to [\"@/graphql-system\"]\n const graphqlSystemAliases = config.graphqlSystemAliases ?? [\"@/graphql-system\"];\n\n // Default exclude to empty array\n const exclude = config.exclude ?? [];\n\n // Normalize artifact config (only if path is specified)\n const artifact = normalizeArtifact(config.artifact, configDir);\n\n // Normalize tsconfig paths (only if path is specified and paths exist)\n const tsconfigPathsResult = normalizeTsconfigPaths(config.tsconfigPath, configDir);\n if (tsconfigPathsResult.isErr()) {\n return err(tsconfigPathsResult.error);\n }\n const tsconfigPaths = tsconfigPathsResult.value;\n\n // Normalize schemas with error handling\n const schemaEntries = Object.entries(config.schemas).map(([name, schemaConfig]) =>\n normalizeSchemaInput(schemaConfig.schema, configDir).map(\n (schema) =>\n [\n name,\n {\n schema,\n inject: normalizeInject(schemaConfig.inject, configDir),\n defaultInputDepth: schemaConfig.defaultInputDepth ?? 3,\n inputDepthOverrides: schemaConfig.inputDepthOverrides ?? {},\n ...(schemaConfig.typeFilter ? { typeFilter: schemaConfig.typeFilter } : {}),\n },\n ] as const,\n ),\n );\n\n const combinedResult = Result.combine(schemaEntries);\n if (combinedResult.isErr()) {\n return err(combinedResult.error);\n }\n const normalizedSchemas = Object.fromEntries(combinedResult.value);\n\n // Normalize graphql-compat config\n const schemaNames = Object.keys(config.schemas);\n const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);\n if (graphqlCompatResult.isErr()) {\n return err(graphqlCompatResult.error);\n }\n const graphqlCompat = graphqlCompatResult.value;\n\n const resolved: ResolvedSodaGqlConfig = {\n analyzer,\n baseDir: configDir,\n outdir: resolve(configDir, config.outdir),\n graphqlSystemAliases,\n include: config.include.map((pattern) => resolvePattern(pattern, configDir)),\n exclude: exclude.map((pattern) => resolvePattern(pattern, configDir)),\n schemas: normalizedSchemas,\n styles: {\n importExtension: config.styles?.importExtension ?? false,\n },\n codegen: normalizeCodegen(config.codegen),\n plugins: config.plugins ?? {},\n ...(graphqlCompat ? { graphqlCompat } : {}),\n ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Result } from \"neverthrow\";\nimport { err } from \"neverthrow\";\nimport type { ConfigError } from \"./errors\";\nimport { configError } from \"./errors\";\nimport { executeConfigFile } from \"./evaluation\";\nimport { normalizeConfig } from \"./normalize\";\nimport type { ResolvedSodaGqlConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG_FILENAMES = [\n \"soda-gql.config.ts\",\n \"soda-gql.config.mts\",\n \"soda-gql.config.js\",\n \"soda-gql.config.mjs\",\n] as const;\n\n/**\n * Find config file by walking up directory tree.\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir;\n while (currentDir !== dirname(currentDir)) {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n currentDir = dirname(currentDir);\n }\n return null;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"dist\"]);\n\n/**\n * Find all config files by walking down from rootDir.\n * Discovers every soda-gql config file in the directory tree,\n * skipping node_modules, dist, and dot-prefixed directories.\n */\nexport function findAllConfigFiles(rootDir: string): readonly string[] {\n const results: string[] = [];\n\n const walk = (dir: string): void => {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(dir, filename);\n if (existsSync(configPath)) {\n results.push(configPath);\n break; // Only one config per directory\n }\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry) || entry.startsWith(\".\")) {\n continue;\n }\n const fullPath = join(dir, entry);\n try {\n if (statSync(fullPath).isDirectory()) {\n walk(fullPath);\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n };\n\n walk(rootDir);\n return results;\n}\n\n/**\n * Load config with Result type (for library use).\n */\nexport function loadConfig(configPath: string | undefined): Result<ResolvedSodaGqlConfig, ConfigError> {\n const resolvedPath = configPath ?? findConfigFile();\n\n if (!resolvedPath) {\n return err(configError({ code: \"CONFIG_NOT_FOUND\", message: \"Config file not found\" }));\n }\n\n try {\n const result = executeConfigFile(resolvedPath);\n if (result.isErr()) {\n return err(result.error);\n }\n return normalizeConfig(result.value, resolvedPath);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: resolvedPath,\n cause: error,\n }),\n );\n }\n}\n\n/**\n * Load config from specific directory.\n */\nexport function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configPath = findConfigFile(dir);\n return loadConfig(configPath ?? undefined);\n}\n","export type { ConfigError, ConfigErrorCode } from \"./errors\";\nexport { configError } from \"./errors\";\nexport {\n defineConfig,\n type SodaGqlConfigContainer,\n validateConfig,\n} from \"./helper\";\nexport { findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n GraphqlCompatConfig,\n PluginConfig,\n ResolvedArtifactConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaConfig,\n SodaGqlConfig,\n TypeCategory,\n TypeFilterConfig,\n TypeFilterRule,\n} from \"./types\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["config: SodaGqlConfig","InjectConfigSchema: z.ZodType<InjectConfig>","SchemaInputSchema: z.ZodType<SchemaInput>","TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined>","resolve","mod: { exports: unknown }","configModule","dirname","resolved: ResolvedSodaGqlConfig","results: string[]","entries: string[]"],"sources":["../src/errors.ts","../src/helper.ts","../src/evaluation.ts","../src/normalize.ts","../src/loader.ts","../src/index.ts"],"sourcesContent":["export type ConfigErrorCode = \"CONFIG_NOT_FOUND\" | \"CONFIG_LOAD_FAILED\" | \"CONFIG_VALIDATION_FAILED\" | \"CONFIG_INVALID_PATH\";\n\nexport type ConfigError = {\n readonly code: ConfigErrorCode;\n readonly message: string;\n readonly filePath?: string;\n readonly cause?: unknown;\n};\n\nexport const configError = ({\n code,\n message,\n filePath,\n cause,\n}: {\n code: ConfigErrorCode;\n message: string;\n filePath?: string;\n cause?: unknown;\n}): ConfigError => ({\n code,\n message,\n filePath,\n cause,\n});\n","import { defineSchemaFor } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport z from \"zod\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n ArtifactConfig,\n CodegenConfig,\n GraphqlCompatConfig,\n InjectConfig,\n SchemaConfig,\n SchemaInput,\n SodaGqlConfig,\n StylesConfig,\n TypeFilterConfig,\n} from \"./types\";\n\n/**\n * Thin wrapper class to simplify the validation of exported value from config file.\n * As we use SWC + VM to execute the config file, the exported value is not typed.\n * This wrapper class ensures the exported value is a valid soda-gql config object.\n */\nexport class SodaGqlConfigContainer {\n private constructor(public readonly config: SodaGqlConfig) {}\n\n public static create(config: SodaGqlConfig): SodaGqlConfigContainer {\n return new SodaGqlConfigContainer(config);\n }\n}\n\n/**\n * Type-safe helper for defining soda-gql configuration.\n * Supports both static and dynamic (async) configs.\n *\n * @example Static config with object inject\n * ```ts\n * import { defineConfig } from \"@soda-gql/config\";\n *\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: { scalars: \"./scalars.ts\" },\n * },\n * },\n * });\n * ```\n *\n * @example Static config with string inject (single file)\n * ```ts\n * export default defineConfig({\n * outdir: \"./graphql-system\",\n * include: [\"./src/**\\/*.ts\"],\n * schemas: {\n * default: {\n * schema: \"./schema.graphql\",\n * inject: \"./inject.ts\", // exports scalar, adapter?\n * },\n * },\n * });\n * ```\n */\nexport function defineConfig(config: SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: () => SodaGqlConfig): SodaGqlConfigContainer;\nexport function defineConfig(config: SodaGqlConfig | (() => SodaGqlConfig)): SodaGqlConfigContainer {\n const validated = validateConfig(typeof config === \"function\" ? config() : config);\n if (validated.isErr()) {\n throw validated.error;\n }\n return SodaGqlConfigContainer.create(validated.value);\n}\n\n// InjectConfig is a union type (string | object), so we define the schema directly\n// rather than using defineSchemaFor which requires object types\nconst InjectConfigSchema: z.ZodType<InjectConfig> = z.union([\n z.string().min(1),\n z.object({\n scalars: z.string().min(1),\n adapter: z.string().min(1).optional(),\n }),\n]);\n\n// SchemaInput supports string, array of strings, or function returning array of strings\n// Function return value validation is deferred to normalize time\nconst SchemaInputSchema: z.ZodType<SchemaInput> = z.union([\n z.string().min(1),\n z.array(z.string().min(1)).min(1),\n z.custom<() => readonly string[]>((val) => typeof val === \"function\"),\n]);\n\n// TypeCategory enum for type filtering\nconst TypeCategorySchema = z.enum([\"object\", \"input\", \"enum\", \"union\", \"scalar\"]);\n\n// TypeFilterRule validates pattern and optional category\nconst TypeFilterRuleSchema = z.object({\n pattern: z.string().min(1),\n category: z.union([TypeCategorySchema, z.array(TypeCategorySchema).min(1)]).optional(),\n});\n\n// TypeFilterConfig supports function or object with exclude rules\n// Function signature validation is deferred to runtime (compileTypeFilter)\nconst TypeFilterConfigSchema: z.ZodType<TypeFilterConfig | undefined> = z\n .union([\n z.custom<TypeFilterConfig>((val) => typeof val === \"function\"),\n z.object({\n exclude: z.array(TypeFilterRuleSchema).min(1),\n }),\n ])\n .optional();\n\nconst SchemaConfigSchema = defineSchemaFor<SchemaConfig>()({\n schema: SchemaInputSchema,\n inject: InjectConfigSchema,\n defaultInputDepth: z.number().int().positive().max(10).optional(),\n inputDepthOverrides: z.record(z.string(), z.number().int().positive()).optional(),\n typeFilter: TypeFilterConfigSchema,\n});\n\nconst StylesConfigSchema = defineSchemaFor<StylesConfig>()({\n importExtension: z.boolean().optional(),\n});\n\nconst CodegenConfigSchema = defineSchemaFor<CodegenConfig>()({\n chunkSize: z.number().int().positive().optional(),\n});\n\nconst GraphqlCompatConfigSchema = defineSchemaFor<GraphqlCompatConfig>()({\n input: z.array(z.string().min(1)),\n schema: z.string().min(1).optional(),\n suffix: z.string().min(1).optional(),\n});\n\nconst ArtifactConfigSchema = defineSchemaFor<ArtifactConfig>()({\n path: z.string().min(1).optional(),\n});\n\nconst SodaGqlConfigSchema = defineSchemaFor<SodaGqlConfig>()({\n analyzer: z.enum([\"ts\", \"swc\"]).optional(),\n outdir: z.string().min(1),\n graphqlSystemAliases: z.array(z.string()).optional(),\n tsconfigPath: z.string().min(1).optional(),\n include: z.array(z.string().min(1)),\n exclude: z.array(z.string().min(1)).optional(),\n schemas: z.record(z.string(), SchemaConfigSchema),\n styles: StylesConfigSchema.optional(),\n codegen: CodegenConfigSchema.optional(),\n plugins: z.record(z.string(), z.unknown()).optional(),\n graphqlCompat: GraphqlCompatConfigSchema.optional(),\n artifact: ArtifactConfigSchema.optional(),\n});\n\nexport function validateConfig(config: unknown): Result<SodaGqlConfig, ConfigError> {\n const result = SodaGqlConfigSchema.safeParse(config);\n\n if (!result.success) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `Invalid config: ${result.error.message}`,\n }),\n );\n }\n\n return ok(result.data satisfies SodaGqlConfig);\n}\n","import { readFileSync } from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport { dirname, resolve } from \"node:path/posix\";\nimport { Script } from \"node:vm\";\nimport { resolveRelativeImportWithExistenceCheck } from \"@soda-gql/common\";\nimport { err, ok, type Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport { SodaGqlConfigContainer } from \"./helper\";\n// TODO: split config package into definition and evaluation parts\nimport * as configModule from \"./index\";\nimport type { SodaGqlConfig } from \"./types\";\n\ntype TransformSync = typeof import(\"@swc/core\").transformSync;\n\n/** Lazily resolve @swc/core from the config file's directory, falling back to package resolution. */\nconst resolveSwc = (configPath: string): TransformSync => {\n try {\n const localRequire = createRequire(configPath);\n return localRequire(\"@swc/core\").transformSync;\n } catch (primaryError) {\n // import.meta.url is undefined in CJS bundles (esbuild replaces import.meta with {})\n if (typeof import.meta.url !== \"string\") {\n throw primaryError;\n }\n // Fall back to package-level resolution (e.g., during tests or when user relies on bundled swc)\n const packageRequire = createRequire(import.meta.url);\n return packageRequire(\"@swc/core\").transformSync;\n }\n};\n\n/**\n * Load and execute TypeScript config file synchronously using SWC + VM.\n */\nexport function executeConfigFile(configPath: string): Result<SodaGqlConfig, ConfigError> {\n const filePath = resolve(configPath);\n try {\n const transformSync = resolveSwc(filePath);\n\n // Read the config file\n const source = readFileSync(filePath, \"utf-8\");\n\n // Transform TypeScript to CommonJS using SWC\n const result = transformSync(source, {\n filename: filePath,\n jsc: {\n parser: {\n syntax: \"typescript\",\n },\n },\n module: {\n type: \"commonjs\",\n },\n sourceMaps: false,\n minify: false,\n });\n\n // Create CommonJS context\n const mod: { exports: unknown } = { exports: {} };\n\n const requireInner = createRequire(filePath);\n const require = (specifier: string) => {\n if (specifier === \"@soda-gql/config\") {\n return configModule;\n }\n\n // Handle external modules normally\n if (!specifier.startsWith(\".\")) {\n return requireInner(specifier);\n }\n\n // Resolve relative imports with existence check\n const resolvedPath = resolveRelativeImportWithExistenceCheck({ filePath, specifier });\n if (!resolvedPath) {\n throw new Error(`Module not found: ${specifier}`);\n }\n return requireInner(resolvedPath);\n };\n\n // Execute in VM context\n new Script(result.code, { filename: filePath }).runInNewContext({\n require,\n module: mod,\n exports: mod.exports,\n __dirname: dirname(filePath),\n __filename: filePath,\n console,\n process,\n });\n\n const config =\n mod.exports &&\n typeof mod.exports === \"object\" &&\n \"default\" in mod.exports &&\n mod.exports.default instanceof SodaGqlConfigContainer\n ? mod.exports.default.config\n : null;\n\n if (!config) {\n throw new Error(\"Invalid config module\");\n }\n\n return ok(config);\n } catch (error) {\n const message =\n error instanceof Error && error.message.includes(\"Cannot find module '@swc/core'\")\n ? \"@swc/core not found. Install it in your project: bun add -D @swc/core\"\n : `Failed to load config: ${error instanceof Error ? error.message : String(error)}`;\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message,\n filePath: filePath,\n cause: error,\n }),\n );\n }\n}\n","import { dirname, resolve } from \"node:path\";\nimport { readTsconfigPaths } from \"@soda-gql/common\";\nimport { err, ok, Result } from \"neverthrow\";\nimport { type ConfigError, configError } from \"./errors\";\nimport type {\n GraphqlCompatConfig,\n InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedInjectConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaInput,\n SodaGqlConfig,\n} from \"./types\";\n\n/**\n * Normalize schema input to resolved array form.\n * String is converted to single-element array.\n * Function is executed to get the array.\n * All paths are resolved relative to config directory.\n */\nfunction normalizeSchemaInput(schema: SchemaInput, configDir: string): Result<readonly string[], ConfigError> {\n // Execute function if provided\n const paths = typeof schema === \"function\" ? schema() : schema;\n // Normalize single string to array\n const pathArray = typeof paths === \"string\" ? [paths] : paths;\n\n // Runtime validation: empty array check\n if (pathArray.length === 0) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"Schema paths cannot be empty\",\n }),\n );\n }\n\n return ok(pathArray.map((p) => resolve(configDir, p)));\n}\n\n/**\n * Normalize inject config to resolved object form.\n * String form is converted to object with same path for all fields.\n */\nfunction normalizeInject(inject: InjectConfig, configDir: string): ResolvedInjectConfig {\n if (typeof inject === \"string\") {\n const resolvedPath = resolve(configDir, inject);\n return {\n scalars: resolvedPath,\n adapter: resolvedPath,\n };\n }\n return {\n scalars: resolve(configDir, inject.scalars),\n ...(inject.adapter ? { adapter: resolve(configDir, inject.adapter) } : {}),\n };\n}\n\n/**\n * Resolve a glob pattern relative to the config directory.\n * Handles negation patterns (e.g., \"!./path/to/exclude\") by preserving the \"!\" prefix.\n */\nfunction resolvePattern(pattern: string, configDir: string): string {\n if (pattern.startsWith(\"!\")) {\n // Preserve the negation prefix, resolve the rest\n return `!${resolve(configDir, pattern.slice(1))}`;\n }\n return resolve(configDir, pattern);\n}\n\n/**\n * Normalize artifact config to resolved form.\n * Returns undefined if no path is specified.\n */\nfunction normalizeArtifact(artifact: SodaGqlConfig[\"artifact\"], configDir: string): ResolvedArtifactConfig | undefined {\n if (!artifact?.path) {\n return undefined;\n }\n return {\n path: resolve(configDir, artifact.path),\n };\n}\n\n/**\n * Normalize tsconfig paths configuration.\n * Reads tsconfig.json and extracts paths if defined.\n * Returns undefined if no tsconfigPath is specified or no paths are defined.\n */\nfunction normalizeTsconfigPaths(\n tsconfigPath: string | undefined,\n configDir: string,\n): Result<ResolvedTsconfigPaths | undefined, ConfigError> {\n if (!tsconfigPath) {\n return ok(undefined);\n }\n\n const resolvedPath = resolve(configDir, tsconfigPath);\n const result = readTsconfigPaths(resolvedPath);\n\n if (result.isErr()) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: result.error.message,\n }),\n );\n }\n\n // Return undefined if no paths defined in tsconfig\n if (result.value === null) {\n return ok(undefined);\n }\n\n return ok(result.value);\n}\n\n/**\n * Normalize graphql-compat config to resolved form.\n * Resolves glob patterns and validates schema name.\n */\nfunction normalizeGraphqlCompat(\n graphqlCompat: GraphqlCompatConfig | undefined,\n schemaNames: readonly string[],\n configDir: string,\n): Result<ResolvedGraphqlCompatConfig | undefined, ConfigError> {\n if (!graphqlCompat) {\n return ok(undefined);\n }\n\n let schemaName = graphqlCompat.schema;\n if (!schemaName) {\n if (schemaNames.length !== 1 || !schemaNames[0]) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: \"graphqlCompat.schema is required when multiple schemas are configured\",\n }),\n );\n }\n schemaName = schemaNames[0];\n }\n\n if (!schemaNames.includes(schemaName)) {\n return err(\n configError({\n code: \"CONFIG_VALIDATION_FAILED\",\n message: `graphqlCompat.schema \"${schemaName}\" not found in schemas config`,\n }),\n );\n }\n\n return ok({\n input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),\n schema: schemaName,\n suffix: graphqlCompat.suffix ?? \".compat.ts\",\n });\n}\n\n/**\n * Normalize codegen config to resolved form with defaults.\n */\nfunction normalizeCodegen(codegen: SodaGqlConfig[\"codegen\"]): ResolvedCodegenConfig {\n return {\n chunkSize: codegen?.chunkSize ?? 100,\n };\n}\n\n/**\n * Resolve and normalize config with defaults.\n * Paths in the config are resolved relative to the config file's directory.\n */\nexport function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configDir = dirname(configPath);\n // Default analyzer to \"ts\"\n const analyzer = config.analyzer ?? \"ts\";\n\n // Default graphqlSystemAliases to [\"@/graphql-system\"]\n const graphqlSystemAliases = config.graphqlSystemAliases ?? [\"@/graphql-system\"];\n\n // Default exclude to empty array\n const exclude = config.exclude ?? [];\n\n // Normalize artifact config (only if path is specified)\n const artifact = normalizeArtifact(config.artifact, configDir);\n\n // Normalize tsconfig paths (only if path is specified and paths exist)\n const tsconfigPathsResult = normalizeTsconfigPaths(config.tsconfigPath, configDir);\n if (tsconfigPathsResult.isErr()) {\n return err(tsconfigPathsResult.error);\n }\n const tsconfigPaths = tsconfigPathsResult.value;\n\n // Normalize schemas with error handling\n const schemaEntries = Object.entries(config.schemas).map(([name, schemaConfig]) =>\n normalizeSchemaInput(schemaConfig.schema, configDir).map(\n (schema) =>\n [\n name,\n {\n schema,\n inject: normalizeInject(schemaConfig.inject, configDir),\n defaultInputDepth: schemaConfig.defaultInputDepth ?? 3,\n inputDepthOverrides: schemaConfig.inputDepthOverrides ?? {},\n ...(schemaConfig.typeFilter ? { typeFilter: schemaConfig.typeFilter } : {}),\n },\n ] as const,\n ),\n );\n\n const combinedResult = Result.combine(schemaEntries);\n if (combinedResult.isErr()) {\n return err(combinedResult.error);\n }\n const normalizedSchemas = Object.fromEntries(combinedResult.value);\n\n // Normalize graphql-compat config\n const schemaNames = Object.keys(config.schemas);\n const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);\n if (graphqlCompatResult.isErr()) {\n return err(graphqlCompatResult.error);\n }\n const graphqlCompat = graphqlCompatResult.value;\n\n const resolved: ResolvedSodaGqlConfig = {\n analyzer,\n baseDir: configDir,\n outdir: resolve(configDir, config.outdir),\n graphqlSystemAliases,\n include: config.include.map((pattern) => resolvePattern(pattern, configDir)),\n exclude: exclude.map((pattern) => resolvePattern(pattern, configDir)),\n schemas: normalizedSchemas,\n styles: {\n importExtension: config.styles?.importExtension ?? false,\n },\n codegen: normalizeCodegen(config.codegen),\n plugins: config.plugins ?? {},\n ...(graphqlCompat ? { graphqlCompat } : {}),\n ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync, readdirSync, statSync } from \"node:fs\";\nimport { dirname, join } from \"node:path\";\nimport type { Result } from \"neverthrow\";\nimport { err } from \"neverthrow\";\nimport type { ConfigError } from \"./errors\";\nimport { configError } from \"./errors\";\nimport { executeConfigFile } from \"./evaluation\";\nimport { normalizeConfig } from \"./normalize\";\nimport type { ResolvedSodaGqlConfig } from \"./types\";\n\nexport const DEFAULT_CONFIG_FILENAMES = [\n \"soda-gql.config.ts\",\n \"soda-gql.config.mts\",\n \"soda-gql.config.js\",\n \"soda-gql.config.mjs\",\n] as const;\n\n/**\n * Find config file by walking up directory tree.\n */\nexport function findConfigFile(startDir: string = process.cwd()): string | null {\n let currentDir = startDir;\n while (currentDir !== dirname(currentDir)) {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(currentDir, filename);\n if (existsSync(configPath)) {\n return configPath;\n }\n }\n currentDir = dirname(currentDir);\n }\n return null;\n}\n\nconst SKIP_DIRS = new Set([\"node_modules\", \"dist\"]);\n\n/**\n * Find all config files by walking down from rootDir.\n * Discovers every soda-gql config file in the directory tree,\n * skipping node_modules, dist, and dot-prefixed directories.\n */\nexport function findAllConfigFiles(rootDir: string): readonly string[] {\n const results: string[] = [];\n\n const walk = (dir: string): void => {\n for (const filename of DEFAULT_CONFIG_FILENAMES) {\n const configPath = join(dir, filename);\n if (existsSync(configPath)) {\n results.push(configPath);\n break; // Only one config per directory\n }\n }\n\n let entries: string[];\n try {\n entries = readdirSync(dir);\n } catch {\n return;\n }\n\n for (const entry of entries) {\n if (SKIP_DIRS.has(entry) || entry.startsWith(\".\")) {\n continue;\n }\n const fullPath = join(dir, entry);\n try {\n if (statSync(fullPath).isDirectory()) {\n walk(fullPath);\n }\n } catch {\n // Skip inaccessible entries\n }\n }\n };\n\n walk(rootDir);\n return results;\n}\n\n/**\n * Load config with Result type (for library use).\n */\nexport function loadConfig(configPath: string | undefined): Result<ResolvedSodaGqlConfig, ConfigError> {\n const resolvedPath = configPath ?? findConfigFile();\n\n if (!resolvedPath) {\n return err(configError({ code: \"CONFIG_NOT_FOUND\", message: \"Config file not found\" }));\n }\n\n try {\n const result = executeConfigFile(resolvedPath);\n if (result.isErr()) {\n return err(result.error);\n }\n return normalizeConfig(result.value, resolvedPath);\n } catch (error) {\n return err(\n configError({\n code: \"CONFIG_LOAD_FAILED\",\n message: `Failed to load config: ${error instanceof Error ? error.message : String(error)}`,\n filePath: resolvedPath,\n cause: error,\n }),\n );\n }\n}\n\n/**\n * Load config from specific directory.\n */\nexport function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, ConfigError> {\n const configPath = findConfigFile(dir);\n return loadConfig(configPath ?? undefined);\n}\n","export type { ConfigError, ConfigErrorCode } from \"./errors\";\nexport { configError } from \"./errors\";\nexport {\n defineConfig,\n type SodaGqlConfigContainer,\n validateConfig,\n} from \"./helper\";\nexport { findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n GraphqlCompatConfig,\n PluginConfig,\n ResolvedArtifactConfig,\n ResolvedGraphqlCompatConfig,\n ResolvedSodaGqlConfig,\n ResolvedTsconfigPaths,\n SchemaConfig,\n SodaGqlConfig,\n TypeCategory,\n TypeFilterConfig,\n TypeFilterRule,\n} from \"./types\";\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@soda-gql/config",
3
- "version": "0.12.0",
3
+ "version": "0.12.2",
4
4
  "description": "Centralized configuration loader and helpers for soda-gql tooling.",
5
5
  "type": "module",
6
6
  "private": false,
@@ -51,7 +51,7 @@
51
51
  "./package.json": "./package.json"
52
52
  },
53
53
  "dependencies": {
54
- "@soda-gql/common": "0.12.0",
54
+ "@soda-gql/common": "0.12.2",
55
55
  "@swc/core": "^1.10.0",
56
56
  "neverthrow": "^8.2.0",
57
57
  "zod": "^4.1.11"