@santi020k/eslint-config-basic 3.1.0 → 3.3.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 +54 -0
- package/dist/agent-skill-generator.d.ts +7 -18
- package/dist/agent-skill-generator.js +54 -18
- package/dist/agent-skill-generator.js.map +1 -0
- package/dist/cli-advanced.d.ts +7 -0
- package/dist/cli-advanced.js +74 -15
- package/dist/cli-advanced.js.map +1 -0
- package/dist/cli-migration.js +388 -34
- package/dist/cli-migration.js.map +1 -0
- package/dist/cli-package-manager.d.ts +10 -0
- package/dist/cli-package-manager.js +135 -0
- package/dist/cli-package-manager.js.map +1 -0
- package/dist/cli-preset.d.ts +103 -0
- package/dist/cli-preset.js +562 -0
- package/dist/cli-preset.js.map +1 -0
- package/dist/cli-workflows.js +1 -0
- package/dist/cli-workflows.js.map +1 -0
- package/dist/cli.d.ts +14 -2
- package/dist/cli.js +689 -94
- package/dist/cli.js.map +1 -0
- package/dist/define-config-metadata.d.ts +10 -0
- package/dist/define-config-metadata.js +16 -0
- package/dist/define-config-metadata.js.map +1 -0
- package/dist/frameworks.d.ts +1 -0
- package/dist/frameworks.js +6 -2
- package/dist/frameworks.js.map +1 -0
- package/dist/index.d.ts +10 -3
- package/dist/index.js +145 -27
- package/dist/index.js.map +1 -0
- package/dist/integrations.js +4 -1
- package/dist/integrations.js.map +1 -0
- package/dist/optional-package-errors.d.ts +3 -0
- package/dist/optional-package-errors.js +15 -0
- package/dist/optional-package-errors.js.map +1 -0
- package/dist/recommended.js +1 -0
- package/dist/recommended.js.map +1 -0
- package/dist/resolvers.js +1 -0
- package/dist/resolvers.js.map +1 -0
- package/dist/tailwind.d.ts +3 -1
- package/dist/tailwind.js +115 -13
- package/dist/tailwind.js.map +1 -0
- package/package.json +20 -19
package/dist/index.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
1
2
|
import { dirname, join } from "node:path";
|
|
2
3
|
import { fileURLToPath } from "node:url";
|
|
3
4
|
import {
|
|
@@ -29,10 +30,26 @@ import {
|
|
|
29
30
|
Testing
|
|
30
31
|
} from "@santi020k/eslint-config-core";
|
|
31
32
|
import { createTypescriptConfig } from "@santi020k/eslint-config-typescript";
|
|
33
|
+
import { attachDefineConfigMetadata } from "./define-config-metadata.js";
|
|
32
34
|
import { createDetectedFrameworkFlags } from "./frameworks.js";
|
|
33
35
|
import { getIntegrationConfigs, getPrettierConfig } from "./integrations.js";
|
|
34
36
|
import { resolveFramework, resolvePreset } from "./resolvers.js";
|
|
35
37
|
import { buildTailwindSettingsConfig } from "./tailwind.js";
|
|
38
|
+
const SCRIPT_FILE_GLOBS = ["**/scripts/**/*.{js,mjs,cjs,ts,mts,cts}"];
|
|
39
|
+
const getCliEntryFiles = (rootDir) => {
|
|
40
|
+
const manifestPath = join(rootDir, "package.json");
|
|
41
|
+
if (!existsSync(manifestPath)) return SCRIPT_FILE_GLOBS;
|
|
42
|
+
try {
|
|
43
|
+
const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
44
|
+
const binFiles = typeof manifest.bin === "string" ? [manifest.bin] : Object.values(manifest.bin ?? {});
|
|
45
|
+
return [.../* @__PURE__ */ new Set([
|
|
46
|
+
...SCRIPT_FILE_GLOBS,
|
|
47
|
+
...binFiles.map((file) => file.replace(/^\.\//, ""))
|
|
48
|
+
])];
|
|
49
|
+
} catch {
|
|
50
|
+
return SCRIPT_FILE_GLOBS;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
36
53
|
import {
|
|
37
54
|
angular,
|
|
38
55
|
astro,
|
|
@@ -85,8 +102,8 @@ const resolveTailwindOptions = (rootDir, tailwind) => {
|
|
|
85
102
|
if (tailwind === false) return void 0;
|
|
86
103
|
const options = tailwind ?? {};
|
|
87
104
|
const entryPoint = options.entryPoint ?? findTailwindEntryPoint(rootDir);
|
|
88
|
-
|
|
89
|
-
return buildTailwindResult(
|
|
105
|
+
const resolvedOptions = !entryPoint && options.noUnknownClasses === void 0 ? { ...options, noUnknownClasses: false } : options;
|
|
106
|
+
return buildTailwindResult(resolvedOptions, entryPoint, rootDir);
|
|
90
107
|
};
|
|
91
108
|
const TESTING_CONFIG_NAMES = {
|
|
92
109
|
[Testing.Cypress]: ["integrations/cypress"],
|
|
@@ -224,7 +241,8 @@ const FRAMEWORK_EXTRA_OPTS = {
|
|
|
224
241
|
hasSolid: ctx.hasSolid,
|
|
225
242
|
hasSvelte: ctx.hasSvelte,
|
|
226
243
|
hasVue: ctx.hasVue,
|
|
227
|
-
tsconfigRootDir: ctx.tsconfigRootDir
|
|
244
|
+
tsconfigRootDir: ctx.tsconfigRootDir,
|
|
245
|
+
typeChecked: ctx.typeChecked
|
|
228
246
|
}),
|
|
229
247
|
hono: (ctx) => ({ runtime: ctx.runtime }),
|
|
230
248
|
slidev: (ctx) => ({ runtime: ctx.runtime }),
|
|
@@ -232,10 +250,7 @@ const FRAMEWORK_EXTRA_OPTS = {
|
|
|
232
250
|
};
|
|
233
251
|
const resolveEnabledFrameworks = async (frameworks, ctx) => {
|
|
234
252
|
const entries = await Promise.all(
|
|
235
|
-
Object.entries(frameworks).filter((entry) => Boolean(entry[1])).map(([name, value]) => (
|
|
236
|
-
// eslint-disable-next-line security/detect-object-injection
|
|
237
|
-
resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx)).then((config) => [name, config])
|
|
238
|
-
))
|
|
253
|
+
Object.entries(frameworks).filter((entry) => Boolean(entry[1])).map(([name, value]) => resolveFramework(name, value, FRAMEWORK_EXTRA_OPTS[name]?.(ctx)).then((config) => [name, config]))
|
|
239
254
|
);
|
|
240
255
|
return Object.fromEntries(entries);
|
|
241
256
|
};
|
|
@@ -247,7 +262,7 @@ const buildEslintConfigs = async (params) => {
|
|
|
247
262
|
nextMode,
|
|
248
263
|
resolvedFrameworks,
|
|
249
264
|
resolvedTypescript,
|
|
250
|
-
rootDir
|
|
265
|
+
rootDir,
|
|
251
266
|
runtime,
|
|
252
267
|
runtimeCoreConfig,
|
|
253
268
|
tailwindOptions,
|
|
@@ -260,12 +275,22 @@ const buildEslintConfigs = async (params) => {
|
|
|
260
275
|
uniqueTools,
|
|
261
276
|
userIgnores
|
|
262
277
|
} = params;
|
|
263
|
-
const { hasReact, hasSolid, hasSvelte, hasVue } = astroOptions;
|
|
278
|
+
const { hasReact, hasSolid, hasSvelte, hasVue, typeChecked } = astroOptions;
|
|
264
279
|
const fw = await resolveEnabledFrameworks(
|
|
265
280
|
resolvedFrameworks,
|
|
266
|
-
{ hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir }
|
|
281
|
+
{ hasReact, hasSolid, hasSvelte, hasVue, runtime, tsconfigRootDir, typeChecked }
|
|
267
282
|
);
|
|
268
283
|
const get = (name) => fw[name] ?? [];
|
|
284
|
+
const typescriptConfigs = resolvedTypescript ? createTypescriptConfig({
|
|
285
|
+
...resolvedTypescript,
|
|
286
|
+
tsconfigRootDir: resolvedTypescript.tsconfigRootDir ?? tsconfigRootDir
|
|
287
|
+
}) : [];
|
|
288
|
+
const untypedTypescriptConfigs = typescriptConfigs.filter(
|
|
289
|
+
(config) => config.name === "eslint-config-typescript/untyped-files"
|
|
290
|
+
);
|
|
291
|
+
const typedTypescriptConfigs = typescriptConfigs.filter(
|
|
292
|
+
(config) => config.name !== "eslint-config-typescript/untyped-files"
|
|
293
|
+
);
|
|
269
294
|
return [
|
|
270
295
|
...defaultIgnores,
|
|
271
296
|
...userIgnores,
|
|
@@ -306,10 +331,7 @@ const buildEslintConfigs = async (params) => {
|
|
|
306
331
|
...get("lit"),
|
|
307
332
|
...get("slidev"),
|
|
308
333
|
...get("vite"),
|
|
309
|
-
...
|
|
310
|
-
...resolvedTypescript,
|
|
311
|
-
tsconfigRootDir: resolvedTypescript.tsconfigRootDir ?? tsconfigRootDir
|
|
312
|
-
}) : [],
|
|
334
|
+
...typedTypescriptConfigs,
|
|
313
335
|
...get("astro"),
|
|
314
336
|
...resolvedFrameworks.next && nextMode === NextMode.AppRouter ? [{
|
|
315
337
|
files: ["app/**/*.{ts,tsx}", "src/**/*.{ts,tsx}"],
|
|
@@ -317,18 +339,45 @@ const buildEslintConfigs = async (params) => {
|
|
|
317
339
|
rules: { "@next/next/no-html-link-for-pages": "off" }
|
|
318
340
|
}] : [],
|
|
319
341
|
...applyTestingFileOverrides(
|
|
320
|
-
await getIntegrationConfigs(
|
|
342
|
+
await getIntegrationConfigs(
|
|
343
|
+
uniqueLibraries,
|
|
344
|
+
uniqueTools,
|
|
345
|
+
uniqueTesting,
|
|
346
|
+
uniqueFormats,
|
|
347
|
+
uniqueExtensions
|
|
348
|
+
),
|
|
321
349
|
testingFiles
|
|
322
350
|
),
|
|
351
|
+
...resolvedFrameworks.next ? [{
|
|
352
|
+
files: ["next-env.d.ts"],
|
|
353
|
+
name: "eslint-config-next/generated-declaration",
|
|
354
|
+
rules: {
|
|
355
|
+
"@stylistic/quotes": "off",
|
|
356
|
+
"@stylistic/semi": "off"
|
|
357
|
+
}
|
|
358
|
+
}] : [],
|
|
323
359
|
{
|
|
324
|
-
files: [
|
|
360
|
+
files: [
|
|
361
|
+
"**/*.{test,spec}.{js,mjs,cjs,jsx,ts,mts,cts,tsx}",
|
|
362
|
+
"**/{test,tests,__tests__}/**/*.{js,mjs,cjs,jsx,ts,mts,cts,tsx}"
|
|
363
|
+
],
|
|
364
|
+
name: "eslint-config-basic/test-file-overrides",
|
|
365
|
+
rules: {
|
|
366
|
+
"@typescript-eslint/no-empty-function": "off",
|
|
367
|
+
"no-use-before-define": "off"
|
|
368
|
+
}
|
|
369
|
+
},
|
|
370
|
+
{
|
|
371
|
+
files: getCliEntryFiles(rootDir),
|
|
325
372
|
name: "eslint-config-basic/scripts-overrides",
|
|
326
373
|
rules: {
|
|
327
374
|
"n/no-unpublished-import": "off",
|
|
328
|
-
|
|
375
|
+
"n/no-process-exit": "off",
|
|
376
|
+
"no-console": "off"
|
|
329
377
|
}
|
|
330
378
|
},
|
|
331
379
|
...tailwindOptions ? [buildTailwindSettingsConfig(tailwindOptions)] : [],
|
|
380
|
+
...untypedTypescriptConfigs,
|
|
332
381
|
...await getPrettierConfig(uniqueTools)
|
|
333
382
|
];
|
|
334
383
|
};
|
|
@@ -373,11 +422,11 @@ const emitAstroDoctorWarning = (extensions, frameworks) => {
|
|
|
373
422
|
"[eslint-config-basic] Warning: Astro Doctor is enabled without the Astro framework config. Enable `frameworks: { astro: true }` or remove the `astro-doctor` feature."
|
|
374
423
|
);
|
|
375
424
|
};
|
|
376
|
-
const resolveProjectConfigs = async (configuredProjects, projectDefaults, detectRootDir, autoFrameworks) => Promise.all(
|
|
425
|
+
const resolveProjectConfigs = async (configuredProjects, projectDefaults, detectRootDir, autoFrameworks, composeConfig) => Promise.all(
|
|
377
426
|
Object.entries(configuredProjects).map(async ([projectPath, projectOptions]) => {
|
|
378
427
|
const projectRoot = join(detectRootDir ?? process.cwd(), projectPath);
|
|
379
428
|
const inheritedOptions = mergeProjectOptions(projectDefaults ?? {}, projectOptions);
|
|
380
|
-
const scopedConfigs = await
|
|
429
|
+
const scopedConfigs = await composeConfig({
|
|
381
430
|
autoFrameworks,
|
|
382
431
|
...inheritedOptions,
|
|
383
432
|
projectDefaults: void 0,
|
|
@@ -387,6 +436,53 @@ const resolveProjectConfigs = async (configuredProjects, projectDefaults, detect
|
|
|
387
436
|
return scopedConfigs.map((config) => config.name === "eslint-config/gitignore" ? config : scopeConfigToProject(config, projectPath));
|
|
388
437
|
})
|
|
389
438
|
);
|
|
439
|
+
const resolveInheritedProjectDefaults = (options) => mergeProjectOptions(
|
|
440
|
+
{
|
|
441
|
+
...options?.detection === void 0 ? {} : { detection: options.detection },
|
|
442
|
+
...options?.tailwind === void 0 ? {} : { tailwind: options.tailwind },
|
|
443
|
+
...typeof options?.typescript === "object" && options.typescript.untypedFiles !== void 0 ? { typescript: { untypedFiles: options.typescript.untypedFiles } } : {}
|
|
444
|
+
},
|
|
445
|
+
options?.projectDefaults ?? {}
|
|
446
|
+
);
|
|
447
|
+
const getPluginNameFromRule = (ruleName, availablePluginNames) => {
|
|
448
|
+
const segments = ruleName.split("/");
|
|
449
|
+
if (segments.length < 2) return void 0;
|
|
450
|
+
const registeredPrefix = [...availablePluginNames].filter((pluginName) => ruleName.startsWith(`${pluginName}/`)).sort((left, right) => right.length - left.length)[0];
|
|
451
|
+
if (registeredPrefix) return registeredPrefix;
|
|
452
|
+
return ruleName.startsWith("@") && segments.length > 2 ? segments.slice(0, 2).join("/") : segments[0];
|
|
453
|
+
};
|
|
454
|
+
const attachReferencedPlugins = (configs) => {
|
|
455
|
+
const availablePlugins = /* @__PURE__ */ new Map();
|
|
456
|
+
const ambiguousPluginNames = /* @__PURE__ */ new Set();
|
|
457
|
+
for (const config of configs) {
|
|
458
|
+
for (const [pluginName, plugin] of Object.entries(config.plugins ?? {})) {
|
|
459
|
+
const existingPlugin = availablePlugins.get(pluginName);
|
|
460
|
+
if (existingPlugin && existingPlugin !== plugin) {
|
|
461
|
+
availablePlugins.delete(pluginName);
|
|
462
|
+
ambiguousPluginNames.add(pluginName);
|
|
463
|
+
} else if (!ambiguousPluginNames.has(pluginName)) {
|
|
464
|
+
availablePlugins.set(pluginName, plugin);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
return configs.map((config) => {
|
|
469
|
+
const requiredPlugins = new Set(
|
|
470
|
+
Object.keys(config.rules ?? {}).map((ruleName) => getPluginNameFromRule(ruleName, availablePlugins.keys())).filter((pluginName) => pluginName !== void 0)
|
|
471
|
+
);
|
|
472
|
+
const missingPluginEntries = [...requiredPlugins].flatMap((pluginName) => {
|
|
473
|
+
const plugin = availablePlugins.get(pluginName);
|
|
474
|
+
return !Object.hasOwn(config.plugins ?? {}, pluginName) && plugin ? [[pluginName, plugin]] : [];
|
|
475
|
+
});
|
|
476
|
+
if (missingPluginEntries.length === 0) return config;
|
|
477
|
+
return {
|
|
478
|
+
...config,
|
|
479
|
+
plugins: {
|
|
480
|
+
...config.plugins,
|
|
481
|
+
...Object.fromEntries(missingPluginEntries)
|
|
482
|
+
}
|
|
483
|
+
};
|
|
484
|
+
});
|
|
485
|
+
};
|
|
390
486
|
const getConfigsParams = (options, rootDir, runtime, uniqueLibraries, uniqueSettings, resolvedFrameworks) => {
|
|
391
487
|
const hasReact = !!resolvedFrameworks.react;
|
|
392
488
|
const hasVue = !!resolvedFrameworks.vue;
|
|
@@ -413,7 +509,7 @@ const getConfigsParams = (options, rootDir, runtime, uniqueLibraries, uniqueSett
|
|
|
413
509
|
userIgnores
|
|
414
510
|
};
|
|
415
511
|
};
|
|
416
|
-
const defineConfig = async (options, ...extraConfigs)
|
|
512
|
+
const defineConfig = async function defineConfig2(options, ...extraConfigs) {
|
|
417
513
|
const {
|
|
418
514
|
detection,
|
|
419
515
|
extensions: optExtensions,
|
|
@@ -430,7 +526,13 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
430
526
|
const detected = resolveDetectedOptions(detectRootDir, detection, requestedPreset);
|
|
431
527
|
const { frameworkDefaults, preset, presetDefaults } = resolvePresetMeta(requestedPreset, detected, autoFrameworks);
|
|
432
528
|
const configuredProjects = resolveConfiguredProjects(detected, options);
|
|
433
|
-
const {
|
|
529
|
+
const {
|
|
530
|
+
detectedExtensions,
|
|
531
|
+
detectedFormats,
|
|
532
|
+
detectedLibraries,
|
|
533
|
+
detectedTesting,
|
|
534
|
+
detectedTools
|
|
535
|
+
} = resolveBucketDefaults(detected);
|
|
434
536
|
const configuredExtensions = mergeOptionalBucket(
|
|
435
537
|
"extensions",
|
|
436
538
|
detectedExtensions,
|
|
@@ -447,7 +549,12 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
447
549
|
options,
|
|
448
550
|
optionMergeStrategy
|
|
449
551
|
);
|
|
450
|
-
const frameworks = mergeFrameworkOption(
|
|
552
|
+
const frameworks = mergeFrameworkOption(
|
|
553
|
+
frameworkDefaults,
|
|
554
|
+
presetDefaults.frameworks,
|
|
555
|
+
optFrameworks,
|
|
556
|
+
optionMergeStrategy
|
|
557
|
+
);
|
|
451
558
|
const libraries = mergeOptionalBucket(
|
|
452
559
|
"libraries",
|
|
453
560
|
detectedLibraries,
|
|
@@ -491,7 +598,10 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
491
598
|
emitAstroDoctorWarning(uniqueExtensions, resolvedFrameworks);
|
|
492
599
|
const params = getConfigsParams(options, rootDir, runtime, uniqueLibraries, uniqueSettings, resolvedFrameworks);
|
|
493
600
|
const configs = await buildEslintConfigs({
|
|
494
|
-
astroOptions:
|
|
601
|
+
astroOptions: {
|
|
602
|
+
...params.astroOptions,
|
|
603
|
+
typeChecked: resolvedTypescript ? resolvedTypescript.mode !== "syntax" : false
|
|
604
|
+
},
|
|
495
605
|
defaultIgnores: params.defaultIgnores,
|
|
496
606
|
gitignoreConfig: params.gitignoreConfig,
|
|
497
607
|
nextMode,
|
|
@@ -528,13 +638,19 @@ const defineConfig = async (options, ...extraConfigs) => {
|
|
|
528
638
|
});
|
|
529
639
|
const projectConfigs = await resolveProjectConfigs(
|
|
530
640
|
configuredProjects,
|
|
531
|
-
options
|
|
641
|
+
resolveInheritedProjectDefaults(options),
|
|
532
642
|
detectRootDir,
|
|
533
|
-
options?.autoFrameworks
|
|
643
|
+
options?.autoFrameworks,
|
|
644
|
+
defineConfig2
|
|
534
645
|
);
|
|
535
|
-
const allConfigs = [
|
|
646
|
+
const allConfigs = [
|
|
647
|
+
...configs,
|
|
648
|
+
...projectConfigs.flat(),
|
|
649
|
+
...flattenConfigInputs(extraConfigs)
|
|
650
|
+
];
|
|
536
651
|
const patchedConfigs = workspacePrefixes?.length ? patchImportGroups(allConfigs, workspacePrefixes) : allConfigs;
|
|
537
|
-
|
|
652
|
+
const finalConfig = attachReferencedPlugins(applyStrictMode(patchedConfigs, strict));
|
|
653
|
+
return attachDefineConfigMetadata(finalConfig, { extraConfigs, options });
|
|
538
654
|
};
|
|
539
655
|
export {
|
|
540
656
|
Extension2 as Extension,
|
|
@@ -549,6 +665,7 @@ export {
|
|
|
549
665
|
Tool,
|
|
550
666
|
angular,
|
|
551
667
|
astro,
|
|
668
|
+
attachReferencedPlugins,
|
|
552
669
|
coreConfig2 as coreConfig,
|
|
553
670
|
createCoreConfig2 as createCoreConfig,
|
|
554
671
|
createGitignoreConfig2 as createGitignoreConfig,
|
|
@@ -576,3 +693,4 @@ export {
|
|
|
576
693
|
vite,
|
|
577
694
|
vue
|
|
578
695
|
};
|
|
696
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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":"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","names":["coreConfig","createCoreConfig","createGitignoreConfig","detectProjectOptions","Extension","Library","NextMode","Preset","Runtime","Setting","Testing","defineConfig"]}
|
package/dist/integrations.js
CHANGED
|
@@ -2,6 +2,7 @@ import {
|
|
|
2
2
|
createModuleLoader,
|
|
3
3
|
resolveConfigFeatures
|
|
4
4
|
} from "@santi020k/eslint-config-core";
|
|
5
|
+
import { isMissingRequestedPackage } from "./optional-package-errors.js";
|
|
5
6
|
const loadModule = createModuleLoader((specifier) => import.meta.resolve(specifier, import.meta.url));
|
|
6
7
|
const packCache = /* @__PURE__ */ new Map();
|
|
7
8
|
const loadFeaturePack = async (specifier) => {
|
|
@@ -18,8 +19,9 @@ const loadFeaturePack = async (specifier) => {
|
|
|
18
19
|
return module.features;
|
|
19
20
|
} catch (error) {
|
|
20
21
|
packCache.delete(specifier);
|
|
22
|
+
const remediation = isMissingRequestedPackage(error, specifier) ? "Install it for the selected options, or remove those options from defineConfig()." : "The installed feature pack failed while evaluating. Inspect this error's cause for the original dependency or runtime failure.";
|
|
21
23
|
throw new Error(
|
|
22
|
-
`Unable to load optional feature pack "${specifier}".
|
|
24
|
+
`Unable to load optional feature pack "${specifier}". ` + remediation,
|
|
23
25
|
{ cause: error }
|
|
24
26
|
);
|
|
25
27
|
}
|
|
@@ -46,3 +48,4 @@ export {
|
|
|
46
48
|
getIntegrationConfigs,
|
|
47
49
|
getPrettierConfig
|
|
48
50
|
};
|
|
51
|
+
//# sourceMappingURL=integrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/integrations.ts"],"sourcesContent":["import {\n type ConfigFeature,\n createModuleLoader,\n type Extension,\n type FlatConfigArray,\n type Format,\n type Library,\n resolveConfigFeatures,\n type Testing,\n type Tool\n} from '@santi020k/eslint-config-core'\n\nimport { isMissingRequestedPackage } from './optional-package-errors.js'\n\nconst loadModule = createModuleLoader(specifier => import.meta.resolve(specifier, import.meta.url))\n\ninterface FeaturePack {\n features?: ConfigFeature[]\n}\n\nconst packCache = new Map<string, Promise<FeaturePack>>()\n\nconst loadFeaturePack = async (specifier: string): Promise<ConfigFeature[]> => {\n let pending = packCache.get(specifier)\n\n if (!pending) {\n pending = loadModule<FeaturePack>(specifier)\n\n packCache.set(specifier, pending)\n }\n\n try {\n const module = await pending\n\n if (!module.features) {\n throw new Error(`Installed package \"${specifier}\" does not export a feature registry.`)\n }\n\n return module.features\n } catch (error) {\n packCache.delete(specifier)\n\n const remediation = isMissingRequestedPackage(error, specifier) ?\n 'Install it for the selected options, or remove those options from defineConfig().' :\n 'The installed feature pack failed while evaluating. Inspect this error\\'s cause for the original dependency or runtime failure.'\n\n throw new Error(\n `Unable to load optional feature pack \"${specifier}\". ` +\n remediation,\n { cause: error }\n )\n }\n}\n\nconst loadSelectedPacks = async (\n libraries: Library[],\n tools: Tool[],\n testing: Testing[],\n formats: Format[],\n extensions: Extension[]\n): Promise<ConfigFeature[]> => (\n await Promise.all([\n extensions.length > 0 ? loadFeaturePack('@santi020k/eslint-config-extensions/registry') : [],\n formats.length > 0 ? loadFeaturePack('@santi020k/eslint-config-formats/registry') : [],\n libraries.length > 0 ? loadFeaturePack('@santi020k/eslint-config-libraries/registry') : [],\n testing.length > 0 ? loadFeaturePack('@santi020k/eslint-config-testing/registry') : [],\n tools.length > 0 ? loadFeaturePack('@santi020k/eslint-config-tools/registry') : []\n ])\n).flat()\n\nexport const getIntegrationConfigs = async (\n libraries: Library[],\n tools: Tool[],\n testing: Testing[],\n formats: Format[],\n extensions: Extension[]\n): Promise<FlatConfigArray> => {\n const selected = [...libraries, ...tools, ...testing, ...formats, ...extensions]\n\n if (selected.length === 0) return []\n\n const features = await loadSelectedPacks(libraries, tools, testing, formats, extensions)\n\n return resolveConfigFeatures(features, selected)\n}\n\nexport const getPrettierConfig = async (tools: Tool[]): Promise<FlatConfigArray> => {\n if (tools.length === 0) return []\n\n const features = await loadFeaturePack('@santi020k/eslint-config-tools/registry')\n\n return resolveConfigFeatures(features, tools, 'finalizer')\n}\n"],"mappings":"AAAA;AAAA,EAEE;AAAA,EAKA;AAAA,OAGK;AAEP,SAAS,iCAAiC;AAE1C,MAAM,aAAa,mBAAmB,eAAa,YAAY,QAAQ,WAAW,YAAY,GAAG,CAAC;AAMlG,MAAM,YAAY,oBAAI,IAAkC;AAExD,MAAM,kBAAkB,OAAO,cAAgD;AAC7E,MAAI,UAAU,UAAU,IAAI,SAAS;AAErC,MAAI,CAAC,SAAS;AACZ,cAAU,WAAwB,SAAS;AAE3C,cAAU,IAAI,WAAW,OAAO;AAAA,EAClC;AAEA,MAAI;AACF,UAAM,SAAS,MAAM;AAErB,QAAI,CAAC,OAAO,UAAU;AACpB,YAAM,IAAI,MAAM,sBAAsB,SAAS,uCAAuC;AAAA,IACxF;AAEA,WAAO,OAAO;AAAA,EAChB,SAAS,OAAO;AACd,cAAU,OAAO,SAAS;AAE1B,UAAM,cAAc,0BAA0B,OAAO,SAAS,IAC5D,sFACA;AAEF,UAAM,IAAI;AAAA,MACR,yCAAyC,SAAS,QAClD;AAAA,MACA,EAAE,OAAO,MAAM;AAAA,IACjB;AAAA,EACF;AACF;AAEA,MAAM,oBAAoB,OACxB,WACA,OACA,SACA,SACA,gBAEA,MAAM,QAAQ,IAAI;AAAA,EAChB,WAAW,SAAS,IAAI,gBAAgB,8CAA8C,IAAI,CAAC;AAAA,EAC3F,QAAQ,SAAS,IAAI,gBAAgB,2CAA2C,IAAI,CAAC;AAAA,EACrF,UAAU,SAAS,IAAI,gBAAgB,6CAA6C,IAAI,CAAC;AAAA,EACzF,QAAQ,SAAS,IAAI,gBAAgB,2CAA2C,IAAI,CAAC;AAAA,EACrF,MAAM,SAAS,IAAI,gBAAgB,yCAAyC,IAAI,CAAC;AACnF,CAAC,GACD,KAAK;AAEA,MAAM,wBAAwB,OACnC,WACA,OACA,SACA,SACA,eAC6B;AAC7B,QAAM,WAAW,CAAC,GAAG,WAAW,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,GAAG,UAAU;AAE/E,MAAI,SAAS,WAAW,EAAG,QAAO,CAAC;AAEnC,QAAM,WAAW,MAAM,kBAAkB,WAAW,OAAO,SAAS,SAAS,UAAU;AAEvF,SAAO,sBAAsB,UAAU,QAAQ;AACjD;AAEO,MAAM,oBAAoB,OAAO,UAA4C;AAClF,MAAI,MAAM,WAAW,EAAG,QAAO,CAAC;AAEhC,QAAM,WAAW,MAAM,gBAAgB,yCAAyC;AAEhF,SAAO,sBAAsB,UAAU,OAAO,WAAW;AAC3D;","names":[]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
const getPackageRoot = (specifier) => {
|
|
2
|
+
const segments = specifier.split("/");
|
|
3
|
+
return specifier.startsWith("@") ? segments.slice(0, 2).join("/") : segments[0];
|
|
4
|
+
};
|
|
5
|
+
const isMissingRequestedPackage = (error, specifier) => {
|
|
6
|
+
if (!(error instanceof Error)) return false;
|
|
7
|
+
const code = "code" in error ? String(error.code) : "";
|
|
8
|
+
if (code !== "ERR_MODULE_NOT_FOUND" && code !== "MODULE_NOT_FOUND") return false;
|
|
9
|
+
const missingSpecifier = /Cannot find (?:module|package) ['"]([^'"]+)['"]/.exec(error.message)?.[1];
|
|
10
|
+
return missingSpecifier !== void 0 && getPackageRoot(missingSpecifier) === getPackageRoot(specifier);
|
|
11
|
+
};
|
|
12
|
+
export {
|
|
13
|
+
isMissingRequestedPackage
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=optional-package-errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/optional-package-errors.ts"],"sourcesContent":["const getPackageRoot = (specifier: string): string => {\n const segments = specifier.split('/')\n\n return specifier.startsWith('@') ? segments.slice(0, 2).join('/') : segments[0]\n}\n\nexport const isMissingRequestedPackage = (error: unknown, specifier: string): boolean => {\n if (!(error instanceof Error)) return false\n\n const code = 'code' in error ? String(error.code) : ''\n\n if (code !== 'ERR_MODULE_NOT_FOUND' && code !== 'MODULE_NOT_FOUND') return false\n\n const missingSpecifier = /Cannot find (?:module|package) ['\"]([^'\"]+)['\"]/.exec(error.message)?.[1]\n\n return missingSpecifier !== undefined && getPackageRoot(missingSpecifier) === getPackageRoot(specifier)\n}\n"],"mappings":"AAAA,MAAM,iBAAiB,CAAC,cAA8B;AACpD,QAAM,WAAW,UAAU,MAAM,GAAG;AAEpC,SAAO,UAAU,WAAW,GAAG,IAAI,SAAS,MAAM,GAAG,CAAC,EAAE,KAAK,GAAG,IAAI,SAAS,CAAC;AAChF;AAEO,MAAM,4BAA4B,CAAC,OAAgB,cAA+B;AACvF,MAAI,EAAE,iBAAiB,OAAQ,QAAO;AAEtC,QAAM,OAAO,UAAU,QAAQ,OAAO,MAAM,IAAI,IAAI;AAEpD,MAAI,SAAS,0BAA0B,SAAS,mBAAoB,QAAO;AAE3E,QAAM,mBAAmB,kDAAkD,KAAK,MAAM,OAAO,IAAI,CAAC;AAElG,SAAO,qBAAqB,UAAa,eAAe,gBAAgB,MAAM,eAAe,SAAS;AACxG;","names":[]}
|
package/dist/recommended.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/recommended.ts"],"sourcesContent":["import { defineConfig } from './index.js'\n\nexport default await defineConfig()\n"],"mappings":"AAAA,SAAS,oBAAoB;AAE7B,IAAO,sBAAQ,MAAM,aAAa;","names":[]}
|
package/dist/resolvers.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/resolvers.ts"],"sourcesContent":["import {\n type DetectedFrameworkName,\n type EslintConfigOptions,\n Extension,\n type FlatConfigArray,\n Format,\n type ImportedFramework,\n Library,\n Preset,\n Runtime,\n Testing,\n Tool\n} from '@santi020k/eslint-config-core'\n\nimport { type FrameworkOptions, getBundledFrameworkConfig } from './frameworks.js'\n\n/**\n * Resolves an imported framework (either array, object with default, or factory function) into a config array.\n * Bundled configs (`true`) and async factories are loaded lazily, so framework\n * packages are only imported when actually enabled.\n */\nexport const resolveFramework = async (\n frameworkName: DetectedFrameworkName,\n framework?: ImportedFramework,\n options?: FrameworkOptions\n): Promise<FlatConfigArray> => {\n if (!framework) return []\n\n if (framework === true) {\n return getBundledFrameworkConfig(frameworkName, options)\n }\n\n // Handle factory functions directly (sync or async)\n if (typeof framework === 'function') {\n return (framework)(options)\n }\n\n // Handle modules with default exports\n if (typeof framework === 'object' && 'default' in framework) {\n if (typeof framework.default === 'function') {\n return (framework.default)(options)\n }\n\n if (Array.isArray(framework.default)) return framework.default\n }\n\n // Handle config arrays directly\n if (Array.isArray(framework)) return framework\n\n throw new TypeError(\n `[ESLint Basic] Invalid framework config for \"${frameworkName}\". ` +\n 'Use true to enable the bundled config, or pass a config array/factory/default export.'\n )\n}\n\n/**\n * Resolves a preset into options\n */\nexport const resolvePreset = (preset: Preset): Partial<EslintConfigOptions> => {\n switch (preset) {\n case Preset.All:\n return {\n extensions: Object.values(Extension),\n formats: Object.values(Format),\n libraries: Object.values(Library),\n runtime: Runtime.Universal,\n testing: Object.values(Testing),\n tools: Object.values(Tool),\n typescript: true\n }\n\n case Preset.App:\n return {\n runtime: Runtime.Browser,\n testing: [Testing.Vitest],\n tools: [Tool.Prettier],\n typescript: true\n }\n\n case Preset.Basic:\n return { runtime: Runtime.Universal }\n\n case Preset.Browser:\n return {\n runtime: Runtime.Browser,\n typescript: true\n }\n\n case Preset.CI:\n return {\n extensions: [Extension.BestPractices],\n runtime: Runtime.Universal,\n strict: 'ci',\n tools: [Tool.Prettier],\n typescript: true\n }\n\n case Preset.Library:\n return {\n extensions: [Extension.BestPractices],\n runtime: Runtime.Node,\n tools: [Tool.Prettier],\n typescript: true\n }\n\n case Preset.Monorepo:\n return {\n extensions: [Extension.BestPractices],\n runtime: Runtime.Universal,\n tools: [Tool.Prettier],\n typescript: true\n }\n\n case Preset.Node:\n return {\n runtime: Runtime.Node,\n typescript: true\n }\n\n case Preset.Worker:\n return {\n runtime: Runtime.Worker,\n typescript: true\n }\n\n // v8 ignore next 2 -- TypeScript exhausts all Preset values; default is unreachable\n default:\n return {}\n }\n}\n"],"mappings":"AAAA;AAAA,EAGE;AAAA,EAEA;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAEP,SAAgC,iCAAiC;AAO1D,MAAM,mBAAmB,OAC9B,eACA,WACA,YAC6B;AAC7B,MAAI,CAAC,UAAW,QAAO,CAAC;AAExB,MAAI,cAAc,MAAM;AACtB,WAAO,0BAA0B,eAAe,OAAO;AAAA,EACzD;AAGA,MAAI,OAAO,cAAc,YAAY;AACnC,WAAQ,UAAW,OAAO;AAAA,EAC5B;AAGA,MAAI,OAAO,cAAc,YAAY,aAAa,WAAW;AAC3D,QAAI,OAAO,UAAU,YAAY,YAAY;AAC3C,aAAQ,UAAU,QAAS,OAAO;AAAA,IACpC;AAEA,QAAI,MAAM,QAAQ,UAAU,OAAO,EAAG,QAAO,UAAU;AAAA,EACzD;AAGA,MAAI,MAAM,QAAQ,SAAS,EAAG,QAAO;AAErC,QAAM,IAAI;AAAA,IACR,gDAAgD,aAAa;AAAA,EAE/D;AACF;AAKO,MAAM,gBAAgB,CAAC,WAAiD;AAC7E,UAAQ,QAAQ;AAAA,IACd,KAAK,OAAO;AACV,aAAO;AAAA,QACL,YAAY,OAAO,OAAO,SAAS;AAAA,QACnC,SAAS,OAAO,OAAO,MAAM;AAAA,QAC7B,WAAW,OAAO,OAAO,OAAO;AAAA,QAChC,SAAS,QAAQ;AAAA,QACjB,SAAS,OAAO,OAAO,OAAO;AAAA,QAC9B,OAAO,OAAO,OAAO,IAAI;AAAA,QACzB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,SAAS,CAAC,QAAQ,MAAM;AAAA,QACxB,OAAO,CAAC,KAAK,QAAQ;AAAA,QACrB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO,EAAE,SAAS,QAAQ,UAAU;AAAA,IAEtC,KAAK,OAAO;AACV,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,YAAY,CAAC,UAAU,aAAa;AAAA,QACpC,SAAS,QAAQ;AAAA,QACjB,QAAQ;AAAA,QACR,OAAO,CAAC,KAAK,QAAQ;AAAA,QACrB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,YAAY,CAAC,UAAU,aAAa;AAAA,QACpC,SAAS,QAAQ;AAAA,QACjB,OAAO,CAAC,KAAK,QAAQ;AAAA,QACrB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,YAAY,CAAC,UAAU,aAAa;AAAA,QACpC,SAAS,QAAQ;AAAA,QACjB,OAAO,CAAC,KAAK,QAAQ;AAAA,QACrB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IAEF,KAAK,OAAO;AACV,aAAO;AAAA,QACL,SAAS,QAAQ;AAAA,QACjB,YAAY;AAAA,MACd;AAAA;AAAA,IAGF;AACE,aAAO,CAAC;AAAA,EACZ;AACF;","names":[]}
|
package/dist/tailwind.d.ts
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { TailwindOptions } from '@santi020k/eslint-config-core';
|
|
2
2
|
import { TSESLint } from '@typescript-eslint/utils';
|
|
3
3
|
|
|
4
|
+
declare const findCssComponentClasses: (cwd: string, entryPoint: string) => string[];
|
|
5
|
+
declare const findCssComponentClassPatterns: (cwd: string, entryPoint: string) => string[];
|
|
4
6
|
declare const buildTailwindSettingsConfig: (tailwindOptions: TailwindOptions) => TSESLint.FlatConfig.Config;
|
|
5
7
|
|
|
6
|
-
export { buildTailwindSettingsConfig };
|
|
8
|
+
export { buildTailwindSettingsConfig, findCssComponentClassPatterns, findCssComponentClasses };
|