@nitra/eslint-config 3.6.12 → 3.6.14

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/index.js CHANGED
@@ -54,7 +54,7 @@ const VUE_SCRIPT_ESLINT_RECOMMENDED_GAP_RULES = {
54
54
 
55
55
  /** Пресет recommended `@e18e/eslint-plugin` (flat). */
56
56
  // @ts-expect-error типізація плагіна не гарантує `configs.recommended`; у runtime поле є.
57
- const e18eRecommendedFlat = /** @type {import('eslint').Linter.FlatConfig} */ (e18ePlugin.configs.recommended)
57
+ const e18eRecommendedFlat = /** @type {import('eslint').Linter.Config} */ (e18ePlugin.configs.recommended)
58
58
 
59
59
  /**
60
60
  * Лише віртуальні GraphQL-документи з процесора (gql у `.js`/`.vue`): шляхи виду
@@ -194,9 +194,9 @@ const vueGraphqlMergedProcessor = mergeProcessors([
194
194
 
195
195
  /**
196
196
  * Обмежує масив flat-конфігів ESLint заданими `files` (копія кожного елемента).
197
- * @param {import('eslint').Linter.FlatConfig[]} configs вхідні конфіги
197
+ * @param {import('eslint').Linter.Config[]} configs вхідні конфіги
198
198
  * @param {string[]} files glob-патерни файлів
199
- * @returns {import('eslint').Linter.FlatConfig[]} новий масив flat-конфігів з полем `files`
199
+ * @returns {import('eslint').Linter.Config[]} новий масив flat-конфігів з полем `files`
200
200
  */
201
201
  function flatConfigsWithFiles(configs, files) {
202
202
  return configs.map(config => ({ ...config, files }))
@@ -324,20 +324,46 @@ const all = [
324
324
  /* Друга частина SDL node: лише правила microsoft-sdl; перший блок upstream дублює реєстрацію eslint-plugin-n. */
325
325
  const microsoftSdlNodeConfigsWithoutN = microsoftSdl.configs.node.slice(1)
326
326
 
327
- const node = [
328
- nodePlugin.configs['flat/recommended-module'],
329
- {
330
- rules: {
331
- 'n/no-missing-import': 'off', // покривається oxlint https://github.com/oxc-project/oxc/issues/481#issuecomment-3135766557
332
- 'n/no-deprecated-api': 'error' // як перший блок `configs.node` у @microsoft/eslint-plugin-sdl
333
- },
334
- languageOptions: {
335
- globals: {
336
- ...globals.node
337
- }
327
+ /**
328
+ * Додаткові правила та глобалі Bun поверх пресетів eslint-plugin-n для кожного шару під `params.node`.
329
+ */
330
+ const NODE_ESLINT_PLUGIN_N_EXTRA = {
331
+ rules: {
332
+ 'n/no-missing-import': 'off', // покривається oxlint https://github.com/oxc-project/oxc/issues/481#issuecomment-3135766557
333
+ 'n/no-deprecated-api': 'error' // як перший блок `configs.node` у @microsoft/eslint-plugin-sdl
334
+ },
335
+ languageOptions: {
336
+ globals: {
337
+ ...globals.node,
338
+ Bun: 'readonly'
338
339
  }
339
340
  }
340
- ]
341
+ }
342
+
343
+ /** Три шари: `.js` (рекомендований пресет за `type` у package.json), `.mjs` (ESM), `.cjs` (CommonJS). */
344
+ const NODE_PLUGIN_N_MIXED = nodePlugin.configs['flat/mixed-esm-and-cjs']
345
+
346
+ /**
347
+ * Flat-конфіги eslint-plugin-n для заданих кореневих директорій Node-коду (узгоджено з `flat/mixed-esm-and-cjs`).
348
+ * @param {string[]} dirNames елементи `params.node`
349
+ * @returns {import('eslint').Linter.Config[]} шість flat-конфігів (три від пресету плагіна n × два шари з NODE_ESLINT_PLUGIN_N_EXTRA)
350
+ */
351
+ function flatConfigsNodePluginNForDirectories(dirNames) {
352
+ const filesByKind = [
353
+ dirNames.map(name => `${name}/**/*.js`),
354
+ dirNames.map(name => `${name}/**/*.mjs`),
355
+ dirNames.map(name => `${name}/**/*.cjs`)
356
+ ]
357
+ /** @type {import('eslint').Linter.Config[]} */
358
+ const out = []
359
+ for (let i = 0; i < 3; i++) {
360
+ out.push(
361
+ { ...NODE_PLUGIN_N_MIXED[i], files: filesByKind[i] },
362
+ { ...NODE_ESLINT_PLUGIN_N_EXTRA, files: filesByKind[i] }
363
+ )
364
+ }
365
+ return out
366
+ }
341
367
 
342
368
  // Тільки для Vue проектів
343
369
  // files: ['**/vite.config.js']
@@ -504,7 +530,7 @@ const vue2 = [
504
530
 
505
531
  /**
506
532
  * Увімкнути graphql-eslint processor лише для .js (gql у коді).
507
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
533
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
508
534
  * @param {string[]} dirs кореневі директорії
509
535
  */
510
536
  function pushGraphqlJsProcessors(result, dirs) {
@@ -520,7 +546,7 @@ function pushGraphqlJsProcessors(result, dirs) {
520
546
  /**
521
547
  * Merge processor для .vue (vue + vue-blocks + graphql) — має бути останнім серед конфігів для `*.vue`,
522
548
  * інакше пресет eslint-plugin-vue (`processor: "vue/vue"`) перезапише його.
523
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
549
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
524
550
  * @param {string[]} dirs кореневі директорії Vue-пакетів
525
551
  */
526
552
  function pushGraphqlVueMergedProcessorLast(result, dirs) {
@@ -536,7 +562,7 @@ function pushGraphqlVueMergedProcessorLast(result, dirs) {
536
562
  /**
537
563
  * Після oxlint додає для `.vue` правила з `eslint:recommended`, які не делегує `eslint-plugin-oxlint` і які
538
564
  * не ввімкнені в oxlint за `.oxlintrc.json` (див. `VUE_SCRIPT_ESLINT_RECOMMENDED_GAP_RULES`).
539
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
565
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
540
566
  * @param {string[]} dirs кореневі директорії Vue-пакетів (ті самі аргументи dirs, що й у pushVueConfigs)
541
567
  */
542
568
  function pushVueScriptEslintRecommendedGapsAfterOxlint(result, dirs) {
@@ -555,9 +581,9 @@ function pushVueScriptEslintRecommendedGapsAfterOxlint(result, dirs) {
555
581
 
556
582
  /**
557
583
  * Додає до result конфіги для Vue-проєктів (vite, .vue, .js).
558
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
584
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
559
585
  * @param {string[]} dirs директорії Vue-проєктів
560
- * @param {{ includeVite?: boolean, extraVueConfigs?: import('eslint').Linter.FlatConfig[] }} [options] опції: includeVite, extraVueConfigs
586
+ * @param {{ includeVite?: boolean, extraVueConfigs?: import('eslint').Linter.Config[] }} [options] опції: includeVite, extraVueConfigs
561
587
  */
562
588
  function pushVueConfigs(result, dirs, options = {}) {
563
589
  const { includeVite = false, extraVueConfigs = [] } = options
@@ -583,10 +609,12 @@ function pushVueConfigs(result, dirs, options = {}) {
583
609
  /**
584
610
  * ESLint flat config для проєктів на Vue та Node.
585
611
  * @param {object} [params] — список директорій для застосування правил
586
- * @param {string[]} [params.node] — шляхи до Node.js коду
612
+ * @param {string[]} [params.node] — шляхи до Node.js коду; правила та `globals.node` застосовуються до файлів
613
+ * `.js`, `.mjs` та `.cjs` у дереві кожної директорії (eslint-plugin-n `flat/mixed-esm-and-cjs`: для `.cjs` —
614
+ * script/CommonJS, для `.mjs` — module, для `.js` — за полем `type` у package.json проєкту).
587
615
  * @param {string[]} [params.vue] — шляхи до Vue 3
588
616
  * @param {string[]} [params.vue2] — шляхи до Vue 2
589
- * @returns {import('eslint').Linter.FlatConfig[]} масив конфігурацій ESLint
617
+ * @returns {import('eslint').Linter.Config[]} масив конфігурацій ESLint
590
618
  */
591
619
  // oxlint-disable-next-line unicorn/no-object-as-default-parameter
592
620
  export function getConfig(params = { node: [], vue: [], vue2: [] }) {
@@ -596,9 +624,9 @@ export function getConfig(params = { node: [], vue: [], vue2: [] }) {
596
624
  const graphqlVueDirsLast = []
597
625
 
598
626
  if (params.node?.length) {
599
- const files = params.node.map(name => `${name}/**/*.js`)
627
+ const files = params.node.flatMap(name => [`${name}/**/*.js`, `${name}/**/*.mjs`, `${name}/**/*.cjs`])
600
628
  result.push(
601
- ...node.map(configObject => ({ files, ...configObject })),
629
+ ...flatConfigsNodePluginNForDirectories(params.node),
602
630
  ...flatConfigsWithFiles(microsoftSdlNodeConfigsWithoutN, files)
603
631
  )
604
632
  // Каталог `npm` пакета конфігу зазвичай без graphql-config; перший preprocess інакше кешує null і ламає демо/vue.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nitra/eslint-config",
3
- "version": "3.6.12",
3
+ "version": "3.6.14",
4
4
  "description": "An ESLint shareable config for projects using Vue and Node",
5
5
  "keywords": [
6
6
  "eslint",
@@ -21,6 +21,9 @@
21
21
  "type": "module",
22
22
  "types": "./types/index.d.ts",
23
23
  "exports": "./index.js",
24
+ "scripts": {
25
+ "test": "bun test"
26
+ },
24
27
  "dependencies": {
25
28
  "@e18e/eslint-plugin": "^0.3.0",
26
29
  "@eslint/compat": "^2.0.5",
package/types/index.d.ts CHANGED
@@ -2,7 +2,10 @@
2
2
  * Параметри для getConfig — список директорій для застосування правил.
3
3
  */
4
4
  export interface GetConfigParams {
5
- /** Шляхи до Node.js коду */
5
+ /**
6
+ * Шляхи до Node.js коду — правила та node globals для `**/*.js`, `**/*.mjs`, `**/*.cjs` у кожній директорії
7
+ * (у т.ч. окремий пресет для `.cjs` через eslint-plugin-n mixed ESM/CJS).
8
+ */
6
9
  node?: string[]
7
10
  /** Шляхи до Vue 3 */
8
11
  vue?: string[]
@@ -11,14 +14,14 @@ export interface GetConfigParams {
11
14
  }
12
15
 
13
16
  /**
14
- * Один елемент ESLint flat config (сумісний з Linter.FlatConfig).
17
+ * Один елемент flat config ESLint (те саме, що `Linter.Config`; колишня назва типу `FlatConfig` у ESLint застаріла).
15
18
  * У проєктах з встановленим eslint типи будуть зв’язані автоматично.
16
19
  */
17
- export type FlatConfig = Record<string, unknown>
20
+ export type FlatConfig = import('eslint').Linter.Config
18
21
 
19
22
  /**
20
23
  * ESLint flat config для проєктів на Vue та Node.
21
24
  * @param params — список директорій для застосування правил
22
25
  * @returns масив конфігурацій ESLint (flat config)
23
26
  */
24
- export function getConfig(params?: GetConfigParams): FlatConfig[]
27
+ export function getConfig(params?: GetConfigParams): import('eslint').Linter.Config[]