@nitra/eslint-config 3.6.13 → 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,21 +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
- Bun: 'readonly'
338
- }
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'
339
339
  }
340
340
  }
341
- ]
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
+ }
342
367
 
343
368
  // Тільки для Vue проектів
344
369
  // files: ['**/vite.config.js']
@@ -505,7 +530,7 @@ const vue2 = [
505
530
 
506
531
  /**
507
532
  * Увімкнути graphql-eslint processor лише для .js (gql у коді).
508
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
533
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
509
534
  * @param {string[]} dirs кореневі директорії
510
535
  */
511
536
  function pushGraphqlJsProcessors(result, dirs) {
@@ -521,7 +546,7 @@ function pushGraphqlJsProcessors(result, dirs) {
521
546
  /**
522
547
  * Merge processor для .vue (vue + vue-blocks + graphql) — має бути останнім серед конфігів для `*.vue`,
523
548
  * інакше пресет eslint-plugin-vue (`processor: "vue/vue"`) перезапише його.
524
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
549
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
525
550
  * @param {string[]} dirs кореневі директорії Vue-пакетів
526
551
  */
527
552
  function pushGraphqlVueMergedProcessorLast(result, dirs) {
@@ -537,7 +562,7 @@ function pushGraphqlVueMergedProcessorLast(result, dirs) {
537
562
  /**
538
563
  * Після oxlint додає для `.vue` правила з `eslint:recommended`, які не делегує `eslint-plugin-oxlint` і які
539
564
  * не ввімкнені в oxlint за `.oxlintrc.json` (див. `VUE_SCRIPT_ESLINT_RECOMMENDED_GAP_RULES`).
540
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
565
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
541
566
  * @param {string[]} dirs кореневі директорії Vue-пакетів (ті самі аргументи dirs, що й у pushVueConfigs)
542
567
  */
543
568
  function pushVueScriptEslintRecommendedGapsAfterOxlint(result, dirs) {
@@ -556,9 +581,9 @@ function pushVueScriptEslintRecommendedGapsAfterOxlint(result, dirs) {
556
581
 
557
582
  /**
558
583
  * Додає до result конфіги для Vue-проєктів (vite, .vue, .js).
559
- * @param {import('eslint').Linter.FlatConfig[]} result масив конфігів
584
+ * @param {import('eslint').Linter.Config[]} result масив конфігів
560
585
  * @param {string[]} dirs директорії Vue-проєктів
561
- * @param {{ includeVite?: boolean, extraVueConfigs?: import('eslint').Linter.FlatConfig[] }} [options] опції: includeVite, extraVueConfigs
586
+ * @param {{ includeVite?: boolean, extraVueConfigs?: import('eslint').Linter.Config[] }} [options] опції: includeVite, extraVueConfigs
562
587
  */
563
588
  function pushVueConfigs(result, dirs, options = {}) {
564
589
  const { includeVite = false, extraVueConfigs = [] } = options
@@ -584,10 +609,12 @@ function pushVueConfigs(result, dirs, options = {}) {
584
609
  /**
585
610
  * ESLint flat config для проєктів на Vue та Node.
586
611
  * @param {object} [params] — список директорій для застосування правил
587
- * @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 проєкту).
588
615
  * @param {string[]} [params.vue] — шляхи до Vue 3
589
616
  * @param {string[]} [params.vue2] — шляхи до Vue 2
590
- * @returns {import('eslint').Linter.FlatConfig[]} масив конфігурацій ESLint
617
+ * @returns {import('eslint').Linter.Config[]} масив конфігурацій ESLint
591
618
  */
592
619
  // oxlint-disable-next-line unicorn/no-object-as-default-parameter
593
620
  export function getConfig(params = { node: [], vue: [], vue2: [] }) {
@@ -597,9 +624,9 @@ export function getConfig(params = { node: [], vue: [], vue2: [] }) {
597
624
  const graphqlVueDirsLast = []
598
625
 
599
626
  if (params.node?.length) {
600
- const files = params.node.map(name => `${name}/**/*.js`)
627
+ const files = params.node.flatMap(name => [`${name}/**/*.js`, `${name}/**/*.mjs`, `${name}/**/*.cjs`])
601
628
  result.push(
602
- ...node.map(configObject => ({ files, ...configObject })),
629
+ ...flatConfigsNodePluginNForDirectories(params.node),
603
630
  ...flatConfigsWithFiles(microsoftSdlNodeConfigsWithoutN, files)
604
631
  )
605
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.13",
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[]