@qstanay/eslint-config 1.1.0 → 1.2.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 +12 -0
- package/README.md +32 -1
- package/dist/index.mjs +46 -1
- package/dist/index.mjs.map +1 -1
- package/dist/nuxt-Bxa1EDDq.d.mts.map +1 -1
- package/dist/{nuxt-dkt3q_AQ.mjs → nuxt-oec8_Haa.mjs} +19 -68
- package/dist/nuxt-oec8_Haa.mjs.map +1 -0
- package/dist/nuxt.mjs +1 -1
- package/package.json +1 -1
- package/dist/nuxt-dkt3q_AQ.mjs.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,18 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to this project are documented in this file.
|
|
4
4
|
|
|
5
|
+
## [1.2.0] - 2026-11-08
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
- Document how to set a 4-space indent in a consuming project via `stylistic.indent` for both `defineConfig()` and `nuxt()`. The preset default stays 2 spaces, and `vue/html-indent` follows the same value.
|
|
10
|
+
|
|
11
|
+
## [1.1.1] - 2026-08-16
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- `/nuxt` no longer registers its own `@typescript-eslint` plugin. It only adds rules on top of the plugin from `@nuxt/eslint`, so consumers do not need pnpm/npm `overrides` to avoid “two instances of plugin `@typescript-eslint`”.
|
|
16
|
+
|
|
5
17
|
## [1.1.0] - 2026-08-08
|
|
6
18
|
|
|
7
19
|
### Added
|
package/README.md
CHANGED
|
@@ -171,7 +171,7 @@ Layer for Nuxt apps used with `withNuxt(...nuxt())`.
|
|
|
171
171
|
| `overrides` | `Linter.RulesRecord` | `{}` | Custom rules merged last over shared rules |
|
|
172
172
|
| `ignores` | `string[]` | `[]` | Extra ignore globs (plus defaults / `.gitignore`) |
|
|
173
173
|
|
|
174
|
-
There are no `vue` / `typescript` flags here — `@nuxt/eslint` already provides that stack. This preset adds shared opinionated rules, Vue opinionated rules, stylistic formatting, and optional Vitest support.
|
|
174
|
+
There are no `vue` / `typescript` flags here — `@nuxt/eslint` already provides that stack. This preset adds shared opinionated rules, Vue opinionated rules, stylistic formatting, and optional Vitest support. It does **not** register `@typescript-eslint` or `vue` plugins; a second copy of `@typescript-eslint` would make ESLint reject the config.
|
|
175
175
|
|
|
176
176
|
### `test` (Vitest)
|
|
177
177
|
|
|
@@ -211,6 +211,37 @@ defineConfig({
|
|
|
211
211
|
})
|
|
212
212
|
```
|
|
213
213
|
|
|
214
|
+
The preset default stays **2 spaces**. A project can switch to 4 without changing this package. Allowed values are `2` and `4`. `vue/html-indent` follows the same value.
|
|
215
|
+
|
|
216
|
+
Vue or TypeScript package:
|
|
217
|
+
|
|
218
|
+
```js
|
|
219
|
+
import { defineConfig } from '@qstanay/eslint-config'
|
|
220
|
+
|
|
221
|
+
export default defineConfig({
|
|
222
|
+
stylistic: {
|
|
223
|
+
indent: 4,
|
|
224
|
+
},
|
|
225
|
+
})
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Nuxt:
|
|
229
|
+
|
|
230
|
+
```js
|
|
231
|
+
import withNuxt from './.nuxt/eslint.config.mjs'
|
|
232
|
+
import { nuxt } from '@qstanay/eslint-config/nuxt'
|
|
233
|
+
|
|
234
|
+
export default withNuxt(
|
|
235
|
+
...nuxt({
|
|
236
|
+
stylistic: {
|
|
237
|
+
indent: 4,
|
|
238
|
+
},
|
|
239
|
+
}),
|
|
240
|
+
)
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
Then run `eslint . --fix` in that project.
|
|
244
|
+
|
|
214
245
|
Disable formatting rules entirely:
|
|
215
246
|
|
|
216
247
|
```js
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { a as
|
|
1
|
+
import { a as has, c as sourceFiles, d as javascriptRules, f as typescriptRules, i as VUE_FILES, l as test, n as vueRules, o as resolveEnabled, p as ignores, r as TYPESCRIPT_FILES, s as resolveStylisticOptions, t as nuxt, u as stylistic } from "./nuxt-oec8_Haa.mjs";
|
|
2
2
|
import { FlatConfigComposer } from "eslint-flat-config-utils";
|
|
3
3
|
//#region src/configs/imports.ts
|
|
4
4
|
async function imports() {
|
|
@@ -68,6 +68,51 @@ async function nuxt$1() {
|
|
|
68
68
|
}];
|
|
69
69
|
}
|
|
70
70
|
//#endregion
|
|
71
|
+
//#region src/configs/typescript.ts
|
|
72
|
+
function collectRules(configs) {
|
|
73
|
+
return Object.assign({}, ...configs.filter((config) => config.rules).map((config) => config.rules));
|
|
74
|
+
}
|
|
75
|
+
async function loadTypescriptPlugin() {
|
|
76
|
+
const pluginMod = await import("@typescript-eslint/eslint-plugin");
|
|
77
|
+
return pluginMod.default ?? pluginMod;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* TypeScript layer.
|
|
81
|
+
*
|
|
82
|
+
* Important: `@typescript-eslint/parser` is never the root parser for `.vue`.
|
|
83
|
+
* Vue SFCs keep `vue-eslint-parser` as root (from the Vue layer) and use the
|
|
84
|
+
* TS parser only as a nested script parser.
|
|
85
|
+
*
|
|
86
|
+
* Flat config requires the plugin on every object that references
|
|
87
|
+
* `@typescript-eslint/*` rules (see shared-rules / overrides too).
|
|
88
|
+
*/
|
|
89
|
+
async function typescript(options = {}) {
|
|
90
|
+
const parserMod = await import("@typescript-eslint/parser");
|
|
91
|
+
const plugin = await loadTypescriptPlugin();
|
|
92
|
+
const parser = parserMod.default ?? parserMod;
|
|
93
|
+
const rules = collectRules(plugin.configs?.["flat/recommended"] ?? []);
|
|
94
|
+
const configs = [{
|
|
95
|
+
name: "qstanay/typescript",
|
|
96
|
+
files: [...TYPESCRIPT_FILES],
|
|
97
|
+
languageOptions: {
|
|
98
|
+
parser,
|
|
99
|
+
parserOptions: {
|
|
100
|
+
sourceType: "module",
|
|
101
|
+
ecmaVersion: "latest"
|
|
102
|
+
}
|
|
103
|
+
},
|
|
104
|
+
plugins: { "@typescript-eslint": plugin },
|
|
105
|
+
rules
|
|
106
|
+
}];
|
|
107
|
+
if (options.vue) configs.push({
|
|
108
|
+
name: "qstanay/typescript/vue-rules",
|
|
109
|
+
files: [...VUE_FILES],
|
|
110
|
+
plugins: { "@typescript-eslint": plugin },
|
|
111
|
+
rules
|
|
112
|
+
});
|
|
113
|
+
return configs;
|
|
114
|
+
}
|
|
115
|
+
//#endregion
|
|
71
116
|
//#region src/configs/vue.ts
|
|
72
117
|
/**
|
|
73
118
|
* Vue layer based on the official flat recommended preset.
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["nuxt","javascriptConfig","typescriptConfig","stylisticConfig","vueConfig","nuxtConfig","testConfig"],"sources":["../src/configs/imports.ts","../src/configs/javascript.ts","../src/configs/nuxt.ts","../src/configs/vue.ts","../src/index.ts"],"sourcesContent":["import type { TypedFlatConfigItem } from '../types';\n\nexport async function imports(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('eslint-plugin-import-x');\n const plugin = (mod as any).default ?? mod;\n\n return [\n {\n name: 'qstanay/imports',\n plugins: {\n import: plugin,\n },\n rules: {\n 'import/first': 'error',\n 'import/no-duplicates': 'error',\n 'import/no-mutable-exports': 'error',\n 'import/no-named-default': 'error',\n 'import/order': [\n 'error',\n {\n 'groups': [\n 'builtin',\n 'external',\n 'internal',\n ['parent', 'sibling', 'index'],\n 'object',\n 'type',\n ],\n 'newlines-between': 'always',\n 'alphabetize': {\n order: 'asc',\n caseInsensitive: true,\n },\n },\n ],\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\n/**\n * Base JS quality rules from `@eslint/js` recommended.\n * Declares Node + ES2022 globals so `no-undef` does not false-positive on\n * `console`, `process`, and other built-ins.\n * When `browser` is true (Vue apps), also declare browser globals for entry\n * files outside `.vue` SFCs (`main.js`, `app.ts`, etc.).\n */\nexport async function javascript(options: {\n browser?: boolean;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const jsMod = await import('@eslint/js');\n const globalsMod = await import('globals');\n\n const js = (jsMod as any).default ?? jsMod;\n const globals = (globalsMod as any).default ?? globalsMod;\n\n return [\n {\n name: 'qstanay/javascript',\n languageOptions: {\n globals: {\n ...globals.es2022,\n ...globals.nodeBuiltin,\n ...(options.browser ? globals.browser : {}),\n },\n },\n rules: {\n ...(js.configs?.recommended?.rules ?? {}),\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\nexport async function nuxt(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('@nuxt/eslint-plugin');\n const plugin = (mod as any).default ?? mod;\n\n return [\n {\n name: 'qstanay/nuxt',\n plugins: {\n nuxt: plugin,\n },\n rules: {\n // keep this minimal; Nuxt base config already provides most of it\n 'nuxt/prefer-import-meta': 'error',\n },\n },\n ];\n}\n","import { VUE_FILES } from '../utils';\nimport { vueRules } from './vue-rules';\n\nimport type { TypedFlatConfigItem } from '../types';\n\n/**\n * Vue layer based on the official flat recommended preset.\n * Must spread the full array — it includes setup, processor, and rule packs.\n */\nexport async function vue(options: {\n indent?: 2 | 4;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const vuePluginMod = await import('eslint-plugin-vue');\n const globalsMod = await import('globals');\n\n const vuePlugin = (vuePluginMod as any).default ?? vuePluginMod;\n const globals = (globalsMod as any).default ?? globalsMod;\n\n const recommended = (vuePlugin.configs?.['flat/recommended'] ?? []) as TypedFlatConfigItem[];\n\n return [\n ...recommended,\n {\n name: 'qstanay/vue/rules',\n files: [...VUE_FILES],\n languageOptions: {\n globals: {\n ...globals.browser,\n },\n parserOptions: {\n // Keep vue-eslint-parser as the root parser (from recommended),\n // and parse <script lang=\"ts\"> with the TS parser.\n parser: {\n ts: '@typescript-eslint/parser',\n js: 'espree',\n },\n ecmaVersion: 'latest',\n sourceType: 'module',\n extraFileExtensions: ['.vue'],\n },\n },\n rules: {\n ...vueRules({ indent: options.indent }),\n },\n },\n ];\n}\n","import { FlatConfigComposer } from 'eslint-flat-config-utils';\n\nimport { ignores } from './configs/ignores';\nimport { imports } from './configs/imports';\nimport { javascript as javascriptConfig } from './configs/javascript';\nimport { nuxt as nuxtConfig } from './configs/nuxt';\nimport {\n javascriptRules,\n typescriptRules,\n} from './configs/shared-rules';\nimport { stylistic as stylisticConfig } from './configs/stylistic';\nimport { test as testConfig } from './configs/test';\nimport {\n loadTypescriptPlugin,\n typescript as typescriptConfig,\n} from './configs/typescript';\nimport { vue as vueConfig } from './configs/vue';\nimport {\n has,\n resolveEnabled,\n resolveStylisticOptions,\n sourceFiles,\n TYPESCRIPT_FILES,\n VUE_FILES,\n} from './utils';\n\nimport type { Awaitable, OptionsConfig, TypedFlatConfigItem } from './types';\n\nexport { nuxt } from './nuxt';\nexport * from './types';\n\nexport function defineConfig(\n options: OptionsConfig = {},\n ...userConfigs: (Awaitable<TypedFlatConfigItem | TypedFlatConfigItem[]>)[]\n) {\n const enableTs = resolveEnabled(options.typescript, has('typescript'));\n const enableVue = resolveEnabled(options.vue, has('vue') || has('nuxt'));\n const enableNuxt = resolveEnabled(options.nuxt, has('nuxt'));\n const enableTest = resolveEnabled(options.test, has('vitest'));\n const stylisticOptions = resolveStylisticOptions(options.stylistic);\n const files = sourceFiles(enableVue);\n const vueIndent = stylisticOptions\n ? (stylisticOptions.indent ?? 2)\n : undefined;\n\n const configs: (Awaitable<TypedFlatConfigItem[]>)[] = [];\n\n // When Vue is off, skip SFCs entirely so espree/TS do not fatal-parse them.\n configs.push(Promise.resolve(ignores([\n ...(options.ignores ?? []),\n ...(!enableVue ? VUE_FILES : []),\n ])));\n configs.push(javascriptConfig({ browser: enableVue }));\n\n if (enableTs) {\n configs.push(typescriptConfig({ vue: enableVue }));\n }\n\n configs.push(imports());\n\n if (stylisticOptions) {\n configs.push(stylisticConfig(stylisticOptions));\n }\n\n if (enableVue) {\n configs.push(vueConfig({ indent: vueIndent }));\n }\n\n if (enableNuxt) {\n configs.push(nuxtConfig());\n }\n\n if (enableTest) {\n configs.push(testConfig());\n }\n\n configs.push(Promise.resolve([\n {\n name: 'qstanay/shared-rules',\n files,\n rules: javascriptRules(),\n },\n ]));\n\n if (enableTs) {\n // TS opinionated rules only on TS sources (+ .vue when Vue is on).\n // Never apply them to plain JS/MJS — that needs type-aware parser services.\n configs.push((async () => {\n const plugin = await loadTypescriptPlugin();\n return [\n {\n name: 'qstanay/shared-rules/typescript',\n files: enableVue\n ? [...TYPESCRIPT_FILES, ...VUE_FILES]\n : [...TYPESCRIPT_FILES],\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules: typescriptRules({ strict: options.strict }),\n },\n ];\n })());\n }\n\n if (options.overrides) {\n // Trailing block so project overrides win over shared/vue/ts packs.\n configs.push((async () => {\n const plugins = enableTs\n ? { '@typescript-eslint': await loadTypescriptPlugin() }\n : undefined;\n\n return [\n {\n name: 'qstanay/overrides',\n files,\n ...(plugins ? { plugins } : {}),\n rules: options.overrides,\n },\n ];\n })());\n }\n\n const composer = new FlatConfigComposer<TypedFlatConfigItem>();\n composer.append(...configs, ...userConfigs as any);\n return composer;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["nuxt","javascriptConfig","typescriptConfig","stylisticConfig","vueConfig","nuxtConfig","testConfig"],"sources":["../src/configs/imports.ts","../src/configs/javascript.ts","../src/configs/nuxt.ts","../src/configs/typescript.ts","../src/configs/vue.ts","../src/index.ts"],"sourcesContent":["import type { TypedFlatConfigItem } from '../types';\n\nexport async function imports(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('eslint-plugin-import-x');\n const plugin = (mod as any).default ?? mod;\n\n return [\n {\n name: 'qstanay/imports',\n plugins: {\n import: plugin,\n },\n rules: {\n 'import/first': 'error',\n 'import/no-duplicates': 'error',\n 'import/no-mutable-exports': 'error',\n 'import/no-named-default': 'error',\n 'import/order': [\n 'error',\n {\n 'groups': [\n 'builtin',\n 'external',\n 'internal',\n ['parent', 'sibling', 'index'],\n 'object',\n 'type',\n ],\n 'newlines-between': 'always',\n 'alphabetize': {\n order: 'asc',\n caseInsensitive: true,\n },\n },\n ],\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\n/**\n * Base JS quality rules from `@eslint/js` recommended.\n * Declares Node + ES2022 globals so `no-undef` does not false-positive on\n * `console`, `process`, and other built-ins.\n * When `browser` is true (Vue apps), also declare browser globals for entry\n * files outside `.vue` SFCs (`main.js`, `app.ts`, etc.).\n */\nexport async function javascript(options: {\n browser?: boolean;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const jsMod = await import('@eslint/js');\n const globalsMod = await import('globals');\n\n const js = (jsMod as any).default ?? jsMod;\n const globals = (globalsMod as any).default ?? globalsMod;\n\n return [\n {\n name: 'qstanay/javascript',\n languageOptions: {\n globals: {\n ...globals.es2022,\n ...globals.nodeBuiltin,\n ...(options.browser ? globals.browser : {}),\n },\n },\n rules: {\n ...(js.configs?.recommended?.rules ?? {}),\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\nexport async function nuxt(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('@nuxt/eslint-plugin');\n const plugin = (mod as any).default ?? mod;\n\n return [\n {\n name: 'qstanay/nuxt',\n plugins: {\n nuxt: plugin,\n },\n rules: {\n // keep this minimal; Nuxt base config already provides most of it\n 'nuxt/prefer-import-meta': 'error',\n },\n },\n ];\n}\n","import { TYPESCRIPT_FILES, VUE_FILES } from '../utils';\n\nimport type { TypedFlatConfigItem } from '../types';\nimport type { Linter } from 'eslint';\n\nfunction collectRules(configs: TypedFlatConfigItem[]): Linter.RulesRecord {\n return Object.assign(\n {},\n ...configs\n .filter(config => config.rules)\n .map(config => config.rules),\n );\n}\n\nexport async function loadTypescriptPlugin() {\n const pluginMod = await import('@typescript-eslint/eslint-plugin');\n return (pluginMod as any).default ?? pluginMod;\n}\n\n/**\n * TypeScript layer.\n *\n * Important: `@typescript-eslint/parser` is never the root parser for `.vue`.\n * Vue SFCs keep `vue-eslint-parser` as root (from the Vue layer) and use the\n * TS parser only as a nested script parser.\n *\n * Flat config requires the plugin on every object that references\n * `@typescript-eslint/*` rules (see shared-rules / overrides too).\n */\nexport async function typescript(options: {\n vue?: boolean;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const parserMod = await import('@typescript-eslint/parser');\n const plugin = await loadTypescriptPlugin();\n const parser = (parserMod as any).default ?? parserMod;\n\n const recommended = (plugin.configs?.['flat/recommended'] ?? []) as TypedFlatConfigItem[];\n const rules = collectRules(recommended);\n\n const configs: TypedFlatConfigItem[] = [\n {\n name: 'qstanay/typescript',\n files: [...TYPESCRIPT_FILES],\n languageOptions: {\n parser,\n parserOptions: {\n sourceType: 'module',\n ecmaVersion: 'latest',\n },\n },\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules,\n },\n ];\n\n if (options.vue) {\n configs.push({\n name: 'qstanay/typescript/vue-rules',\n files: [...VUE_FILES],\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules,\n });\n }\n\n return configs;\n}\n","import { VUE_FILES } from '../utils';\nimport { vueRules } from './vue-rules';\n\nimport type { TypedFlatConfigItem } from '../types';\n\n/**\n * Vue layer based on the official flat recommended preset.\n * Must spread the full array — it includes setup, processor, and rule packs.\n */\nexport async function vue(options: {\n indent?: 2 | 4;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const vuePluginMod = await import('eslint-plugin-vue');\n const globalsMod = await import('globals');\n\n const vuePlugin = (vuePluginMod as any).default ?? vuePluginMod;\n const globals = (globalsMod as any).default ?? globalsMod;\n\n const recommended = (vuePlugin.configs?.['flat/recommended'] ?? []) as TypedFlatConfigItem[];\n\n return [\n ...recommended,\n {\n name: 'qstanay/vue/rules',\n files: [...VUE_FILES],\n languageOptions: {\n globals: {\n ...globals.browser,\n },\n parserOptions: {\n // Keep vue-eslint-parser as the root parser (from recommended),\n // and parse <script lang=\"ts\"> with the TS parser.\n parser: {\n ts: '@typescript-eslint/parser',\n js: 'espree',\n },\n ecmaVersion: 'latest',\n sourceType: 'module',\n extraFileExtensions: ['.vue'],\n },\n },\n rules: {\n ...vueRules({ indent: options.indent }),\n },\n },\n ];\n}\n","import { FlatConfigComposer } from 'eslint-flat-config-utils';\n\nimport { ignores } from './configs/ignores';\nimport { imports } from './configs/imports';\nimport { javascript as javascriptConfig } from './configs/javascript';\nimport { nuxt as nuxtConfig } from './configs/nuxt';\nimport {\n javascriptRules,\n typescriptRules,\n} from './configs/shared-rules';\nimport { stylistic as stylisticConfig } from './configs/stylistic';\nimport { test as testConfig } from './configs/test';\nimport {\n loadTypescriptPlugin,\n typescript as typescriptConfig,\n} from './configs/typescript';\nimport { vue as vueConfig } from './configs/vue';\nimport {\n has,\n resolveEnabled,\n resolveStylisticOptions,\n sourceFiles,\n TYPESCRIPT_FILES,\n VUE_FILES,\n} from './utils';\n\nimport type { Awaitable, OptionsConfig, TypedFlatConfigItem } from './types';\n\nexport { nuxt } from './nuxt';\nexport * from './types';\n\nexport function defineConfig(\n options: OptionsConfig = {},\n ...userConfigs: (Awaitable<TypedFlatConfigItem | TypedFlatConfigItem[]>)[]\n) {\n const enableTs = resolveEnabled(options.typescript, has('typescript'));\n const enableVue = resolveEnabled(options.vue, has('vue') || has('nuxt'));\n const enableNuxt = resolveEnabled(options.nuxt, has('nuxt'));\n const enableTest = resolveEnabled(options.test, has('vitest'));\n const stylisticOptions = resolveStylisticOptions(options.stylistic);\n const files = sourceFiles(enableVue);\n const vueIndent = stylisticOptions\n ? (stylisticOptions.indent ?? 2)\n : undefined;\n\n const configs: (Awaitable<TypedFlatConfigItem[]>)[] = [];\n\n // When Vue is off, skip SFCs entirely so espree/TS do not fatal-parse them.\n configs.push(Promise.resolve(ignores([\n ...(options.ignores ?? []),\n ...(!enableVue ? VUE_FILES : []),\n ])));\n configs.push(javascriptConfig({ browser: enableVue }));\n\n if (enableTs) {\n configs.push(typescriptConfig({ vue: enableVue }));\n }\n\n configs.push(imports());\n\n if (stylisticOptions) {\n configs.push(stylisticConfig(stylisticOptions));\n }\n\n if (enableVue) {\n configs.push(vueConfig({ indent: vueIndent }));\n }\n\n if (enableNuxt) {\n configs.push(nuxtConfig());\n }\n\n if (enableTest) {\n configs.push(testConfig());\n }\n\n configs.push(Promise.resolve([\n {\n name: 'qstanay/shared-rules',\n files,\n rules: javascriptRules(),\n },\n ]));\n\n if (enableTs) {\n // TS opinionated rules only on TS sources (+ .vue when Vue is on).\n // Never apply them to plain JS/MJS — that needs type-aware parser services.\n configs.push((async () => {\n const plugin = await loadTypescriptPlugin();\n return [\n {\n name: 'qstanay/shared-rules/typescript',\n files: enableVue\n ? [...TYPESCRIPT_FILES, ...VUE_FILES]\n : [...TYPESCRIPT_FILES],\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules: typescriptRules({ strict: options.strict }),\n },\n ];\n })());\n }\n\n if (options.overrides) {\n // Trailing block so project overrides win over shared/vue/ts packs.\n configs.push((async () => {\n const plugins = enableTs\n ? { '@typescript-eslint': await loadTypescriptPlugin() }\n : undefined;\n\n return [\n {\n name: 'qstanay/overrides',\n files,\n ...(plugins ? { plugins } : {}),\n rules: options.overrides,\n },\n ];\n })());\n }\n\n const composer = new FlatConfigComposer<TypedFlatConfigItem>();\n composer.append(...configs, ...userConfigs as any);\n return composer;\n}\n"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nuxt-Bxa1EDDq.d.mts","names":[],"sources":["../src/types.ts","../src/nuxt.ts"],"mappings":";;KAEY,UAAU,KAAK,IAAI,QAAQ;KAE3B,sBAAsB,OAAO;UAExB;EACf;EACA;EACA;EACA;;UAGe;;;;EAIf;;;;EAIA;;;;EAIA;;;;;EAKA;;;;;EAKA;EACA,sBAAsB;;;;EAItB;;;;EAIA,YAAY,OAAO;;;;
|
|
1
|
+
{"version":3,"file":"nuxt-Bxa1EDDq.d.mts","names":[],"sources":["../src/types.ts","../src/nuxt.ts"],"mappings":";;KAEY,UAAU,KAAK,IAAI,QAAQ;KAE3B,sBAAsB,OAAO;UAExB;EACf;EACA;EACA;EACA;;UAGe;;;;EAIf;;;;EAIA;;;;EAIA;;;;;EAKA;;;;;EAKA;EACA,sBAAsB;;;;EAItB;;;;EAIA,YAAY,OAAO;;;;UCxBJ;EACf,sBAAsB;;;;EAItB;;;;;EAKA;EACA,YAAY,OAAO;;;;EAInB;;;;;;;;;iBAUc,KAAK,UAAS,oBAAsB,QAAA"}
|
|
@@ -151,51 +151,6 @@ function sourceFiles(vueEnabled) {
|
|
|
151
151
|
/** Files that receive shared / override rule packs when Vue is enabled. */
|
|
152
152
|
const SOURCE_FILES = ["**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts,vue}"];
|
|
153
153
|
//#endregion
|
|
154
|
-
//#region src/configs/typescript.ts
|
|
155
|
-
function collectRules(configs) {
|
|
156
|
-
return Object.assign({}, ...configs.filter((config) => config.rules).map((config) => config.rules));
|
|
157
|
-
}
|
|
158
|
-
async function loadTypescriptPlugin() {
|
|
159
|
-
const pluginMod = await import("@typescript-eslint/eslint-plugin");
|
|
160
|
-
return pluginMod.default ?? pluginMod;
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* TypeScript layer.
|
|
164
|
-
*
|
|
165
|
-
* Important: `@typescript-eslint/parser` is never the root parser for `.vue`.
|
|
166
|
-
* Vue SFCs keep `vue-eslint-parser` as root (from the Vue layer) and use the
|
|
167
|
-
* TS parser only as a nested script parser.
|
|
168
|
-
*
|
|
169
|
-
* Flat config requires the plugin on every object that references
|
|
170
|
-
* `@typescript-eslint/*` rules (see shared-rules / overrides too).
|
|
171
|
-
*/
|
|
172
|
-
async function typescript(options = {}) {
|
|
173
|
-
const parserMod = await import("@typescript-eslint/parser");
|
|
174
|
-
const plugin = await loadTypescriptPlugin();
|
|
175
|
-
const parser = parserMod.default ?? parserMod;
|
|
176
|
-
const rules = collectRules(plugin.configs?.["flat/recommended"] ?? []);
|
|
177
|
-
const configs = [{
|
|
178
|
-
name: "qstanay/typescript",
|
|
179
|
-
files: [...TYPESCRIPT_FILES],
|
|
180
|
-
languageOptions: {
|
|
181
|
-
parser,
|
|
182
|
-
parserOptions: {
|
|
183
|
-
sourceType: "module",
|
|
184
|
-
ecmaVersion: "latest"
|
|
185
|
-
}
|
|
186
|
-
},
|
|
187
|
-
plugins: { "@typescript-eslint": plugin },
|
|
188
|
-
rules
|
|
189
|
-
}];
|
|
190
|
-
if (options.vue) configs.push({
|
|
191
|
-
name: "qstanay/typescript/vue-rules",
|
|
192
|
-
files: [...VUE_FILES],
|
|
193
|
-
plugins: { "@typescript-eslint": plugin },
|
|
194
|
-
rules
|
|
195
|
-
});
|
|
196
|
-
return configs;
|
|
197
|
-
}
|
|
198
|
-
//#endregion
|
|
199
154
|
//#region src/configs/vue-rules.ts
|
|
200
155
|
function vueRules(options = {}) {
|
|
201
156
|
const rules = {
|
|
@@ -234,27 +189,23 @@ function nuxt(options = {}) {
|
|
|
234
189
|
const configs = [Promise.resolve(ignores(options.ignores))];
|
|
235
190
|
if (stylisticOptions) configs.push(stylistic(stylisticOptions));
|
|
236
191
|
if (enableTest) configs.push(test());
|
|
237
|
-
configs.push((
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
{
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
rules: { ...vueRules({ indent: vueIndent }) }
|
|
255
|
-
}
|
|
256
|
-
];
|
|
257
|
-
})());
|
|
192
|
+
configs.push(Promise.resolve([
|
|
193
|
+
{
|
|
194
|
+
name: "qstanay/nuxt/shared-rules",
|
|
195
|
+
files: [...SOURCE_FILES],
|
|
196
|
+
rules: javascriptRules()
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "qstanay/nuxt/shared-rules/typescript",
|
|
200
|
+
files: [...TYPESCRIPT_FILES, ...VUE_FILES],
|
|
201
|
+
rules: typescriptRules({ strict: options.strict })
|
|
202
|
+
},
|
|
203
|
+
{
|
|
204
|
+
name: "qstanay/nuxt/vue-rules",
|
|
205
|
+
files: [...VUE_FILES],
|
|
206
|
+
rules: { ...vueRules({ indent: vueIndent }) }
|
|
207
|
+
}
|
|
208
|
+
]));
|
|
258
209
|
if (options.overrides) configs.push(Promise.resolve([{
|
|
259
210
|
name: "qstanay/nuxt/overrides",
|
|
260
211
|
files: [...SOURCE_FILES],
|
|
@@ -263,6 +214,6 @@ function nuxt(options = {}) {
|
|
|
263
214
|
return configs;
|
|
264
215
|
}
|
|
265
216
|
//#endregion
|
|
266
|
-
export {
|
|
217
|
+
export { has as a, sourceFiles as c, javascriptRules as d, typescriptRules as f, VUE_FILES as i, test as l, vueRules as n, resolveEnabled as o, ignores as p, TYPESCRIPT_FILES as r, resolveStylisticOptions as s, nuxt as t, stylistic as u };
|
|
267
218
|
|
|
268
|
-
//# sourceMappingURL=nuxt-
|
|
219
|
+
//# sourceMappingURL=nuxt-oec8_Haa.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nuxt-oec8_Haa.mjs","names":["stylisticConfig","testConfig"],"sources":["../src/configs/ignores.ts","../src/configs/shared-rules.ts","../src/configs/stylistic.ts","../src/configs/test.ts","../src/utils.ts","../src/configs/vue-rules.ts","../src/nuxt.ts"],"sourcesContent":["import gitignore from 'eslint-config-flat-gitignore';\n\nimport type { TypedFlatConfigItem } from '../types';\n\nexport function ignores(extraIgnores: string[] = []): TypedFlatConfigItem[] {\n return [\n // Prefer project .gitignore when present; do not fail if missing.\n gitignore({ strict: false }),\n {\n name: 'qstanay/ignores',\n ignores: [\n '**/node_modules/**',\n '**/dist/**',\n '**/.output/**',\n '**/.nuxt/**',\n '**/.nitro/**',\n '**/coverage/**',\n ...extraIgnores,\n ],\n },\n ];\n}\n","import type { Linter } from 'eslint';\n\nexport function javascriptRules(): Linter.RulesRecord {\n return {\n 'no-console': ['error', { allow: ['warn', 'error'] }],\n 'no-debugger': 'error',\n 'eqeqeq': ['error', 'always'],\n 'object-shorthand': ['error', 'always'],\n 'prefer-template': 'error',\n 'curly': ['error', 'all'],\n 'arrow-body-style': ['error', 'as-needed'],\n };\n}\n\nexport function typescriptRules(options: { strict?: boolean } = {}): Linter.RulesRecord {\n const rules: Linter.RulesRecord = {\n // Disable base rules that conflict with TypeScript-aware variants.\n 'no-unused-vars': 'off',\n 'no-undef': 'off',\n\n '@typescript-eslint/no-unused-vars': [\n 'error',\n {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrorsIgnorePattern: '^_',\n destructuredArrayIgnorePattern: '^_',\n },\n ],\n '@typescript-eslint/consistent-type-imports': [\n 'error',\n { prefer: 'type-imports', disallowTypeAnnotations: false },\n ],\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-non-null-assertion': 'error',\n '@typescript-eslint/no-empty-function': ['error', { allow: ['arrowFunctions'] }],\n };\n\n if (options.strict) {\n rules['@typescript-eslint/no-magic-numbers'] = [\n 'warn',\n {\n ignore: [-1, 0, 1, 2, 1000],\n ignoreEnums: true,\n ignoreArrayIndexes: true,\n ignoreDefaultValues: true,\n ignoreClassFieldInitialValues: true,\n ignoreReadonlyClassProperties: true,\n },\n ];\n }\n\n return rules;\n}\n\n/**\n * Shared opinionated rules.\n * TypeScript rules are included only when `typescript` is true,\n * so JS-only projects do not reference a missing plugin.\n */\nexport function sharedRules(options: {\n typescript?: boolean;\n strict?: boolean;\n} = {}): Linter.RulesRecord {\n return {\n ...javascriptRules(),\n ...(options.typescript\n ? typescriptRules({ strict: options.strict })\n : {}),\n };\n}\n","import type { TypedFlatConfigItem, StylisticOptions } from '../types';\n\nasync function loadStylistic() {\n const mod = await import('@stylistic/eslint-plugin');\n return mod.default ?? mod;\n}\n\nexport async function stylistic(\n options: StylisticOptions = {},\n): Promise<TypedFlatConfigItem[]> {\n const {\n indent = 2,\n quotes = 'single',\n semi = true,\n maxLen = 100,\n } = options;\n\n const plugin = await loadStylistic();\n\n // `customize()` gives us a coherent bundle of stylistic rules.\n // Plugin name is fixed to `style` for stable rule IDs.\n const config = plugin.configs.customize({\n indent,\n quotes,\n semi,\n jsx: false,\n pluginName: 'style',\n }) as TypedFlatConfigItem;\n\n return [\n {\n name: 'qstanay/stylistic',\n plugins: {\n style: plugin,\n },\n rules: {\n ...(config.rules ?? {}),\n // Keep max line length aligned across all projects.\n 'style/max-len': [\n 'warn',\n {\n code: maxLen,\n ignoreUrls: true,\n ignoreStrings: true,\n ignoreTemplateLiterals: true,\n ignoreComments: true,\n ignoreTrailingComments: true,\n ignoreRegExpLiterals: true,\n },\n ],\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\nexport const TEST_FILES = [\n '**/__tests__/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/*.{test,spec}.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/tests/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/test/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n] as const;\n\n/**\n * Vitest layer: recommended rules + test globals for common test globs.\n */\nexport async function test(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('@vitest/eslint-plugin');\n const vitest = (mod as any).default ?? mod;\n const globalsMod = await import('globals');\n const globals = (globalsMod as any).default ?? globalsMod;\n\n const recommended = vitest.configs?.recommended ?? {};\n const env = vitest.configs?.env ?? {};\n\n return [\n {\n name: 'qstanay/test',\n files: [...TEST_FILES],\n plugins: {\n vitest,\n },\n languageOptions: {\n globals: {\n ...globals.vitest,\n ...(env.languageOptions?.globals ?? {}),\n },\n },\n rules: {\n ...(recommended.rules ?? {}),\n },\n },\n ];\n}\n","import { isPackageExists } from 'local-pkg';\n\nimport type { StylisticOptions } from './types';\n\nexport function resolveEnabled(explicit: boolean | undefined, detected: boolean) {\n return explicit ?? detected;\n}\n\nexport function has(pkg: string) {\n return isPackageExists(pkg);\n}\n\nexport function resolveStylisticOptions(\n stylistic: boolean | StylisticOptions | undefined,\n): false | StylisticOptions {\n if (stylistic === false) {\n return false;\n }\n\n if (typeof stylistic === 'object') {\n return stylistic;\n }\n\n return {};\n}\n\nconst SCRIPT_FILES = [\n '**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n] as const;\n\nexport const VUE_FILES = ['**/*.vue'] as const;\n\n/** TypeScript sources — never includes `.vue` (Vue keeps its own root parser). */\nexport const TYPESCRIPT_FILES = [\n '**/*.{ts,tsx,cts,mts}',\n] as const;\n\n/**\n * Files that receive shared / override rule packs.\n * `.vue` is included only when Vue support is enabled.\n */\nexport function sourceFiles(vueEnabled: boolean): string[] {\n return vueEnabled\n ? [...SCRIPT_FILES, ...VUE_FILES]\n : [...SCRIPT_FILES];\n}\n\n/** Files that receive shared / override rule packs when Vue is enabled. */\nexport const SOURCE_FILES = [\n '**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts,vue}',\n] as const;\n","import type { Linter } from 'eslint';\n\nexport function vueRules(options: {\n indent?: 2 | 4;\n} = {}): Linter.RulesRecord {\n const rules: Linter.RulesRecord = {\n 'vue/html-self-closing': [\n 'error',\n {\n html: {\n void: 'always',\n normal: 'always',\n component: 'always',\n },\n svg: 'always',\n math: 'always',\n },\n ],\n 'vue/attributes-order': 'error',\n 'vue/padding-line-between-tags': [\n 'error',\n [\n {\n blankLine: 'always',\n prev: '*',\n next: '*',\n },\n ],\n ],\n };\n\n if (options.indent !== undefined) {\n // Keep template indent in sync with @stylistic script indent.\n rules['vue/html-indent'] = ['error', options.indent];\n }\n\n return rules;\n}\n","import { ignores } from './configs/ignores';\nimport {\n javascriptRules,\n typescriptRules,\n} from './configs/shared-rules';\nimport { stylistic as stylisticConfig } from './configs/stylistic';\nimport { test as testConfig } from './configs/test';\nimport { vueRules } from './configs/vue-rules';\nimport {\n has,\n resolveEnabled,\n resolveStylisticOptions,\n SOURCE_FILES,\n TYPESCRIPT_FILES,\n VUE_FILES,\n} from './utils';\n\nimport type { StylisticOptions, TypedFlatConfigItem } from './types';\nimport type { Linter } from 'eslint';\n\nexport interface NuxtPresetOptions {\n stylistic?: boolean | StylisticOptions;\n /**\n * Enable stricter opinionated TypeScript rules (e.g. `no-magic-numbers`).\n */\n strict?: boolean;\n /**\n * Enable Vitest rules/globals for test files.\n * Auto-enabled when `vitest` is installed unless explicitly set.\n */\n test?: boolean;\n overrides?: Linter.RulesRecord;\n /**\n * Extra ignores appended to defaults / `.gitignore`.\n */\n ignores?: string[];\n}\n\n/**\n * Opinionated layer for Nuxt apps.\n *\n * Intended to be used with `@nuxt/eslint` + `withNuxt()`:\n * Nuxt already provides TypeScript/Vue/import plugins, so this preset\n * only adds stylistic formatting and shared opinionated rules.\n */\nexport function nuxt(options: NuxtPresetOptions = {}) {\n const stylisticOptions = resolveStylisticOptions(options.stylistic);\n const enableTest = resolveEnabled(options.test, has('vitest'));\n const vueIndent = stylisticOptions\n ? (stylisticOptions.indent ?? 2)\n : undefined;\n\n const configs: Promise<TypedFlatConfigItem[]>[] = [\n Promise.resolve(ignores(options.ignores)),\n ];\n\n if (stylisticOptions) {\n configs.push(stylisticConfig(stylisticOptions));\n }\n\n if (enableTest) {\n configs.push(testConfig());\n }\n\n // Rules only — do not register `@typescript-eslint` / `vue`.\n // `@nuxt/eslint` already provides those plugins; a second instance\n // (common with pnpm) makes ESLint reject the config.\n configs.push(Promise.resolve([\n {\n name: 'qstanay/nuxt/shared-rules',\n files: [...SOURCE_FILES],\n rules: javascriptRules(),\n },\n {\n name: 'qstanay/nuxt/shared-rules/typescript',\n files: [...TYPESCRIPT_FILES, ...VUE_FILES],\n rules: typescriptRules({ strict: options.strict }),\n },\n {\n name: 'qstanay/nuxt/vue-rules',\n files: [...VUE_FILES],\n rules: {\n ...vueRules({ indent: vueIndent }),\n },\n },\n ]));\n\n if (options.overrides) {\n // Dedicated trailing block so overrides always win over vue/shared rules.\n configs.push(Promise.resolve([\n {\n name: 'qstanay/nuxt/overrides',\n files: [...SOURCE_FILES],\n rules: options.overrides,\n },\n ]));\n }\n\n return configs;\n}\n"],"mappings":";;;AAIA,SAAgB,QAAQ,eAAyB,CAAC,GAA0B;CAC1E,OAAO,CAEL,UAAU,EAAE,QAAQ,MAAM,CAAC,GAC3B;EACE,MAAM;EACN,SAAS;GACP;GACA;GACA;GACA;GACA;GACA;GACA,GAAG;EACL;CACF,CACF;AACF;;;ACnBA,SAAgB,kBAAsC;CACpD,OAAO;EACL,cAAc,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,OAAO,EAAE,CAAC;EACpD,eAAe;EACf,UAAU,CAAC,SAAS,QAAQ;EAC5B,oBAAoB,CAAC,SAAS,QAAQ;EACtC,mBAAmB;EACnB,SAAS,CAAC,SAAS,KAAK;EACxB,oBAAoB,CAAC,SAAS,WAAW;CAC3C;AACF;AAEA,SAAgB,gBAAgB,UAAgC,CAAC,GAAuB;CACtF,MAAM,QAA4B;EAEhC,kBAAkB;EAClB,YAAY;EAEZ,qCAAqC,CACnC,SACA;GACE,mBAAmB;GACnB,mBAAmB;GACnB,2BAA2B;GAC3B,gCAAgC;EAClC,CACF;EACA,8CAA8C,CAC5C,SACA;GAAE,QAAQ;GAAgB,yBAAyB;EAAM,CAC3D;EACA,sCAAsC;EACtC,4CAA4C;EAC5C,wCAAwC,CAAC,SAAS,EAAE,OAAO,CAAC,gBAAgB,EAAE,CAAC;CACjF;CAEA,IAAI,QAAQ,QACV,MAAM,yCAAyC,CAC7C,QACA;EACE,QAAQ;GAAC;GAAI;GAAG;GAAG;GAAG;EAAI;EAC1B,aAAa;EACb,oBAAoB;EACpB,qBAAqB;EACrB,+BAA+B;EAC/B,+BAA+B;CACjC,CACF;CAGF,OAAO;AACT;;;ACnDA,eAAe,gBAAgB;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,OAAO,IAAI,WAAW;AACxB;AAEA,eAAsB,UACpB,UAA4B,CAAC,GACG;CAChC,MAAM,EACJ,SAAS,GACT,SAAS,UACT,OAAO,MACP,SAAS,QACP;CAEJ,MAAM,SAAS,MAAM,cAAc;CAInC,MAAM,SAAS,OAAO,QAAQ,UAAU;EACtC;EACA;EACA;EACA,KAAK;EACL,YAAY;CACd,CAAC;CAED,OAAO,CACL;EACE,MAAM;EACN,SAAS,EACP,OAAO,OACT;EACA,OAAO;GACL,GAAI,OAAO,SAAS,CAAC;GAErB,iBAAiB,CACf,QACA;IACE,MAAM;IACN,YAAY;IACZ,eAAe;IACf,wBAAwB;IACxB,gBAAgB;IAChB,wBAAwB;IACxB,sBAAsB;GACxB,CACF;EACF;CACF,CACF;AACF;;;ACnDA,MAAa,aAAa;CACxB;CACA;CACA;CACA;AACF;;;;AAKA,eAAsB,OAAuC;CAC3D,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,SAAU,IAAY,WAAW;CACvC,MAAM,aAAa,MAAM,OAAO;CAChC,MAAM,UAAW,WAAmB,WAAW;CAE/C,MAAM,cAAc,OAAO,SAAS,eAAe,CAAC;CACpD,MAAM,MAAM,OAAO,SAAS,OAAO,CAAC;CAEpC,OAAO,CACL;EACE,MAAM;EACN,OAAO,CAAC,GAAG,UAAU;EACrB,SAAS,EACP,OACF;EACA,iBAAiB,EACf,SAAS;GACP,GAAG,QAAQ;GACX,GAAI,IAAI,iBAAiB,WAAW,CAAC;EACvC,EACF;EACA,OAAO,EACL,GAAI,YAAY,SAAS,CAAC,EAC5B;CACF,CACF;AACF;;;ACnCA,SAAgB,eAAe,UAA+B,UAAmB;CAC/E,OAAO,YAAY;AACrB;AAEA,SAAgB,IAAI,KAAa;CAC/B,OAAO,gBAAgB,GAAG;AAC5B;AAEA,SAAgB,wBACd,WAC0B;CAC1B,IAAI,cAAc,OAChB,OAAO;CAGT,IAAI,OAAO,cAAc,UACvB,OAAO;CAGT,OAAO,CAAC;AACV;AAEA,MAAM,eAAe,CACnB,sCACF;AAEA,MAAa,YAAY,CAAC,UAAU;;AAGpC,MAAa,mBAAmB,CAC9B,uBACF;;;;;AAMA,SAAgB,YAAY,YAA+B;CACzD,OAAO,aACH,CAAC,GAAG,cAAc,GAAG,SAAS,IAC9B,CAAC,GAAG,YAAY;AACtB;;AAGA,MAAa,eAAe,CAC1B,0CACF;;;AChDA,SAAgB,SAAS,UAErB,CAAC,GAAuB;CAC1B,MAAM,QAA4B;EAChC,yBAAyB,CACvB,SACA;GACE,MAAM;IACJ,MAAM;IACN,QAAQ;IACR,WAAW;GACb;GACA,KAAK;GACL,MAAM;EACR,CACF;EACA,wBAAwB;EACxB,iCAAiC,CAC/B,SACA,CACE;GACE,WAAW;GACX,MAAM;GACN,MAAM;EACR,CACF,CACF;CACF;CAEA,IAAI,QAAQ,WAAW,KAAA,GAErB,MAAM,qBAAqB,CAAC,SAAS,QAAQ,MAAM;CAGrD,OAAO;AACT;;;;;;;;;;ACQA,SAAgB,KAAK,UAA6B,CAAC,GAAG;CACpD,MAAM,mBAAmB,wBAAwB,QAAQ,SAAS;CAClE,MAAM,aAAa,eAAe,QAAQ,MAAM,IAAI,QAAQ,CAAC;CAC7D,MAAM,YAAY,mBACb,iBAAiB,UAAU,IAC5B,KAAA;CAEJ,MAAM,UAA4C,CAChD,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,CAAC,CAC1C;CAEA,IAAI,kBACF,QAAQ,KAAKA,UAAgB,gBAAgB,CAAC;CAGhD,IAAI,YACF,QAAQ,KAAKC,KAAW,CAAC;CAM3B,QAAQ,KAAK,QAAQ,QAAQ;EAC3B;GACE,MAAM;GACN,OAAO,CAAC,GAAG,YAAY;GACvB,OAAO,gBAAgB;EACzB;EACA;GACE,MAAM;GACN,OAAO,CAAC,GAAG,kBAAkB,GAAG,SAAS;GACzC,OAAO,gBAAgB,EAAE,QAAQ,QAAQ,OAAO,CAAC;EACnD;EACA;GACE,MAAM;GACN,OAAO,CAAC,GAAG,SAAS;GACpB,OAAO,EACL,GAAG,SAAS,EAAE,QAAQ,UAAU,CAAC,EACnC;EACF;CACF,CAAC,CAAC;CAEF,IAAI,QAAQ,WAEV,QAAQ,KAAK,QAAQ,QAAQ,CAC3B;EACE,MAAM;EACN,OAAO,CAAC,GAAG,YAAY;EACvB,OAAO,QAAQ;CACjB,CACF,CAAC,CAAC;CAGJ,OAAO;AACT"}
|
package/dist/nuxt.mjs
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as nuxt } from "./nuxt-
|
|
1
|
+
import { t as nuxt } from "./nuxt-oec8_Haa.mjs";
|
|
2
2
|
export { nuxt };
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"nuxt-dkt3q_AQ.mjs","names":["stylisticConfig","testConfig"],"sources":["../src/configs/ignores.ts","../src/configs/shared-rules.ts","../src/configs/stylistic.ts","../src/configs/test.ts","../src/utils.ts","../src/configs/typescript.ts","../src/configs/vue-rules.ts","../src/nuxt.ts"],"sourcesContent":["import gitignore from 'eslint-config-flat-gitignore';\n\nimport type { TypedFlatConfigItem } from '../types';\n\nexport function ignores(extraIgnores: string[] = []): TypedFlatConfigItem[] {\n return [\n // Prefer project .gitignore when present; do not fail if missing.\n gitignore({ strict: false }),\n {\n name: 'qstanay/ignores',\n ignores: [\n '**/node_modules/**',\n '**/dist/**',\n '**/.output/**',\n '**/.nuxt/**',\n '**/.nitro/**',\n '**/coverage/**',\n ...extraIgnores,\n ],\n },\n ];\n}\n","import type { Linter } from 'eslint';\n\nexport function javascriptRules(): Linter.RulesRecord {\n return {\n 'no-console': ['error', { allow: ['warn', 'error'] }],\n 'no-debugger': 'error',\n 'eqeqeq': ['error', 'always'],\n 'object-shorthand': ['error', 'always'],\n 'prefer-template': 'error',\n 'curly': ['error', 'all'],\n 'arrow-body-style': ['error', 'as-needed'],\n };\n}\n\nexport function typescriptRules(options: { strict?: boolean } = {}): Linter.RulesRecord {\n const rules: Linter.RulesRecord = {\n // Disable base rules that conflict with TypeScript-aware variants.\n 'no-unused-vars': 'off',\n 'no-undef': 'off',\n\n '@typescript-eslint/no-unused-vars': [\n 'error',\n {\n argsIgnorePattern: '^_',\n varsIgnorePattern: '^_',\n caughtErrorsIgnorePattern: '^_',\n destructuredArrayIgnorePattern: '^_',\n },\n ],\n '@typescript-eslint/consistent-type-imports': [\n 'error',\n { prefer: 'type-imports', disallowTypeAnnotations: false },\n ],\n '@typescript-eslint/no-explicit-any': 'warn',\n '@typescript-eslint/no-non-null-assertion': 'error',\n '@typescript-eslint/no-empty-function': ['error', { allow: ['arrowFunctions'] }],\n };\n\n if (options.strict) {\n rules['@typescript-eslint/no-magic-numbers'] = [\n 'warn',\n {\n ignore: [-1, 0, 1, 2, 1000],\n ignoreEnums: true,\n ignoreArrayIndexes: true,\n ignoreDefaultValues: true,\n ignoreClassFieldInitialValues: true,\n ignoreReadonlyClassProperties: true,\n },\n ];\n }\n\n return rules;\n}\n\n/**\n * Shared opinionated rules.\n * TypeScript rules are included only when `typescript` is true,\n * so JS-only projects do not reference a missing plugin.\n */\nexport function sharedRules(options: {\n typescript?: boolean;\n strict?: boolean;\n} = {}): Linter.RulesRecord {\n return {\n ...javascriptRules(),\n ...(options.typescript\n ? typescriptRules({ strict: options.strict })\n : {}),\n };\n}\n","import type { TypedFlatConfigItem, StylisticOptions } from '../types';\n\nasync function loadStylistic() {\n const mod = await import('@stylistic/eslint-plugin');\n return mod.default ?? mod;\n}\n\nexport async function stylistic(\n options: StylisticOptions = {},\n): Promise<TypedFlatConfigItem[]> {\n const {\n indent = 2,\n quotes = 'single',\n semi = true,\n maxLen = 100,\n } = options;\n\n const plugin = await loadStylistic();\n\n // `customize()` gives us a coherent bundle of stylistic rules.\n // Plugin name is fixed to `style` for stable rule IDs.\n const config = plugin.configs.customize({\n indent,\n quotes,\n semi,\n jsx: false,\n pluginName: 'style',\n }) as TypedFlatConfigItem;\n\n return [\n {\n name: 'qstanay/stylistic',\n plugins: {\n style: plugin,\n },\n rules: {\n ...(config.rules ?? {}),\n // Keep max line length aligned across all projects.\n 'style/max-len': [\n 'warn',\n {\n code: maxLen,\n ignoreUrls: true,\n ignoreStrings: true,\n ignoreTemplateLiterals: true,\n ignoreComments: true,\n ignoreTrailingComments: true,\n ignoreRegExpLiterals: true,\n },\n ],\n },\n },\n ];\n}\n","import type { TypedFlatConfigItem } from '../types';\n\nexport const TEST_FILES = [\n '**/__tests__/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/*.{test,spec}.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/tests/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n '**/test/**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n] as const;\n\n/**\n * Vitest layer: recommended rules + test globals for common test globs.\n */\nexport async function test(): Promise<TypedFlatConfigItem[]> {\n const mod = await import('@vitest/eslint-plugin');\n const vitest = (mod as any).default ?? mod;\n const globalsMod = await import('globals');\n const globals = (globalsMod as any).default ?? globalsMod;\n\n const recommended = vitest.configs?.recommended ?? {};\n const env = vitest.configs?.env ?? {};\n\n return [\n {\n name: 'qstanay/test',\n files: [...TEST_FILES],\n plugins: {\n vitest,\n },\n languageOptions: {\n globals: {\n ...globals.vitest,\n ...(env.languageOptions?.globals ?? {}),\n },\n },\n rules: {\n ...(recommended.rules ?? {}),\n },\n },\n ];\n}\n","import { isPackageExists } from 'local-pkg';\n\nimport type { StylisticOptions } from './types';\n\nexport function resolveEnabled(explicit: boolean | undefined, detected: boolean) {\n return explicit ?? detected;\n}\n\nexport function has(pkg: string) {\n return isPackageExists(pkg);\n}\n\nexport function resolveStylisticOptions(\n stylistic: boolean | StylisticOptions | undefined,\n): false | StylisticOptions {\n if (stylistic === false) {\n return false;\n }\n\n if (typeof stylistic === 'object') {\n return stylistic;\n }\n\n return {};\n}\n\nconst SCRIPT_FILES = [\n '**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts}',\n] as const;\n\nexport const VUE_FILES = ['**/*.vue'] as const;\n\n/** TypeScript sources — never includes `.vue` (Vue keeps its own root parser). */\nexport const TYPESCRIPT_FILES = [\n '**/*.{ts,tsx,cts,mts}',\n] as const;\n\n/**\n * Files that receive shared / override rule packs.\n * `.vue` is included only when Vue support is enabled.\n */\nexport function sourceFiles(vueEnabled: boolean): string[] {\n return vueEnabled\n ? [...SCRIPT_FILES, ...VUE_FILES]\n : [...SCRIPT_FILES];\n}\n\n/** Files that receive shared / override rule packs when Vue is enabled. */\nexport const SOURCE_FILES = [\n '**/*.{js,mjs,cjs,jsx,ts,tsx,cts,mts,vue}',\n] as const;\n","import { TYPESCRIPT_FILES, VUE_FILES } from '../utils';\n\nimport type { TypedFlatConfigItem } from '../types';\nimport type { Linter } from 'eslint';\n\nfunction collectRules(configs: TypedFlatConfigItem[]): Linter.RulesRecord {\n return Object.assign(\n {},\n ...configs\n .filter(config => config.rules)\n .map(config => config.rules),\n );\n}\n\nexport async function loadTypescriptPlugin() {\n const pluginMod = await import('@typescript-eslint/eslint-plugin');\n return (pluginMod as any).default ?? pluginMod;\n}\n\n/**\n * TypeScript layer.\n *\n * Important: `@typescript-eslint/parser` is never the root parser for `.vue`.\n * Vue SFCs keep `vue-eslint-parser` as root (from the Vue layer) and use the\n * TS parser only as a nested script parser.\n *\n * Flat config requires the plugin on every object that references\n * `@typescript-eslint/*` rules (see shared-rules / overrides too).\n */\nexport async function typescript(options: {\n vue?: boolean;\n} = {}): Promise<TypedFlatConfigItem[]> {\n const parserMod = await import('@typescript-eslint/parser');\n const plugin = await loadTypescriptPlugin();\n const parser = (parserMod as any).default ?? parserMod;\n\n const recommended = (plugin.configs?.['flat/recommended'] ?? []) as TypedFlatConfigItem[];\n const rules = collectRules(recommended);\n\n const configs: TypedFlatConfigItem[] = [\n {\n name: 'qstanay/typescript',\n files: [...TYPESCRIPT_FILES],\n languageOptions: {\n parser,\n parserOptions: {\n sourceType: 'module',\n ecmaVersion: 'latest',\n },\n },\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules,\n },\n ];\n\n if (options.vue) {\n configs.push({\n name: 'qstanay/typescript/vue-rules',\n files: [...VUE_FILES],\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules,\n });\n }\n\n return configs;\n}\n","import type { Linter } from 'eslint';\n\nexport function vueRules(options: {\n indent?: 2 | 4;\n} = {}): Linter.RulesRecord {\n const rules: Linter.RulesRecord = {\n 'vue/html-self-closing': [\n 'error',\n {\n html: {\n void: 'always',\n normal: 'always',\n component: 'always',\n },\n svg: 'always',\n math: 'always',\n },\n ],\n 'vue/attributes-order': 'error',\n 'vue/padding-line-between-tags': [\n 'error',\n [\n {\n blankLine: 'always',\n prev: '*',\n next: '*',\n },\n ],\n ],\n };\n\n if (options.indent !== undefined) {\n // Keep template indent in sync with @stylistic script indent.\n rules['vue/html-indent'] = ['error', options.indent];\n }\n\n return rules;\n}\n","import { ignores } from './configs/ignores';\nimport {\n javascriptRules,\n typescriptRules,\n} from './configs/shared-rules';\nimport { stylistic as stylisticConfig } from './configs/stylistic';\nimport { test as testConfig } from './configs/test';\nimport { loadTypescriptPlugin } from './configs/typescript';\nimport { vueRules } from './configs/vue-rules';\nimport {\n has,\n resolveEnabled,\n resolveStylisticOptions,\n SOURCE_FILES,\n TYPESCRIPT_FILES,\n VUE_FILES,\n} from './utils';\n\nimport type { StylisticOptions, TypedFlatConfigItem } from './types';\nimport type { Linter } from 'eslint';\n\nexport interface NuxtPresetOptions {\n stylistic?: boolean | StylisticOptions;\n /**\n * Enable stricter opinionated TypeScript rules (e.g. `no-magic-numbers`).\n */\n strict?: boolean;\n /**\n * Enable Vitest rules/globals for test files.\n * Auto-enabled when `vitest` is installed unless explicitly set.\n */\n test?: boolean;\n overrides?: Linter.RulesRecord;\n /**\n * Extra ignores appended to defaults / `.gitignore`.\n */\n ignores?: string[];\n}\n\n/**\n * Opinionated layer for Nuxt apps.\n *\n * Intended to be used with `@nuxt/eslint` + `withNuxt()`:\n * Nuxt already provides TypeScript/Vue/import plugins, so this preset\n * only adds stylistic formatting and shared opinionated rules.\n */\nexport function nuxt(options: NuxtPresetOptions = {}) {\n const stylisticOptions = resolveStylisticOptions(options.stylistic);\n const enableTest = resolveEnabled(options.test, has('vitest'));\n const vueIndent = stylisticOptions\n ? (stylisticOptions.indent ?? 2)\n : undefined;\n\n const configs: Promise<TypedFlatConfigItem[]>[] = [\n Promise.resolve(ignores(options.ignores)),\n ];\n\n if (stylisticOptions) {\n configs.push(stylisticConfig(stylisticOptions));\n }\n\n if (enableTest) {\n configs.push(testConfig());\n }\n\n configs.push((async () => {\n // Register plugin explicitly so the preset also works when tested standalone.\n // In real Nuxt apps `@nuxt/eslint` already provides it (duplicate name is fine).\n const plugin = await loadTypescriptPlugin();\n\n return [\n {\n name: 'qstanay/nuxt/shared-rules',\n files: [...SOURCE_FILES],\n rules: javascriptRules(),\n },\n {\n name: 'qstanay/nuxt/shared-rules/typescript',\n files: [...TYPESCRIPT_FILES, ...VUE_FILES],\n plugins: {\n '@typescript-eslint': plugin,\n },\n rules: typescriptRules({ strict: options.strict }),\n },\n {\n name: 'qstanay/nuxt/vue-rules',\n files: [...VUE_FILES],\n rules: {\n ...vueRules({ indent: vueIndent }),\n },\n },\n ];\n })());\n\n if (options.overrides) {\n // Dedicated trailing block so overrides always win over vue/shared rules.\n configs.push(Promise.resolve([\n {\n name: 'qstanay/nuxt/overrides',\n files: [...SOURCE_FILES],\n rules: options.overrides,\n },\n ]));\n }\n\n return configs;\n}\n"],"mappings":"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"}
|