diff --git a/packages/adders/common.ts b/packages/adders/common.ts index 4255e8fe5..0b1c0e071 100644 --- a/packages/adders/common.ts +++ b/packages/adders/common.ts @@ -25,8 +25,8 @@ export function addEslintConfigPrettier({ ast }: ScriptFileEditor el?.type === 'SpreadElement' && el.argument.type === 'MemberExpression' && @@ -51,9 +53,9 @@ export function addEslintConfigPrettier({ ast }: ScriptFileEditor 'eslint.config.js', contentType: 'script', content: ({ ast, typescript }) => { - const eslintConfigs = array.createEmpty(); + const eslintConfigs: Array< + AstKinds.ExpressionKind | AstTypes.SpreadElement | AstTypes.ObjectExpression + > = []; const jsConfig = common.expressionFromString('js.configs.recommended'); - array.push(eslintConfigs, jsConfig); + eslintConfigs.push(jsConfig); if (typescript) { const tsConfig = common.expressionFromString('ts.configs.recommended'); - array.push(eslintConfigs, common.createSpreadElement(tsConfig)); + eslintConfigs.push(common.createSpreadElement(tsConfig)); } const svelteConfig = common.expressionFromString('svelte.configs["flat/recommended"]'); - array.push(eslintConfigs, common.createSpreadElement(svelteConfig)); + eslintConfigs.push(common.createSpreadElement(svelteConfig)); const globalsBrowser = common.createSpreadElement( common.expressionFromString('globals.browser') @@ -89,7 +91,7 @@ export const adder = defineAdderConfig({ globals: globalsObjLiteral }) }); - array.push(eslintConfigs, globalsConfig); + eslintConfigs.push(globalsConfig); if (typescript) { const svelteTSParserConfig = object.create({ @@ -100,23 +102,35 @@ export const adder = defineAdderConfig({ }) }) }); - array.push(eslintConfigs, svelteTSParserConfig); + eslintConfigs.push(svelteTSParserConfig); } const ignoresConfig = object.create({ ignores: common.expressionFromString('["build/", ".svelte-kit/", "dist/"]') }); - array.push(eslintConfigs, ignoresConfig); + eslintConfigs.push(ignoresConfig); - const defaultExport = exports.defaultExport(ast, eslintConfigs); + let exportExpression: AstTypes.ArrayExpression | AstTypes.CallExpression; + if (typescript) { + const tsConfigCall = functions.call('ts.config', []); + tsConfigCall.arguments.push(...eslintConfigs); + exportExpression = tsConfigCall; + } else { + const eslintArray = array.createEmpty(); + eslintConfigs.map((x) => array.push(eslintArray, x)); + exportExpression = eslintArray; + } + + const defaultExport = exports.defaultExport(ast, exportExpression); // if it's not the config we created, then we'll leave it alone and exit out - if (defaultExport.value !== eslintConfigs) { + if (defaultExport.value !== exportExpression) { log.warn('An eslint config is already defined. Skipping initialization.'); return; } // type annotate config - common.addJsDocTypeComment(defaultExport.astNode, "import('eslint').Linter.Config[]"); + if (!typescript) + common.addJsDocTypeComment(defaultExport.astNode, "import('eslint').Linter.Config[]"); // imports if (typescript) imports.addDefault(ast, 'typescript-eslint', 'ts');