diff --git a/packages/wbfy/src/generators/oxlintConfig.ts b/packages/wbfy/src/generators/oxlintConfig.ts index 60c7cf58..674709ae 100644 --- a/packages/wbfy/src/generators/oxlintConfig.ts +++ b/packages/wbfy/src/generators/oxlintConfig.ts @@ -64,6 +64,8 @@ function replaceLegacyConfigReferences(content: string): string { } function getConfigContent(config: PackageConfig): string { + const isRootConfig = config.isRoot; + // Do not collapse this to a static import for every package. CommonJS packages // type-check auto-discovered oxlint.config.ts as CommonJS, so importing the ESM // @willbooster/oxlint-config package triggers TS1479. Keep this in sync with @@ -74,15 +76,30 @@ function getConfigContent(config: PackageConfig): string { `// oxlint-disable unicorn/prefer-module -- Oxlint only auto-discovers .ts config files, and CommonJS avoids Node typeless ESM warnings. const oxlintBaseConfig = require('@willbooster/oxlint-config'); -const oxlintResolvedConfig = oxlintBaseConfig.default ?? oxlintBaseConfig;` +${getResolvedConfigContent('oxlintBaseConfig.default ?? oxlintBaseConfig', isRootConfig)}` )} ${managedConfigBlocks.getBlock('export', 'module.exports = oxlintResolvedConfig;')} `; } - return `${managedConfigBlocks.getBlock('base', "import oxlintResolvedConfig from '@willbooster/oxlint-config';")} + return `${managedConfigBlocks.getBlock( + 'base', + `import oxlintBaseConfig from '@willbooster/oxlint-config'; + +${getResolvedConfigContent('oxlintBaseConfig', isRootConfig)}` + )} ${managedConfigBlocks.getBlock('export', 'export default oxlintResolvedConfig;')} `; } + +function getResolvedConfigContent(baseConfigName: string, isRootConfig: boolean): string { + if (isRootConfig) { + return `const oxlintResolvedConfig = ${baseConfigName};`; + } + + return `// Oxlint only supports type-aware options in the root config, while it +// still auto-discovers package-local config files in monorepos. +const { options: _rootOnlyOptions, ...oxlintResolvedConfig } = ${baseConfigName};`; +} diff --git a/packages/wbfy/test/oxlintConfigGenerator.test.ts b/packages/wbfy/test/oxlintConfigGenerator.test.ts index af7fd25f..b429873f 100644 --- a/packages/wbfy/test/oxlintConfigGenerator.test.ts +++ b/packages/wbfy/test/oxlintConfigGenerator.test.ts @@ -73,7 +73,24 @@ test('generates esm oxlint config for esm packages', async () => { await promisePool.promiseAll(); const content = await readOxlintConfig(dirPath); - expect(content).toContain("import oxlintResolvedConfig from '@willbooster/oxlint-config';"); + expect(content).toContain("import oxlintBaseConfig from '@willbooster/oxlint-config';"); + expect(content).toContain('const oxlintResolvedConfig = oxlintBaseConfig;'); + expect(content).toContain('export default oxlintResolvedConfig;'); +}); + +test('omits root-only oxlint options for sub-package configs', async () => { + const rootDirPath = createTempDir(); + const dirPath = createTempDir(); + + await generateOxlintConfig( + createConfig({ dirPath, isEsmPackage: true, isRoot: false }), + createConfig({ dirPath: rootDirPath }) + ); + await promisePool.promiseAll(); + + const content = await readOxlintConfig(dirPath); + expect(content).toContain('options: _rootOnlyOptions'); + expect(content).toContain('...oxlintResolvedConfig'); expect(content).toContain('export default oxlintResolvedConfig;'); });