@infernodesign/eslint-config 2.4.0 → 2.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/dist/index.js CHANGED
@@ -3,7 +3,7 @@ import { FlatConfigComposer } from "eslint-flat-config-utils";
3
3
  import process$1 from "node:process";
4
4
  import fs from "node:fs/promises";
5
5
  import { fileURLToPath } from "node:url";
6
- import fs$1, { existsSync, readdirSync, statSync } from "node:fs";
6
+ import fs$1, { existsSync, readFileSync, readdirSync, statSync } from "node:fs";
7
7
  import path from "node:path";
8
8
  import { isPackageExists } from "local-pkg";
9
9
  import createCommand from "eslint-plugin-command/config";
@@ -105,6 +105,9 @@ const GLOB_EXCLUDE = [
105
105
  "**/.agents",
106
106
  "**/.antigravity",
107
107
  "**/.bmad",
108
+ "**/.bmad-*",
109
+ "**/_bmad",
110
+ "**/_bmad-*",
108
111
  "**/.context",
109
112
  "**/.codex",
110
113
  "**/.claude",
@@ -112,10 +115,12 @@ const GLOB_EXCLUDE = [
112
115
  "**/.windsurf",
113
116
  "**/.*/skills",
114
117
  "**/AGENTS.md",
118
+ "**/CLAUDE.md",
115
119
  "**/.idea",
116
120
  "**/.vscode",
117
121
  "**/.zed",
118
122
  "**/__snapshots__",
123
+ "**/badges",
119
124
  "**/coverage",
120
125
  "**/.cache",
121
126
  "**/.eslintcache",
@@ -157,10 +162,14 @@ const GLOB_EXCLUDE = [
157
162
  ];
158
163
  const GLOB_SEARCH_EXCLUDE = new Set([
159
164
  "__snapshots__",
165
+ "_bmad",
166
+ "_bmad-*",
160
167
  ".bmad",
168
+ ".bmad-*",
161
169
  ".cache",
162
170
  ".changeset",
163
171
  ".claude",
172
+ ".codex",
164
173
  ".cursor",
165
174
  ".eslintcache",
166
175
  ".git",
@@ -1796,7 +1805,6 @@ async function react(options = {}) {
1796
1805
  name: "config/react/rules",
1797
1806
  rules: {
1798
1807
  ...pluginReact.configs.recommended.rules,
1799
- "react/prefer-namespace-import": "error",
1800
1808
  "react-refresh/only-export-components": ["error", {
1801
1809
  allowConstantExport: isAllowConstantExport,
1802
1810
  allowExportNames: [...isUsingNext ? [
@@ -2288,25 +2296,60 @@ async function svelte(options = {}) {
2288
2296
  const defaultEntryPointCandidates = [
2289
2297
  "src/styles/global.css",
2290
2298
  "src/styles/globals.css",
2299
+ "src/styles/app.css",
2300
+ "src/styles/index.css",
2301
+ "src/styles/style.css",
2302
+ "src/app/styles/global.css",
2303
+ "src/app/styles/globals.css",
2304
+ "src/app/styles/app.css",
2305
+ "src/app/styles/index.css",
2306
+ "src/app/styles/style.css",
2291
2307
  "src/app/global.css",
2292
2308
  "src/app/globals.css",
2293
- "src/global.css",
2294
- "src/globals.css",
2309
+ "src/app/app.css",
2310
+ "app/styles/global.css",
2311
+ "app/styles/globals.css",
2312
+ "app/styles/app.css",
2313
+ "app/styles/index.css",
2314
+ "app/styles/style.css",
2295
2315
  "app/global.css",
2296
2316
  "app/globals.css",
2317
+ "app/app.css",
2318
+ "src/global.css",
2319
+ "src/globals.css",
2320
+ "src/app.css",
2321
+ "src/index.css",
2322
+ "src/style.css",
2297
2323
  "styles/global.css",
2298
2324
  "styles/globals.css",
2325
+ "styles/app.css",
2326
+ "styles/index.css",
2327
+ "styles/style.css",
2299
2328
  "global.css",
2300
- "globals.css"
2329
+ "globals.css",
2330
+ "app.css",
2331
+ "index.css",
2332
+ "style.css"
2301
2333
  ];
2334
+ const entryPointCandidateFileNames = new Set([
2335
+ "app.css",
2336
+ "global.css",
2337
+ "globals.css",
2338
+ "index.css",
2339
+ "style.css"
2340
+ ]);
2341
+ const tailwindEntryPointPattern = /@import\s+["']tailwindcss(?:\/[^"']+)?["']|@tailwind\s+(?:base|components|utilities|variants)|@theme\b|@utility\b|@custom-variant\b/;
2342
+ const tailwindEntryPointCache = /* @__PURE__ */ new Map();
2343
+ const warnings = /* @__PURE__ */ new Set();
2302
2344
  async function tailwindcss(options = {}) {
2303
2345
  const { files = [GLOB_SRC], overrides = {} } = options;
2304
2346
  if (!isPackageExists("tailwindcss")) return [];
2305
2347
  await ensurePackages(["eslint-plugin-better-tailwindcss"]);
2306
2348
  const tsconfigPath = options?.tsconfigPath !== void 0 ? toArray(options.tsconfigPath) : void 0;
2307
- const resolvedTsconfigPath = tsconfigPath?.[0] ? path.resolve(process.cwd(), tsconfigPath[0]) : void 0;
2349
+ const cwd = resolveCwd(options.cwd);
2350
+ const resolvedTsconfigPath = tsconfigPath?.[0] ? path.resolve(cwd, tsconfigPath[0]) : void 0;
2308
2351
  const isTypeAware = !!resolvedTsconfigPath;
2309
- const resolvedEntryPointPath = resolveTailwindEntryPoint(options.entryPoint);
2352
+ const resolvedEntryPointPath = resolveTailwindEntryPoint(options.entryPoint, cwd);
2310
2353
  const isUsingEntryPoint = !!resolvedEntryPointPath;
2311
2354
  const [pluginTailwindCSS, parserTs] = await Promise.all([interopDefault(import("eslint-plugin-better-tailwindcss")), interopDefault(import("@typescript-eslint/parser"))]);
2312
2355
  return [{
@@ -2317,7 +2360,7 @@ async function tailwindcss(options = {}) {
2317
2360
  ...isTypeAware ? {
2318
2361
  jsxPragma: null,
2319
2362
  project: tsconfigPath,
2320
- tsconfigRootDir: process.cwd()
2363
+ tsconfigRootDir: cwd
2321
2364
  } : {}
2322
2365
  }
2323
2366
  },
@@ -2325,6 +2368,7 @@ async function tailwindcss(options = {}) {
2325
2368
  plugins: { "tailwindcss": pluginTailwindCSS },
2326
2369
  settings: { tailwindcss: {
2327
2370
  ...isUsingEntryPoint ? { entryPoint: resolvedEntryPointPath } : {},
2371
+ ...options.cwd ? { cwd } : {},
2328
2372
  detectComponentClasses: options.detectComponentClasses ?? false,
2329
2373
  ...isTypeAware ? { tsconfig: resolvedTsconfigPath } : {}
2330
2374
  } }
@@ -2369,15 +2413,15 @@ function findExistingFile(filePath) {
2369
2413
  * @param {string} relativePath - The relative path to the file to find.
2370
2414
  * @returns {string | undefined} The path to the existing file, or undefined if the file does not exist.
2371
2415
  */
2372
- function findFileRecursiveFromCwd(relativePath) {
2373
- let resolvedPath = path.resolve(process.cwd(), relativePath);
2416
+ function findFileRecursiveFromCwd(relativePath, cwd) {
2417
+ let resolvedPath = path.resolve(cwd, relativePath);
2374
2418
  while (true) {
2375
2419
  const foundFile = findExistingFile(resolvedPath);
2376
2420
  if (foundFile) return foundFile;
2377
2421
  const fileName = path.basename(resolvedPath);
2378
2422
  const directory = path.dirname(resolvedPath);
2379
2423
  const parentDirectory = path.resolve(directory, "..");
2380
- if (parentDirectory === directory || directory === process.cwd()) return;
2424
+ if (parentDirectory === directory || directory === cwd) return;
2381
2425
  resolvedPath = path.resolve(parentDirectory, fileName);
2382
2426
  }
2383
2427
  }
@@ -2386,12 +2430,17 @@ function findFileRecursiveFromCwd(relativePath) {
2386
2430
  *
2387
2431
  * @returns {string | undefined} The path to the global CSS entry point, or undefined if no entry point is found.
2388
2432
  */
2389
- function findGlobalCssEntryPoint() {
2433
+ function findGlobalCssEntryPoint(cwd) {
2434
+ const explicitCandidates = [];
2390
2435
  for (const candidate of defaultEntryPointCandidates) {
2391
- const found = findExistingFile(path.resolve(process.cwd(), candidate));
2392
- if (found) return found;
2436
+ const found = findExistingFile(path.resolve(cwd, candidate));
2437
+ if (found) explicitCandidates.push(found);
2438
+ }
2439
+ if (explicitCandidates.length) {
2440
+ const resolvedEntryPoint = resolveBestEntryPointCandidate(explicitCandidates);
2441
+ if (resolvedEntryPoint) return resolvedEntryPoint;
2393
2442
  }
2394
- const queue = [process.cwd()];
2443
+ const queue = [cwd];
2395
2444
  const candidates = [];
2396
2445
  while (queue.length) {
2397
2446
  const currentPath = queue.shift();
@@ -2409,18 +2458,57 @@ function findGlobalCssEntryPoint() {
2409
2458
  queue.push(nextPath);
2410
2459
  continue;
2411
2460
  }
2412
- if (entry.isFile() && (entry.name === "global.css" || entry.name === "globals.css")) candidates.push(nextPath);
2461
+ if (entry.isFile() && entryPointCandidateFileNames.has(entry.name)) candidates.push(nextPath);
2413
2462
  }
2414
2463
  }
2415
2464
  if (!candidates.length) {
2416
- console.warn(`[${PACKAGE_NAME}] No global CSS entry point found in "${process.cwd()}".`);
2465
+ warnOnce(`[${PACKAGE_NAME}] No global CSS entry point found in "${cwd}".`);
2417
2466
  return;
2418
2467
  }
2419
- const resolvedEntryPoint = candidates.sort((a, b) => rankEntryPointPath(a) - rankEntryPointPath(b) || a.length - b.length || a.localeCompare(b))[0];
2468
+ const resolvedEntryPoint = resolveBestEntryPointCandidate(candidates);
2469
+ if (!resolvedEntryPoint) return;
2420
2470
  console.log(`[${PACKAGE_NAME}] Resolved global CSS entryPoint: "${resolvedEntryPoint}".`);
2421
2471
  return resolvedEntryPoint;
2422
2472
  }
2423
2473
  /**
2474
+ * Resolve the best entry point candidate from a list of file paths.
2475
+ *
2476
+ * @param {string[]} candidates - The entry point candidate paths.
2477
+ * @returns {string | undefined} The best entry point candidate, or undefined if no candidate exists.
2478
+ */
2479
+ function resolveBestEntryPointCandidate(candidates) {
2480
+ return candidates.sort(compareEntryPointPaths)[0];
2481
+ }
2482
+ /**
2483
+ * Compare two entry point paths.
2484
+ *
2485
+ * @param {string} a - The first entry point path.
2486
+ * @param {string} b - The second entry point path.
2487
+ * @returns {number} The comparison result.
2488
+ */
2489
+ function compareEntryPointPaths(a, b) {
2490
+ return Number(hasTailwindEntryPointDirective(b)) - Number(hasTailwindEntryPointDirective(a)) || rankEntryPointPath(a) - rankEntryPointPath(b) || a.length - b.length || a.localeCompare(b);
2491
+ }
2492
+ /**
2493
+ * Check whether a CSS file appears to be a Tailwind entry point.
2494
+ *
2495
+ * @param {string} filePath - The path to the CSS file.
2496
+ * @returns {boolean} Whether the CSS file contains Tailwind entry point directives.
2497
+ */
2498
+ function hasTailwindEntryPointDirective(filePath) {
2499
+ const cachedResult = tailwindEntryPointCache.get(filePath);
2500
+ if (cachedResult !== void 0) return cachedResult;
2501
+ try {
2502
+ const fileContents = readFileSync(filePath, "utf8");
2503
+ const hasTailwindDirective = tailwindEntryPointPattern.test(fileContents);
2504
+ tailwindEntryPointCache.set(filePath, hasTailwindDirective);
2505
+ return hasTailwindDirective;
2506
+ } catch {
2507
+ tailwindEntryPointCache.set(filePath, false);
2508
+ return false;
2509
+ }
2510
+ }
2511
+ /**
2424
2512
  * Rank the entry point path.
2425
2513
  *
2426
2514
  * @param {string} filePath - The path to the entry point.
@@ -2428,11 +2516,37 @@ function findGlobalCssEntryPoint() {
2428
2516
  */
2429
2517
  function rankEntryPointPath(filePath) {
2430
2518
  const normalizedPath = filePath.split(path.sep).join("/");
2431
- if (normalizedPath.includes("/src/styles/")) return 0;
2432
- if (normalizedPath.includes("/src/")) return 1;
2433
- if (normalizedPath.includes("/app/")) return 2;
2434
- if (normalizedPath.endsWith("/global.css")) return 3;
2435
- if (normalizedPath.endsWith("/globals.css")) return 4;
2519
+ if (normalizedPath.includes("/src/styles/")) return getEntryPointRank(0, normalizedPath);
2520
+ if (normalizedPath.includes("/src/app/styles/")) return getEntryPointRank(1, normalizedPath);
2521
+ if (normalizedPath.includes("/src/app/")) return getEntryPointRank(2, normalizedPath);
2522
+ if (normalizedPath.includes("/app/styles/")) return getEntryPointRank(3, normalizedPath);
2523
+ if (normalizedPath.includes("/app/")) return getEntryPointRank(4, normalizedPath);
2524
+ if (normalizedPath.includes("/src/")) return getEntryPointRank(5, normalizedPath);
2525
+ if (normalizedPath.includes("/styles/")) return getEntryPointRank(6, normalizedPath);
2526
+ return getEntryPointRank(7, normalizedPath);
2527
+ }
2528
+ /**
2529
+ * Get the entry point rank from its directory and file name.
2530
+ *
2531
+ * @param {number} directoryRank - The rank of the entry point directory.
2532
+ * @param {string} normalizedPath - The normalized entry point path.
2533
+ * @returns {number} The entry point rank.
2534
+ */
2535
+ function getEntryPointRank(directoryRank, normalizedPath) {
2536
+ return directoryRank * 10 + getEntryPointFileNameRank(normalizedPath);
2537
+ }
2538
+ /**
2539
+ * Get the entry point file name rank.
2540
+ *
2541
+ * @param {string} normalizedPath - The normalized entry point path.
2542
+ * @returns {number} The entry point file name rank.
2543
+ */
2544
+ function getEntryPointFileNameRank(normalizedPath) {
2545
+ if (normalizedPath.endsWith("/global.css")) return 0;
2546
+ if (normalizedPath.endsWith("/globals.css")) return 1;
2547
+ if (normalizedPath.endsWith("/app.css")) return 2;
2548
+ if (normalizedPath.endsWith("/index.css")) return 3;
2549
+ if (normalizedPath.endsWith("/style.css")) return 4;
2436
2550
  return 5;
2437
2551
  }
2438
2552
  /**
@@ -2441,16 +2555,35 @@ function rankEntryPointPath(filePath) {
2441
2555
  * @param {string} entryPoint - The entry point to resolve.
2442
2556
  * @returns {string | undefined} The path to the resolved entry point, or undefined if no entry point is found.
2443
2557
  */
2444
- function resolveTailwindEntryPoint(entryPoint) {
2558
+ function resolveTailwindEntryPoint(entryPoint, cwd) {
2445
2559
  if (entryPoint) {
2446
- const resolvedEntryPoint = findFileRecursiveFromCwd(entryPoint);
2560
+ const resolvedEntryPoint = findFileRecursiveFromCwd(entryPoint, cwd);
2447
2561
  if (resolvedEntryPoint) {
2448
2562
  console.log(`[${PACKAGE_NAME}] Resolved Tailwind CSS entryPoint: "${resolvedEntryPoint}".`);
2449
2563
  return resolvedEntryPoint;
2450
2564
  }
2451
- console.warn(`[${PACKAGE_NAME}] Tailwind CSS entryPoint "${entryPoint}" was not found from "${process.cwd()}".`);
2565
+ warnOnce(`[${PACKAGE_NAME}] Tailwind CSS entryPoint "${entryPoint}" was not found from "${cwd}".`);
2452
2566
  }
2453
- return findGlobalCssEntryPoint();
2567
+ return findGlobalCssEntryPoint(cwd);
2568
+ }
2569
+ /**
2570
+ * Resolve the Tailwind CSS working directory.
2571
+ *
2572
+ * @param {string} cwd - The configured working directory.
2573
+ * @returns {string} The resolved working directory.
2574
+ */
2575
+ function resolveCwd(cwd) {
2576
+ return cwd ? path.resolve(process.cwd(), cwd) : process.cwd();
2577
+ }
2578
+ /**
2579
+ * Warn only once per process for repeated Tailwind CSS resolution failures.
2580
+ *
2581
+ * @param {string} message - The warning message.
2582
+ */
2583
+ function warnOnce(message) {
2584
+ if (warnings.has(message)) return;
2585
+ warnings.add(message);
2586
+ console.warn(message);
2454
2587
  }
2455
2588
  //#endregion
2456
2589
  //#region src/configs/test.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@infernodesign/eslint-config",
3
3
  "description": "ESLint config for Inferno Design.",
4
- "version": "2.4.0",
4
+ "version": "2.5.0",
5
5
  "type": "module",
6
6
  "author": "Inferno Design <support@infernodesign.com>",
7
7
  "license": "MIT",
@@ -47,22 +47,22 @@
47
47
  },
48
48
  "dependencies": {
49
49
  "@antfu/install-pkg": "1.1.0",
50
- "@clack/prompts": "1.2.0",
51
- "@e18e/eslint-plugin": "0.3.0",
50
+ "@clack/prompts": "1.3.0",
51
+ "@e18e/eslint-plugin": "0.4.1",
52
52
  "@eslint-community/eslint-plugin-eslint-comments": "4.7.1",
53
53
  "@eslint/compat": "2.0.5",
54
54
  "@eslint/config-array": "0.23.5",
55
55
  "@eslint/config-helpers": "0.5.5",
56
56
  "@eslint/markdown": "8.0.1",
57
57
  "@stylistic/eslint-plugin": "5.10.0",
58
- "@typescript-eslint/eslint-plugin": "8.59.0",
59
- "@typescript-eslint/parser": "8.59.0",
60
- "@typescript-eslint/utils": "8.59.0",
58
+ "@typescript-eslint/eslint-plugin": "8.59.1",
59
+ "@typescript-eslint/parser": "8.59.1",
60
+ "@typescript-eslint/utils": "8.59.1",
61
61
  "@vitest/eslint-plugin": "1.6.16",
62
62
  "ansis": "4.2.0",
63
63
  "cac": "7.0.0",
64
64
  "eslint-config-flat-gitignore": "2.3.0",
65
- "eslint-flat-config-utils": "3.1.0",
65
+ "eslint-flat-config-utils": "3.2.0",
66
66
  "eslint-merge-processors": "2.0.0",
67
67
  "eslint-plugin-antfu": "3.2.2",
68
68
  "eslint-plugin-command": "3.5.2",
@@ -70,17 +70,17 @@
70
70
  "eslint-plugin-jsdoc": "62.9.0",
71
71
  "eslint-plugin-jsonc": "3.1.2",
72
72
  "eslint-plugin-n": "17.24.0",
73
- "eslint-plugin-no-only-tests": "3.3.0",
73
+ "eslint-plugin-no-only-tests": "3.4.0",
74
74
  "eslint-plugin-perfectionist": "5.9.0",
75
75
  "eslint-plugin-pnpm": "1.6.0",
76
76
  "eslint-plugin-regexp": "3.1.0",
77
77
  "eslint-plugin-toml": "1.3.1",
78
78
  "eslint-plugin-unicorn": "64.0.0",
79
79
  "eslint-plugin-unused-imports": "4.4.1",
80
- "eslint-plugin-vue": "10.8.0",
81
- "eslint-plugin-yml": "3.3.1",
80
+ "eslint-plugin-vue": "10.9.0",
81
+ "eslint-plugin-yml": "3.3.2",
82
82
  "eslint-processor-vue-blocks": "2.0.0",
83
- "globals": "17.5.0",
83
+ "globals": "17.6.0",
84
84
  "jsonc-eslint-parser": "3.1.0",
85
85
  "local-pkg": "1.1.2",
86
86
  "parse-gitignore": "2.0.0",
@@ -89,7 +89,7 @@
89
89
  "yaml-eslint-parser": "2.0.0"
90
90
  },
91
91
  "devDependencies": {
92
- "@eslint-react/eslint-plugin": "4.2.3",
92
+ "@eslint-react/eslint-plugin": "5.7.1",
93
93
  "@eslint/config-inspector": "2.0.0",
94
94
  "@infernodesign/typescript-config": "workspace:*",
95
95
  "@next/eslint-plugin-next": "16.2.4",
@@ -98,16 +98,16 @@
98
98
  "@types/node": "25.6.0",
99
99
  "@unocss/eslint-plugin": "66.6.8",
100
100
  "astro-eslint-parser": "1.4.0",
101
- "eslint": "10.2.1",
101
+ "eslint": "10.3.0",
102
102
  "eslint-plugin-astro": "1.7.0",
103
- "eslint-plugin-better-tailwindcss": "4.4.1",
104
- "eslint-plugin-erasable-syntax-only": "0.4.0",
103
+ "eslint-plugin-better-tailwindcss": "4.5.0",
104
+ "eslint-plugin-erasable-syntax-only": "0.4.1",
105
105
  "eslint-plugin-format": "2.0.1",
106
106
  "eslint-plugin-jsx-a11y": "6.10.2",
107
107
  "eslint-plugin-react-refresh": "0.5.2",
108
108
  "eslint-plugin-solid": "0.14.5",
109
- "eslint-plugin-storybook": "10.3.5",
110
- "eslint-plugin-svelte": "3.17.0",
109
+ "eslint-plugin-storybook": "10.3.6",
110
+ "eslint-plugin-svelte": "3.17.1",
111
111
  "eslint-plugin-vuejs-accessibility": "2.5.0",
112
112
  "eslint-typegen": "2.3.1",
113
113
  "execa": "9.6.1",
@@ -116,30 +116,30 @@
116
116
  "pnpm-workspace-yaml": "1.6.0",
117
117
  "prettier-plugin-astro": "0.14.1",
118
118
  "prettier-plugin-slidev": "1.0.5",
119
- "svelte": "5.55.4",
119
+ "svelte": "5.55.5",
120
120
  "svelte-eslint-parser": "1.6.0",
121
121
  "tinyglobby": "0.2.16",
122
- "tsdown": "0.21.9",
123
- "typescript": "5.9.3",
122
+ "tsdown": "0.21.10",
123
+ "typescript": "6.0.3",
124
124
  "vitest": "4.1.5",
125
- "vue": "3.5.32"
125
+ "vue": "3.5.33"
126
126
  },
127
127
  "peerDependencies": {
128
- "@eslint-react/eslint-plugin": "^4.2.3",
128
+ "@eslint-react/eslint-plugin": "^5.7.1",
129
129
  "@next/eslint-plugin-next": "^16.2.4",
130
130
  "@prettier/plugin-xml": "^3.4.2",
131
131
  "@unocss/eslint-plugin": "^66.6.8",
132
132
  "astro-eslint-parser": "^1.4.0",
133
- "eslint": "^10.2.1",
133
+ "eslint": "^10.3.0",
134
134
  "eslint-plugin-astro": "^1.7.0",
135
- "eslint-plugin-better-tailwindcss": "^4.4.1",
136
- "eslint-plugin-erasable-syntax-only": "^0.4.0",
135
+ "eslint-plugin-better-tailwindcss": "^4.5.0",
136
+ "eslint-plugin-erasable-syntax-only": "^0.4.1",
137
137
  "eslint-plugin-format": "^2.0.1",
138
138
  "eslint-plugin-jsx-a11y": "^6.10.2",
139
139
  "eslint-plugin-react-refresh": "^0.5.2",
140
140
  "eslint-plugin-solid": "^0.14.5",
141
- "eslint-plugin-storybook": "^10.3.5",
142
- "eslint-plugin-svelte": "^3.17.0",
141
+ "eslint-plugin-storybook": "^10.3.6",
142
+ "eslint-plugin-svelte": "^3.17.1",
143
143
  "eslint-plugin-vuejs-accessibility": "^2.5.0",
144
144
  "prettier-plugin-astro": "^0.14.1",
145
145
  "prettier-plugin-slidev": "^1.0.5",