@soda-gql/config 0.11.26 → 0.12.0
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 +82 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +39 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +39 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +83 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -5
package/dist/index.cjs
CHANGED
|
@@ -109,6 +109,11 @@ const SchemaConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({
|
|
|
109
109
|
});
|
|
110
110
|
const StylesConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({ importExtension: zod.default.boolean().optional() });
|
|
111
111
|
const CodegenConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({ chunkSize: zod.default.number().int().positive().optional() });
|
|
112
|
+
const GraphqlCompatConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({
|
|
113
|
+
input: zod.default.array(zod.default.string().min(1)),
|
|
114
|
+
schema: zod.default.string().min(1).optional(),
|
|
115
|
+
suffix: zod.default.string().min(1).optional()
|
|
116
|
+
});
|
|
112
117
|
const ArtifactConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({ path: zod.default.string().min(1).optional() });
|
|
113
118
|
const SodaGqlConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({
|
|
114
119
|
analyzer: zod.default.enum(["ts", "swc"]).optional(),
|
|
@@ -121,6 +126,7 @@ const SodaGqlConfigSchema = (0, __soda_gql_common.defineSchemaFor)()({
|
|
|
121
126
|
styles: StylesConfigSchema.optional(),
|
|
122
127
|
codegen: CodegenConfigSchema.optional(),
|
|
123
128
|
plugins: zod.default.record(zod.default.string(), zod.default.unknown()).optional(),
|
|
129
|
+
graphqlCompat: GraphqlCompatConfigSchema.optional(),
|
|
124
130
|
artifact: ArtifactConfigSchema.optional()
|
|
125
131
|
});
|
|
126
132
|
function validateConfig(config) {
|
|
@@ -271,6 +277,36 @@ function normalizeTsconfigPaths(tsconfigPath, configDir) {
|
|
|
271
277
|
return (0, neverthrow.ok)(result.value);
|
|
272
278
|
}
|
|
273
279
|
/**
|
|
280
|
+
* Normalize graphql-compat config to resolved form.
|
|
281
|
+
* Resolves glob patterns and validates schema name.
|
|
282
|
+
*/
|
|
283
|
+
function normalizeGraphqlCompat(graphqlCompat, schemaNames, configDir) {
|
|
284
|
+
if (!graphqlCompat) {
|
|
285
|
+
return (0, neverthrow.ok)(undefined);
|
|
286
|
+
}
|
|
287
|
+
let schemaName = graphqlCompat.schema;
|
|
288
|
+
if (!schemaName) {
|
|
289
|
+
if (schemaNames.length !== 1 || !schemaNames[0]) {
|
|
290
|
+
return (0, neverthrow.err)(configError({
|
|
291
|
+
code: "CONFIG_VALIDATION_FAILED",
|
|
292
|
+
message: "graphqlCompat.schema is required when multiple schemas are configured"
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
schemaName = schemaNames[0];
|
|
296
|
+
}
|
|
297
|
+
if (!schemaNames.includes(schemaName)) {
|
|
298
|
+
return (0, neverthrow.err)(configError({
|
|
299
|
+
code: "CONFIG_VALIDATION_FAILED",
|
|
300
|
+
message: `graphqlCompat.schema "${schemaName}" not found in schemas config`
|
|
301
|
+
}));
|
|
302
|
+
}
|
|
303
|
+
return (0, neverthrow.ok)({
|
|
304
|
+
input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),
|
|
305
|
+
schema: schemaName,
|
|
306
|
+
suffix: graphqlCompat.suffix ?? ".compat.ts"
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
274
310
|
* Normalize codegen config to resolved form with defaults.
|
|
275
311
|
*/
|
|
276
312
|
function normalizeCodegen(codegen) {
|
|
@@ -303,6 +339,12 @@ function normalizeConfig(config, configPath) {
|
|
|
303
339
|
return (0, neverthrow.err)(combinedResult.error);
|
|
304
340
|
}
|
|
305
341
|
const normalizedSchemas = Object.fromEntries(combinedResult.value);
|
|
342
|
+
const schemaNames = Object.keys(config.schemas);
|
|
343
|
+
const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);
|
|
344
|
+
if (graphqlCompatResult.isErr()) {
|
|
345
|
+
return (0, neverthrow.err)(graphqlCompatResult.error);
|
|
346
|
+
}
|
|
347
|
+
const graphqlCompat = graphqlCompatResult.value;
|
|
306
348
|
const resolved = {
|
|
307
349
|
analyzer,
|
|
308
350
|
baseDir: configDir,
|
|
@@ -314,6 +356,7 @@ function normalizeConfig(config, configPath) {
|
|
|
314
356
|
styles: { importExtension: config.styles?.importExtension ?? false },
|
|
315
357
|
codegen: normalizeCodegen(config.codegen),
|
|
316
358
|
plugins: config.plugins ?? {},
|
|
359
|
+
...graphqlCompat ? { graphqlCompat } : {},
|
|
317
360
|
...artifact ? { artifact } : {},
|
|
318
361
|
...tsconfigPaths ? { tsconfigPaths } : {}
|
|
319
362
|
};
|
|
@@ -344,6 +387,43 @@ function findConfigFile(startDir = process.cwd()) {
|
|
|
344
387
|
}
|
|
345
388
|
return null;
|
|
346
389
|
}
|
|
390
|
+
const SKIP_DIRS = new Set(["node_modules", "dist"]);
|
|
391
|
+
/**
|
|
392
|
+
* Find all config files by walking down from rootDir.
|
|
393
|
+
* Discovers every soda-gql config file in the directory tree,
|
|
394
|
+
* skipping node_modules, dist, and dot-prefixed directories.
|
|
395
|
+
*/
|
|
396
|
+
function findAllConfigFiles(rootDir) {
|
|
397
|
+
const results = [];
|
|
398
|
+
const walk = (dir) => {
|
|
399
|
+
for (const filename of DEFAULT_CONFIG_FILENAMES) {
|
|
400
|
+
const configPath = (0, node_path.join)(dir, filename);
|
|
401
|
+
if ((0, node_fs.existsSync)(configPath)) {
|
|
402
|
+
results.push(configPath);
|
|
403
|
+
break;
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
let entries;
|
|
407
|
+
try {
|
|
408
|
+
entries = (0, node_fs.readdirSync)(dir);
|
|
409
|
+
} catch {
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
for (const entry of entries) {
|
|
413
|
+
if (SKIP_DIRS.has(entry) || entry.startsWith(".")) {
|
|
414
|
+
continue;
|
|
415
|
+
}
|
|
416
|
+
const fullPath = (0, node_path.join)(dir, entry);
|
|
417
|
+
try {
|
|
418
|
+
if ((0, node_fs.statSync)(fullPath).isDirectory()) {
|
|
419
|
+
walk(fullPath);
|
|
420
|
+
}
|
|
421
|
+
} catch {}
|
|
422
|
+
}
|
|
423
|
+
};
|
|
424
|
+
walk(rootDir);
|
|
425
|
+
return results;
|
|
426
|
+
}
|
|
347
427
|
/**
|
|
348
428
|
* Load config with Result type (for library use).
|
|
349
429
|
*/
|
|
@@ -383,6 +463,7 @@ function loadConfigFrom(dir) {
|
|
|
383
463
|
var src_exports = /* @__PURE__ */ __export({
|
|
384
464
|
configError: () => configError,
|
|
385
465
|
defineConfig: () => defineConfig,
|
|
466
|
+
findAllConfigFiles: () => findAllConfigFiles,
|
|
386
467
|
findConfigFile: () => findConfigFile,
|
|
387
468
|
loadConfig: () => loadConfig,
|
|
388
469
|
loadConfigFrom: () => loadConfigFrom,
|
|
@@ -393,6 +474,7 @@ var src_exports = /* @__PURE__ */ __export({
|
|
|
393
474
|
//#endregion
|
|
394
475
|
exports.configError = configError;
|
|
395
476
|
exports.defineConfig = defineConfig;
|
|
477
|
+
exports.findAllConfigFiles = findAllConfigFiles;
|
|
396
478
|
exports.findConfigFile = findConfigFile;
|
|
397
479
|
exports.loadConfig = loadConfig;
|
|
398
480
|
exports.loadConfigFrom = loadConfigFrom;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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"],"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 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 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 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 InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\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 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 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 ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync } 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\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 { findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n PluginConfig,\n ResolvedArtifactConfig,\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 { 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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"}
|
package/dist/index.d.cts
CHANGED
|
@@ -103,6 +103,18 @@ type TypeFilterConfig = ((context: {
|
|
|
103
103
|
}) => boolean) | {
|
|
104
104
|
readonly exclude: readonly TypeFilterRule[];
|
|
105
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* Configuration for graphql-compat code generation.
|
|
108
|
+
* When specified, `codegen` will generate `.compat.ts` files from `.graphql` files.
|
|
109
|
+
*/
|
|
110
|
+
type GraphqlCompatConfig = {
|
|
111
|
+
/** Glob patterns for .graphql/.gql files */
|
|
112
|
+
readonly input: readonly string[];
|
|
113
|
+
/** Schema name to use (required if multiple schemas configured) */
|
|
114
|
+
readonly schema?: string;
|
|
115
|
+
/** Output file suffix (default: ".compat.ts") */
|
|
116
|
+
readonly suffix?: string;
|
|
117
|
+
};
|
|
106
118
|
type StylesConfig = {
|
|
107
119
|
/**
|
|
108
120
|
* Whether to include file extensions in import paths.
|
|
@@ -212,6 +224,16 @@ type SodaGqlConfig = {
|
|
|
212
224
|
* The plugins to use for the project.
|
|
213
225
|
*/
|
|
214
226
|
readonly plugins?: PluginConfig;
|
|
227
|
+
/**
|
|
228
|
+
* Configuration for graphql-compat code generation.
|
|
229
|
+
* When specified, `codegen` will generate `.compat.ts` files from `.graphql` files.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ```ts
|
|
233
|
+
* graphqlCompat: { input: ["src/∗∗/∗.graphql"] }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
readonly graphqlCompat?: GraphqlCompatConfig;
|
|
215
237
|
/**
|
|
216
238
|
* Configuration for pre-built artifact loading.
|
|
217
239
|
* When specified, plugins will load the artifact from the file instead of building dynamically.
|
|
@@ -237,6 +259,11 @@ type ResolvedSchemaConfig = {
|
|
|
237
259
|
readonly inputDepthOverrides: Readonly<Record<string, number>>;
|
|
238
260
|
readonly typeFilter?: TypeFilterConfig;
|
|
239
261
|
};
|
|
262
|
+
type ResolvedGraphqlCompatConfig = {
|
|
263
|
+
readonly input: readonly string[];
|
|
264
|
+
readonly schema: string;
|
|
265
|
+
readonly suffix: string;
|
|
266
|
+
};
|
|
240
267
|
type ResolvedSodaGqlConfig = {
|
|
241
268
|
readonly analyzer: "ts" | "swc";
|
|
242
269
|
/**
|
|
@@ -253,6 +280,11 @@ type ResolvedSodaGqlConfig = {
|
|
|
253
280
|
readonly styles: ResolvedStylesConfig;
|
|
254
281
|
readonly codegen: ResolvedCodegenConfig;
|
|
255
282
|
readonly plugins: PluginConfig;
|
|
283
|
+
/**
|
|
284
|
+
* Resolved graphql-compat configuration.
|
|
285
|
+
* Only present when graphqlCompat is specified in the config.
|
|
286
|
+
*/
|
|
287
|
+
readonly graphqlCompat?: ResolvedGraphqlCompatConfig;
|
|
256
288
|
/**
|
|
257
289
|
* Resolved artifact configuration.
|
|
258
290
|
* Only present when artifact.path is specified in the config.
|
|
@@ -320,6 +352,12 @@ declare const DEFAULT_CONFIG_FILENAMES: readonly ["soda-gql.config.ts", "soda-gq
|
|
|
320
352
|
* Find config file by walking up directory tree.
|
|
321
353
|
*/
|
|
322
354
|
declare function findConfigFile(startDir?: string): string | null;
|
|
355
|
+
/**
|
|
356
|
+
* Find all config files by walking down from rootDir.
|
|
357
|
+
* Discovers every soda-gql config file in the directory tree,
|
|
358
|
+
* skipping node_modules, dist, and dot-prefixed directories.
|
|
359
|
+
*/
|
|
360
|
+
declare function findAllConfigFiles(rootDir: string): readonly string[];
|
|
323
361
|
/**
|
|
324
362
|
* Load config with Result type (for library use).
|
|
325
363
|
*/
|
|
@@ -336,5 +374,5 @@ declare function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, Conf
|
|
|
336
374
|
*/
|
|
337
375
|
declare function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError>;
|
|
338
376
|
//#endregion
|
|
339
|
-
export { type ArtifactConfig, type ConfigError, type ConfigErrorCode, type PluginConfig, type ResolvedArtifactConfig, type ResolvedSodaGqlConfig, type ResolvedTsconfigPaths, type SchemaConfig, type SodaGqlConfig, type SodaGqlConfigContainer, type TypeCategory, type TypeFilterConfig, type TypeFilterRule, configError, defineConfig, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
377
|
+
export { type ArtifactConfig, type ConfigError, type ConfigErrorCode, type GraphqlCompatConfig, type PluginConfig, type ResolvedArtifactConfig, type ResolvedGraphqlCompatConfig, type ResolvedSodaGqlConfig, type ResolvedTsconfigPaths, type SchemaConfig, type SodaGqlConfig, type SodaGqlConfigContainer, type TypeCategory, type TypeFilterConfig, type TypeFilterRule, configError, defineConfig, findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
340
378
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/helper.ts","../src/loader.ts","../src/normalize.ts"],"sourcesContent":[],"mappings":";;;KAAY,eAAA;KAEA,WAAA;iBACK;EAHL,SAAA,OAAA,EAAe,MAAA;EAEf,SAAA,QAAW,CAAA,EAAA,MACN;EAMJ,SAAA,KAeX,CAAA,EAAA,OAAA;CAf0B;AAAA,cAAf,WAAe,EAAA,CAAA;EAAA,IAAA;EAAA,OAAA;EAAA,QAAA;EAAA;CAAA,EAAA;EAAA,IAAA,EAMpB,eANoB;EAAA,OAAA,EAAA,MAAA;EAMpB,QAAA,CAAA,EAAA,MAAA;EAIJ,KAAA,CAAA,EAAA,OAAA;CAKF,EAAA,GALE,WAKF;;;;;;AAxBF;AAEA;AAOA;;;;;AAMQ,KCLI,YAAA,GDKJ,MAAA,GAAA;EAIJ,SAAA,OAAA,EAAA,MAAA;EAKF,SAAA,OAAA,CAAA,EAAA,MAAA;;;;ACdF;AAeA;AAGA;;;;AAwBiC,KA3BrB,WAAA,GA2BqB,MAAA,GAAA,SAAA,MAAA,EAAA,GAAA,CAAA,GAAA,GAAA,SAAA,MAAA,EAAA,CAAA;AAoBT,KA5CZ,YAAA,GA4CY;EAAgB,SAAA,MAAA,EA3CrB,WA2CqB;EAI5B;AAEZ;AAOA;
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/helper.ts","../src/loader.ts","../src/normalize.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.d.mts
CHANGED
|
@@ -103,6 +103,18 @@ type TypeFilterConfig = ((context: {
|
|
|
103
103
|
}) => boolean) | {
|
|
104
104
|
readonly exclude: readonly TypeFilterRule[];
|
|
105
105
|
};
|
|
106
|
+
/**
|
|
107
|
+
* Configuration for graphql-compat code generation.
|
|
108
|
+
* When specified, `codegen` will generate `.compat.ts` files from `.graphql` files.
|
|
109
|
+
*/
|
|
110
|
+
type GraphqlCompatConfig = {
|
|
111
|
+
/** Glob patterns for .graphql/.gql files */
|
|
112
|
+
readonly input: readonly string[];
|
|
113
|
+
/** Schema name to use (required if multiple schemas configured) */
|
|
114
|
+
readonly schema?: string;
|
|
115
|
+
/** Output file suffix (default: ".compat.ts") */
|
|
116
|
+
readonly suffix?: string;
|
|
117
|
+
};
|
|
106
118
|
type StylesConfig = {
|
|
107
119
|
/**
|
|
108
120
|
* Whether to include file extensions in import paths.
|
|
@@ -212,6 +224,16 @@ type SodaGqlConfig = {
|
|
|
212
224
|
* The plugins to use for the project.
|
|
213
225
|
*/
|
|
214
226
|
readonly plugins?: PluginConfig;
|
|
227
|
+
/**
|
|
228
|
+
* Configuration for graphql-compat code generation.
|
|
229
|
+
* When specified, `codegen` will generate `.compat.ts` files from `.graphql` files.
|
|
230
|
+
*
|
|
231
|
+
* @example
|
|
232
|
+
* ```ts
|
|
233
|
+
* graphqlCompat: { input: ["src/∗∗/∗.graphql"] }
|
|
234
|
+
* ```
|
|
235
|
+
*/
|
|
236
|
+
readonly graphqlCompat?: GraphqlCompatConfig;
|
|
215
237
|
/**
|
|
216
238
|
* Configuration for pre-built artifact loading.
|
|
217
239
|
* When specified, plugins will load the artifact from the file instead of building dynamically.
|
|
@@ -237,6 +259,11 @@ type ResolvedSchemaConfig = {
|
|
|
237
259
|
readonly inputDepthOverrides: Readonly<Record<string, number>>;
|
|
238
260
|
readonly typeFilter?: TypeFilterConfig;
|
|
239
261
|
};
|
|
262
|
+
type ResolvedGraphqlCompatConfig = {
|
|
263
|
+
readonly input: readonly string[];
|
|
264
|
+
readonly schema: string;
|
|
265
|
+
readonly suffix: string;
|
|
266
|
+
};
|
|
240
267
|
type ResolvedSodaGqlConfig = {
|
|
241
268
|
readonly analyzer: "ts" | "swc";
|
|
242
269
|
/**
|
|
@@ -253,6 +280,11 @@ type ResolvedSodaGqlConfig = {
|
|
|
253
280
|
readonly styles: ResolvedStylesConfig;
|
|
254
281
|
readonly codegen: ResolvedCodegenConfig;
|
|
255
282
|
readonly plugins: PluginConfig;
|
|
283
|
+
/**
|
|
284
|
+
* Resolved graphql-compat configuration.
|
|
285
|
+
* Only present when graphqlCompat is specified in the config.
|
|
286
|
+
*/
|
|
287
|
+
readonly graphqlCompat?: ResolvedGraphqlCompatConfig;
|
|
256
288
|
/**
|
|
257
289
|
* Resolved artifact configuration.
|
|
258
290
|
* Only present when artifact.path is specified in the config.
|
|
@@ -320,6 +352,12 @@ declare const DEFAULT_CONFIG_FILENAMES: readonly ["soda-gql.config.ts", "soda-gq
|
|
|
320
352
|
* Find config file by walking up directory tree.
|
|
321
353
|
*/
|
|
322
354
|
declare function findConfigFile(startDir?: string): string | null;
|
|
355
|
+
/**
|
|
356
|
+
* Find all config files by walking down from rootDir.
|
|
357
|
+
* Discovers every soda-gql config file in the directory tree,
|
|
358
|
+
* skipping node_modules, dist, and dot-prefixed directories.
|
|
359
|
+
*/
|
|
360
|
+
declare function findAllConfigFiles(rootDir: string): readonly string[];
|
|
323
361
|
/**
|
|
324
362
|
* Load config with Result type (for library use).
|
|
325
363
|
*/
|
|
@@ -336,5 +374,5 @@ declare function loadConfigFrom(dir: string): Result<ResolvedSodaGqlConfig, Conf
|
|
|
336
374
|
*/
|
|
337
375
|
declare function normalizeConfig(config: SodaGqlConfig, configPath: string): Result<ResolvedSodaGqlConfig, ConfigError>;
|
|
338
376
|
//#endregion
|
|
339
|
-
export { type ArtifactConfig, type ConfigError, type ConfigErrorCode, type PluginConfig, type ResolvedArtifactConfig, type ResolvedSodaGqlConfig, type ResolvedTsconfigPaths, type SchemaConfig, type SodaGqlConfig, type SodaGqlConfigContainer, type TypeCategory, type TypeFilterConfig, type TypeFilterRule, configError, defineConfig, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
377
|
+
export { type ArtifactConfig, type ConfigError, type ConfigErrorCode, type GraphqlCompatConfig, type PluginConfig, type ResolvedArtifactConfig, type ResolvedGraphqlCompatConfig, type ResolvedSodaGqlConfig, type ResolvedTsconfigPaths, type SchemaConfig, type SodaGqlConfig, type SodaGqlConfigContainer, type TypeCategory, type TypeFilterConfig, type TypeFilterRule, configError, defineConfig, findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
340
378
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/helper.ts","../src/loader.ts","../src/normalize.ts"],"sourcesContent":[],"mappings":";;;KAAY,eAAA;KAEA,WAAA;iBACK;EAHL,SAAA,OAAA,EAAe,MAAA;EAEf,SAAA,QAAW,CAAA,EAAA,MACN;EAMJ,SAAA,KAeX,CAAA,EAAA,OAAA;CAf0B;AAAA,cAAf,WAAe,EAAA,CAAA;EAAA,IAAA;EAAA,OAAA;EAAA,QAAA;EAAA;CAAA,EAAA;EAAA,IAAA,EAMpB,eANoB;EAAA,OAAA,EAAA,MAAA;EAMpB,QAAA,CAAA,EAAA,MAAA;EAIJ,KAAA,CAAA,EAAA,OAAA;CAKF,EAAA,GALE,WAKF;;;;;;AAxBF;AAEA;AAOA;;;;;AAMQ,KCLI,YAAA,GDKJ,MAAA,GAAA;EAIJ,SAAA,OAAA,EAAA,MAAA;EAKF,SAAA,OAAA,CAAA,EAAA,MAAA;;;;ACdF;AAeA;AAGA;;;;AAwBiC,KA3BrB,WAAA,GA2BqB,MAAA,GAAA,SAAA,MAAA,EAAA,GAAA,CAAA,GAAA,GAAA,SAAA,MAAA,EAAA,CAAA;AAoBT,KA5CZ,YAAA,GA4CY;EAAgB,SAAA,MAAA,EA3CrB,WA2CqB;EAI5B;AAEZ;AAOA;
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../src/errors.ts","../src/types.ts","../src/helper.ts","../src/loader.ts","../src/normalize.ts"],"sourcesContent":[],"mappings":"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"}
|
package/dist/index.mjs
CHANGED
|
@@ -2,7 +2,7 @@ import { createRequire } from "node:module";
|
|
|
2
2
|
import { defineSchemaFor, readTsconfigPaths, resolveRelativeImportWithExistenceCheck } from "@soda-gql/common";
|
|
3
3
|
import { Result, err, ok } from "neverthrow";
|
|
4
4
|
import z from "zod";
|
|
5
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
5
|
+
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";
|
|
@@ -85,6 +85,11 @@ const SchemaConfigSchema = defineSchemaFor()({
|
|
|
85
85
|
});
|
|
86
86
|
const StylesConfigSchema = defineSchemaFor()({ importExtension: z.boolean().optional() });
|
|
87
87
|
const CodegenConfigSchema = defineSchemaFor()({ chunkSize: z.number().int().positive().optional() });
|
|
88
|
+
const GraphqlCompatConfigSchema = defineSchemaFor()({
|
|
89
|
+
input: z.array(z.string().min(1)),
|
|
90
|
+
schema: z.string().min(1).optional(),
|
|
91
|
+
suffix: z.string().min(1).optional()
|
|
92
|
+
});
|
|
88
93
|
const ArtifactConfigSchema = defineSchemaFor()({ path: z.string().min(1).optional() });
|
|
89
94
|
const SodaGqlConfigSchema = defineSchemaFor()({
|
|
90
95
|
analyzer: z.enum(["ts", "swc"]).optional(),
|
|
@@ -97,6 +102,7 @@ const SodaGqlConfigSchema = defineSchemaFor()({
|
|
|
97
102
|
styles: StylesConfigSchema.optional(),
|
|
98
103
|
codegen: CodegenConfigSchema.optional(),
|
|
99
104
|
plugins: z.record(z.string(), z.unknown()).optional(),
|
|
105
|
+
graphqlCompat: GraphqlCompatConfigSchema.optional(),
|
|
100
106
|
artifact: ArtifactConfigSchema.optional()
|
|
101
107
|
});
|
|
102
108
|
function validateConfig(config) {
|
|
@@ -247,6 +253,36 @@ function normalizeTsconfigPaths(tsconfigPath, configDir) {
|
|
|
247
253
|
return ok(result.value);
|
|
248
254
|
}
|
|
249
255
|
/**
|
|
256
|
+
* Normalize graphql-compat config to resolved form.
|
|
257
|
+
* Resolves glob patterns and validates schema name.
|
|
258
|
+
*/
|
|
259
|
+
function normalizeGraphqlCompat(graphqlCompat, schemaNames, configDir) {
|
|
260
|
+
if (!graphqlCompat) {
|
|
261
|
+
return ok(undefined);
|
|
262
|
+
}
|
|
263
|
+
let schemaName = graphqlCompat.schema;
|
|
264
|
+
if (!schemaName) {
|
|
265
|
+
if (schemaNames.length !== 1 || !schemaNames[0]) {
|
|
266
|
+
return err(configError({
|
|
267
|
+
code: "CONFIG_VALIDATION_FAILED",
|
|
268
|
+
message: "graphqlCompat.schema is required when multiple schemas are configured"
|
|
269
|
+
}));
|
|
270
|
+
}
|
|
271
|
+
schemaName = schemaNames[0];
|
|
272
|
+
}
|
|
273
|
+
if (!schemaNames.includes(schemaName)) {
|
|
274
|
+
return err(configError({
|
|
275
|
+
code: "CONFIG_VALIDATION_FAILED",
|
|
276
|
+
message: `graphqlCompat.schema "${schemaName}" not found in schemas config`
|
|
277
|
+
}));
|
|
278
|
+
}
|
|
279
|
+
return ok({
|
|
280
|
+
input: graphqlCompat.input.map((p) => resolvePattern(p, configDir)),
|
|
281
|
+
schema: schemaName,
|
|
282
|
+
suffix: graphqlCompat.suffix ?? ".compat.ts"
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
250
286
|
* Normalize codegen config to resolved form with defaults.
|
|
251
287
|
*/
|
|
252
288
|
function normalizeCodegen(codegen) {
|
|
@@ -279,6 +315,12 @@ function normalizeConfig(config, configPath) {
|
|
|
279
315
|
return err(combinedResult.error);
|
|
280
316
|
}
|
|
281
317
|
const normalizedSchemas = Object.fromEntries(combinedResult.value);
|
|
318
|
+
const schemaNames = Object.keys(config.schemas);
|
|
319
|
+
const graphqlCompatResult = normalizeGraphqlCompat(config.graphqlCompat, schemaNames, configDir);
|
|
320
|
+
if (graphqlCompatResult.isErr()) {
|
|
321
|
+
return err(graphqlCompatResult.error);
|
|
322
|
+
}
|
|
323
|
+
const graphqlCompat = graphqlCompatResult.value;
|
|
282
324
|
const resolved = {
|
|
283
325
|
analyzer,
|
|
284
326
|
baseDir: configDir,
|
|
@@ -290,6 +332,7 @@ function normalizeConfig(config, configPath) {
|
|
|
290
332
|
styles: { importExtension: config.styles?.importExtension ?? false },
|
|
291
333
|
codegen: normalizeCodegen(config.codegen),
|
|
292
334
|
plugins: config.plugins ?? {},
|
|
335
|
+
...graphqlCompat ? { graphqlCompat } : {},
|
|
293
336
|
...artifact ? { artifact } : {},
|
|
294
337
|
...tsconfigPaths ? { tsconfigPaths } : {}
|
|
295
338
|
};
|
|
@@ -320,6 +363,43 @@ function findConfigFile(startDir = process.cwd()) {
|
|
|
320
363
|
}
|
|
321
364
|
return null;
|
|
322
365
|
}
|
|
366
|
+
const SKIP_DIRS = new Set(["node_modules", "dist"]);
|
|
367
|
+
/**
|
|
368
|
+
* Find all config files by walking down from rootDir.
|
|
369
|
+
* Discovers every soda-gql config file in the directory tree,
|
|
370
|
+
* skipping node_modules, dist, and dot-prefixed directories.
|
|
371
|
+
*/
|
|
372
|
+
function findAllConfigFiles(rootDir) {
|
|
373
|
+
const results = [];
|
|
374
|
+
const walk = (dir) => {
|
|
375
|
+
for (const filename of DEFAULT_CONFIG_FILENAMES) {
|
|
376
|
+
const configPath = join(dir, filename);
|
|
377
|
+
if (existsSync(configPath)) {
|
|
378
|
+
results.push(configPath);
|
|
379
|
+
break;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
let entries;
|
|
383
|
+
try {
|
|
384
|
+
entries = readdirSync(dir);
|
|
385
|
+
} catch {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
for (const entry of entries) {
|
|
389
|
+
if (SKIP_DIRS.has(entry) || entry.startsWith(".")) {
|
|
390
|
+
continue;
|
|
391
|
+
}
|
|
392
|
+
const fullPath = join(dir, entry);
|
|
393
|
+
try {
|
|
394
|
+
if (statSync(fullPath).isDirectory()) {
|
|
395
|
+
walk(fullPath);
|
|
396
|
+
}
|
|
397
|
+
} catch {}
|
|
398
|
+
}
|
|
399
|
+
};
|
|
400
|
+
walk(rootDir);
|
|
401
|
+
return results;
|
|
402
|
+
}
|
|
323
403
|
/**
|
|
324
404
|
* Load config with Result type (for library use).
|
|
325
405
|
*/
|
|
@@ -359,6 +439,7 @@ function loadConfigFrom(dir) {
|
|
|
359
439
|
var src_exports = /* @__PURE__ */ __export({
|
|
360
440
|
configError: () => configError,
|
|
361
441
|
defineConfig: () => defineConfig,
|
|
442
|
+
findAllConfigFiles: () => findAllConfigFiles,
|
|
362
443
|
findConfigFile: () => findConfigFile,
|
|
363
444
|
loadConfig: () => loadConfig,
|
|
364
445
|
loadConfigFrom: () => loadConfigFrom,
|
|
@@ -367,5 +448,5 @@ var src_exports = /* @__PURE__ */ __export({
|
|
|
367
448
|
});
|
|
368
449
|
|
|
369
450
|
//#endregion
|
|
370
|
-
export { configError, defineConfig, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
451
|
+
export { configError, defineConfig, findAllConfigFiles, findConfigFile, loadConfig, loadConfigFrom, normalizeConfig, validateConfig };
|
|
371
452
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -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"],"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 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 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 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 InjectConfig,\n ResolvedArtifactConfig,\n ResolvedCodegenConfig,\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 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 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 ...(artifact ? { artifact } : {}),\n ...(tsconfigPaths ? { tsconfigPaths } : {}),\n };\n\n return ok(resolved);\n}\n","import { existsSync } 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\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 { findConfigFile, loadConfig, loadConfigFrom } from \"./loader\";\nexport { normalizeConfig } from \"./normalize\";\nexport type {\n ArtifactConfig,\n PluginConfig,\n ResolvedArtifactConfig,\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 { 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@soda-gql/config",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "Centralized configuration loader and helpers for soda-gql tooling.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
@@ -38,9 +38,6 @@
|
|
|
38
38
|
"module": "./dist/index.mjs",
|
|
39
39
|
"types": "./dist/index.d.mts",
|
|
40
40
|
"exports": {
|
|
41
|
-
"./test": {
|
|
42
|
-
"@soda-gql": "./@devx-test.ts"
|
|
43
|
-
},
|
|
44
41
|
".": {
|
|
45
42
|
"@soda-gql": "./@x-index.ts",
|
|
46
43
|
"types": "./dist/index.d.mts",
|
|
@@ -48,10 +45,13 @@
|
|
|
48
45
|
"require": "./dist/index.cjs",
|
|
49
46
|
"default": "./dist/index.mjs"
|
|
50
47
|
},
|
|
48
|
+
"./test": {
|
|
49
|
+
"@soda-gql": "./@devx-test.ts"
|
|
50
|
+
},
|
|
51
51
|
"./package.json": "./package.json"
|
|
52
52
|
},
|
|
53
53
|
"dependencies": {
|
|
54
|
-
"@soda-gql/common": "0.
|
|
54
|
+
"@soda-gql/common": "0.12.0",
|
|
55
55
|
"@swc/core": "^1.10.0",
|
|
56
56
|
"neverthrow": "^8.2.0",
|
|
57
57
|
"zod": "^4.1.11"
|