@santi020k/eslint-config-basic 3.3.0 → 3.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/dist/cli-preset.d.ts +13 -2
- package/dist/cli-preset.js +58 -9
- package/dist/cli-preset.js.map +1 -1
- package/dist/cli-workflows.d.ts +23 -3
- package/dist/cli-workflows.js +173 -11
- package/dist/cli-workflows.js.map +1 -1
- package/dist/cli.d.ts +2 -1
- package/dist/cli.js +44 -4
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +12 -2
- package/dist/index.js.map +1 -1
- package/dist/recommended.d.ts +6 -3
- package/dist/recommended.js +2 -1
- package/dist/recommended.js.map +1 -1
- package/dist/tailwind.d.ts +2 -1
- package/dist/tailwind.js +87 -11
- package/dist/tailwind.js.map +1 -1
- package/package.json +9 -9
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,17 @@ export { DetectedFrameworkName, DetectionOptions, EslintConfigOptions, Extension
|
|
|
3
3
|
export { angular, astro, expo, hono, lit, nest, next, nuxt, preact, qwik, react, reactRouter, slidev, solid, svelte, tanstackStart, vite, vue } from './frameworks.js';
|
|
4
4
|
export { typescriptConfig } from '@santi020k/eslint-config-typescript';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Portable public result type returned by the Basic config composer.
|
|
8
|
+
*
|
|
9
|
+
* Keeping this as a package-owned interface prevents TypeScript declaration
|
|
10
|
+
* inference from exposing pnpm-internal `typescript-eslint` paths in consumer
|
|
11
|
+
* `eslint.config.js` files.
|
|
12
|
+
*/
|
|
13
|
+
interface EslintConfigArray extends FlatConfigArray {
|
|
14
|
+
length: number;
|
|
15
|
+
}
|
|
16
|
+
type ConfigComposer = (options?: EslintConfigOptions, ...extraConfigs: ConfigInput[]) => Promise<EslintConfigArray>;
|
|
7
17
|
/**
|
|
8
18
|
* Copies already-loaded plugin objects onto rule blocks that reference them.
|
|
9
19
|
* ESLint 10 validates plugin availability per effective config object, while
|
|
@@ -20,4 +30,4 @@ declare const attachReferencedPlugins: (configs: FlatConfigArray) => FlatConfigA
|
|
|
20
30
|
*/
|
|
21
31
|
declare const defineConfig: ConfigComposer;
|
|
22
32
|
|
|
23
|
-
export { attachReferencedPlugins, defineConfig };
|
|
33
|
+
export { type EslintConfigArray, attachReferencedPlugins, defineConfig };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport {\n applyDetectionControls,\n applyStrictMode,\n applyStrictProfileDefaults,\n type ConfigInput,\n coreConfig,\n createCoreConfig,\n createGitignoreConfig,\n DEFAULT_IGNORES,\n type DetectedFrameworkName,\n detectProjectOptions,\n type EslintConfigOptions,\n Extension,\n findTailwindEntryPoint,\n type FlatConfigArray,\n flattenConfigInputs,\n type Format,\n GENERATED_CODE_IGNORES,\n getStrictMode,\n type ImportedFramework,\n Library,\n mergeFrameworkOption,\n mergeOptionalBucket,\n mergeProjectOptions,\n NextMode,\n patchImportGroups,\n Preset,\n resolveTsconfigRootDir,\n resolveTypescriptOptions,\n Runtime,\n scopeConfigToProject,\n Setting,\n type TailwindOptions,\n Testing,\n type Tool,\n type TypeScriptMode,\n type TypeScriptOptions\n} from '@santi020k/eslint-config-core'\nimport { createTypescriptConfig } from '@santi020k/eslint-config-typescript'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nimport { attachDefineConfigMetadata } from './define-config-metadata.js'\nimport { createDetectedFrameworkFlags, type FrameworkOptions } from './frameworks.js'\nimport { getIntegrationConfigs, getPrettierConfig } from './integrations.js'\nimport { resolveFramework, resolvePreset } from './resolvers.js'\nimport { buildTailwindSettingsConfig } from './tailwind.js'\n\nconst SCRIPT_FILE_GLOBS = ['**/scripts/**/*.{js,mjs,cjs,ts,mts,cts}']\n\nconst getCliEntryFiles = (rootDir: string): string[] => {\n const manifestPath = join(rootDir, 'package.json')\n\n if (!existsSync(manifestPath)) return SCRIPT_FILE_GLOBS\n\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as {\n bin?: Record<string, string> | string\n }\n\n const binFiles = typeof manifest.bin === 'string' ?\n [manifest.bin] :\n Object.values(manifest.bin ?? {})\n\n return [...new Set([\n ...SCRIPT_FILE_GLOBS,\n ...binFiles.map(file => file.replace(/^\\.\\//, ''))\n ])]\n } catch {\n return SCRIPT_FILE_GLOBS\n }\n}\n\n// Lazy framework factories.\nexport {\n angular,\n astro,\n expo,\n hono,\n lit,\n nest,\n next,\n nuxt,\n preact,\n qwik,\n react,\n reactRouter,\n slidev,\n solid,\n svelte,\n tanstackStart,\n vite,\n vue\n} from './frameworks.js'\n\n// Re-export core types and utilities\nexport type {\n DetectedFrameworkName,\n DetectionOptions,\n EslintConfigOptions,\n ExtensionName,\n ExtensionOption,\n FlatConfigArray,\n FormatName,\n FormatOption,\n ImportedFramework,\n ImportGroupOptions,\n LibraryName,\n LibraryOption,\n NextModeName,\n NextModeOption,\n OptionalConfigMap,\n OptionalConfigName,\n PresetName,\n PresetOption,\n ProjectConfigOptions,\n RuntimeName,\n RuntimeOption,\n SettingName,\n SettingOption,\n StrictMode,\n TestingName,\n TestingOption,\n ToolName,\n ToolOption,\n TypeScriptMode,\n TypeScriptOptions\n} from '@santi020k/eslint-config-core'\nexport {\n coreConfig,\n createCoreConfig,\n createGitignoreConfig,\n createImportGroups,\n detectProjectOptions,\n Extension,\n Format,\n getGlobalsForRuntime,\n groups,\n hasReactConfig,\n Library,\n NextMode,\n Preset,\n ReactConfigKeys,\n Runtime,\n Setting,\n Testing,\n Tool\n} from '@santi020k/eslint-config-core'\n\n// Re-export framework configs\nexport { typescriptConfig } from '@santi020k/eslint-config-typescript'\n\nconst buildTailwindResult = (\n options: TailwindOptions,\n entryPoint: string | undefined,\n rootDir: string\n): TailwindOptions => ({\n cwd: options.cwd ?? rootDir,\n detectComponentClasses: options.detectComponentClasses ?? true,\n ...(entryPoint ? { entryPoint } : {}),\n ...(options.ignore?.length ? { ignore: options.ignore } : {}),\n ...(options.noUnknownClasses === undefined ? {} : { noUnknownClasses: options.noUnknownClasses })\n})\n\nconst resolveTailwindOptions = (\n rootDir: string,\n tailwind: EslintConfigOptions['tailwind']\n): TailwindOptions | undefined => {\n if (tailwind === false) return undefined\n\n const options = tailwind ?? {}\n const entryPoint = options.entryPoint ?? findTailwindEntryPoint(rootDir)\n\n const resolvedOptions: TailwindOptions = !entryPoint && options.noUnknownClasses === undefined ?\n { ...options, noUnknownClasses: false } :\n options\n\n return buildTailwindResult(resolvedOptions, entryPoint, rootDir)\n}\n\nconst TESTING_CONFIG_NAMES: Partial<Record<Testing, string[]>> = {\n [Testing.Cypress]: ['integrations/cypress'],\n [Testing.Jest]: ['integrations/jest'],\n [Testing.JestDom]: ['eslint-config-integrations/jest-dom'],\n [Testing.Playwright]: ['integrations/playwright'],\n [Testing.TestingLibrary]: ['integrations/testing-library'],\n [Testing.Vitest]: ['integrations/vitest']\n}\n\nconst applyTestingFileOverrides = (\n configs: FlatConfigArray,\n testingFiles: EslintConfigOptions['testingFiles']\n): FlatConfigArray => {\n if (!testingFiles) return configs\n\n const entries = Object.entries(testingFiles).filter(([, files]) => files.length > 0)\n\n if (entries.length === 0) return configs\n\n return configs.map(config => {\n const match = entries.find(([testingName]) => (TESTING_CONFIG_NAMES[testingName as Testing] ?? []).includes(config.name ?? ''))\n\n if (!match) return config\n\n const [, files] = match\n\n return {\n ...config,\n files\n }\n })\n}\n\nconst ESLINT_CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.mjs',\n 'eslint.config.ts',\n 'eslint.config.cts',\n 'eslint.config.mts'\n]\n\n// A direct defineConfig() call retains the eslint.config.* frame in Node's\n// stack. Prefer that location over cwd because editor ESLint processes may be\n// launched from outside the project.\nconst findConfigRootFromStack = (stack: string | undefined = new Error().stack): string | undefined => {\n if (!stack) return undefined\n\n for (const line of stack.split('\\n')) {\n const configFilename = ESLINT_CONFIG_FILENAMES.find(filename => line.includes(filename))\n\n if (!configFilename) continue\n\n const filenameStart = line.indexOf(configFilename)\n const fileUrlStart = line.lastIndexOf('file://', filenameStart)\n const windowsPathStart = line.slice(0, filenameStart).search(/[A-Za-z]:[\\\\/]/)\n const absolutePathStart = line.indexOf('/')\n let configPathStart = absolutePathStart\n\n if (windowsPathStart >= 0) configPathStart = windowsPathStart\n\n if (fileUrlStart >= 0) configPathStart = fileUrlStart\n\n try {\n if (configPathStart < 0) continue\n\n const configPath = line.slice(configPathStart, filenameStart + configFilename.length)\n\n return dirname(configPath.startsWith('file:') ? fileURLToPath(configPath) : configPath)\n } catch {\n // Ignore malformed or non-local stack URLs and retain the cwd fallback.\n }\n }\n\n return undefined\n}\n\nconst resolveConfigSetup = (options: EslintConfigOptions | undefined) => {\n const {\n autoFrameworks = true,\n detectRootDir,\n optionMergeStrategy = 'merge',\n preset: requestedPreset,\n root,\n tsconfigRootDir\n } = options ?? {}\n\n const implicitRootDir = root ?? detectRootDir ?? tsconfigRootDir ?? findConfigRootFromStack()\n\n return {\n autoFrameworks,\n detectRootDir: implicitRootDir,\n optionMergeStrategy,\n requestedPreset\n }\n}\n\nconst resolveUniqueLibraries = (\n libraries: Library[],\n tailwind: EslintConfigOptions['tailwind']\n): Library[] => {\n const uniqueLibraries = [...new Set(libraries)]\n\n if (tailwind === false) return uniqueLibraries.filter(library => library !== Library.Tailwind)\n\n if (!tailwind) return uniqueLibraries\n\n return [...new Set([...uniqueLibraries, Library.Tailwind])]\n}\n\nconst resolvePresetMeta = (\n requestedPreset: EslintConfigOptions['preset'],\n detected: EslintConfigOptions,\n autoFrameworks: boolean\n) => {\n const preset = requestedPreset ?? detected.preset\n const presetDefaults = preset ? resolvePreset(preset as Preset) : {}\n const frameworkDefaults = autoFrameworks ? createDetectedFrameworkFlags(detected.detectedFrameworks) : {}\n\n return { frameworkDefaults, preset, presetDefaults }\n}\n\nconst resolveConfiguredProjects = (\n detected: EslintConfigOptions,\n options: EslintConfigOptions | undefined\n): Record<string, EslintConfigOptions> => ({\n ...(detected.projects ?? {}),\n ...(options?.projects ?? {})\n})\n\nconst resolveBucketDefaults = (detected: EslintConfigOptions) => ({\n detectedExtensions: detected.extensions ?? [],\n detectedFormats: detected.formats ?? [],\n detectedLibraries: detected.libraries ?? [],\n detectedTesting: detected.testing ?? [],\n detectedTools: detected.tools ?? []\n})\n\nconst scopeWorkspaceDetection = (\n detected: EslintConfigOptions,\n isWorkspace: boolean\n): EslintConfigOptions => isWorkspace ?\n {\n ...detected,\n detectedFrameworks: [],\n libraries: [],\n nextMode: undefined,\n runtime: Runtime.Universal\n } :\n detected\n\nconst resolveDetectedOptions = (\n detectRootDir: string | undefined,\n detection: EslintConfigOptions['detection'],\n requestedPreset: EslintConfigOptions['preset']\n): EslintConfigOptions => {\n const rawDetected = detectProjectOptions(detectRootDir)\n\n const shouldDetectProjects = requestedPreset === Preset.Monorepo ||\n rawDetected.preset === Preset.Monorepo\n\n const detected = applyDetectionControls(rawDetected, detection, { projects: shouldDetectProjects })\n const hasDetectedProjects = Object.keys(detected.projects ?? {}).length > 0\n\n // Root devDependencies in a workspace commonly contain frameworks and\n // libraries used by only one package. Keep those detections package-scoped;\n // explicit root options still apply normally.\n return scopeWorkspaceDetection(detected, hasDetectedProjects)\n}\n\nconst resolveNextModeValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions\n): NextMode => (options?.nextMode ?? presetDefaults.nextMode ?? detected.nextMode ?? NextMode.Pages) as NextMode\n\nconst resolveRuntimeValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions,\n usePresetRuntime: boolean\n): Runtime => (\n options?.runtime ??\n (usePresetRuntime ? presetDefaults.runtime : undefined) ??\n detected.runtime ??\n Runtime.Universal\n) as Runtime\n\nconst resolveSettingsValue = (\n options: EslintConfigOptions | undefined,\n detected: EslintConfigOptions\n): Setting[] => (options?.settings ?? detected.settings ?? []) as Setting[]\n\nconst resolveTypescriptValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions\n): EslintConfigOptions['typescript'] => options?.typescript ?? presetDefaults.typescript ?? detected.typescript ?? false\n\nconst needsReactAutoAdd = (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>\n): boolean => Boolean(\n frameworks.next ??\n frameworks.expo ??\n frameworks['react-router'] ??\n (frameworks['tanstack-start'] && !frameworks.solid)\n) && !frameworks.react\n\nconst applyFrameworkImpliedDeps = (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>\n): NonNullable<EslintConfigOptions['frameworks']> => {\n const result = { ...frameworks }\n\n if (needsReactAutoAdd(result)) result.react = true\n\n if (result.slidev && !result.vue) result.vue = true\n\n if (result.nuxt && !result.vue) result.vue = true\n\n return result\n}\n\nconst buildIgnoresConfig = (\n useDefaultIgnores: boolean,\n useGeneratedCodeIgnores: boolean,\n useGitignore: boolean,\n options: EslintConfigOptions | undefined,\n rootDir: string\n) => ({\n defaultIgnores: useDefaultIgnores ?\n [{\n ignores: [...DEFAULT_IGNORES, ...(useGeneratedCodeIgnores ? GENERATED_CODE_IGNORES : [])],\n name: 'eslint-config-basic/default-ignores'\n } as TSESLint.FlatConfig.Config] :\n [],\n gitignoreConfig: useGitignore ? createGitignoreConfig(rootDir) : [] as FlatConfigArray,\n userIgnores: options?.ignores?.length ?\n [{\n ignores: options.ignores,\n name: 'eslint-config-basic/ignores'\n } as TSESLint.FlatConfig.Config] :\n []\n})\n\ninterface FrameworkResolutionContext {\n hasReact: boolean\n hasSolid: boolean\n hasSvelte: boolean\n hasVue: boolean\n runtime: Runtime\n tsconfigRootDir?: string\n typeChecked?: boolean\n}\n\nconst FRAMEWORK_EXTRA_OPTS: Partial<Record<string, (ctx: FrameworkResolutionContext) => FrameworkOptions>> = {\n astro: ctx => ({\n hasReact: ctx.hasReact,\n hasSolid: ctx.hasSolid,\n hasSvelte: ctx.hasSvelte,\n hasVue: ctx.hasVue,\n tsconfigRootDir: ctx.tsconfigRootDir,\n typeChecked: ctx.typeChecked\n }),\n hono: ctx => ({ runtime: ctx.runtime }),\n slidev: ctx => ({ runtime: ctx.runtime }),\n vite: ctx => ({ runtime: ctx.runtime })\n}\n\nconst resolveEnabledFrameworks = async (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>,\n ctx: FrameworkResolutionContext\n): Promise<Record<string, FlatConfigArray>> => {\n const entries = await Promise.all(\n (Object.entries(frameworks) as [DetectedFrameworkName, ImportedFramework][])\n .filter((entry): entry is [DetectedFrameworkName, ImportedFramework] => Boolean(entry[1]))\n .map(([name, value]) => resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx))\n .then(config => [name, config] as const))\n )\n\n return Object.fromEntries(entries)\n}\n\ninterface BuildConfigsParams {\n astroOptions: { hasReact: boolean, hasSolid: boolean, hasSvelte: boolean, hasVue: boolean, typeChecked?: boolean }\n defaultIgnores: TSESLint.FlatConfig.Config[]\n gitignoreConfig: FlatConfigArray\n nextMode: NextMode\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n resolvedTypescript: false | (TypeScriptOptions & { mode: Exclude<TypeScriptMode, 'off'> })\n rootDir: string\n runtime: Runtime\n runtimeCoreConfig: FlatConfigArray\n tailwindOptions: TailwindOptions | undefined\n testingFiles: EslintConfigOptions['testingFiles']\n tsconfigRootDir: string | undefined\n uniqueExtensions: Extension[]\n uniqueFormats: Format[]\n uniqueLibraries: Library[]\n uniqueTesting: Testing[]\n uniqueTools: Tool[]\n userIgnores: TSESLint.FlatConfig.Config[]\n}\n\nconst buildEslintConfigs = async (params: BuildConfigsParams): Promise<FlatConfigArray> => {\n const {\n astroOptions, defaultIgnores, gitignoreConfig, nextMode, resolvedFrameworks,\n resolvedTypescript, rootDir, runtime, runtimeCoreConfig, tailwindOptions,\n testingFiles, tsconfigRootDir, uniqueExtensions, uniqueFormats, uniqueLibraries,\n uniqueTesting, uniqueTools, userIgnores\n } = params\n\n const { hasReact, hasSolid, hasSvelte, hasVue, typeChecked } = astroOptions\n\n const fw = await resolveEnabledFrameworks(\n resolvedFrameworks, { hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir, typeChecked }\n )\n\n const get = (name: string): FlatConfigArray => fw[name] ?? []\n\n const typescriptConfigs = resolvedTypescript ?\n createTypescriptConfig({\n ...resolvedTypescript,\n tsconfigRootDir: resolvedTypescript.tsconfigRootDir ?? tsconfigRootDir\n }) :\n []\n\n const untypedTypescriptConfigs = typescriptConfigs.filter(\n config => config.name === 'eslint-config-typescript/untyped-files'\n )\n\n const typedTypescriptConfigs = typescriptConfigs.filter(\n config => config.name !== 'eslint-config-typescript/untyped-files'\n )\n\n return [\n ...defaultIgnores,\n ...userIgnores,\n ...gitignoreConfig,\n ...(tsconfigRootDir ?\n [{\n languageOptions: { parserOptions: { tsconfigRootDir } },\n name: 'eslint-config-basic/tsconfig-root-dir'\n }] :\n []),\n {\n files: ['**/*.cjs', '**/*.cts'],\n languageOptions: {\n globals: {\n __dirname: 'readonly',\n __filename: 'readonly',\n exports: 'readonly',\n module: 'readonly',\n require: 'readonly'\n },\n sourceType: 'commonjs'\n },\n name: 'eslint-config-basic/commonjs'\n },\n ...runtimeCoreConfig,\n ...(hasReact ? get('react') : []),\n ...get('next'),\n ...get('expo'),\n ...get('nest'),\n ...get('hono'),\n ...get('vue'),\n ...get('svelte'),\n ...get('solid'),\n ...get('angular'),\n ...get('qwik'),\n ...get('react-router'),\n ...get('tanstack-start'),\n ...get('nuxt'),\n ...get('preact'),\n ...get('lit'),\n ...get('slidev'),\n ...get('vite'),\n ...typedTypescriptConfigs,\n ...get('astro'),\n ...(resolvedFrameworks.next && nextMode === NextMode.AppRouter ?\n [{\n files: ['app/**/*.{ts,tsx}', 'src/**/*.{ts,tsx}'],\n name: 'eslint-config-next/app-router-overrides',\n rules: { '@next/next/no-html-link-for-pages': 'off' }\n } as TSESLint.FlatConfig.Config] :\n []),\n ...applyTestingFileOverrides(\n await getIntegrationConfigs(\n uniqueLibraries, uniqueTools, uniqueTesting, uniqueFormats, uniqueExtensions\n ),\n testingFiles\n ),\n ...(resolvedFrameworks.next ?\n [{\n files: ['next-env.d.ts'],\n name: 'eslint-config-next/generated-declaration',\n rules: {\n '@stylistic/quotes': 'off',\n '@stylistic/semi': 'off'\n }\n } as TSESLint.FlatConfig.Config] :\n []),\n {\n files: [\n '**/*.{test,spec}.{js,mjs,cjs,jsx,ts,mts,cts,tsx}',\n '**/{test,tests,__tests__}/**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'\n ],\n name: 'eslint-config-basic/test-file-overrides',\n rules: {\n '@typescript-eslint/no-empty-function': 'off',\n 'no-use-before-define': 'off'\n }\n },\n {\n files: getCliEntryFiles(rootDir),\n name: 'eslint-config-basic/scripts-overrides',\n rules: {\n 'n/no-unpublished-import': 'off',\n 'n/no-process-exit': 'off',\n 'no-console': 'off'\n }\n },\n ...(tailwindOptions ? [buildTailwindSettingsConfig(tailwindOptions)] : []),\n ...untypedTypescriptConfigs,\n ...(await getPrettierConfig(uniqueTools))\n ]\n}\n\ninterface EslintDebugInfo {\n autoFrameworks: boolean\n detectRootDir: string | undefined\n nextMode: NextMode\n optionMergeStrategy: 'merge' | 'replace'\n preset: EslintConfigOptions['preset']\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n resolvedTypescript: BuildConfigsParams['resolvedTypescript']\n runtime: Runtime\n tsconfigRootDir: string | undefined\n uniqueExtensions: Extension[]\n uniqueFormats: Format[]\n uniqueLibraries: Library[]\n uniqueTesting: Testing[]\n uniqueTools: Tool[]\n}\n\nconst logEslintDebug = ({\n autoFrameworks,\n detectRootDir,\n nextMode,\n optionMergeStrategy,\n preset,\n resolvedFrameworks,\n resolvedTypescript,\n runtime,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools\n}: EslintDebugInfo) => {\n if (!process.env.ESLINT_BASIC_DEBUG) return\n\n process.stdout.write(`[ESLint Basic] Resolved options: ${JSON.stringify({\n autoFrameworks,\n detectRootDir: detectRootDir ?? process.cwd(),\n extensions: uniqueExtensions,\n formats: uniqueFormats,\n frameworks: Object.entries(resolvedFrameworks)\n .filter(([, value]) => Boolean(value))\n .map(([key]) => key),\n libraries: uniqueLibraries,\n nextMode,\n optionMergeStrategy,\n preset,\n runtime,\n testing: uniqueTesting,\n tools: uniqueTools,\n tsconfigRootDir,\n typescript: resolvedTypescript ? resolvedTypescript.mode : false\n }, null, 2)}\\n`)\n}\n\nconst emitAstroDoctorWarning = (\n extensions: Extension[],\n frameworks: Record<string, unknown>\n): void => {\n if (!extensions.includes(Extension.AstroDoctor) || frameworks.astro) return\n\n process.emitWarning(\n '[eslint-config-basic] Warning: Astro Doctor is enabled without the Astro framework config. ' +\n 'Enable `frameworks: { astro: true }` or remove the `astro-doctor` feature.'\n )\n}\n\ntype ConfigComposer = (\n options?: EslintConfigOptions,\n ...extraConfigs: ConfigInput[]\n) => Promise<FlatConfigArray>\n\nconst resolveProjectConfigs = async (\n configuredProjects: Record<string, EslintConfigOptions>,\n projectDefaults: EslintConfigOptions['projectDefaults'],\n detectRootDir: string | undefined,\n autoFrameworks: boolean | undefined,\n composeConfig: ConfigComposer\n) => Promise.all(\n Object.entries(configuredProjects).map(async ([projectPath, projectOptions]) => {\n const projectRoot = join(detectRootDir ?? process.cwd(), projectPath)\n const inheritedOptions = mergeProjectOptions(projectDefaults ?? {}, projectOptions)\n\n const scopedConfigs = await composeConfig({\n autoFrameworks,\n ...inheritedOptions,\n projectDefaults: undefined,\n projects: undefined,\n root: inheritedOptions.root ?? inheritedOptions.detectRootDir ?? projectRoot\n })\n\n return scopedConfigs.map(config => config.name === 'eslint-config/gitignore' ? config : scopeConfigToProject(config, projectPath))\n })\n)\n\nconst resolveInheritedProjectDefaults = (\n options: EslintConfigOptions | undefined\n): EslintConfigOptions['projectDefaults'] => mergeProjectOptions(\n {\n ...(options?.detection === undefined ? {} : { detection: options.detection }),\n ...(options?.tailwind === undefined ? {} : { tailwind: options.tailwind }),\n ...(typeof options?.typescript === 'object' && options.typescript.untypedFiles !== undefined ?\n { typescript: { untypedFiles: options.typescript.untypedFiles } } :\n {})\n },\n options?.projectDefaults ?? {}\n)\n\nconst getPluginNameFromRule = (\n ruleName: string,\n availablePluginNames: Iterable<string>\n): string | undefined => {\n const segments = ruleName.split('/')\n\n if (segments.length < 2) return undefined\n\n const registeredPrefix = [...availablePluginNames]\n .filter(pluginName => ruleName.startsWith(`${pluginName}/`))\n .sort((left, right) => right.length - left.length)[0]\n\n if (registeredPrefix) return registeredPrefix\n\n return ruleName.startsWith('@') && segments.length > 2 ?\n segments.slice(0, 2).join('/') :\n segments[0]\n}\n\n/**\n * Copies already-loaded plugin objects onto rule blocks that reference them.\n * ESLint 10 validates plugin availability per effective config object, while\n * feature packs often keep plugin setup and consumer overrides separate.\n */\nexport const attachReferencedPlugins = (configs: FlatConfigArray): FlatConfigArray => {\n const availablePlugins = new Map<string, NonNullable<TSESLint.FlatConfig.Config['plugins']>[string]>()\n const ambiguousPluginNames = new Set<string>()\n\n for (const config of configs) {\n for (const [pluginName, plugin] of Object.entries(config.plugins ?? {})) {\n const existingPlugin = availablePlugins.get(pluginName)\n\n if (existingPlugin && existingPlugin !== plugin) {\n availablePlugins.delete(pluginName)\n\n ambiguousPluginNames.add(pluginName)\n } else if (!ambiguousPluginNames.has(pluginName)) {\n availablePlugins.set(pluginName, plugin)\n }\n }\n }\n\n return configs.map(config => {\n const requiredPlugins = new Set(\n Object.keys(config.rules ?? {})\n .map(ruleName => getPluginNameFromRule(ruleName, availablePlugins.keys()))\n .filter((pluginName): pluginName is string => pluginName !== undefined)\n )\n\n const missingPluginEntries = [...requiredPlugins].flatMap(pluginName => {\n const plugin = availablePlugins.get(pluginName)\n\n return !Object.hasOwn(config.plugins ?? {}, pluginName) && plugin ?\n [[pluginName, plugin] as const] :\n []\n })\n\n if (missingPluginEntries.length === 0) return config\n\n return {\n ...config,\n plugins: {\n ...config.plugins,\n ...Object.fromEntries(missingPluginEntries)\n }\n }\n })\n}\n\nconst getConfigsParams = (\n options: EslintConfigOptions | undefined,\n rootDir: string,\n runtime: Runtime,\n uniqueLibraries: Library[],\n uniqueSettings: Setting[],\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n) => {\n const hasReact = !!resolvedFrameworks.react\n const hasVue = !!resolvedFrameworks.vue\n const hasSvelte = !!resolvedFrameworks.svelte\n const hasSolid = !!resolvedFrameworks.solid\n const useGitignore = !uniqueSettings.includes(Setting.NoGitignore)\n const useDefaultIgnores = !uniqueSettings.includes(Setting.NoDefaultIgnores)\n const useGeneratedCodeIgnores = !uniqueSettings.includes(Setting.NoGeneratedCodeIgnores)\n\n const tailwindOptions = uniqueLibraries.includes(Library.Tailwind) ?\n resolveTailwindOptions(rootDir, options?.tailwind) :\n undefined\n\n const runtimeCoreConfig = runtime === Runtime.Universal ? coreConfig : createCoreConfig(runtime)\n\n const { defaultIgnores, gitignoreConfig, userIgnores } = buildIgnoresConfig(\n useDefaultIgnores, useGeneratedCodeIgnores, useGitignore, options, rootDir\n )\n\n return {\n astroOptions: { hasReact, hasSolid, hasSvelte, hasVue },\n defaultIgnores,\n gitignoreConfig,\n runtimeCoreConfig,\n tailwindOptions,\n userIgnores\n }\n}\n\n/**\n * Generates the ESLint configuration array, applying configurations\n * and integration settings based on the input configuration.\n *\n * @param {EslintConfigOptions} options - Configuration and integration settings\n * @param {ConfigInput[]} extraConfigs - Local flat-config overrides appended after generated config\n * @returns {FlatConfigArray} The final ESLint configuration array\n */\nexport const defineConfig: ConfigComposer = async function defineConfig(\n options?: EslintConfigOptions,\n ...extraConfigs: ConfigInput[]\n): Promise<FlatConfigArray> {\n const {\n detection,\n extensions: optExtensions,\n formats: optFormats,\n frameworks: optFrameworks,\n libraries: optLibraries,\n strict: optStrict,\n testing: optTesting,\n tools: optTools,\n tsconfigRootDir: optTsconfigRootDir,\n workspacePrefixes\n } = options ?? {}\n\n const { autoFrameworks, detectRootDir, optionMergeStrategy, requestedPreset } = resolveConfigSetup(options)\n const detected = resolveDetectedOptions(detectRootDir, detection, requestedPreset)\n const { frameworkDefaults, preset, presetDefaults } = resolvePresetMeta(requestedPreset, detected, autoFrameworks)\n const configuredProjects = resolveConfiguredProjects(detected, options)\n\n const {\n detectedExtensions,\n detectedFormats,\n detectedLibraries,\n detectedTesting,\n detectedTools\n } = resolveBucketDefaults(detected)\n\n // NOTE: these must be computed unconditionally (not via destructuring defaults)\n // so that `optionMergeStrategy: 'merge'` actually unions explicit values with\n // detected/preset values. Destructuring defaults are skipped whenever the\n // option is provided, which silently turned 'merge' into 'replace'.\n const configuredExtensions = mergeOptionalBucket(\n 'extensions', detectedExtensions, presetDefaults.extensions, optExtensions, options, optionMergeStrategy\n ) as Extension[]\n\n const formats = mergeOptionalBucket(\n 'formats', detectedFormats, presetDefaults.formats, optFormats, options, optionMergeStrategy\n ) as Format[]\n\n const frameworks = mergeFrameworkOption(\n frameworkDefaults, presetDefaults.frameworks, optFrameworks, optionMergeStrategy\n )\n\n const libraries = mergeOptionalBucket(\n 'libraries', detectedLibraries, presetDefaults.libraries, optLibraries, options, optionMergeStrategy\n ) as Library[]\n\n const nextMode = resolveNextModeValue(options, presetDefaults, detected)\n const runtime = resolveRuntimeValue(options, presetDefaults, detected, requestedPreset !== undefined)\n const settings = resolveSettingsValue(options, detected)\n const strict = getStrictMode(optStrict, presetDefaults.strict)\n\n const testing = mergeOptionalBucket(\n 'testing', detectedTesting, presetDefaults.testing, optTesting, options, optionMergeStrategy\n ) as Testing[]\n\n const tools = mergeOptionalBucket(\n 'tools', detectedTools, presetDefaults.tools, optTools, options, optionMergeStrategy\n ) as Tool[]\n\n const typescript = resolveTypescriptValue(options, presetDefaults, detected)\n const resolvedTypescript = resolveTypescriptOptions(typescript)\n const rootDir = detectRootDir ?? process.cwd()\n const tsconfigRootDir = resolveTsconfigRootDir(rootDir, typescript, optTsconfigRootDir)\n const extensions = applyStrictProfileDefaults(configuredExtensions, strict)\n const resolvedFrameworks = applyFrameworkImpliedDeps({ ...frameworks })\n const uniqueLibraries = resolveUniqueLibraries(libraries, options?.tailwind)\n const uniqueTesting = [...new Set(testing)]\n const uniqueFormats = [...new Set(formats)]\n const uniqueTools = [...new Set(tools)]\n const uniqueExtensions = [...new Set(extensions)]\n const uniqueSettings = [...new Set(settings)]\n\n emitAstroDoctorWarning(uniqueExtensions, resolvedFrameworks)\n\n const params = getConfigsParams(options, rootDir, runtime, uniqueLibraries, uniqueSettings, resolvedFrameworks)\n\n const configs = await buildEslintConfigs({\n astroOptions: {\n ...params.astroOptions,\n typeChecked: resolvedTypescript ? resolvedTypescript.mode !== 'syntax' : false\n },\n defaultIgnores: params.defaultIgnores,\n gitignoreConfig: params.gitignoreConfig,\n nextMode,\n resolvedFrameworks,\n resolvedTypescript,\n rootDir,\n runtime,\n runtimeCoreConfig: params.runtimeCoreConfig,\n tailwindOptions: params.tailwindOptions,\n testingFiles: options?.testingFiles,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools,\n userIgnores: params.userIgnores\n })\n\n logEslintDebug({\n autoFrameworks,\n detectRootDir,\n nextMode,\n optionMergeStrategy,\n preset,\n resolvedFrameworks,\n resolvedTypescript,\n runtime,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools\n })\n\n const projectConfigs = await resolveProjectConfigs(\n configuredProjects,\n resolveInheritedProjectDefaults(options),\n detectRootDir,\n options?.autoFrameworks,\n defineConfig\n )\n\n // Merge workspace import group into any existing simple-import-sort/imports rules\n // so framework-specific group ordering (e.g. React-first) is preserved.\n const allConfigs = [\n ...configs,\n ...projectConfigs.flat(),\n ...flattenConfigInputs(extraConfigs)\n ]\n\n const patchedConfigs = workspacePrefixes?.length ?\n patchImportGroups(allConfigs, workspacePrefixes) :\n allConfigs\n\n const finalConfig = attachReferencedPlugins(applyStrictMode(patchedConfigs, strict))\n\n return attachDefineConfigMetadata(finalConfig, { extraConfigs, options })\n}\n"],"mappings":"AAAA,SAAS,YAAY,oBAAoB;AACzC,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAE9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AAAA,OAIK;AACP,SAAS,8BAA8B;AAGvC,SAAS,kCAAkC;AAC3C,SAAS,oCAA2D;AACpE,SAAS,uBAAuB,yBAAyB;AACzD,SAAS,kBAAkB,qBAAqB;AAChD,SAAS,mCAAmC;AAE5C,MAAM,oBAAoB,CAAC,yCAAyC;AAEpE,MAAM,mBAAmB,CAAC,YAA8B;AACtD,QAAM,eAAe,KAAK,SAAS,cAAc;AAEjD,MAAI,CAAC,WAAW,YAAY,EAAG,QAAO;AAEtC,MAAI;AACF,UAAM,WAAW,KAAK,MAAM,aAAa,cAAc,MAAM,CAAC;AAI9D,UAAM,WAAW,OAAO,SAAS,QAAQ,WACvC,CAAC,SAAS,GAAG,IACb,OAAO,OAAO,SAAS,OAAO,CAAC,CAAC;AAElC,WAAO,CAAC,GAAG,oBAAI,IAAI;AAAA,MACjB,GAAG;AAAA,MACH,GAAG,SAAS,IAAI,UAAQ,KAAK,QAAQ,SAAS,EAAE,CAAC;AAAA,IACnD,CAAC,CAAC;AAAA,EACJ,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAGA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAmCP;AAAA,EACE,cAAAA;AAAA,EACA,oBAAAC;AAAA,EACA,yBAAAC;AAAA,EACA;AAAA,EACA,wBAAAC;AAAA,EACA,aAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,YAAAC;AAAA,EACA,UAAAC;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,OACK;AAGP,SAAS,wBAAwB;AAEjC,MAAM,sBAAsB,CAC1B,SACA,YACA,aACqB;AAAA,EACrB,KAAK,QAAQ,OAAO;AAAA,EACpB,wBAAwB,QAAQ,0BAA0B;AAAA,EAC1D,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;AAAA,EACnC,GAAI,QAAQ,QAAQ,SAAS,EAAE,QAAQ,QAAQ,OAAO,IAAI,CAAC;AAAA,EAC3D,GAAI,QAAQ,qBAAqB,SAAY,CAAC,IAAI,EAAE,kBAAkB,QAAQ,iBAAiB;AACjG;AAEA,MAAM,yBAAyB,CAC7B,SACA,aACgC;AAChC,MAAI,aAAa,MAAO,QAAO;AAE/B,QAAM,UAAU,YAAY,CAAC;AAC7B,QAAM,aAAa,QAAQ,cAAc,uBAAuB,OAAO;AAEvE,QAAM,kBAAmC,CAAC,cAAc,QAAQ,qBAAqB,SACnF,EAAE,GAAG,SAAS,kBAAkB,MAAM,IACtC;AAEF,SAAO,oBAAoB,iBAAiB,YAAY,OAAO;AACjE;AAEA,MAAM,uBAA2D;AAAA,EAC/D,CAAC,QAAQ,OAAO,GAAG,CAAC,sBAAsB;AAAA,EAC1C,CAAC,QAAQ,IAAI,GAAG,CAAC,mBAAmB;AAAA,EACpC,CAAC,QAAQ,OAAO,GAAG,CAAC,qCAAqC;AAAA,EACzD,CAAC,QAAQ,UAAU,GAAG,CAAC,yBAAyB;AAAA,EAChD,CAAC,QAAQ,cAAc,GAAG,CAAC,8BAA8B;AAAA,EACzD,CAAC,QAAQ,MAAM,GAAG,CAAC,qBAAqB;AAC1C;AAEA,MAAM,4BAA4B,CAChC,SACA,iBACoB;AACpB,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,UAAU,OAAO,QAAQ,YAAY,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,MAAM,SAAS,CAAC;AAEnF,MAAI,QAAQ,WAAW,EAAG,QAAO;AAEjC,SAAO,QAAQ,IAAI,YAAU;AAC3B,UAAM,QAAQ,QAAQ,KAAK,CAAC,CAAC,WAAW,OAAO,qBAAqB,WAAsB,KAAK,CAAC,GAAG,SAAS,OAAO,QAAQ,EAAE,CAAC;AAE9H,QAAI,CAAC,MAAO,QAAO;AAEnB,UAAM,CAAC,EAAE,KAAK,IAAI;AAElB,WAAO;AAAA,MACL,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,MAAM,0BAA0B;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAKA,MAAM,0BAA0B,CAAC,QAA4B,IAAI,MAAM,EAAE,UAA8B;AACrG,MAAI,CAAC,MAAO,QAAO;AAEnB,aAAW,QAAQ,MAAM,MAAM,IAAI,GAAG;AACpC,UAAM,iBAAiB,wBAAwB,KAAK,cAAY,KAAK,SAAS,QAAQ,CAAC;AAEvF,QAAI,CAAC,eAAgB;AAErB,UAAM,gBAAgB,KAAK,QAAQ,cAAc;AACjD,UAAM,eAAe,KAAK,YAAY,WAAW,aAAa;AAC9D,UAAM,mBAAmB,KAAK,MAAM,GAAG,aAAa,EAAE,OAAO,gBAAgB;AAC7E,UAAM,oBAAoB,KAAK,QAAQ,GAAG;AAC1C,QAAI,kBAAkB;AAEtB,QAAI,oBAAoB,EAAG,mBAAkB;AAE7C,QAAI,gBAAgB,EAAG,mBAAkB;AAEzC,QAAI;AACF,UAAI,kBAAkB,EAAG;AAEzB,YAAM,aAAa,KAAK,MAAM,iBAAiB,gBAAgB,eAAe,MAAM;AAEpF,aAAO,QAAQ,WAAW,WAAW,OAAO,IAAI,cAAc,UAAU,IAAI,UAAU;AAAA,IACxF,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,SAAO;AACT;AAEA,MAAM,qBAAqB,CAAC,YAA6C;AACvE,QAAM;AAAA,IACJ,iBAAiB;AAAA,IACjB;AAAA,IACA,sBAAsB;AAAA,IACtB,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF,IAAI,WAAW,CAAC;AAEhB,QAAM,kBAAkB,QAAQ,iBAAiB,mBAAmB,wBAAwB;AAE5F,SAAO;AAAA,IACL;AAAA,IACA,eAAe;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAEA,MAAM,yBAAyB,CAC7B,WACA,aACc;AACd,QAAM,kBAAkB,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;AAE9C,MAAI,aAAa,MAAO,QAAO,gBAAgB,OAAO,aAAW,YAAY,QAAQ,QAAQ;AAE7F,MAAI,CAAC,SAAU,QAAO;AAEtB,SAAO,CAAC,GAAG,oBAAI,IAAI,CAAC,GAAG,iBAAiB,QAAQ,QAAQ,CAAC,CAAC;AAC5D;AAEA,MAAM,oBAAoB,CACxB,iBACA,UACA,mBACG;AACH,QAAM,SAAS,mBAAmB,SAAS;AAC3C,QAAM,iBAAiB,SAAS,cAAc,MAAgB,IAAI,CAAC;AACnE,QAAM,oBAAoB,iBAAiB,6BAA6B,SAAS,kBAAkB,IAAI,CAAC;AAExG,SAAO,EAAE,mBAAmB,QAAQ,eAAe;AACrD;AAEA,MAAM,4BAA4B,CAChC,UACA,aACyC;AAAA,EACzC,GAAI,SAAS,YAAY,CAAC;AAAA,EAC1B,GAAI,SAAS,YAAY,CAAC;AAC5B;AAEA,MAAM,wBAAwB,CAAC,cAAmC;AAAA,EAChE,oBAAoB,SAAS,cAAc,CAAC;AAAA,EAC5C,iBAAiB,SAAS,WAAW,CAAC;AAAA,EACtC,mBAAmB,SAAS,aAAa,CAAC;AAAA,EAC1C,iBAAiB,SAAS,WAAW,CAAC;AAAA,EACtC,eAAe,SAAS,SAAS,CAAC;AACpC;AAEA,MAAM,0BAA0B,CAC9B,UACA,gBACwB,cACxB;AAAA,EACE,GAAG;AAAA,EACH,oBAAoB,CAAC;AAAA,EACrB,WAAW,CAAC;AAAA,EACZ,UAAU;AAAA,EACV,SAAS,QAAQ;AACnB,IACA;AAEF,MAAM,yBAAyB,CAC7B,eACA,WACA,oBACwB;AACxB,QAAM,cAAc,qBAAqB,aAAa;AAEtD,QAAM,uBAAuB,oBAAoB,OAAO,YACtD,YAAY,WAAW,OAAO;AAEhC,QAAM,WAAW,uBAAuB,aAAa,WAAW,EAAE,UAAU,qBAAqB,CAAC;AAClG,QAAM,sBAAsB,OAAO,KAAK,SAAS,YAAY,CAAC,CAAC,EAAE,SAAS;AAK1E,SAAO,wBAAwB,UAAU,mBAAmB;AAC9D;AAEA,MAAM,uBAAuB,CAC3B,SACA,gBACA,aACc,SAAS,YAAY,eAAe,YAAY,SAAS,YAAY,SAAS;AAE9F,MAAM,sBAAsB,CAC1B,SACA,gBACA,UACA,qBAEA,SAAS,YACR,mBAAmB,eAAe,UAAU,WAC7C,SAAS,WACT,QAAQ;AAGV,MAAM,uBAAuB,CAC3B,SACA,aACe,SAAS,YAAY,SAAS,YAAY,CAAC;AAE5D,MAAM,yBAAyB,CAC7B,SACA,gBACA,aACsC,SAAS,cAAc,eAAe,cAAc,SAAS,cAAc;AAEnH,MAAM,oBAAoB,CACxB,eACY;AAAA,EACZ,WAAW,QACX,WAAW,QACX,WAAW,cAAc,MACxB,WAAW,gBAAgB,KAAK,CAAC,WAAW;AAC/C,KAAK,CAAC,WAAW;AAEjB,MAAM,4BAA4B,CAChC,eACmD;AACnD,QAAM,SAAS,EAAE,GAAG,WAAW;AAE/B,MAAI,kBAAkB,MAAM,EAAG,QAAO,QAAQ;AAE9C,MAAI,OAAO,UAAU,CAAC,OAAO,IAAK,QAAO,MAAM;AAE/C,MAAI,OAAO,QAAQ,CAAC,OAAO,IAAK,QAAO,MAAM;AAE7C,SAAO;AACT;AAEA,MAAM,qBAAqB,CACzB,mBACA,yBACA,cACA,SACA,aACI;AAAA,EACJ,gBAAgB,oBACd,CAAC;AAAA,IACC,SAAS,CAAC,GAAG,iBAAiB,GAAI,0BAA0B,yBAAyB,CAAC,CAAE;AAAA,IACxF,MAAM;AAAA,EACR,CAA+B,IAC/B,CAAC;AAAA,EACH,iBAAiB,eAAe,sBAAsB,OAAO,IAAI,CAAC;AAAA,EAClE,aAAa,SAAS,SAAS,SAC7B,CAAC;AAAA,IACC,SAAS,QAAQ;AAAA,IACjB,MAAM;AAAA,EACR,CAA+B,IAC/B,CAAC;AACL;AAYA,MAAM,uBAAuG;AAAA,EAC3G,OAAO,UAAQ;AAAA,IACb,UAAU,IAAI;AAAA,IACd,UAAU,IAAI;AAAA,IACd,WAAW,IAAI;AAAA,IACf,QAAQ,IAAI;AAAA,IACZ,iBAAiB,IAAI;AAAA,IACrB,aAAa,IAAI;AAAA,EACnB;AAAA,EACA,MAAM,UAAQ,EAAE,SAAS,IAAI,QAAQ;AAAA,EACrC,QAAQ,UAAQ,EAAE,SAAS,IAAI,QAAQ;AAAA,EACvC,MAAM,UAAQ,EAAE,SAAS,IAAI,QAAQ;AACvC;AAEA,MAAM,2BAA2B,OAC/B,YACA,QAC6C;AAC7C,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC3B,OAAO,QAAQ,UAAU,EACvB,OAAO,CAAC,UAA+D,QAAQ,MAAM,CAAC,CAAC,CAAC,EACxF,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,iBAAiB,MAAM,OAAO,qBAAqB,IAAI,IAAI,GAAG,CAAC,EACpF,KAAK,YAAU,CAAC,MAAM,MAAM,CAAU,CAAC;AAAA,EAC9C;AAEA,SAAO,OAAO,YAAY,OAAO;AACnC;AAuBA,MAAM,qBAAqB,OAAO,WAAyD;AACzF,QAAM;AAAA,IACJ;AAAA,IAAc;AAAA,IAAgB;AAAA,IAAiB;AAAA,IAAU;AAAA,IACzD;AAAA,IAAoB;AAAA,IAAS;AAAA,IAAS;AAAA,IAAmB;AAAA,IACzD;AAAA,IAAc;AAAA,IAAiB;AAAA,IAAkB;AAAA,IAAe;AAAA,IAChE;AAAA,IAAe;AAAA,IAAa;AAAA,EAC9B,IAAI;AAEJ,QAAM,EAAE,UAAU,UAAU,WAAW,QAAQ,YAAY,IAAI;AAE/D,QAAM,KAAK,MAAM;AAAA,IACf;AAAA,IAAoB,EAAE,UAAU,UAAU,WAAW,QAAQ,SAAS,iBAAiB,YAAY;AAAA,EACrG;AAEA,QAAM,MAAM,CAAC,SAAkC,GAAG,IAAI,KAAK,CAAC;AAE5D,QAAM,oBAAoB,qBACxB,uBAAuB;AAAA,IACrB,GAAG;AAAA,IACH,iBAAiB,mBAAmB,mBAAmB;AAAA,EACzD,CAAC,IACD,CAAC;AAEH,QAAM,2BAA2B,kBAAkB;AAAA,IACjD,YAAU,OAAO,SAAS;AAAA,EAC5B;AAEA,QAAM,yBAAyB,kBAAkB;AAAA,IAC/C,YAAU,OAAO,SAAS;AAAA,EAC5B;AAEA,SAAO;AAAA,IACL,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAG;AAAA,IACH,GAAI,kBACF,CAAC;AAAA,MACC,iBAAiB,EAAE,eAAe,EAAE,gBAAgB,EAAE;AAAA,MACtD,MAAM;AAAA,IACR,CAAC,IACD,CAAC;AAAA,IACH;AAAA,MACE,OAAO,CAAC,YAAY,UAAU;AAAA,MAC9B,iBAAiB;AAAA,QACf,SAAS;AAAA,UACP,WAAW;AAAA,UACX,YAAY;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,UACR,SAAS;AAAA,QACX;AAAA,QACA,YAAY;AAAA,MACd;AAAA,MACA,MAAM;AAAA,IACR;AAAA,IACA,GAAG;AAAA,IACH,GAAI,WAAW,IAAI,OAAO,IAAI,CAAC;AAAA,IAC/B,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,KAAK;AAAA,IACZ,GAAG,IAAI,QAAQ;AAAA,IACf,GAAG,IAAI,OAAO;AAAA,IACd,GAAG,IAAI,SAAS;AAAA,IAChB,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,cAAc;AAAA,IACrB,GAAG,IAAI,gBAAgB;AAAA,IACvB,GAAG,IAAI,MAAM;AAAA,IACb,GAAG,IAAI,QAAQ;AAAA,IACf,GAAG,IAAI,KAAK;AAAA,IACZ,GAAG,IAAI,QAAQ;AAAA,IACf,GAAG,IAAI,MAAM;AAAA,IACb,GAAG;AAAA,IACH,GAAG,IAAI,OAAO;AAAA,IACd,GAAI,mBAAmB,QAAQ,aAAa,SAAS,YACnD,CAAC;AAAA,MACC,OAAO,CAAC,qBAAqB,mBAAmB;AAAA,MAChD,MAAM;AAAA,MACN,OAAO,EAAE,qCAAqC,MAAM;AAAA,IACtD,CAA+B,IAC/B,CAAC;AAAA,IACH,GAAG;AAAA,MACD,MAAM;AAAA,QACJ;AAAA,QAAiB;AAAA,QAAa;AAAA,QAAe;AAAA,QAAe;AAAA,MAC9D;AAAA,MACA;AAAA,IACF;AAAA,IACA,GAAI,mBAAmB,OACrB,CAAC;AAAA,MACC,OAAO,CAAC,eAAe;AAAA,MACvB,MAAM;AAAA,MACN,OAAO;AAAA,QACL,qBAAqB;AAAA,QACrB,mBAAmB;AAAA,MACrB;AAAA,IACF,CAA+B,IAC/B,CAAC;AAAA,IACH;AAAA,MACE,OAAO;AAAA,QACL;AAAA,QACA;AAAA,MACF;AAAA,MACA,MAAM;AAAA,MACN,OAAO;AAAA,QACL,wCAAwC;AAAA,QACxC,wBAAwB;AAAA,MAC1B;AAAA,IACF;AAAA,IACA;AAAA,MACE,OAAO,iBAAiB,OAAO;AAAA,MAC/B,MAAM;AAAA,MACN,OAAO;AAAA,QACL,2BAA2B;AAAA,QAC3B,qBAAqB;AAAA,QACrB,cAAc;AAAA,MAChB;AAAA,IACF;AAAA,IACA,GAAI,kBAAkB,CAAC,4BAA4B,eAAe,CAAC,IAAI,CAAC;AAAA,IACxE,GAAG;AAAA,IACH,GAAI,MAAM,kBAAkB,WAAW;AAAA,EACzC;AACF;AAmBA,MAAM,iBAAiB,CAAC;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAuB;AACrB,MAAI,CAAC,QAAQ,IAAI,mBAAoB;AAErC,UAAQ,OAAO,MAAM,oCAAoC,KAAK,UAAU;AAAA,IACtE;AAAA,IACA,eAAe,iBAAiB,QAAQ,IAAI;AAAA,IAC5C,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY,OAAO,QAAQ,kBAAkB,EAC1C,OAAO,CAAC,CAAC,EAAE,KAAK,MAAM,QAAQ,KAAK,CAAC,EACpC,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG;AAAA,IACrB,WAAW;AAAA,IACX;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP;AAAA,IACA,YAAY,qBAAqB,mBAAmB,OAAO;AAAA,EAC7D,GAAG,MAAM,CAAC,CAAC;AAAA,CAAI;AACjB;AAEA,MAAM,yBAAyB,CAC7B,YACA,eACS;AACT,MAAI,CAAC,WAAW,SAAS,UAAU,WAAW,KAAK,WAAW,MAAO;AAErE,UAAQ;AAAA,IACN;AAAA,EAEF;AACF;AAOA,MAAM,wBAAwB,OAC5B,oBACA,iBACA,eACA,gBACA,kBACG,QAAQ;AAAA,EACX,OAAO,QAAQ,kBAAkB,EAAE,IAAI,OAAO,CAAC,aAAa,cAAc,MAAM;AAC9E,UAAM,cAAc,KAAK,iBAAiB,QAAQ,IAAI,GAAG,WAAW;AACpE,UAAM,mBAAmB,oBAAoB,mBAAmB,CAAC,GAAG,cAAc;AAElF,UAAM,gBAAgB,MAAM,cAAc;AAAA,MACxC;AAAA,MACA,GAAG;AAAA,MACH,iBAAiB;AAAA,MACjB,UAAU;AAAA,MACV,MAAM,iBAAiB,QAAQ,iBAAiB,iBAAiB;AAAA,IACnE,CAAC;AAED,WAAO,cAAc,IAAI,YAAU,OAAO,SAAS,4BAA4B,SAAS,qBAAqB,QAAQ,WAAW,CAAC;AAAA,EACnI,CAAC;AACH;AAEA,MAAM,kCAAkC,CACtC,YAC2C;AAAA,EAC3C;AAAA,IACE,GAAI,SAAS,cAAc,SAAY,CAAC,IAAI,EAAE,WAAW,QAAQ,UAAU;AAAA,IAC3E,GAAI,SAAS,aAAa,SAAY,CAAC,IAAI,EAAE,UAAU,QAAQ,SAAS;AAAA,IACxE,GAAI,OAAO,SAAS,eAAe,YAAY,QAAQ,WAAW,iBAAiB,SACjF,EAAE,YAAY,EAAE,cAAc,QAAQ,WAAW,aAAa,EAAE,IAChE,CAAC;AAAA,EACL;AAAA,EACA,SAAS,mBAAmB,CAAC;AAC/B;AAEA,MAAM,wBAAwB,CAC5B,UACA,yBACuB;AACvB,QAAM,WAAW,SAAS,MAAM,GAAG;AAEnC,MAAI,SAAS,SAAS,EAAG,QAAO;AAEhC,QAAM,mBAAmB,CAAC,GAAG,oBAAoB,EAC9C,OAAO,gBAAc,SAAS,WAAW,GAAG,UAAU,GAAG,CAAC,EAC1D,KAAK,CAAC,MAAM,UAAU,MAAM,SAAS,KAAK,MAAM,EAAE,CAAC;AAEtD,MAAI,iBAAkB,QAAO;AAE7B,SAAO,SAAS,WAAW,GAAG,KAAK,SAAS,SAAS,IACnD,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAC7B,SAAS,CAAC;AACd;AAOO,MAAM,0BAA0B,CAAC,YAA8C;AACpF,QAAM,mBAAmB,oBAAI,IAAwE;AACrG,QAAM,uBAAuB,oBAAI,IAAY;AAE7C,aAAW,UAAU,SAAS;AAC5B,eAAW,CAAC,YAAY,MAAM,KAAK,OAAO,QAAQ,OAAO,WAAW,CAAC,CAAC,GAAG;AACvE,YAAM,iBAAiB,iBAAiB,IAAI,UAAU;AAEtD,UAAI,kBAAkB,mBAAmB,QAAQ;AAC/C,yBAAiB,OAAO,UAAU;AAElC,6BAAqB,IAAI,UAAU;AAAA,MACrC,WAAW,CAAC,qBAAqB,IAAI,UAAU,GAAG;AAChD,yBAAiB,IAAI,YAAY,MAAM;AAAA,MACzC;AAAA,IACF;AAAA,EACF;AAEA,SAAO,QAAQ,IAAI,YAAU;AAC3B,UAAM,kBAAkB,IAAI;AAAA,MAC1B,OAAO,KAAK,OAAO,SAAS,CAAC,CAAC,EAC3B,IAAI,cAAY,sBAAsB,UAAU,iBAAiB,KAAK,CAAC,CAAC,EACxE,OAAO,CAAC,eAAqC,eAAe,MAAS;AAAA,IAC1E;AAEA,UAAM,uBAAuB,CAAC,GAAG,eAAe,EAAE,QAAQ,gBAAc;AACtE,YAAM,SAAS,iBAAiB,IAAI,UAAU;AAE9C,aAAO,CAAC,OAAO,OAAO,OAAO,WAAW,CAAC,GAAG,UAAU,KAAK,SACzD,CAAC,CAAC,YAAY,MAAM,CAAU,IAC9B,CAAC;AAAA,IACL,CAAC;AAED,QAAI,qBAAqB,WAAW,EAAG,QAAO;AAE9C,WAAO;AAAA,MACL,GAAG;AAAA,MACH,SAAS;AAAA,QACP,GAAG,OAAO;AAAA,QACV,GAAG,OAAO,YAAY,oBAAoB;AAAA,MAC5C;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,MAAM,mBAAmB,CACvB,SACA,SACA,SACA,iBACA,gBACA,uBACG;AACH,QAAM,WAAW,CAAC,CAAC,mBAAmB;AACtC,QAAM,SAAS,CAAC,CAAC,mBAAmB;AACpC,QAAM,YAAY,CAAC,CAAC,mBAAmB;AACvC,QAAM,WAAW,CAAC,CAAC,mBAAmB;AACtC,QAAM,eAAe,CAAC,eAAe,SAAS,QAAQ,WAAW;AACjE,QAAM,oBAAoB,CAAC,eAAe,SAAS,QAAQ,gBAAgB;AAC3E,QAAM,0BAA0B,CAAC,eAAe,SAAS,QAAQ,sBAAsB;AAEvF,QAAM,kBAAkB,gBAAgB,SAAS,QAAQ,QAAQ,IAC/D,uBAAuB,SAAS,SAAS,QAAQ,IACjD;AAEF,QAAM,oBAAoB,YAAY,QAAQ,YAAY,aAAa,iBAAiB,OAAO;AAE/F,QAAM,EAAE,gBAAgB,iBAAiB,YAAY,IAAI;AAAA,IACvD;AAAA,IAAmB;AAAA,IAAyB;AAAA,IAAc;AAAA,IAAS;AAAA,EACrE;AAEA,SAAO;AAAA,IACL,cAAc,EAAE,UAAU,UAAU,WAAW,OAAO;AAAA,IACtD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAUO,MAAM,eAA+B,eAAeC,cACzD,YACG,cACuB;AAC1B,QAAM;AAAA,IACJ;AAAA,IACA,YAAY;AAAA,IACZ,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,WAAW;AAAA,IACX,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,OAAO;AAAA,IACP,iBAAiB;AAAA,IACjB;AAAA,EACF,IAAI,WAAW,CAAC;AAEhB,QAAM,EAAE,gBAAgB,eAAe,qBAAqB,gBAAgB,IAAI,mBAAmB,OAAO;AAC1G,QAAM,WAAW,uBAAuB,eAAe,WAAW,eAAe;AACjF,QAAM,EAAE,mBAAmB,QAAQ,eAAe,IAAI,kBAAkB,iBAAiB,UAAU,cAAc;AACjH,QAAM,qBAAqB,0BAA0B,UAAU,OAAO;AAEtE,QAAM;AAAA,IACJ;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,sBAAsB,QAAQ;AAMlC,QAAM,uBAAuB;AAAA,IAC3B;AAAA,IAAc;AAAA,IAAoB,eAAe;AAAA,IAAY;AAAA,IAAe;AAAA,IAAS;AAAA,EACvF;AAEA,QAAM,UAAU;AAAA,IACd;AAAA,IAAW;AAAA,IAAiB,eAAe;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,EAC3E;AAEA,QAAM,aAAa;AAAA,IACjB;AAAA,IAAmB,eAAe;AAAA,IAAY;AAAA,IAAe;AAAA,EAC/D;AAEA,QAAM,YAAY;AAAA,IAChB;AAAA,IAAa;AAAA,IAAmB,eAAe;AAAA,IAAW;AAAA,IAAc;AAAA,IAAS;AAAA,EACnF;AAEA,QAAM,WAAW,qBAAqB,SAAS,gBAAgB,QAAQ;AACvE,QAAM,UAAU,oBAAoB,SAAS,gBAAgB,UAAU,oBAAoB,MAAS;AACpG,QAAM,WAAW,qBAAqB,SAAS,QAAQ;AACvD,QAAM,SAAS,cAAc,WAAW,eAAe,MAAM;AAE7D,QAAM,UAAU;AAAA,IACd;AAAA,IAAW;AAAA,IAAiB,eAAe;AAAA,IAAS;AAAA,IAAY;AAAA,IAAS;AAAA,EAC3E;AAEA,QAAM,QAAQ;AAAA,IACZ;AAAA,IAAS;AAAA,IAAe,eAAe;AAAA,IAAO;AAAA,IAAU;AAAA,IAAS;AAAA,EACnE;AAEA,QAAM,aAAa,uBAAuB,SAAS,gBAAgB,QAAQ;AAC3E,QAAM,qBAAqB,yBAAyB,UAAU;AAC9D,QAAM,UAAU,iBAAiB,QAAQ,IAAI;AAC7C,QAAM,kBAAkB,uBAAuB,SAAS,YAAY,kBAAkB;AACtF,QAAM,aAAa,2BAA2B,sBAAsB,MAAM;AAC1E,QAAM,qBAAqB,0BAA0B,EAAE,GAAG,WAAW,CAAC;AACtE,QAAM,kBAAkB,uBAAuB,WAAW,SAAS,QAAQ;AAC3E,QAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC1C,QAAM,gBAAgB,CAAC,GAAG,IAAI,IAAI,OAAO,CAAC;AAC1C,QAAM,cAAc,CAAC,GAAG,IAAI,IAAI,KAAK,CAAC;AACtC,QAAM,mBAAmB,CAAC,GAAG,IAAI,IAAI,UAAU,CAAC;AAChD,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,QAAQ,CAAC;AAE5C,yBAAuB,kBAAkB,kBAAkB;AAE3D,QAAM,SAAS,iBAAiB,SAAS,SAAS,SAAS,iBAAiB,gBAAgB,kBAAkB;AAE9G,QAAM,UAAU,MAAM,mBAAmB;AAAA,IACvC,cAAc;AAAA,MACZ,GAAG,OAAO;AAAA,MACV,aAAa,qBAAqB,mBAAmB,SAAS,WAAW;AAAA,IAC3E;AAAA,IACA,gBAAgB,OAAO;AAAA,IACvB,iBAAiB,OAAO;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,mBAAmB,OAAO;AAAA,IAC1B,iBAAiB,OAAO;AAAA,IACxB,cAAc,SAAS;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,aAAa,OAAO;AAAA,EACtB,CAAC;AAED,iBAAe;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,iBAAiB,MAAM;AAAA,IAC3B;AAAA,IACA,gCAAgC,OAAO;AAAA,IACvC;AAAA,IACA,SAAS;AAAA,IACTA;AAAA,EACF;AAIA,QAAM,aAAa;AAAA,IACjB,GAAG;AAAA,IACH,GAAG,eAAe,KAAK;AAAA,IACvB,GAAG,oBAAoB,YAAY;AAAA,EACrC;AAEA,QAAM,iBAAiB,mBAAmB,SACxC,kBAAkB,YAAY,iBAAiB,IAC/C;AAEF,QAAM,cAAc,wBAAwB,gBAAgB,gBAAgB,MAAM,CAAC;AAEnF,SAAO,2BAA2B,aAAa,EAAE,cAAc,QAAQ,CAAC;AAC1E;","names":["coreConfig","createCoreConfig","createGitignoreConfig","detectProjectOptions","Extension","Library","NextMode","Preset","Runtime","Setting","Testing","defineConfig"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nimport {\n applyDetectionControls,\n applyStrictMode,\n applyStrictProfileDefaults,\n type ConfigInput,\n coreConfig,\n createCoreConfig,\n createGitignoreConfig,\n DEFAULT_IGNORES,\n type DetectedFrameworkName,\n detectProjectOptions,\n type EslintConfigOptions,\n Extension,\n findTailwindEntryPoint,\n type FlatConfigArray,\n flattenConfigInputs,\n type Format,\n GENERATED_CODE_IGNORES,\n getStrictMode,\n type ImportedFramework,\n Library,\n mergeFrameworkOption,\n mergeOptionalBucket,\n mergeProjectOptions,\n NextMode,\n patchImportGroups,\n Preset,\n resolveTsconfigRootDir,\n resolveTypescriptOptions,\n Runtime,\n scopeConfigToProject,\n Setting,\n type TailwindOptions,\n Testing,\n type Tool,\n type TypeScriptMode,\n type TypeScriptOptions\n} from '@santi020k/eslint-config-core'\nimport { createTypescriptConfig } from '@santi020k/eslint-config-typescript'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nimport { attachDefineConfigMetadata } from './define-config-metadata.js'\nimport { createDetectedFrameworkFlags, type FrameworkOptions } from './frameworks.js'\nimport { getIntegrationConfigs, getPrettierConfig } from './integrations.js'\nimport { resolveFramework, resolvePreset } from './resolvers.js'\nimport { buildTailwindSettingsConfig } from './tailwind.js'\n\nconst SCRIPT_FILE_GLOBS = ['**/scripts/**/*.{js,mjs,cjs,ts,mts,cts}']\n\nconst getCliEntryFiles = (rootDir: string): string[] => {\n const manifestPath = join(rootDir, 'package.json')\n\n if (!existsSync(manifestPath)) return SCRIPT_FILE_GLOBS\n\n try {\n const manifest = JSON.parse(readFileSync(manifestPath, 'utf8')) as {\n bin?: Record<string, string> | string\n }\n\n const binFiles = typeof manifest.bin === 'string' ?\n [manifest.bin] :\n Object.values(manifest.bin ?? {})\n\n return [...new Set([\n ...SCRIPT_FILE_GLOBS,\n ...binFiles.map(file => file.replace(/^\\.\\//, ''))\n ])]\n } catch {\n return SCRIPT_FILE_GLOBS\n }\n}\n\n// Lazy framework factories.\nexport {\n angular,\n astro,\n expo,\n hono,\n lit,\n nest,\n next,\n nuxt,\n preact,\n qwik,\n react,\n reactRouter,\n slidev,\n solid,\n svelte,\n tanstackStart,\n vite,\n vue\n} from './frameworks.js'\n\n// Re-export core types and utilities\nexport type {\n DetectedFrameworkName,\n DetectionOptions,\n EslintConfigOptions,\n ExtensionName,\n ExtensionOption,\n FlatConfigArray,\n FormatName,\n FormatOption,\n ImportedFramework,\n ImportGroupOptions,\n LibraryName,\n LibraryOption,\n NextModeName,\n NextModeOption,\n OptionalConfigMap,\n OptionalConfigName,\n PresetName,\n PresetOption,\n ProjectConfigOptions,\n RuntimeName,\n RuntimeOption,\n SettingName,\n SettingOption,\n StrictMode,\n TestingName,\n TestingOption,\n ToolName,\n ToolOption,\n TypeScriptMode,\n TypeScriptOptions\n} from '@santi020k/eslint-config-core'\nexport {\n coreConfig,\n createCoreConfig,\n createGitignoreConfig,\n createImportGroups,\n detectProjectOptions,\n Extension,\n Format,\n getGlobalsForRuntime,\n groups,\n hasReactConfig,\n Library,\n NextMode,\n Preset,\n ReactConfigKeys,\n Runtime,\n Setting,\n Testing,\n Tool\n} from '@santi020k/eslint-config-core'\n\n// Re-export framework configs\nexport { typescriptConfig } from '@santi020k/eslint-config-typescript'\n\nconst buildTailwindResult = (\n options: TailwindOptions,\n entryPoint: string | undefined,\n rootDir: string\n): TailwindOptions => ({\n cwd: options.cwd ?? rootDir,\n detectComponentClasses: options.detectComponentClasses ?? true,\n ...(entryPoint ? { entryPoint } : {}),\n ...(options.ignore?.length ? { ignore: options.ignore } : {}),\n ...(options.noUnknownClasses === undefined ? {} : { noUnknownClasses: options.noUnknownClasses })\n})\n\nconst resolveTailwindOptions = (\n rootDir: string,\n tailwind: EslintConfigOptions['tailwind']\n): TailwindOptions | undefined => {\n if (tailwind === false) return undefined\n\n const options = tailwind ?? {}\n const entryPoint = options.entryPoint ?? findTailwindEntryPoint(rootDir)\n\n const resolvedOptions: TailwindOptions = !entryPoint && options.noUnknownClasses === undefined ?\n { ...options, noUnknownClasses: false } :\n options\n\n return buildTailwindResult(resolvedOptions, entryPoint, rootDir)\n}\n\nconst TESTING_CONFIG_NAMES: Partial<Record<Testing, string[]>> = {\n [Testing.Cypress]: ['integrations/cypress'],\n [Testing.Jest]: ['integrations/jest'],\n [Testing.JestDom]: ['eslint-config-integrations/jest-dom'],\n [Testing.Playwright]: ['integrations/playwright'],\n [Testing.TestingLibrary]: ['integrations/testing-library'],\n [Testing.Vitest]: ['integrations/vitest']\n}\n\nconst applyTestingFileOverrides = (\n configs: FlatConfigArray,\n testingFiles: EslintConfigOptions['testingFiles']\n): FlatConfigArray => {\n if (!testingFiles) return configs\n\n const entries = Object.entries(testingFiles).filter(([, files]) => files.length > 0)\n\n if (entries.length === 0) return configs\n\n return configs.map(config => {\n const match = entries.find(([testingName]) => (TESTING_CONFIG_NAMES[testingName as Testing] ?? []).includes(config.name ?? ''))\n\n if (!match) return config\n\n const [, files] = match\n\n return {\n ...config,\n files\n }\n })\n}\n\nconst ESLINT_CONFIG_FILENAMES = [\n 'eslint.config.js',\n 'eslint.config.cjs',\n 'eslint.config.mjs',\n 'eslint.config.ts',\n 'eslint.config.cts',\n 'eslint.config.mts'\n]\n\n// A direct defineConfig() call retains the eslint.config.* frame in Node's\n// stack. Prefer that location over cwd because editor ESLint processes may be\n// launched from outside the project.\nconst findConfigRootFromStack = (stack: string | undefined = new Error().stack): string | undefined => {\n if (!stack) return undefined\n\n for (const line of stack.split('\\n')) {\n const configFilename = ESLINT_CONFIG_FILENAMES.find(filename => line.includes(filename))\n\n if (!configFilename) continue\n\n const filenameStart = line.indexOf(configFilename)\n const fileUrlStart = line.lastIndexOf('file://', filenameStart)\n const windowsPathStart = line.slice(0, filenameStart).search(/[A-Za-z]:[\\\\/]/)\n const absolutePathStart = line.indexOf('/')\n let configPathStart = absolutePathStart\n\n if (windowsPathStart >= 0) configPathStart = windowsPathStart\n\n if (fileUrlStart >= 0) configPathStart = fileUrlStart\n\n try {\n if (configPathStart < 0) continue\n\n const configPath = line.slice(configPathStart, filenameStart + configFilename.length)\n\n return dirname(configPath.startsWith('file:') ? fileURLToPath(configPath) : configPath)\n } catch {\n // Ignore malformed or non-local stack URLs and retain the cwd fallback.\n }\n }\n\n return undefined\n}\n\nconst resolveConfigSetup = (options: EslintConfigOptions | undefined) => {\n const {\n autoFrameworks = true,\n detectRootDir,\n optionMergeStrategy = 'merge',\n preset: requestedPreset,\n root,\n tsconfigRootDir\n } = options ?? {}\n\n const implicitRootDir = root ?? detectRootDir ?? tsconfigRootDir ?? findConfigRootFromStack()\n\n return {\n autoFrameworks,\n detectRootDir: implicitRootDir,\n optionMergeStrategy,\n requestedPreset\n }\n}\n\nconst resolveUniqueLibraries = (\n libraries: Library[],\n tailwind: EslintConfigOptions['tailwind']\n): Library[] => {\n const uniqueLibraries = [...new Set(libraries)]\n\n if (tailwind === false) return uniqueLibraries.filter(library => library !== Library.Tailwind)\n\n if (!tailwind) return uniqueLibraries\n\n return [...new Set([...uniqueLibraries, Library.Tailwind])]\n}\n\nconst resolvePresetMeta = (\n requestedPreset: EslintConfigOptions['preset'],\n detected: EslintConfigOptions,\n autoFrameworks: boolean\n) => {\n const preset = requestedPreset ?? detected.preset\n const presetDefaults = preset ? resolvePreset(preset as Preset) : {}\n const frameworkDefaults = autoFrameworks ? createDetectedFrameworkFlags(detected.detectedFrameworks) : {}\n\n return { frameworkDefaults, preset, presetDefaults }\n}\n\nconst resolveConfiguredProjects = (\n detected: EslintConfigOptions,\n options: EslintConfigOptions | undefined\n): Record<string, EslintConfigOptions> => ({\n ...(detected.projects ?? {}),\n ...(options?.projects ?? {})\n})\n\nconst resolveBucketDefaults = (detected: EslintConfigOptions) => ({\n detectedExtensions: detected.extensions ?? [],\n detectedFormats: detected.formats ?? [],\n detectedLibraries: detected.libraries ?? [],\n detectedTesting: detected.testing ?? [],\n detectedTools: detected.tools ?? []\n})\n\nconst scopeWorkspaceDetection = (\n detected: EslintConfigOptions,\n isWorkspace: boolean\n): EslintConfigOptions => isWorkspace ?\n {\n ...detected,\n detectedFrameworks: [],\n libraries: [],\n nextMode: undefined,\n runtime: Runtime.Universal\n } :\n detected\n\nconst resolveDetectedOptions = (\n detectRootDir: string | undefined,\n detection: EslintConfigOptions['detection'],\n requestedPreset: EslintConfigOptions['preset']\n): EslintConfigOptions => {\n const rawDetected = detectProjectOptions(detectRootDir)\n\n const shouldDetectProjects = requestedPreset === Preset.Monorepo ||\n rawDetected.preset === Preset.Monorepo\n\n const detected = applyDetectionControls(rawDetected, detection, { projects: shouldDetectProjects })\n const hasDetectedProjects = Object.keys(detected.projects ?? {}).length > 0\n\n // Root devDependencies in a workspace commonly contain frameworks and\n // libraries used by only one package. Keep those detections package-scoped;\n // explicit root options still apply normally.\n return scopeWorkspaceDetection(detected, hasDetectedProjects)\n}\n\nconst resolveNextModeValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions\n): NextMode => (options?.nextMode ?? presetDefaults.nextMode ?? detected.nextMode ?? NextMode.Pages) as NextMode\n\nconst resolveRuntimeValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions,\n usePresetRuntime: boolean\n): Runtime => (\n options?.runtime ??\n (usePresetRuntime ? presetDefaults.runtime : undefined) ??\n detected.runtime ??\n Runtime.Universal\n) as Runtime\n\nconst resolveSettingsValue = (\n options: EslintConfigOptions | undefined,\n detected: EslintConfigOptions\n): Setting[] => (options?.settings ?? detected.settings ?? []) as Setting[]\n\nconst resolveTypescriptValue = (\n options: EslintConfigOptions | undefined,\n presetDefaults: Partial<EslintConfigOptions>,\n detected: EslintConfigOptions\n): EslintConfigOptions['typescript'] => options?.typescript ?? presetDefaults.typescript ?? detected.typescript ?? false\n\nconst needsReactAutoAdd = (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>\n): boolean => Boolean(\n frameworks.next ??\n frameworks.expo ??\n frameworks['react-router'] ??\n (frameworks['tanstack-start'] && !frameworks.solid)\n) && !frameworks.react\n\nconst applyFrameworkImpliedDeps = (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>\n): NonNullable<EslintConfigOptions['frameworks']> => {\n const result = { ...frameworks }\n\n if (needsReactAutoAdd(result)) result.react = true\n\n if (result.slidev && !result.vue) result.vue = true\n\n if (result.nuxt && !result.vue) result.vue = true\n\n return result\n}\n\nconst buildIgnoresConfig = (\n useDefaultIgnores: boolean,\n useGeneratedCodeIgnores: boolean,\n useGitignore: boolean,\n options: EslintConfigOptions | undefined,\n rootDir: string\n) => ({\n defaultIgnores: useDefaultIgnores ?\n [{\n ignores: [...DEFAULT_IGNORES, ...(useGeneratedCodeIgnores ? GENERATED_CODE_IGNORES : [])],\n name: 'eslint-config-basic/default-ignores'\n } as TSESLint.FlatConfig.Config] :\n [],\n gitignoreConfig: useGitignore ? createGitignoreConfig(rootDir) : [] as FlatConfigArray,\n userIgnores: options?.ignores?.length ?\n [{\n ignores: options.ignores,\n name: 'eslint-config-basic/ignores'\n } as TSESLint.FlatConfig.Config] :\n []\n})\n\ninterface FrameworkResolutionContext {\n hasReact: boolean\n hasSolid: boolean\n hasSvelte: boolean\n hasVue: boolean\n runtime: Runtime\n tsconfigRootDir?: string\n typeChecked?: boolean\n}\n\nconst FRAMEWORK_EXTRA_OPTS: Partial<Record<string, (ctx: FrameworkResolutionContext) => FrameworkOptions>> = {\n astro: ctx => ({\n hasReact: ctx.hasReact,\n hasSolid: ctx.hasSolid,\n hasSvelte: ctx.hasSvelte,\n hasVue: ctx.hasVue,\n tsconfigRootDir: ctx.tsconfigRootDir,\n typeChecked: ctx.typeChecked\n }),\n hono: ctx => ({ runtime: ctx.runtime }),\n slidev: ctx => ({ runtime: ctx.runtime }),\n vite: ctx => ({ runtime: ctx.runtime })\n}\n\nconst resolveEnabledFrameworks = async (\n frameworks: NonNullable<EslintConfigOptions['frameworks']>,\n ctx: FrameworkResolutionContext\n): Promise<Record<string, FlatConfigArray>> => {\n const entries = await Promise.all(\n (Object.entries(frameworks) as [DetectedFrameworkName, ImportedFramework][])\n .filter((entry): entry is [DetectedFrameworkName, ImportedFramework] => Boolean(entry[1]))\n .map(([name, value]) => resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx))\n .then(config => [name, config] as const))\n )\n\n return Object.fromEntries(entries)\n}\n\ninterface BuildConfigsParams {\n astroOptions: { hasReact: boolean, hasSolid: boolean, hasSvelte: boolean, hasVue: boolean, typeChecked?: boolean }\n defaultIgnores: TSESLint.FlatConfig.Config[]\n gitignoreConfig: FlatConfigArray\n nextMode: NextMode\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n resolvedTypescript: false | (TypeScriptOptions & { mode: Exclude<TypeScriptMode, 'off'> })\n rootDir: string\n runtime: Runtime\n runtimeCoreConfig: FlatConfigArray\n tailwindOptions: TailwindOptions | undefined\n testingFiles: EslintConfigOptions['testingFiles']\n tsconfigRootDir: string | undefined\n uniqueExtensions: Extension[]\n uniqueFormats: Format[]\n uniqueLibraries: Library[]\n uniqueTesting: Testing[]\n uniqueTools: Tool[]\n userIgnores: TSESLint.FlatConfig.Config[]\n}\n\nconst buildEslintConfigs = async (params: BuildConfigsParams): Promise<FlatConfigArray> => {\n const {\n astroOptions, defaultIgnores, gitignoreConfig, nextMode, resolvedFrameworks,\n resolvedTypescript, rootDir, runtime, runtimeCoreConfig, tailwindOptions,\n testingFiles, tsconfigRootDir, uniqueExtensions, uniqueFormats, uniqueLibraries,\n uniqueTesting, uniqueTools, userIgnores\n } = params\n\n const { hasReact, hasSolid, hasSvelte, hasVue, typeChecked } = astroOptions\n\n const fw = await resolveEnabledFrameworks(\n resolvedFrameworks, { hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir, typeChecked }\n )\n\n const get = (name: string): FlatConfigArray => fw[name] ?? []\n\n const typescriptConfigs = resolvedTypescript ?\n createTypescriptConfig({\n ...resolvedTypescript,\n tsconfigRootDir: resolvedTypescript.tsconfigRootDir ?? tsconfigRootDir\n }) :\n []\n\n const untypedTypescriptConfigs = typescriptConfigs.filter(\n config => config.name === 'eslint-config-typescript/untyped-files'\n )\n\n const typedTypescriptConfigs = typescriptConfigs.filter(\n config => config.name !== 'eslint-config-typescript/untyped-files'\n )\n\n return [\n ...defaultIgnores,\n ...userIgnores,\n ...gitignoreConfig,\n ...(tsconfigRootDir ?\n [{\n languageOptions: { parserOptions: { tsconfigRootDir } },\n name: 'eslint-config-basic/tsconfig-root-dir'\n }] :\n []),\n {\n files: ['**/*.cjs', '**/*.cts'],\n languageOptions: {\n globals: {\n __dirname: 'readonly',\n __filename: 'readonly',\n exports: 'readonly',\n module: 'readonly',\n require: 'readonly'\n },\n sourceType: 'commonjs'\n },\n name: 'eslint-config-basic/commonjs'\n },\n ...runtimeCoreConfig,\n ...(hasReact ? get('react') : []),\n ...get('next'),\n ...get('expo'),\n ...get('nest'),\n ...get('hono'),\n ...get('vue'),\n ...get('svelte'),\n ...get('solid'),\n ...get('angular'),\n ...get('qwik'),\n ...get('react-router'),\n ...get('tanstack-start'),\n ...get('nuxt'),\n ...get('preact'),\n ...get('lit'),\n ...get('slidev'),\n ...get('vite'),\n ...typedTypescriptConfigs,\n ...get('astro'),\n ...(resolvedFrameworks.next && nextMode === NextMode.AppRouter ?\n [{\n files: ['app/**/*.{ts,tsx}', 'src/**/*.{ts,tsx}'],\n name: 'eslint-config-next/app-router-overrides',\n rules: { '@next/next/no-html-link-for-pages': 'off' }\n } as TSESLint.FlatConfig.Config] :\n []),\n ...applyTestingFileOverrides(\n await getIntegrationConfigs(\n uniqueLibraries, uniqueTools, uniqueTesting, uniqueFormats, uniqueExtensions\n ),\n testingFiles\n ),\n ...(resolvedFrameworks.next ?\n [{\n files: ['next-env.d.ts'],\n name: 'eslint-config-next/generated-declaration',\n rules: {\n '@stylistic/quotes': 'off',\n '@stylistic/semi': 'off'\n }\n } as TSESLint.FlatConfig.Config] :\n []),\n {\n files: [\n '**/*.{test,spec}.{js,mjs,cjs,jsx,ts,mts,cts,tsx}',\n '**/{test,tests,__tests__}/**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}'\n ],\n name: 'eslint-config-basic/test-file-overrides',\n rules: {\n '@typescript-eslint/no-empty-function': 'off',\n 'no-use-before-define': 'off'\n }\n },\n {\n files: getCliEntryFiles(rootDir),\n name: 'eslint-config-basic/scripts-overrides',\n rules: {\n 'n/no-unpublished-import': 'off',\n 'n/no-process-exit': 'off',\n 'no-console': 'off'\n }\n },\n ...(tailwindOptions ? [buildTailwindSettingsConfig(tailwindOptions)] : []),\n ...untypedTypescriptConfigs,\n ...(await getPrettierConfig(uniqueTools))\n ]\n}\n\ninterface EslintDebugInfo {\n autoFrameworks: boolean\n detectRootDir: string | undefined\n nextMode: NextMode\n optionMergeStrategy: 'merge' | 'replace'\n preset: EslintConfigOptions['preset']\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n resolvedTypescript: BuildConfigsParams['resolvedTypescript']\n runtime: Runtime\n tsconfigRootDir: string | undefined\n uniqueExtensions: Extension[]\n uniqueFormats: Format[]\n uniqueLibraries: Library[]\n uniqueTesting: Testing[]\n uniqueTools: Tool[]\n}\n\nconst logEslintDebug = ({\n autoFrameworks,\n detectRootDir,\n nextMode,\n optionMergeStrategy,\n preset,\n resolvedFrameworks,\n resolvedTypescript,\n runtime,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools\n}: EslintDebugInfo) => {\n if (!process.env.ESLINT_BASIC_DEBUG) return\n\n process.stdout.write(`[ESLint Basic] Resolved options: ${JSON.stringify({\n autoFrameworks,\n detectRootDir: detectRootDir ?? process.cwd(),\n extensions: uniqueExtensions,\n formats: uniqueFormats,\n frameworks: Object.entries(resolvedFrameworks)\n .filter(([, value]) => Boolean(value))\n .map(([key]) => key),\n libraries: uniqueLibraries,\n nextMode,\n optionMergeStrategy,\n preset,\n runtime,\n testing: uniqueTesting,\n tools: uniqueTools,\n tsconfigRootDir,\n typescript: resolvedTypescript ? resolvedTypescript.mode : false\n }, null, 2)}\\n`)\n}\n\nconst emitAstroDoctorWarning = (\n extensions: Extension[],\n frameworks: Record<string, unknown>\n): void => {\n if (!extensions.includes(Extension.AstroDoctor) || frameworks.astro) return\n\n process.emitWarning(\n '[eslint-config-basic] Warning: Astro Doctor is enabled without the Astro framework config. ' +\n 'Enable `frameworks: { astro: true }` or remove the `astro-doctor` feature.'\n )\n}\n\n/**\n * Portable public result type returned by the Basic config composer.\n *\n * Keeping this as a package-owned interface prevents TypeScript declaration\n * inference from exposing pnpm-internal `typescript-eslint` paths in consumer\n * `eslint.config.js` files.\n */\nexport interface EslintConfigArray extends FlatConfigArray {\n length: number\n}\n\ntype ConfigComposer = (\n options?: EslintConfigOptions,\n ...extraConfigs: ConfigInput[]\n) => Promise<EslintConfigArray>\n\nconst resolveProjectConfigs = async (\n configuredProjects: Record<string, EslintConfigOptions>,\n projectDefaults: EslintConfigOptions['projectDefaults'],\n detectRootDir: string | undefined,\n autoFrameworks: boolean | undefined,\n composeConfig: ConfigComposer\n) => Promise.all(\n Object.entries(configuredProjects).map(async ([projectPath, projectOptions]) => {\n const projectRoot = join(detectRootDir ?? process.cwd(), projectPath)\n const inheritedOptions = mergeProjectOptions(projectDefaults ?? {}, projectOptions)\n\n const scopedConfigs = await composeConfig({\n autoFrameworks,\n ...inheritedOptions,\n projectDefaults: undefined,\n projects: undefined,\n root: inheritedOptions.root ?? inheritedOptions.detectRootDir ?? projectRoot\n })\n\n return scopedConfigs.map(config => config.name === 'eslint-config/gitignore' ? config : scopeConfigToProject(config, projectPath))\n })\n)\n\nconst resolveInheritedProjectDefaults = (\n options: EslintConfigOptions | undefined\n): EslintConfigOptions['projectDefaults'] => mergeProjectOptions(\n {\n ...(options?.detection === undefined ? {} : { detection: options.detection }),\n ...(options?.tailwind === undefined ? {} : { tailwind: options.tailwind }),\n ...(typeof options?.typescript === 'object' && options.typescript.untypedFiles !== undefined ?\n { typescript: { untypedFiles: options.typescript.untypedFiles } } :\n {})\n },\n options?.projectDefaults ?? {}\n)\n\nconst getPluginNameFromRule = (\n ruleName: string,\n availablePluginNames: Iterable<string>\n): string | undefined => {\n const segments = ruleName.split('/')\n\n if (segments.length < 2) return undefined\n\n const registeredPrefix = [...availablePluginNames]\n .filter(pluginName => ruleName.startsWith(`${pluginName}/`))\n .sort((left, right) => right.length - left.length)[0]\n\n if (registeredPrefix) return registeredPrefix\n\n return ruleName.startsWith('@') && segments.length > 2 ?\n segments.slice(0, 2).join('/') :\n segments[0]\n}\n\n/**\n * Copies already-loaded plugin objects onto rule blocks that reference them.\n * ESLint 10 validates plugin availability per effective config object, while\n * feature packs often keep plugin setup and consumer overrides separate.\n */\nexport const attachReferencedPlugins = (configs: FlatConfigArray): FlatConfigArray => {\n const availablePlugins = new Map<string, NonNullable<TSESLint.FlatConfig.Config['plugins']>[string]>()\n const ambiguousPluginNames = new Set<string>()\n\n for (const config of configs) {\n for (const [pluginName, plugin] of Object.entries(config.plugins ?? {})) {\n const existingPlugin = availablePlugins.get(pluginName)\n\n if (existingPlugin && existingPlugin !== plugin) {\n availablePlugins.delete(pluginName)\n\n ambiguousPluginNames.add(pluginName)\n } else if (!ambiguousPluginNames.has(pluginName)) {\n availablePlugins.set(pluginName, plugin)\n }\n }\n }\n\n return configs.map(config => {\n const requiredPlugins = new Set(\n Object.keys(config.rules ?? {})\n .map(ruleName => getPluginNameFromRule(ruleName, availablePlugins.keys()))\n .filter((pluginName): pluginName is string => pluginName !== undefined)\n )\n\n const missingPluginEntries = [...requiredPlugins].flatMap(pluginName => {\n const plugin = availablePlugins.get(pluginName)\n\n return !Object.hasOwn(config.plugins ?? {}, pluginName) && plugin ?\n [[pluginName, plugin] as const] :\n []\n })\n\n if (missingPluginEntries.length === 0) return config\n\n return {\n ...config,\n plugins: {\n ...config.plugins,\n ...Object.fromEntries(missingPluginEntries)\n }\n }\n })\n}\n\nconst getConfigsParams = (\n options: EslintConfigOptions | undefined,\n rootDir: string,\n runtime: Runtime,\n uniqueLibraries: Library[],\n uniqueSettings: Setting[],\n resolvedFrameworks: NonNullable<EslintConfigOptions['frameworks']>\n) => {\n const hasReact = !!resolvedFrameworks.react\n const hasVue = !!resolvedFrameworks.vue\n const hasSvelte = !!resolvedFrameworks.svelte\n const hasSolid = !!resolvedFrameworks.solid\n const useGitignore = !uniqueSettings.includes(Setting.NoGitignore)\n const useDefaultIgnores = !uniqueSettings.includes(Setting.NoDefaultIgnores)\n const useGeneratedCodeIgnores = !uniqueSettings.includes(Setting.NoGeneratedCodeIgnores)\n\n const tailwindOptions = uniqueLibraries.includes(Library.Tailwind) ?\n resolveTailwindOptions(rootDir, options?.tailwind) :\n undefined\n\n const runtimeCoreConfig = runtime === Runtime.Universal ? coreConfig : createCoreConfig(runtime)\n\n const { defaultIgnores, gitignoreConfig, userIgnores } = buildIgnoresConfig(\n useDefaultIgnores, useGeneratedCodeIgnores, useGitignore, options, rootDir\n )\n\n return {\n astroOptions: { hasReact, hasSolid, hasSvelte, hasVue },\n defaultIgnores,\n gitignoreConfig,\n runtimeCoreConfig,\n tailwindOptions,\n userIgnores\n }\n}\n\n/**\n * Generates the ESLint configuration array, applying configurations\n * and integration settings based on the input configuration.\n *\n * @param {EslintConfigOptions} options - Configuration and integration settings\n * @param {ConfigInput[]} extraConfigs - Local flat-config overrides appended after generated config\n * @returns {FlatConfigArray} The final ESLint configuration array\n */\nexport const defineConfig: ConfigComposer = async function defineConfig(\n options?: EslintConfigOptions,\n ...extraConfigs: ConfigInput[]\n): Promise<EslintConfigArray> {\n const {\n detection,\n extensions: optExtensions,\n formats: optFormats,\n frameworks: optFrameworks,\n libraries: optLibraries,\n strict: optStrict,\n testing: optTesting,\n tools: optTools,\n tsconfigRootDir: optTsconfigRootDir,\n workspacePrefixes\n } = options ?? {}\n\n const { autoFrameworks, detectRootDir, optionMergeStrategy, requestedPreset } = resolveConfigSetup(options)\n const detected = resolveDetectedOptions(detectRootDir, detection, requestedPreset)\n const { frameworkDefaults, preset, presetDefaults } = resolvePresetMeta(requestedPreset, detected, autoFrameworks)\n const configuredProjects = resolveConfiguredProjects(detected, options)\n\n const {\n detectedExtensions,\n detectedFormats,\n detectedLibraries,\n detectedTesting,\n detectedTools\n } = resolveBucketDefaults(detected)\n\n // NOTE: these must be computed unconditionally (not via destructuring defaults)\n // so that `optionMergeStrategy: 'merge'` actually unions explicit values with\n // detected/preset values. Destructuring defaults are skipped whenever the\n // option is provided, which silently turned 'merge' into 'replace'.\n const configuredExtensions = mergeOptionalBucket(\n 'extensions', detectedExtensions, presetDefaults.extensions, optExtensions, options, optionMergeStrategy\n ) as Extension[]\n\n const formats = mergeOptionalBucket(\n 'formats', detectedFormats, presetDefaults.formats, optFormats, options, optionMergeStrategy\n ) as Format[]\n\n const frameworks = mergeFrameworkOption(\n frameworkDefaults, presetDefaults.frameworks, optFrameworks, optionMergeStrategy\n )\n\n const libraries = mergeOptionalBucket(\n 'libraries', detectedLibraries, presetDefaults.libraries, optLibraries, options, optionMergeStrategy\n ) as Library[]\n\n const nextMode = resolveNextModeValue(options, presetDefaults, detected)\n const runtime = resolveRuntimeValue(options, presetDefaults, detected, requestedPreset !== undefined)\n const settings = resolveSettingsValue(options, detected)\n const strict = getStrictMode(optStrict, presetDefaults.strict)\n\n const testing = mergeOptionalBucket(\n 'testing', detectedTesting, presetDefaults.testing, optTesting, options, optionMergeStrategy\n ) as Testing[]\n\n const tools = mergeOptionalBucket(\n 'tools', detectedTools, presetDefaults.tools, optTools, options, optionMergeStrategy\n ) as Tool[]\n\n const typescript = resolveTypescriptValue(options, presetDefaults, detected)\n const resolvedTypescript = resolveTypescriptOptions(typescript)\n const rootDir = detectRootDir ?? process.cwd()\n const tsconfigRootDir = resolveTsconfigRootDir(rootDir, typescript, optTsconfigRootDir)\n const extensions = applyStrictProfileDefaults(configuredExtensions, strict)\n const resolvedFrameworks = applyFrameworkImpliedDeps({ ...frameworks })\n const uniqueLibraries = resolveUniqueLibraries(libraries, options?.tailwind)\n const uniqueTesting = [...new Set(testing)]\n const uniqueFormats = [...new Set(formats)]\n const uniqueTools = [...new Set(tools)]\n const uniqueExtensions = [...new Set(extensions)]\n const uniqueSettings = [...new Set(settings)]\n\n emitAstroDoctorWarning(uniqueExtensions, resolvedFrameworks)\n\n const params = getConfigsParams(options, rootDir, runtime, uniqueLibraries, uniqueSettings, resolvedFrameworks)\n\n const configs = await buildEslintConfigs({\n astroOptions: {\n ...params.astroOptions,\n typeChecked: resolvedTypescript ? resolvedTypescript.mode !== 'syntax' : false\n },\n defaultIgnores: params.defaultIgnores,\n gitignoreConfig: params.gitignoreConfig,\n nextMode,\n resolvedFrameworks,\n resolvedTypescript,\n rootDir,\n runtime,\n runtimeCoreConfig: params.runtimeCoreConfig,\n tailwindOptions: params.tailwindOptions,\n testingFiles: options?.testingFiles,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools,\n userIgnores: params.userIgnores\n })\n\n logEslintDebug({\n autoFrameworks,\n detectRootDir,\n nextMode,\n optionMergeStrategy,\n preset,\n resolvedFrameworks,\n resolvedTypescript,\n runtime,\n tsconfigRootDir,\n uniqueExtensions,\n uniqueFormats,\n uniqueLibraries,\n uniqueTesting,\n uniqueTools\n })\n\n const projectConfigs = await resolveProjectConfigs(\n configuredProjects,\n resolveInheritedProjectDefaults(options),\n detectRootDir,\n options?.autoFrameworks,\n defineConfig\n )\n\n // Merge workspace import group into any existing simple-import-sort/imports rules\n // so framework-specific group ordering (e.g. React-first) is preserved.\n const allConfigs = [\n ...configs,\n ...projectConfigs.flat(),\n ...flattenConfigInputs(extraConfigs)\n ]\n\n const patchedConfigs = workspacePrefixes?.length ?\n patchImportGroups(allConfigs, workspacePrefixes) :\n allConfigs\n\n const finalConfig = attachReferencedPlugins(applyStrictMode(patchedConfigs, strict))\n\n return attachDefineConfigMetadata(finalConfig, { extraConfigs, options })\n}\n"],"mappings":"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","names":["coreConfig","createCoreConfig","createGitignoreConfig","detectProjectOptions","Extension","Library","NextMode","Preset","Runtime","Setting","Testing","defineConfig"]}
|
package/dist/recommended.d.ts
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
|
-
import
|
|
1
|
+
import { EslintConfigArray } from './index.js';
|
|
2
|
+
import '@santi020k/eslint-config-core';
|
|
3
|
+
import './frameworks.js';
|
|
4
|
+
import '@santi020k/eslint-config-typescript';
|
|
2
5
|
|
|
3
|
-
declare const
|
|
6
|
+
declare const config: EslintConfigArray;
|
|
4
7
|
|
|
5
|
-
export {
|
|
8
|
+
export { config as default };
|
package/dist/recommended.js
CHANGED
package/dist/recommended.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/recommended.ts"],"sourcesContent":["import { defineConfig } from './index.js'\n\
|
|
1
|
+
{"version":3,"sources":["../src/recommended.ts"],"sourcesContent":["import { defineConfig, type EslintConfigArray } from './index.js'\n\nconst config: EslintConfigArray = await defineConfig()\n\nexport default config\n"],"mappings":"AAAA,SAAS,oBAA4C;AAErD,MAAM,SAA4B,MAAM,aAAa;AAErD,IAAO,sBAAQ;","names":[]}
|
package/dist/tailwind.d.ts
CHANGED
|
@@ -2,7 +2,8 @@ import { TailwindOptions } from '@santi020k/eslint-config-core';
|
|
|
2
2
|
import { TSESLint } from '@typescript-eslint/utils';
|
|
3
3
|
|
|
4
4
|
declare const findCssComponentClasses: (cwd: string, entryPoint: string) => string[];
|
|
5
|
+
declare const findTailwindPluginClassPatterns: (cwd: string, entryPoint: string) => string[];
|
|
5
6
|
declare const findCssComponentClassPatterns: (cwd: string, entryPoint: string) => string[];
|
|
6
7
|
declare const buildTailwindSettingsConfig: (tailwindOptions: TailwindOptions) => TSESLint.FlatConfig.Config;
|
|
7
8
|
|
|
8
|
-
export { buildTailwindSettingsConfig, findCssComponentClassPatterns, findCssComponentClasses };
|
|
9
|
+
export { buildTailwindSettingsConfig, findCssComponentClassPatterns, findCssComponentClasses, findTailwindPluginClassPatterns };
|
package/dist/tailwind.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { existsSync, readFileSync } from "node:fs";
|
|
1
|
+
import { existsSync, readdirSync, readFileSync } from "node:fs";
|
|
2
2
|
import { dirname, extname, isAbsolute, join, resolve } from "node:path";
|
|
3
3
|
const CSS_ESCAPE_PATTERN = String.raw`\\(?:[\dA-Fa-f]{1,6}\s?|[^\f\n\r])`;
|
|
4
4
|
const CSS_CLASS_PATTERN = new RegExp(
|
|
@@ -7,9 +7,31 @@ const CSS_CLASS_PATTERN = new RegExp(
|
|
|
7
7
|
);
|
|
8
8
|
const CSS_UTILITY_PATTERN = /@utility\s+([A-Za-z_][\w-]*)\s*\{/g;
|
|
9
9
|
const CSS_IMPORT_PATTERN = /@import\s+(?:url\(\s*)?["']([^"']+)["']/g;
|
|
10
|
+
const CSS_PLUGIN_PATTERN = /@plugin\s+["']([^"']+)["']/g;
|
|
10
11
|
const CSS_COMMENT_PATTERN = /\/\*[\s\S]*?\*\//g;
|
|
11
12
|
const CSS_STRING_PATTERN = /("(?:\\.|[^"\\])*"|'(?:\\.|[^'\\])*')/g;
|
|
13
|
+
const ASTRO_STYLE_PATTERN = /<style(?:\s[^>]*)?>([\s\S]*?)<\/style\s*>/gi;
|
|
14
|
+
const TAILWIND_CONFIG_PATTERN = /^tailwind\.config\.(?:cjs|cts|js|mjs|mts|ts)$/;
|
|
12
15
|
const MAX_COMPONENT_PATTERN_LENGTH = 3e3;
|
|
16
|
+
const IGNORED_COMPONENT_DIRECTORIES = /* @__PURE__ */ new Set([
|
|
17
|
+
".astro",
|
|
18
|
+
".git",
|
|
19
|
+
".next",
|
|
20
|
+
".nuxt",
|
|
21
|
+
".output",
|
|
22
|
+
".svelte-kit",
|
|
23
|
+
"build",
|
|
24
|
+
"coverage",
|
|
25
|
+
"dist",
|
|
26
|
+
"node_modules"
|
|
27
|
+
]);
|
|
28
|
+
const PLUGIN_CLASS_PATTERNS = {
|
|
29
|
+
"@tailwindcss/aspect-ratio": ["^aspect-(?:h|w)-\\d+$"],
|
|
30
|
+
"@tailwindcss/forms": [
|
|
31
|
+
"^form-(?:checkbox|input|multiselect|radio|select|textarea)$"
|
|
32
|
+
],
|
|
33
|
+
"@tailwindcss/typography": ["^not-prose$"]
|
|
34
|
+
};
|
|
13
35
|
const decodeCssIdentifier = (value) => value.replaceAll(/\\([\dA-Fa-f]{1,6})\s?/g, (_, codePoint) => String.fromCodePoint(Number.parseInt(codePoint, 16))).replaceAll(/\\([^\f\n\r])/g, "$1");
|
|
14
36
|
const resolveLocalCssImport = (filePath, specifier) => {
|
|
15
37
|
if (!specifier.startsWith(".") && !isAbsolute(specifier)) return void 0;
|
|
@@ -42,21 +64,63 @@ const getCssSelectorClasses = (content) => {
|
|
|
42
64
|
return [...classes];
|
|
43
65
|
};
|
|
44
66
|
const getCssUtilityClasses = (content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_UTILITY_PATTERN)].flatMap((match) => match[1] ? [match[1]] : []);
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
visited.add(filePath);
|
|
48
|
-
let content;
|
|
67
|
+
const getCssPlugins = (content) => [...content.replaceAll(CSS_COMMENT_PATTERN, "").matchAll(CSS_PLUGIN_PATTERN)].flatMap((match) => match[1] ? [match[1]] : []);
|
|
68
|
+
const readDirectory = (directory) => {
|
|
49
69
|
try {
|
|
50
|
-
|
|
70
|
+
return readdirSync(directory, { withFileTypes: true, encoding: "utf8" });
|
|
51
71
|
} catch {
|
|
52
|
-
return;
|
|
72
|
+
return [];
|
|
53
73
|
}
|
|
74
|
+
};
|
|
75
|
+
const readTextFile = (path) => {
|
|
76
|
+
try {
|
|
77
|
+
return readFileSync(path, "utf8");
|
|
78
|
+
} catch {
|
|
79
|
+
return void 0;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
const collectCssComponentClasses = (filePath, visited, classes, plugins) => {
|
|
83
|
+
if (visited.has(filePath)) return;
|
|
84
|
+
visited.add(filePath);
|
|
85
|
+
const content = readTextFile(filePath);
|
|
86
|
+
if (content === void 0) return;
|
|
54
87
|
for (const className of getCssSelectorClasses(content)) classes.add(className);
|
|
55
88
|
for (const className of getCssUtilityClasses(content)) classes.add(className);
|
|
89
|
+
for (const plugin of getCssPlugins(content)) plugins.add(plugin);
|
|
56
90
|
for (const importedFile of getImportedCssFiles(filePath, content)) {
|
|
57
|
-
collectCssComponentClasses(importedFile, visited, classes);
|
|
91
|
+
collectCssComponentClasses(importedFile, visited, classes, plugins);
|
|
58
92
|
}
|
|
59
93
|
};
|
|
94
|
+
const collectAstroComponentClasses = (cwd, classes) => {
|
|
95
|
+
const visit = (directory) => {
|
|
96
|
+
const entries = readDirectory(directory);
|
|
97
|
+
for (const entry of entries.filter((entry2) => entry2.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry2.name))) visit(join(directory, entry.name));
|
|
98
|
+
for (const entry of entries.filter((entry2) => entry2.isFile() && entry2.name.endsWith(".astro"))) {
|
|
99
|
+
const content = readTextFile(join(directory, entry.name));
|
|
100
|
+
if (content === void 0) continue;
|
|
101
|
+
for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {
|
|
102
|
+
const stylesheet = style[1];
|
|
103
|
+
if (!stylesheet) continue;
|
|
104
|
+
for (const className of getCssSelectorClasses(stylesheet)) classes.add(className);
|
|
105
|
+
for (const className of getCssUtilityClasses(stylesheet)) classes.add(className);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
visit(cwd);
|
|
110
|
+
};
|
|
111
|
+
const getConfiguredTailwindPlugins = (cwd) => {
|
|
112
|
+
const plugins = /* @__PURE__ */ new Set();
|
|
113
|
+
for (const entry of readDirectory(cwd)) {
|
|
114
|
+
if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue;
|
|
115
|
+
const content = readTextFile(join(cwd, entry.name));
|
|
116
|
+
if (content === void 0) continue;
|
|
117
|
+
const uncommentedContent = content.replaceAll(/\/\*[\s\S]*?\*\//g, "").replaceAll(/^\s*\/\/.*$/gm, "");
|
|
118
|
+
for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {
|
|
119
|
+
if (uncommentedContent.includes(plugin)) plugins.add(plugin);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return [...plugins];
|
|
123
|
+
};
|
|
60
124
|
const escapeRegex = (value) => value.replaceAll(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
61
125
|
const createExactClassPatterns = (classes) => {
|
|
62
126
|
const patterns = [];
|
|
@@ -78,9 +142,16 @@ const createExactClassPatterns = (classes) => {
|
|
|
78
142
|
const findCssComponentClasses = (cwd, entryPoint) => {
|
|
79
143
|
const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
|
|
80
144
|
const classes = /* @__PURE__ */ new Set();
|
|
81
|
-
collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes);
|
|
145
|
+
collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), classes, /* @__PURE__ */ new Set());
|
|
146
|
+
collectAstroComponentClasses(cwd, classes);
|
|
82
147
|
return [...classes].toSorted();
|
|
83
148
|
};
|
|
149
|
+
const findTailwindPluginClassPatterns = (cwd, entryPoint) => {
|
|
150
|
+
const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint);
|
|
151
|
+
const plugins = new Set(getConfiguredTailwindPlugins(cwd));
|
|
152
|
+
collectCssComponentClasses(entryPath, /* @__PURE__ */ new Set(), /* @__PURE__ */ new Set(), plugins);
|
|
153
|
+
return [...plugins].flatMap((plugin) => PLUGIN_CLASS_PATTERNS[plugin] ?? []).filter((pattern, index, patterns) => patterns.indexOf(pattern) === index).toSorted();
|
|
154
|
+
};
|
|
84
155
|
const findCssComponentClassPatterns = (cwd, entryPoint) => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint));
|
|
85
156
|
const getIgnoredClasses = (tailwindOptions) => {
|
|
86
157
|
const configuredClasses = tailwindOptions.ignore ?? [];
|
|
@@ -91,7 +162,11 @@ const getIgnoredClasses = (tailwindOptions) => {
|
|
|
91
162
|
tailwindOptions.cwd ?? process.cwd(),
|
|
92
163
|
tailwindOptions.entryPoint
|
|
93
164
|
);
|
|
94
|
-
|
|
165
|
+
const pluginClasses = findTailwindPluginClassPatterns(
|
|
166
|
+
tailwindOptions.cwd ?? process.cwd(),
|
|
167
|
+
tailwindOptions.entryPoint
|
|
168
|
+
);
|
|
169
|
+
return [.../* @__PURE__ */ new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])];
|
|
95
170
|
};
|
|
96
171
|
const getUnknownClassRule = (tailwindOptions, ignoredClasses) => {
|
|
97
172
|
const options = {
|
|
@@ -122,6 +197,7 @@ const buildTailwindSettingsConfig = (tailwindOptions) => {
|
|
|
122
197
|
export {
|
|
123
198
|
buildTailwindSettingsConfig,
|
|
124
199
|
findCssComponentClassPatterns,
|
|
125
|
-
findCssComponentClasses
|
|
200
|
+
findCssComponentClasses,
|
|
201
|
+
findTailwindPluginClassPatterns
|
|
126
202
|
};
|
|
127
203
|
//# sourceMappingURL=tailwind.js.map
|
package/dist/tailwind.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n let content: string\n\n try {\n content = readFileSync(filePath, 'utf8')\n } catch {\n return\n }\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes)\n }\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes)\n\n return [...classes].toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/tailwind.ts"],"sourcesContent":["import type { Dirent } from 'node:fs'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { dirname, extname, isAbsolute, join, resolve } from 'node:path'\n\nimport type { TailwindOptions } from '@santi020k/eslint-config-core'\nimport type { TSESLint } from '@typescript-eslint/utils'\n\nconst CSS_ESCAPE_PATTERN = String.raw`\\\\(?:[\\dA-Fa-f]{1,6}\\s?|[^\\f\\n\\r])`\n\nconst CSS_CLASS_PATTERN = new RegExp(\n String.raw`\\.((?:${CSS_ESCAPE_PATTERN}|[A-Za-z_])(?:${CSS_ESCAPE_PATTERN}|[\\w-])*)`,\n 'g'\n)\n\nconst CSS_UTILITY_PATTERN = /@utility\\s+([A-Za-z_][\\w-]*)\\s*\\{/g\nconst CSS_IMPORT_PATTERN = /@import\\s+(?:url\\(\\s*)?[\"']([^\"']+)[\"']/g\nconst CSS_PLUGIN_PATTERN = /@plugin\\s+[\"']([^\"']+)[\"']/g\nconst CSS_COMMENT_PATTERN = /\\/\\*[\\s\\S]*?\\*\\//g\nconst CSS_STRING_PATTERN = /(\"(?:\\\\.|[^\"\\\\])*\"|'(?:\\\\.|[^'\\\\])*')/g\nconst ASTRO_STYLE_PATTERN = /<style(?:\\s[^>]*)?>([\\s\\S]*?)<\\/style\\s*>/gi\nconst TAILWIND_CONFIG_PATTERN = /^tailwind\\.config\\.(?:cjs|cts|js|mjs|mts|ts)$/\nconst MAX_COMPONENT_PATTERN_LENGTH = 3000\n\nconst IGNORED_COMPONENT_DIRECTORIES = new Set([\n '.astro',\n '.git',\n '.next',\n '.nuxt',\n '.output',\n '.svelte-kit',\n 'build',\n 'coverage',\n 'dist',\n 'node_modules'\n])\n\nconst PLUGIN_CLASS_PATTERNS: Readonly<Record<string, readonly string[]>> = {\n '@tailwindcss/aspect-ratio': ['^aspect-(?:h|w)-\\\\d+$'],\n '@tailwindcss/forms': [\n '^form-(?:checkbox|input|multiselect|radio|select|textarea)$'\n ],\n '@tailwindcss/typography': ['^not-prose$']\n}\n\nconst decodeCssIdentifier = (value: string): string => value\n .replaceAll(/\\\\([\\dA-Fa-f]{1,6})\\s?/g, (_, codePoint: string) => String.fromCodePoint(Number.parseInt(codePoint, 16)))\n .replaceAll(/\\\\([^\\f\\n\\r])/g, '$1')\n\nconst resolveLocalCssImport = (filePath: string, specifier: string): string | undefined => {\n if (!specifier.startsWith('.') && !isAbsolute(specifier)) return undefined\n\n const cleanSpecifier = specifier.split(/[?#]/, 1)[0]\n\n if (!cleanSpecifier) return undefined\n\n const candidate = isAbsolute(cleanSpecifier) ? cleanSpecifier : resolve(dirname(filePath), cleanSpecifier)\n const candidates = extname(candidate) ? [candidate] : [candidate, `${candidate}.css`, join(candidate, 'index.css')]\n\n return candidates.find(path => existsSync(path))\n}\n\nconst getImportedCssFiles = (filePath: string, content: string): string[] => (\n [...content.matchAll(CSS_IMPORT_PATTERN)].flatMap(match => {\n const importedFile = match[1] ? resolveLocalCssImport(filePath, match[1]) : undefined\n\n return importedFile ? [importedFile] : []\n })\n)\n\nconst getCssSelectorClasses = (content: string): string[] => {\n const classes = new Set<string>()\n const source = content.replaceAll(CSS_COMMENT_PATTERN, '')\n\n for (const blockStart of source.matchAll(/\\{/g)) {\n const index = blockStart.index\n\n const boundary = Math.max(\n source.lastIndexOf(';', index - 1),\n source.lastIndexOf('{', index - 1),\n source.lastIndexOf('}', index - 1)\n )\n\n const selector = source.slice(boundary + 1, index).trim()\n\n if (!selector || selector.startsWith('@')) continue\n\n for (const match of selector.replaceAll(CSS_STRING_PATTERN, '').matchAll(CSS_CLASS_PATTERN)) {\n if (match[1]) classes.add(decodeCssIdentifier(match[1]))\n }\n }\n\n return [...classes]\n}\n\nconst getCssUtilityClasses = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_UTILITY_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst getCssPlugins = (content: string): string[] => (\n [...content.replaceAll(CSS_COMMENT_PATTERN, '').matchAll(CSS_PLUGIN_PATTERN)]\n .flatMap(match => match[1] ? [match[1]] : [])\n)\n\nconst readDirectory = (directory: string): Dirent[] => {\n try {\n return readdirSync(directory, { withFileTypes: true, encoding: 'utf8' })\n } catch {\n return []\n }\n}\n\nconst readTextFile = (path: string): string | undefined => {\n try {\n return readFileSync(path, 'utf8')\n } catch {\n return undefined\n }\n}\n\nconst collectCssComponentClasses = (\n filePath: string,\n visited: Set<string>,\n classes: Set<string>,\n plugins: Set<string>\n): void => {\n if (visited.has(filePath)) return\n\n visited.add(filePath)\n\n const content = readTextFile(filePath)\n\n if (content === undefined) return\n\n for (const className of getCssSelectorClasses(content)) classes.add(className)\n\n for (const className of getCssUtilityClasses(content)) classes.add(className)\n\n for (const plugin of getCssPlugins(content)) plugins.add(plugin)\n\n for (const importedFile of getImportedCssFiles(filePath, content)) {\n collectCssComponentClasses(importedFile, visited, classes, plugins)\n }\n}\n\nconst collectAstroComponentClasses = (cwd: string, classes: Set<string>): void => {\n const visit = (directory: string): void => {\n const entries = readDirectory(directory)\n\n for (const entry of entries.filter(entry => (\n entry.isDirectory() && !IGNORED_COMPONENT_DIRECTORIES.has(entry.name)\n ))) visit(join(directory, entry.name))\n\n for (const entry of entries.filter(entry => entry.isFile() && entry.name.endsWith('.astro'))) {\n const content = readTextFile(join(directory, entry.name))\n\n if (content === undefined) continue\n\n for (const style of content.matchAll(ASTRO_STYLE_PATTERN)) {\n const stylesheet = style[1]\n\n if (!stylesheet) continue\n\n for (const className of getCssSelectorClasses(stylesheet)) classes.add(className)\n\n for (const className of getCssUtilityClasses(stylesheet)) classes.add(className)\n }\n }\n }\n\n visit(cwd)\n}\n\nconst getConfiguredTailwindPlugins = (cwd: string): string[] => {\n const plugins = new Set<string>()\n\n for (const entry of readDirectory(cwd)) {\n if (!entry.isFile() || !TAILWIND_CONFIG_PATTERN.test(entry.name)) continue\n\n const content = readTextFile(join(cwd, entry.name))\n\n if (content === undefined) continue\n\n const uncommentedContent = content\n .replaceAll(/\\/\\*[\\s\\S]*?\\*\\//g, '')\n .replaceAll(/^\\s*\\/\\/.*$/gm, '')\n\n for (const plugin of Object.keys(PLUGIN_CLASS_PATTERNS)) {\n if (uncommentedContent.includes(plugin)) plugins.add(plugin)\n }\n }\n\n return [...plugins]\n}\n\nconst escapeRegex = (value: string): string => value.replaceAll(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\nconst createExactClassPatterns = (classes: string[]): string[] => {\n const patterns: string[] = []\n let alternatives: string[] = []\n\n const flush = (): void => {\n if (alternatives.length === 0) return\n\n patterns.push(`^(?:${alternatives.join('|')})$`)\n\n alternatives = []\n }\n\n for (const className of classes.toSorted()) {\n const escapedClass = escapeRegex(className)\n const nextLength = alternatives.join('|').length + escapedClass.length + 6\n\n if (nextLength > MAX_COMPONENT_PATTERN_LENGTH) flush()\n\n alternatives.push(escapedClass)\n }\n\n flush()\n\n return patterns\n}\n\nexport const findCssComponentClasses = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const classes = new Set<string>()\n\n collectCssComponentClasses(entryPath, new Set(), classes, new Set())\n\n collectAstroComponentClasses(cwd, classes)\n\n return [...classes].toSorted()\n}\n\nexport const findTailwindPluginClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => {\n const entryPath = isAbsolute(entryPoint) ? entryPoint : join(cwd, entryPoint)\n const plugins = new Set(getConfiguredTailwindPlugins(cwd))\n\n collectCssComponentClasses(entryPath, new Set(), new Set(), plugins)\n\n return [...plugins]\n .flatMap(plugin => PLUGIN_CLASS_PATTERNS[plugin] ?? [])\n .filter((pattern, index, patterns) => patterns.indexOf(pattern) === index)\n .toSorted()\n}\n\nexport const findCssComponentClassPatterns = (\n cwd: string,\n entryPoint: string\n): string[] => createExactClassPatterns(findCssComponentClasses(cwd, entryPoint))\n\nconst getIgnoredClasses = (tailwindOptions: TailwindOptions): string[] => {\n const configuredClasses = tailwindOptions.ignore ?? []\n\n if (!tailwindOptions.entryPoint || tailwindOptions.detectComponentClasses === false) {\n return configuredClasses\n }\n\n const detectedClasses = findCssComponentClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n const pluginClasses = findTailwindPluginClassPatterns(\n tailwindOptions.cwd ?? process.cwd(),\n tailwindOptions.entryPoint\n )\n\n return [...new Set([...configuredClasses, ...detectedClasses, ...pluginClasses])]\n}\n\nconst getUnknownClassRule = (\n tailwindOptions: TailwindOptions,\n ignoredClasses: string[]\n): TSESLint.FlatConfig.RuleEntry | undefined => {\n const options = {\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(ignoredClasses.length ? { ignore: ignoredClasses } : {})\n }\n\n const hasOptions = Object.keys(options).length > 0\n const severity = tailwindOptions.noUnknownClasses ?? 'error'\n\n if (!hasOptions && tailwindOptions.noUnknownClasses === undefined) return undefined\n\n if (severity === false) return 'off'\n\n return hasOptions ? [severity, options] : severity\n}\n\nexport const buildTailwindSettingsConfig = (\n tailwindOptions: TailwindOptions\n): TSESLint.FlatConfig.Config => {\n const ignoredClasses = getIgnoredClasses(tailwindOptions)\n const noUnknownClassesRule = getUnknownClassRule(tailwindOptions, ignoredClasses)\n\n const settingsOptions = {\n ...(tailwindOptions.cwd ? { cwd: tailwindOptions.cwd } : {}),\n ...(tailwindOptions.detectComponentClasses === undefined ?\n {} :\n { detectComponentClasses: tailwindOptions.detectComponentClasses }),\n ...(tailwindOptions.entryPoint ? { entryPoint: tailwindOptions.entryPoint } : {}),\n ...(tailwindOptions.ignore?.length ? { ignore: tailwindOptions.ignore } : {})\n }\n\n return {\n name: 'eslint-config-basic/tailwind-settings',\n ...(noUnknownClassesRule === undefined ?\n {} :\n { rules: { 'better-tailwindcss/no-unknown-classes': noUnknownClassesRule } }),\n settings: { 'better-tailwindcss': settingsOptions }\n }\n}\n"],"mappings":"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","names":["entry"]}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@santi020k/eslint-config-basic",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.5.0",
|
|
4
4
|
"publishConfig": {
|
|
5
5
|
"access": "public",
|
|
6
6
|
"provenance": true
|
|
7
7
|
},
|
|
8
|
-
"description": "Lean, auto-detecting ESLint 10 flat config with opt-in framework and integration packages.",
|
|
8
|
+
"description": "Lean, auto-detecting ESLint 10 flat config with opt-in framework and integration packages for modern projects.",
|
|
9
9
|
"type": "module",
|
|
10
10
|
"main": "./dist/index.js",
|
|
11
11
|
"module": "./dist/index.js",
|
|
@@ -40,15 +40,15 @@
|
|
|
40
40
|
"@typescript-eslint/utils": "^8.65.0",
|
|
41
41
|
"semver": "^7.8.5",
|
|
42
42
|
"@santi020k/eslint-config-core": "^3.1.1",
|
|
43
|
-
"@santi020k/eslint-config-typescript": "^3.1.
|
|
43
|
+
"@santi020k/eslint-config-typescript": "^3.1.3"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
46
46
|
"@types/node": "^26.1.2",
|
|
47
47
|
"publint": "^0.3.22",
|
|
48
48
|
"tsup": "^8.5.1",
|
|
49
|
-
"typescript": "
|
|
49
|
+
"typescript": "npm:@typescript/typescript6@^6.0.2",
|
|
50
50
|
"@santi020k/eslint-config-angular": "^3.1.0",
|
|
51
|
-
"@santi020k/eslint-config-astro": "^3.1.
|
|
51
|
+
"@santi020k/eslint-config-astro": "^3.1.2",
|
|
52
52
|
"@santi020k/eslint-config-expo": "^3.1.0",
|
|
53
53
|
"@santi020k/eslint-config-extensions": "^3.1.1",
|
|
54
54
|
"@santi020k/eslint-config-formats": "^3.1.1",
|
|
@@ -75,15 +75,15 @@
|
|
|
75
75
|
"eslint": "^10.0.0",
|
|
76
76
|
"typescript": ">=5.0.0 <7.0.0",
|
|
77
77
|
"@santi020k/eslint-config-angular": "^3.1.0",
|
|
78
|
-
"@santi020k/eslint-config-astro": "^3.1.
|
|
78
|
+
"@santi020k/eslint-config-astro": "^3.1.2",
|
|
79
79
|
"@santi020k/eslint-config-expo": "^3.1.0",
|
|
80
80
|
"@santi020k/eslint-config-extensions": "^3.1.1",
|
|
81
81
|
"@santi020k/eslint-config-formats": "^3.1.1",
|
|
82
82
|
"@santi020k/eslint-config-hono": "^3.1.0",
|
|
83
83
|
"@santi020k/eslint-config-lit": "^3.1.0",
|
|
84
84
|
"@santi020k/eslint-config-libraries": "^3.1.1",
|
|
85
|
-
"@santi020k/eslint-config-nest": "^3.1.0",
|
|
86
85
|
"@santi020k/eslint-config-next": "^3.1.0",
|
|
86
|
+
"@santi020k/eslint-config-nest": "^3.1.0",
|
|
87
87
|
"@santi020k/eslint-config-nuxt": "^3.1.0",
|
|
88
88
|
"@santi020k/eslint-config-preact": "^3.1.0",
|
|
89
89
|
"@santi020k/eslint-config-qwik": "^3.1.0",
|
|
@@ -93,10 +93,10 @@
|
|
|
93
93
|
"@santi020k/eslint-config-solid": "^3.1.0",
|
|
94
94
|
"@santi020k/eslint-config-svelte": "^3.1.0",
|
|
95
95
|
"@santi020k/eslint-config-tanstack-start": "^3.1.0",
|
|
96
|
-
"@santi020k/eslint-config-testing": "^3.1.1",
|
|
97
96
|
"@santi020k/eslint-config-tools": "^3.1.1",
|
|
98
97
|
"@santi020k/eslint-config-vite": "^3.1.0",
|
|
99
|
-
"@santi020k/eslint-config-vue": "^3.1.0"
|
|
98
|
+
"@santi020k/eslint-config-vue": "^3.1.0",
|
|
99
|
+
"@santi020k/eslint-config-testing": "^3.1.1"
|
|
100
100
|
},
|
|
101
101
|
"peerDependenciesMeta": {
|
|
102
102
|
"@santi020k/eslint-config-angular": {
|