From aa2aa4e85f38f08da0c6a5e221b0f4fd3e6920c8 Mon Sep 17 00:00:00 2001 From: Nedal <73669345+cipherlogs@users.noreply.github.com> Date: Thu, 11 Jul 2024 17:27:35 +0100 Subject: [PATCH] feat: add support for BiomeJS config (#480) Co-authored-by: cipherlogs <73669345+0x78logs@users.noreply.github.com> --- README.md | 7 +++++++ src/core/biomelintrc.ts | 16 ++++++++++++++++ src/core/ctx.ts | 25 ++++++++++++++++++++++++- src/types.ts | 13 +++++++++++++ 4 files changed, 60 insertions(+), 1 deletion(-) create mode 100644 src/core/biomelintrc.ts diff --git a/README.md b/README.md index 0d1d0cd..ce53e9e 100644 --- a/README.md +++ b/README.md @@ -320,6 +320,13 @@ AutoImport({ filepath: './.eslintrc-auto-import.json', // Default `./.eslintrc-auto-import.json` globalsPropValue: true, // Default `true`, (true | false | 'readonly' | 'readable' | 'writable' | 'writeable') }, + + // Generate corresponding .biomelintrc-auto-import.json file. + // biomejs extends Docs - https://biomejs.dev/guides/how-biome-works/#the-extends-option + biomelintrc: { + enabled: false, // Default `false` + filepath: './.biomelintrc-auto-import.json', // Default `./.biomelintrc-auto-import.json` + }, }) ``` diff --git a/src/core/biomelintrc.ts b/src/core/biomelintrc.ts new file mode 100644 index 0000000..b17446d --- /dev/null +++ b/src/core/biomelintrc.ts @@ -0,0 +1,16 @@ +import type { Import } from 'unimport' + +export function generateBiomeLintConfigs( + imports: Import[], +) { + const names + = imports + .map(i => i.as ?? i.name) + .filter(Boolean) + .sort() + + const config = { javascript: { globals: names } } + const jsonBody = JSON.stringify(config, null, 2) + + return jsonBody +} diff --git a/src/core/ctx.ts b/src/core/ctx.ts index 529f003..6051a21 100644 --- a/src/core/ctx.ts +++ b/src/core/ctx.ts @@ -12,8 +12,9 @@ import fg from 'fast-glob' import { vueTemplateAddon } from 'unimport/addons' import MagicString from 'magic-string' import { presets } from '../presets' -import type { ESLintGlobalsPropValue, ESLintrc, ImportExtended, Options } from '../types' +import type { BiomeLintrc, ESLintGlobalsPropValue, ESLintrc, ImportExtended, Options } from '../types' import { generateESLintConfigs } from './eslintrc' +import { generateBiomeLintConfigs } from './biomelintrc' import { resolversAddon } from './resolvers' function resolveGlobsExclude(root: string, glob: string) { @@ -48,6 +49,10 @@ export function createContext(options: Options = {}, root = process.cwd()) { eslintrc.filepath = eslintrc.filepath || './.eslintrc-auto-import.json' eslintrc.globalsPropValue = eslintrc.globalsPropValue === undefined ? true : eslintrc.globalsPropValue + const biomelintrc: BiomeLintrc = options.biomelintrc || {} + biomelintrc.enabled = biomelintrc.enabled !== undefined + biomelintrc.filepath = biomelintrc.filepath || './.biomelintrc-auto-import.json' + const resolvers = options.resolvers ? [options.resolvers].flat(2) : [] // When "options.injectAtEnd" is undefined or true, it's true. @@ -177,6 +182,10 @@ ${dts}`.trim()}\n` return generateESLintConfigs(await unimport.getImports(), eslintrc, await parseESLint()) } + async function generateBiomeLint() { + return generateBiomeLintConfigs(await unimport.getImports()) + } + const writeConfigFilesThrottled = throttle(500, writeConfigFiles, { noLeading: false }) async function writeFile(filePath: string, content = '') { @@ -186,6 +195,8 @@ ${dts}`.trim()}\n` let lastDTS: string | undefined let lastESLint: string | undefined + let lastBiomeLint: string | undefined + async function writeConfigFiles() { const promises: any[] = [] if (dts) { @@ -215,6 +226,18 @@ ${dts}`.trim()}\n` }), ) } + + if (biomelintrc.enabled) { + promises.push( + generateBiomeLint().then((content) => { + if (content !== lastBiomeLint) { + lastBiomeLint = content + return writeFile(biomelintrc.filepath!, content) + } + }), + ) + } + return Promise.all(promises) } diff --git a/src/types.ts b/src/types.ts index f1ddca8..3724ca2 100644 --- a/src/types.ts +++ b/src/types.ts @@ -70,6 +70,19 @@ export interface ESLintrc { globalsPropValue?: ESLintGlobalsPropValue } +export interface BiomeLintrc { + /** + * @default false + */ + enabled?: boolean + /** + * Filepath to save the generated eslint config + * + * @default './.eslintrc-auto-import.json' + */ + filepath?: string +} + export interface Options { /** * Preset names or custom imports map