Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 2 additions & 9 deletions packages/codegen/src/cli.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { generateSchema, type LoadedFlatbreadConfig } from '@flatbread/core';
import { generateSchema } from '@flatbread/core';
import { loadConfig } from '@flatbread/config';
import kleur from 'kleur';
import type { CodegenOptions } from './types.js';
Expand Down Expand Up @@ -63,14 +63,7 @@ export function createCodegenCommand() {
cwd: options.config ? dirname(options.config) : process.cwd(),
});

if (!configResult.config) {
console.error(kleur.red('✗ Failed to load Flatbread configuration'));
process.exit(1);
}

// Initialize the configuration first
const { initializeConfig } = await import('@flatbread/core');
const loadedConfig = initializeConfig(configResult.config);
const loadedConfig = configResult.config!;

// Generate GraphQL schema
if (options.verbose) {
Expand Down
3 changes: 1 addition & 2 deletions packages/codegen/src/generator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -669,11 +669,10 @@ export async function watchAndGenerate(
if (path.includes('flatbread.config.')) {
try {
const { loadConfig } = await import('@flatbread/config');
const { initializeConfig } = await import('@flatbread/core');
const configResult = await loadConfig({ cwd: process.cwd() });

if (configResult.config) {
currentConfig = initializeConfig(configResult.config);
currentConfig = configResult.config;
console.log(kleur.dim('🔧 Configuration reloaded'));
// Refresh codegen options from the updated config so changes like outputFile/outputDir/documents are applied
currentOptions = deriveOptionsFromConfig(
Expand Down
70 changes: 70 additions & 0 deletions packages/config/src/load.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
import test from 'ava';
import fs from 'node:fs/promises';
import os from 'node:os';
import path from 'node:path';
import type { LoadedFlatbreadConfig } from '@flatbread/core';
import { NoConfigFoundError, TooManyConfigsFoundError } from './errors';
import { loadConfig } from './load';

async function withTempConfig(
files: Record<string, string>,
callback: (cwd: string) => Promise<void>
) {
const cwd = await fs.mkdtemp(path.join(os.tmpdir(), 'flatbread-config-'));

try {
await Promise.all(
Object.entries(files).map(([filename, contents]) =>
fs.writeFile(path.join(cwd, filename), contents)
)
);
await callback(cwd);
} finally {
await fs.rm(cwd, { recursive: true, force: true });
}
}

test('loadConfig throws NoConfigFoundError without exiting', async (t) => {
await withTempConfig({}, async (cwd) => {
const error = await t.throwsAsync(loadConfig({ cwd }));

t.true(error instanceof NoConfigFoundError);
});
});

test('loadConfig throws TooManyConfigsFoundError without exiting', async (t) => {
await withTempConfig(
{
'flatbread.config.js': 'export default {};',
'flatbread.config.ts': 'export default {};',
},
async (cwd) => {
const error = await t.throwsAsync(loadConfig({ cwd }));

t.true(error instanceof TooManyConfigsFoundError);
}
);
});

test('loadConfig returns an initialized config', async (t) => {
await withTempConfig(
{
'flatbread.config.js': `
export default {
source: { fetch: async () => ({}) },
transformer: { extensions: ['.md'], inspect: (input) => String(input) },
content: [],
};
`,
},
async (cwd) => {
const result = await loadConfig({ cwd });
const config = result.config as LoadedFlatbreadConfig;

t.is(result.filepath, path.join(cwd, 'flatbread.config.js'));
t.is(config.transformer.length, 1);
t.deepEqual(config.loaded.extensions, ['.md']);
t.is(typeof config.fieldNameTransform, 'function');
}
);
});
3 changes: 2 additions & 1 deletion packages/config/src/load.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import {
ConfigResult,
FlatbreadConfig,
LoadedFlatbreadConfig,
initializeConfig,
} from '@flatbread/core';
import { build } from 'esbuild';
Expand Down Expand Up @@ -62,7 +63,7 @@ async function loadConfigFromBundledFile(
* @returns Promise that resolves to the user config object.
*/
export async function loadConfig({ cwd = process.cwd() } = {}): Promise<
ConfigResult<FlatbreadConfig>
ConfigResult<LoadedFlatbreadConfig>
> {
let configFileName: ConfigFileName;
const files = await fs.readdir(cwd);
Expand Down
3 changes: 1 addition & 2 deletions packages/flatbread/src/utils/getSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,5 @@ export async function loadFlatbreadConfig(
const { loadConfig } = await import('@flatbread/config');
const result = await loadConfig({ cwd });
if (!result.config) throw new Error('Flatbread configuration was not found');
const { initializeConfig } = await import('@flatbread/core');
return { ...result, config: initializeConfig(result.config) };
return result;
}
Loading