@soda-gql/config

Configuration management for soda-gql tooling. This package provides type-safe configuration helpers and loaders.

Installation

bun add -D @soda-gql/config

defineConfig()

Create a type-safe configuration file:

// soda-gql.config.ts
import { defineConfig } from "@soda-gql/config";

export default defineConfig({
  outdir: "./src/graphql-system",
  include: ["./src/**/*.ts"],
  schemas: {
    default: {
      schema: "./schema.graphql",
      inject: "./src/graphql-system/default.inject.ts",
    },
  },
});

Configuration Options

Root Options

OptionTypeRequiredDescription
outdirstringYesOutput directory for generated GraphQL system
includestring[]YesGlob patterns for files to analyze
excludestring[]NoGlob patterns for files to exclude
schemasobjectYesSchema configurations
analyzer"ts" | "swc"NoTypeScript analyzer (default: "ts")
graphqlSystemAliasesstring[]NoPath aliases for imports
styles.importExtensionbooleanNoInclude .js extensions

Schema Options

Each entry in schemas requires:

OptionTypeDescription
schemastringPath to GraphQL schema file
injectstringPath to inject file (scalars and adapter definitions)

Multi-Schema Configuration

Support multiple GraphQL schemas in one project:

import { defineConfig } from "@soda-gql/config";

export default defineConfig({
  outdir: "./src/graphql-system",
  include: ["./src/**/*.ts"],
  schemas: {
    users: {
      schema: "./schemas/users.graphql",
      inject: "./src/graphql-system/users.inject.ts",
    },
    products: {
      schema: "./schemas/products.graphql",
      inject: "./src/graphql-system/products.inject.ts",
    },
  },
});

Use different schemas in your code:

import { gql } from "@/graphql-system";

// Use the users schema
export const getUserQuery = gql.users(({ query }) => ...);

// Use the products schema
export const getProductQuery = gql.products(({ query }) => ...);

Programmatic Loading

Load configuration programmatically using loadConfig:

import { loadConfig } from "@soda-gql/config";

const result = await loadConfig();

if (result.isOk()) {
  const config = result.value;
  console.log(config.outdir);
  console.log(Object.keys(config.schemas));
} else {
  console.error(result.error);
}

Load Options

await loadConfig({
  configPath: "./custom-config.ts",  // Custom config file path
});

Config File Formats

Supported formats (searched in order):

  1. soda-gql.config.ts (recommended)
  2. soda-gql.config.mts
  3. soda-gql.config.js
  4. soda-gql.config.mjs

Error Handling

Configuration errors are returned as Result types using neverthrow:

import { loadConfig } from "@soda-gql/config";

const result = await loadConfig();

result.match(
  (config) => {
    // Success: use config
  },
  (error) => {
    // Error: handle ConfigError
    console.error(error.code, error.message);
  },
);

Error Codes

CodeDescription
CONFIG_NOT_FOUNDNo config file found
CONFIG_PARSE_ERRORFailed to parse config file
VALIDATION_ERRORConfig validation failed