@homer0/oxlint-config 1.0.3 → 2.0.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/README.md CHANGED
@@ -25,12 +25,12 @@ Create an `oxlint.config.ts` file and export one composed config.
25
25
  import { createConfig } from '@homer0/oxlint-config';
26
26
 
27
27
  export default createConfig({
28
- configs: ['node'],
28
+ env: 'node',
29
29
  tests: 'directory',
30
30
  });
31
31
  ```
32
32
 
33
- `configs` accepts exactly one environment: `node` or `browser`. Native TypeScript policy is enabled by default; set `ts: false` to disable it. It does not enable type-aware rules or require the TypeScript compiler.
33
+ `env` selects one environment: `node` or `browser`. Native TypeScript policy is enabled by default; set `ts: false` to disable it. It does not enable type-aware rules or require the TypeScript compiler.
34
34
 
35
35
  ### Browser
36
36
 
@@ -38,32 +38,32 @@ export default createConfig({
38
38
  import { createConfig } from '@homer0/oxlint-config';
39
39
 
40
40
  export default createConfig({
41
- configs: ['browser'],
41
+ env: 'browser',
42
42
  });
43
43
  ```
44
44
 
45
45
  ### React
46
46
 
47
- Use `createReactConfig` with the same options to add React, JSX accessibility, and React-performance rules.
47
+ Use `createConfig` and send the `react` option to add React, JSX accessibility, and React-performance rules.
48
48
 
49
49
  ```ts
50
- import { createReactConfig } from '@homer0/oxlint-config';
50
+ import { createConfig } from '@homer0/oxlint-config';
51
51
 
52
- export default createReactConfig({
53
- configs: ['browser'],
54
- tests: 'colocated',
52
+ export default createConfig({
53
+ env: 'browser',
54
+ react: true,
55
55
  });
56
56
  ```
57
57
 
58
58
  ### Tests
59
59
 
60
- | `tests` value | Matching files | Environment and TypeScript policy |
61
- | ------------------ | --------------------------------------------- | ------------------------------------------------------------------------------------- |
62
- | Omitted or `false` | None | No test override. |
63
- | `true` | Both `*.test`/`*.spec` files and `tests/**` | Uses production settings and Vitest rules. |
64
- | `'colocated'` | `*.test` and `*.spec` files | Uses production settings and Vitest rules. |
65
- | `'directory'` | `tests/**` | Uses production settings and Vitest rules. |
66
- | Object | Built-in `files` convention or custom glob(s) | Uses custom `configs` and `ts`, or production settings by default, with Vitest rules. |
60
+ | `tests` value | Matching files | Environment and TypeScript policy |
61
+ | ------------------ | --------------------------------------------- | --------------------------------------------------------------------------------- |
62
+ | Omitted or `false` | None | No test override. |
63
+ | `true` | Both `*.test`/`*.spec` files and `tests/**` | Uses production settings and Vitest rules. |
64
+ | `'colocated'` | `*.test` and `*.spec` files | Uses production settings and Vitest rules. |
65
+ | `'directory'` | `tests/**` | Uses production settings and Vitest rules. |
66
+ | Object | Built-in `files` convention or custom glob(s) | Uses custom `env` and `ts`, or production settings by default, with Vitest rules. |
67
67
 
68
68
  A browser project can use Node TypeScript policy for its tests without changing production rules:
69
69
 
@@ -71,21 +71,93 @@ A browser project can use Node TypeScript policy for its tests without changing
71
71
  import { createConfig } from '@homer0/oxlint-config';
72
72
 
73
73
  export default createConfig({
74
- configs: ['browser'],
74
+ env: 'browser',
75
+ tests: {
76
+ env: 'node',
77
+ files: 'directory',
78
+ },
79
+ });
80
+ ```
81
+
82
+ ### Overrides
83
+
84
+ Use `overrides` to change root rules, apply policy to matching files, or select a different environment for a file group. A rule-settings object extends the root policy and generated test policy:
85
+
86
+ ```ts
87
+ export default createConfig({
88
+ env: 'node',
89
+ overrides: {
90
+ 'max-classes-per-file': ['warn', 3],
91
+ },
92
+ });
93
+ ```
94
+
95
+ Use an array to mix root rule settings with file overrides:
96
+
97
+ ```ts
98
+ export default createConfig({
99
+ env: 'browser',
100
+ overrides: [
101
+ {
102
+ 'max-classes-per-file': ['warn', 3],
103
+ },
104
+ {
105
+ files: ['src/**/*.dtos.ts'],
106
+ ignores: ['src/special.dtos.ts'],
107
+ rules: {
108
+ 'no-magic-numbers': 'warn',
109
+ },
110
+ },
111
+ {
112
+ env: 'node',
113
+ files: ['utils/plugins/**/*.ts'],
114
+ tests: {
115
+ files: ['utils/plugins/**/*.test.ts'],
116
+ },
117
+ },
118
+ ],
75
119
  tests: {
76
- configs: ['node'],
120
+ env: 'node',
77
121
  files: 'directory',
78
122
  },
79
123
  });
80
124
  ```
81
125
 
126
+ Root `ignores` exclude files from linting. Override `ignores` exclude matching files only from that override. Override tests require explicit file glob(s) and generate a sibling test override using the parent override's environment by default.
127
+
128
+ ### Globals
129
+
130
+ Use `globals` to add named globals or `$`-prefixed global groups from the [`globals`](https://www.npmjs.com/package/globals) package. Named globals use Oxlint's `'readonly'`, `'writable'`, or `'off'` modes; `true` makes a named global writable. Groups use `true`. Added globals also apply to generated test overrides.
131
+
132
+ ```ts
133
+ export default createConfig({
134
+ env: 'node',
135
+ globals: {
136
+ $browser: true,
137
+ __piMcpState: 'readonly',
138
+ },
139
+ tests: 'directory',
140
+ });
141
+ ```
142
+
143
+ ### Allowed dangling underscores
144
+
145
+ Use `allowedDangleNames` to add exact identifiers to the base `no-underscore-dangle` allow-list. The built-in `__` entry remains allowed, and added names also apply to generated test overrides.
146
+
147
+ ```ts
148
+ export default createConfig({
149
+ allowedDangleNames: ['__piMcpState'],
150
+ env: 'node',
151
+ });
152
+ ```
153
+
82
154
  ### JSDoc
83
155
 
84
156
  Set `jsdoc: true` to opt into Oxlint's native JSDoc subset. It covers JSDoc access, tag, parameter, property, and return declarations; rules without a native equivalent remain omitted.
85
157
 
86
158
  ```ts
87
159
  export default createConfig({
88
- configs: ['node'],
160
+ env: 'node',
89
161
  jsdoc: true,
90
162
  ts: true,
91
163
  });
@@ -114,7 +186,7 @@ pnpm add --save-dev oxlint-tsgolint typescript
114
186
 
115
187
  ```ts
116
188
  export default createConfig({
117
- configs: ['node'],
189
+ env: 'node',
118
190
  ts: true,
119
191
  typeAware: true,
120
192
  });
@@ -126,7 +198,7 @@ Use `extensions` to add supported native rule settings without manually merging
126
198
 
127
199
  ```ts
128
200
  createConfig({
129
- configs: ['node'],
201
+ env: 'node',
130
202
  extensions: {
131
203
  typescript: {
132
204
  rules: {
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import e from"globals";const t=[`coverage/`,`coverage-*/`,`dist/`,`node_modules/`],n={colocated:[`**/*.{test,spec}.{js,jsx,ts,tsx,mjs,cjs,mts,cts}`],directory:[`tests/**/*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}`]},r={"array-callback-return":[`error`,{allowImplicit:!0}],"block-scoped-var":`error`,complexity:[`warn`,30],"consistent-return":`error`,curly:`off`,"default-case":[`error`,{commentPattern:`^no default$`}],"default-case-last":`error`,"default-param-last":`error`,"dot-notation":[`error`,{allowKeywords:!0}],eqeqeq:[`error`,`always`,{null:`ignore`}],"grouped-accessor-pairs":`error`,"guard-for-in":`error`,"max-classes-per-file":[`error`,1],"no-alert":`warn`,"no-caller":`error`,"no-case-declarations":`error`,"no-constructor-return":`error`,"no-else-return":[`error`,{allowElseIf:!1}],"no-empty-function":[`error`,{allow:[`arrowFunctions`,`functions`,`methods`]}],"no-empty-pattern":`error`,"no-eval":`error`,"no-extend-native":`error`,"no-extra-bind":`error`,"no-extra-label":`error`,"no-fallthrough":`error`,"no-global-assign":[`error`,{exceptions:[]}],"no-implied-eval":`error`,"no-iterator":`error`,"no-labels":[`error`,{allowLoop:!1,allowSwitch:!1}],"no-lone-blocks":`error`,"no-loop-func":`error`,"no-magic-numbers":[`error`,{ignore:[0,1,-1,60,100,1e3],ignoreArrayIndexes:!0,enforceConst:!1,detectObjects:!1}],"no-multi-str":`error`,"no-new":`error`,"no-new-func":`error`,"no-new-wrappers":`error`,"no-nonoctal-decimal-escape":`error`,"no-param-reassign":[`error`,{props:!0,ignorePropertyModificationsFor:[`acc`,`accumulator`,`e`,`ctx`,`context`,`req`,`request`,`res`,`response`,`$scope`,`staticContext`,`state`,`ref`,`sacc`]}],"no-proto":`error`,"no-redeclare":`error`,"no-restricted-properties":[`error`,{object:`arguments`,property:`callee`,message:`arguments.callee is deprecated`},{object:`global`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`self`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`window`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`global`,property:`isNaN`,message:`Please use Number.isNaN instead`},{object:`self`,property:`isNaN`,message:`Please use Number.isNaN instead`},{object:`window`,property:`isNaN`,message:`Please use Number.isNaN instead`},{property:`__defineGetter__`,message:`Please use Object.defineProperty instead.`},{property:`__defineSetter__`,message:`Please use Object.defineProperty instead.`},{object:`Math`,property:`pow`,message:`Use the exponentiation operator (**) instead.`}],"no-return-assign":[`error`,`always`],"no-script-url":`error`,"no-self-assign":[`error`,{props:!0}],"no-self-compare":`error`,"no-sequences":`error`,"no-throw-literal":`error`,"no-unmodified-loop-condition":`error`,"no-unused-expressions":[`error`,{allowShortCircuit:!1,allowTernary:!1,allowTaggedTemplates:!1}],"no-unused-labels":`error`,"no-useless-call":`error`,"no-useless-catch":`error`,"no-useless-concat":`error`,"no-useless-return":`error`,"no-void":`error`,"no-with":`error`,"prefer-promise-reject-errors":[`error`,{allowEmptyReject:!0}],"prefer-regex-literals":[`error`,{disallowRedundantWrapping:!0}],radix:`error`,"vars-on-top":`error`,yoda:`error`,"for-direction":`error`,"getter-return":[`error`,{allowImplicit:!0}],"no-async-promise-executor":`error`,"no-compare-neg-zero":`error`,"no-cond-assign":[`error`,`always`],"no-console":`warn`,"no-control-regex":`error`,"no-debugger":`error`,"no-dupe-else-if":`error`,"no-dupe-keys":`error`,"no-duplicate-case":`error`,"no-empty":`error`,"no-empty-character-class":`error`,"no-ex-assign":`error`,"no-extra-boolean-cast":`error`,"no-func-assign":`error`,"no-import-assign":`error`,"no-inner-declarations":`error`,"no-invalid-regexp":`error`,"no-irregular-whitespace":`error`,"no-loss-of-precision":`error`,"no-misleading-character-class":`error`,"no-obj-calls":`error`,"no-promise-executor-return":`error`,"no-prototype-builtins":`error`,"no-regex-spaces":`error`,"no-setter-return":`error`,"no-sparse-arrays":`error`,"no-template-curly-in-string":`error`,"no-unexpected-multiline":`off`,"no-unreachable":`error`,"no-unreachable-loop":[`error`,{ignore:[]}],"no-unsafe-finally":`error`,"no-unsafe-negation":`error`,"no-unsafe-optional-chaining":[`error`,{disallowArithmeticOperators:!0}],"no-useless-backreference":`error`,"use-isnan":`error`,"valid-typeof":[`error`,{requireStringLiterals:!0}],"func-names":`warn`,"new-cap":[`error`,{newIsCap:!0,newIsCapExceptions:[],capIsNew:!1,capIsNewExceptions:[`Immutable.Map`,`Immutable.Set`,`Immutable.List`]}],"no-array-constructor":`error`,"no-bitwise":`error`,"no-continue":`error`,"no-lonely-if":`error`,"no-multi-assign":[`error`],"no-nested-ternary":`error`,"no-underscore-dangle":[`error`,{allow:[`__`],allowAfterThis:!0,allowAfterSuper:!0,enforceInMethodNames:!1}],"no-unneeded-ternary":[`error`,{defaultAssignment:!1}],"operator-assignment":[`error`,`always`],"prefer-exponentiation-operator":`error`,"prefer-object-spread":`error`,"unicode-bom":[`error`,`never`],"no-delete-var":`error`,"no-label-var":`error`,"no-shadow":`error`,"no-shadow-restricted-names":`error`,"no-undef":`error`,"no-unused-vars":[`error`,{vars:`all`,args:`after-used`,ignoreRestSiblings:!0}],"no-use-before-define":[`error`,{functions:!0,classes:!0,variables:!0}],"arrow-body-style":[`error`,`as-needed`,{requireReturnForObjectLiteral:!1}],"constructor-super":`error`,"no-class-assign":`error`,"no-const-assign":`error`,"no-dupe-class-members":`error`,"no-restricted-exports":[`error`,{restrictedNamedExports:[`default`,`then`]}],"no-this-before-super":`error`,"no-useless-computed-key":`error`,"no-useless-constructor":`error`,"no-useless-rename":[`error`,{ignoreDestructuring:!1,ignoreImport:!1,ignoreExport:!1}],"no-var":`error`,"object-shorthand":[`error`,`always`,{ignoreConstructors:!1,avoidQuotes:!0}],"prefer-arrow-callback":[`error`,{allowNamedFunctions:!1,allowUnboundThis:!0}],"prefer-const":[`error`,{destructuring:`any`,ignoreReadBeforeAssign:!0}],"prefer-destructuring":[`error`,{VariableDeclarator:{array:!1,object:!0},AssignmentExpression:{array:!0,object:!1}},{enforceForRenamedProperties:!1}],"prefer-numeric-literals":`error`,"prefer-rest-params":`error`,"prefer-spread":`error`,"prefer-template":`error`,"require-yield":`error`,"symbol-description":`error`,"import/named":`error`,"import/export":`error`,"import/no-named-as-default":`error`,"import/no-named-as-default-member":`error`,"import/no-mutable-exports":`error`,"import/no-amd":`error`,"import/first":`error`,"import/no-duplicates":`error`,"import/extensions":[`error`,`ignorePackages`,{js:`never`,mjs:`never`,jsx:`never`}],"import/newline-after-import":`error`,"import/no-absolute-path":`error`,"import/no-dynamic-require":`error`,"import/no-webpack-loader-syntax":`error`,"import/no-named-default":`error`,"import/no-self-import":`error`,"import/no-cycle":[`error`,{maxDepth:4294967295}]},i={},a={"jsdoc/check-access":`error`,"jsdoc/check-property-names":`error`,"jsdoc/check-tag-names":`error`,"jsdoc/implements-on-classes":`error`,"jsdoc/require-param":`error`,"jsdoc/require-param-description":`error`,"jsdoc/require-param-name":`error`,"jsdoc/require-param-type":`error`,"jsdoc/require-property":`error`,"jsdoc/require-property-description":`error`,"jsdoc/require-property-name":`error`,"jsdoc/require-property-type":`error`,"jsdoc/require-returns":`error`,"jsdoc/require-returns-type":`error`},o={"nextjs/google-font-display":`warn`,"nextjs/google-font-preconnect":`warn`,"nextjs/inline-script-id":`error`,"nextjs/next-script-for-ga":`warn`,"nextjs/no-assign-module-variable":`error`,"nextjs/no-async-client-component":`warn`,"nextjs/no-before-interactive-script-outside-document":`warn`,"nextjs/no-css-tags":`warn`,"nextjs/no-document-import-in-page":`error`,"nextjs/no-duplicate-head":`error`,"nextjs/no-head-element":`warn`,"nextjs/no-head-import-in-document":`error`,"nextjs/no-html-link-for-pages":`error`,"nextjs/no-img-element":`warn`,"nextjs/no-page-custom-font":`warn`,"nextjs/no-script-component-in-head":`error`,"nextjs/no-styled-jsx-in-document":`warn`,"nextjs/no-sync-scripts":`error`,"nextjs/no-title-in-document-head":`warn`,"nextjs/no-typos":`warn`,"nextjs/no-unwanted-polyfillio":`warn`},s={"node/no-exports-assign":`error`,"node/global-require":`error`,"node/handle-callback-err":[`error`,`^(err|error|\\w+Error)$`],"node/no-mixed-requires":`error`,"node/no-new-require":`error`,"node/no-path-concat":`error`,"node/no-process-env":`error`},c={"jsx-a11y/alt-text":`error`,"jsx-a11y/anchor-has-content":`error`,"jsx-a11y/anchor-is-valid":`error`,"jsx-a11y/aria-activedescendant-has-tabindex":`error`,"jsx-a11y/aria-props":`error`,"jsx-a11y/aria-proptypes":`error`,"jsx-a11y/aria-role":`error`,"jsx-a11y/aria-unsupported-elements":`error`,"jsx-a11y/autocomplete-valid":`error`,"jsx-a11y/click-events-have-key-events":`error`,"jsx-a11y/control-has-associated-label":`error`,"jsx-a11y/heading-has-content":`error`,"jsx-a11y/html-has-lang":`error`,"jsx-a11y/iframe-has-title":`error`,"jsx-a11y/img-redundant-alt":`error`,"jsx-a11y/interactive-supports-focus":[`error`,{tabbable:[`button`,`checkbox`,`link`,`searchbox`,`spinbutton`,`switch`,`textbox`]}],"jsx-a11y/label-has-associated-control":`error`,"jsx-a11y/media-has-caption":`error`,"jsx-a11y/mouse-events-have-key-events":`error`,"jsx-a11y/no-access-key":`error`,"jsx-a11y/no-autofocus":`error`,"jsx-a11y/no-distracting-elements":`error`,"jsx-a11y/no-interactive-element-to-noninteractive-role":[`error`,{tr:[`none`,`presentation`],canvas:[`img`]}],"jsx-a11y/no-noninteractive-element-interactions":[`error`,{handlers:[`onClick`,`onError`,`onLoad`,`onMouseDown`,`onMouseUp`,`onKeyPress`,`onKeyDown`,`onKeyUp`],alert:[`onKeyUp`,`onKeyDown`,`onKeyPress`],body:[`onError`,`onLoad`],dialog:[`onKeyUp`,`onKeyDown`,`onKeyPress`],iframe:[`onError`,`onLoad`],img:[`onError`,`onLoad`]}],"jsx-a11y/no-noninteractive-element-to-interactive-role":[`error`,{ul:[`listbox`,`menu`,`menubar`,`radiogroup`,`tablist`,`tree`,`treegrid`],ol:[`listbox`,`menu`,`menubar`,`radiogroup`,`tablist`,`tree`,`treegrid`],li:[`menuitem`,`menuitemradio`,`menuitemcheckbox`,`option`,`row`,`tab`,`treeitem`],table:[`grid`],td:[`gridcell`],fieldset:[`radiogroup`,`presentation`]}],"jsx-a11y/no-noninteractive-tabindex":[`error`,{tags:[],roles:[`tabpanel`],allowExpressionValues:!0}],"jsx-a11y/no-redundant-roles":`error`,"jsx-a11y/no-static-element-interactions":[`error`,{allowExpressionValues:!0,handlers:[`onClick`,`onMouseDown`,`onMouseUp`,`onKeyPress`,`onKeyDown`,`onKeyUp`]}],"jsx-a11y/role-has-required-aria-props":`error`,"jsx-a11y/role-supports-aria-props":`error`,"jsx-a11y/scope":`error`,"jsx-a11y/tabindex-no-positive":`error`,"react/display-name":2,"react/jsx-key":2,"react/jsx-no-comment-textnodes":2,"react/jsx-no-duplicate-props":2,"react/jsx-no-target-blank":2,"react/jsx-no-undef":2,"react/no-children-prop":2,"react/no-danger-with-children":2,"react/no-direct-mutation-state":2,"react/no-find-dom-node":2,"react/no-is-mounted":2,"react/no-render-return-value":2,"react/no-string-refs":2,"react/no-unescaped-entities":2,"react/no-unknown-property":2,"react/require-render-return":2,"react/rules-of-hooks":`error`,"react/exhaustive-deps":`warn`,"react-perf/jsx-no-new-array-as-prop":`error`,"react-perf/jsx-no-new-function-as-prop":`error`,"react-perf/jsx-no-new-object-as-prop":`error`,"no-use-before-define":`off`},l={"max-classes-per-file":`off`,"no-magic-numbers":`off`,"import/first":`off`},u={"typescript/no-deprecated":`error`,"typescript/no-floating-promises":`error`,"typescript/no-misused-promises":`error`},d={"typescript/ban-ts-comment":[`error`,{"ts-expect-error":`allow-with-description`,"ts-ignore":`allow-with-description`,"ts-nocheck":`allow-with-description`,"ts-check":`allow-with-description`}],"typescript/no-array-constructor":`error`,"typescript/no-duplicate-enum-values":`error`,"typescript/no-empty-object-type":`error`,"typescript/no-explicit-any":`error`,"typescript/no-extra-non-null-assertion":`error`,"typescript/no-misused-new":`error`,"typescript/no-namespace":`error`,"typescript/no-non-null-asserted-optional-chain":`error`,"typescript/no-require-imports":`error`,"typescript/no-this-alias":`error`,"typescript/no-unnecessary-type-constraint":`error`,"typescript/no-unsafe-declaration-merging":`error`,"typescript/no-unsafe-function-type":`error`,"typescript/no-unused-expressions":`error`,"typescript/no-unused-vars":`error`,"typescript/no-wrapper-object-types":`error`,"typescript/prefer-as-const":`error`,"typescript/prefer-namespace-keyword":`error`,"typescript/triple-slash-reference":`error`,"typescript/dot-notation":`error`,"no-array-constructor":`off`,"no-empty-function":`off`,"dot-notation":`off`,"no-unused-expressions":`off`,"no-unused-vars":`off`,"no-useless-constructor":`off`,"import/extensions":`off`},f={"vitest/no-focused-tests":`error`,"vitest/no-disabled-tests":`error`,"vitest/no-identical-title":`error`,"vitest/no-conditional-expect":`error`,"vitest/no-standalone-expect":`error`,"vitest/require-mock-type-parameters":`off`,"vitest/valid-expect":`error`},p={base:{globals:e.es2023,rules:r},browser:{globals:e.browser,rules:i},jsdoc:{rules:a},node:{globals:e.node,rules:s},react:{rules:c},tests:{rules:l},typescript:{rules:d}},m=(...e)=>e.reduce((e,t)=>(Object.assign(e,t?.rules),e),{}),h=e=>{if(e.length!==1)throw Error(`Exactly one environment config must be selected: "node" or "browser".`);let[t]=e;if(t===void 0)throw Error(`Exactly one environment config must be selected: "node" or "browser".`);return t},g=e=>e===void 0?[]:Array.isArray(e)?e.slice():Object.hasOwn(n,e)?n[e].slice():[e],_=({tests:e,productionConfig:t,productionTs:r})=>{if(e)return e===!0?{configs:[t],files:[...n.colocated,...n.directory],framework:`vitest`,ts:r}:typeof e==`string`?{configs:[t],files:n[e].slice(),framework:`vitest`,ts:r}:{configs:e.configs??[t],files:g(e.files),framework:e.framework||`vitest`,ts:e.ts??r}},v=({config:e,testConfig:t,tests:n,ts:r})=>t?{doingTestsSetup:!0,testConfig:t}:n?{doingTestsSetup:!1,testConfig:_({tests:n,productionConfig:e,productionTs:r??!1})}:{doingTestsSetup:!1,testConfig:void 0},y=t=>{let{configs:n,extensions:r,jsdoc:i,nextjs:a,react:s,ts:c=!0,typeAware:l,baseFragment:d=p.base,baseExtensionFragment:m}=t,g=m??r?.base,_=h(t.configs),{doingTestsSetup:y,testConfig:b}=v({config:_,testConfig:t.testConfig,tests:t.tests,ts:c}),x=[d,p[_]],S=[`import`],C=[];return n.includes(`node`)&&S.push(`node`),i&&(x.push(p.jsdoc),S.push(`jsdoc`)),c&&x.push(p.typescript),l&&x.push({rules:u}),(c||l)&&S.push(`typescript`),s&&(x.push(p.react),S.push(`react`,`jsx-a11y`,`react-perf`)),a&&(x.push({rules:o}),S.push(`nextjs`)),b?.framework===`vitest`&&(S.push(`vitest`),y&&(x.push({rules:f}),C.push(e.vitest))),g&&x.push(g),r?.[_]&&x.push(r[_]),i&&r?.jsdoc&&x.push(r.jsdoc),c&&r?.typescript&&x.push(r.typescript),s&&r?.react&&x.push(r.react),{config:_,fragments:x,plugins:S,testConfig:b,configGlobals:C.length>0?Object.assign({},...C):void 0}},b=({testConfig:e,extensions:t})=>{let{config:n,fragments:r,configGlobals:i}=y({configs:e.configs,extensions:t,testConfig:e,ts:e.ts,baseFragment:p.tests,baseExtensionFragment:t?.tests}),a=m(...r);if(e.files.length===0)throw Error(`Custom test configuration requires at least one file glob.`);return{files:e.files,globals:{...p[n].globals,...i},rules:a}},x=e=>{let{fragments:n,plugins:r,config:i,testConfig:a}=y(e),{extensions:o,ignores:s,typeAware:c}=e,l=m(...n);return{globals:{...p.base.globals,...p[i].globals},ignorePatterns:[...t,...s||[]],options:c?{typeAware:!0}:void 0,plugins:r,rules:l,overrides:a?[b({testConfig:a,extensions:o})]:void 0}},S=[`.next/`,`out/`,`build/`,`next-env.d.ts`],C=({ignores:e=[],...t})=>x({...t,configs:[`node`],ignores:[...S,...e],nextjs:!0,react:!0,ts:!0}),w=e=>x({...e,react:!0});export{x as createConfig,C as createNextjsConfig,w as createReactConfig,p as extensionFragments};
1
+ import e from"globals";const t=[`browser`,`node`],n=[`coverage/`,`coverage-*/`,`dist/`,`node_modules/`],r={colocated:[`**/*.{test,spec}.{js,jsx,ts,tsx,mjs,cjs,mts,cts}`],directory:[`tests/**/*.{js,jsx,ts,tsx,mjs,cjs,mts,cts}`]},i={allow:[`__`],allowAfterThis:!0,allowAfterSuper:!0,enforceInMethodNames:!1},a=[`error`,i],o={"array-callback-return":[`error`,{allowImplicit:!0}],"block-scoped-var":`error`,complexity:[`warn`,30],"consistent-return":`error`,curly:`off`,"default-case":[`error`,{commentPattern:`^no default$`}],"default-case-last":`error`,"default-param-last":`error`,"dot-notation":[`error`,{allowKeywords:!0}],eqeqeq:[`error`,`always`,{null:`ignore`}],"grouped-accessor-pairs":`error`,"guard-for-in":`error`,"max-classes-per-file":[`error`,1],"no-alert":`warn`,"no-caller":`error`,"no-case-declarations":`error`,"no-constructor-return":`error`,"no-else-return":[`error`,{allowElseIf:!1}],"no-empty-function":[`error`,{allow:[`arrowFunctions`,`functions`,`methods`]}],"no-empty-pattern":`error`,"no-eval":`error`,"no-extend-native":`error`,"no-extra-bind":`error`,"no-extra-label":`error`,"no-fallthrough":`error`,"no-global-assign":[`error`,{exceptions:[]}],"no-implied-eval":`error`,"no-iterator":`error`,"no-labels":[`error`,{allowLoop:!1,allowSwitch:!1}],"no-lone-blocks":`error`,"no-loop-func":`error`,"no-magic-numbers":[`error`,{ignore:[0,1,-1,60,100,1e3],ignoreArrayIndexes:!0,enforceConst:!1,detectObjects:!1}],"no-multi-str":`error`,"no-new":`error`,"no-new-func":`error`,"no-new-wrappers":`error`,"no-nonoctal-decimal-escape":`error`,"no-param-reassign":[`error`,{props:!0,ignorePropertyModificationsFor:[`acc`,`accumulator`,`e`,`ctx`,`context`,`req`,`request`,`res`,`response`,`$scope`,`staticContext`,`state`,`ref`,`sacc`]}],"no-proto":`error`,"no-redeclare":`error`,"no-restricted-properties":[`error`,{object:`arguments`,property:`callee`,message:`arguments.callee is deprecated`},{object:`global`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`self`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`window`,property:`isFinite`,message:`Please use Number.isFinite instead`},{object:`global`,property:`isNaN`,message:`Please use Number.isNaN instead`},{object:`self`,property:`isNaN`,message:`Please use Number.isNaN instead`},{object:`window`,property:`isNaN`,message:`Please use Number.isNaN instead`},{property:`__defineGetter__`,message:`Please use Object.defineProperty instead.`},{property:`__defineSetter__`,message:`Please use Object.defineProperty instead.`},{object:`Math`,property:`pow`,message:`Use the exponentiation operator (**) instead.`}],"no-return-assign":[`error`,`always`],"no-script-url":`error`,"no-self-assign":[`error`,{props:!0}],"no-self-compare":`error`,"no-sequences":`error`,"no-throw-literal":`error`,"no-unmodified-loop-condition":`error`,"no-unused-expressions":[`error`,{allowShortCircuit:!1,allowTernary:!1,allowTaggedTemplates:!1}],"no-unused-labels":`error`,"no-useless-call":`error`,"no-useless-catch":`error`,"no-useless-concat":`error`,"no-useless-escape":`off`,"no-useless-return":`error`,"no-void":`error`,"no-with":`error`,"prefer-promise-reject-errors":[`error`,{allowEmptyReject:!0}],"prefer-regex-literals":[`error`,{disallowRedundantWrapping:!0}],radix:`error`,"vars-on-top":`error`,yoda:`error`,"for-direction":`error`,"getter-return":[`error`,{allowImplicit:!0}],"no-async-promise-executor":`error`,"no-compare-neg-zero":`error`,"no-cond-assign":[`error`,`always`],"no-console":`warn`,"no-control-regex":`error`,"no-debugger":`error`,"no-dupe-else-if":`error`,"no-dupe-keys":`error`,"no-duplicate-case":`error`,"no-empty":`error`,"no-empty-character-class":`error`,"no-ex-assign":`error`,"no-extra-boolean-cast":`error`,"no-func-assign":`error`,"no-import-assign":`error`,"no-inner-declarations":`error`,"no-invalid-regexp":`error`,"no-irregular-whitespace":`error`,"no-loss-of-precision":`error`,"no-misleading-character-class":`error`,"no-obj-calls":`error`,"no-promise-executor-return":`error`,"no-prototype-builtins":`error`,"no-regex-spaces":`error`,"no-setter-return":`error`,"no-sparse-arrays":`error`,"no-template-curly-in-string":`error`,"no-unexpected-multiline":`off`,"no-unreachable":`error`,"no-unreachable-loop":[`error`,{ignore:[]}],"no-unsafe-finally":`error`,"no-unsafe-negation":`error`,"no-unsafe-optional-chaining":[`error`,{disallowArithmeticOperators:!0}],"no-useless-backreference":`error`,"use-isnan":`error`,"valid-typeof":[`error`,{requireStringLiterals:!0}],"func-names":`warn`,"new-cap":[`error`,{newIsCap:!0,newIsCapExceptions:[],capIsNew:!1,capIsNewExceptions:[`Immutable.Map`,`Immutable.Set`,`Immutable.List`]}],"no-array-constructor":`error`,"no-bitwise":`error`,"no-continue":`error`,"no-lonely-if":`error`,"no-multi-assign":[`error`],"no-nested-ternary":`error`,"no-underscore-dangle":a,"no-unneeded-ternary":[`error`,{defaultAssignment:!1}],"operator-assignment":[`error`,`always`],"prefer-exponentiation-operator":`error`,"prefer-object-spread":`error`,"unicode-bom":[`error`,`never`],"no-delete-var":`error`,"no-label-var":`error`,"no-shadow":`error`,"no-shadow-restricted-names":`error`,"no-undef":`error`,"no-unused-vars":[`error`,{vars:`all`,args:`after-used`,ignoreRestSiblings:!0}],"no-use-before-define":[`error`,{functions:!0,classes:!0,variables:!0}],"arrow-body-style":[`error`,`as-needed`,{requireReturnForObjectLiteral:!1}],"constructor-super":`error`,"no-class-assign":`error`,"no-const-assign":`error`,"no-dupe-class-members":`error`,"no-restricted-exports":[`error`,{restrictedNamedExports:[`default`,`then`]}],"no-this-before-super":`error`,"no-useless-computed-key":`error`,"no-useless-constructor":`error`,"no-useless-rename":[`error`,{ignoreDestructuring:!1,ignoreImport:!1,ignoreExport:!1}],"no-var":`error`,"object-shorthand":[`error`,`always`,{ignoreConstructors:!1,avoidQuotes:!0}],"prefer-arrow-callback":[`error`,{allowNamedFunctions:!1,allowUnboundThis:!0}],"prefer-const":[`error`,{destructuring:`any`,ignoreReadBeforeAssign:!0}],"prefer-destructuring":[`error`,{VariableDeclarator:{array:!1,object:!0},AssignmentExpression:{array:!0,object:!1}},{enforceForRenamedProperties:!1}],"prefer-numeric-literals":`error`,"prefer-rest-params":`error`,"prefer-spread":`error`,"prefer-template":`error`,"require-yield":`error`,"symbol-description":`error`,"import/named":`error`,"import/export":`error`,"import/no-named-as-default":`error`,"import/no-named-as-default-member":`error`,"import/no-mutable-exports":`error`,"import/no-amd":`error`,"import/first":`error`,"import/no-duplicates":`error`,"import/extensions":[`error`,`ignorePackages`,{js:`never`,mjs:`never`,jsx:`never`}],"import/newline-after-import":`error`,"import/no-absolute-path":`error`,"import/no-dynamic-require":`error`,"import/no-webpack-loader-syntax":`error`,"import/no-named-default":`error`,"import/no-self-import":`error`,"import/no-cycle":[`error`,{maxDepth:4294967295}]},s={},c={"jsdoc/check-access":`error`,"jsdoc/check-property-names":`error`,"jsdoc/check-tag-names":`error`,"jsdoc/implements-on-classes":`error`,"jsdoc/require-param":`error`,"jsdoc/require-param-description":`error`,"jsdoc/require-param-name":`error`,"jsdoc/require-param-type":`error`,"jsdoc/require-property":`error`,"jsdoc/require-property-description":`error`,"jsdoc/require-property-name":`error`,"jsdoc/require-property-type":`error`,"jsdoc/require-returns":`error`,"jsdoc/require-returns-type":`error`},l={"nextjs/google-font-display":`warn`,"nextjs/google-font-preconnect":`warn`,"nextjs/inline-script-id":`error`,"nextjs/next-script-for-ga":`warn`,"nextjs/no-assign-module-variable":`error`,"nextjs/no-async-client-component":`warn`,"nextjs/no-before-interactive-script-outside-document":`warn`,"nextjs/no-css-tags":`warn`,"nextjs/no-document-import-in-page":`error`,"nextjs/no-duplicate-head":`error`,"nextjs/no-head-element":`warn`,"nextjs/no-head-import-in-document":`error`,"nextjs/no-html-link-for-pages":`error`,"nextjs/no-img-element":`warn`,"nextjs/no-page-custom-font":`warn`,"nextjs/no-script-component-in-head":`error`,"nextjs/no-styled-jsx-in-document":`warn`,"nextjs/no-sync-scripts":`error`,"nextjs/no-title-in-document-head":`warn`,"nextjs/no-typos":`warn`,"nextjs/no-unwanted-polyfillio":`warn`},u={"node/no-exports-assign":`error`,"node/global-require":`error`,"node/handle-callback-err":[`error`,`^(err|error|\\w+Error)$`],"node/no-mixed-requires":`error`,"node/no-new-require":`error`,"node/no-path-concat":`error`,"node/no-process-env":`error`},d={"jsx-a11y/alt-text":`error`,"jsx-a11y/anchor-has-content":`error`,"jsx-a11y/anchor-is-valid":`error`,"jsx-a11y/aria-activedescendant-has-tabindex":`error`,"jsx-a11y/aria-props":`error`,"jsx-a11y/aria-proptypes":`error`,"jsx-a11y/aria-role":`error`,"jsx-a11y/aria-unsupported-elements":`error`,"jsx-a11y/autocomplete-valid":`error`,"jsx-a11y/click-events-have-key-events":`error`,"jsx-a11y/control-has-associated-label":`error`,"jsx-a11y/heading-has-content":`error`,"jsx-a11y/html-has-lang":`error`,"jsx-a11y/iframe-has-title":`error`,"jsx-a11y/img-redundant-alt":`error`,"jsx-a11y/interactive-supports-focus":[`error`,{tabbable:[`button`,`checkbox`,`link`,`searchbox`,`spinbutton`,`switch`,`textbox`]}],"jsx-a11y/label-has-associated-control":`error`,"jsx-a11y/media-has-caption":`error`,"jsx-a11y/mouse-events-have-key-events":`error`,"jsx-a11y/no-access-key":`error`,"jsx-a11y/no-autofocus":`error`,"jsx-a11y/no-distracting-elements":`error`,"jsx-a11y/no-interactive-element-to-noninteractive-role":[`error`,{tr:[`none`,`presentation`],canvas:[`img`]}],"jsx-a11y/no-noninteractive-element-interactions":[`error`,{handlers:[`onClick`,`onError`,`onLoad`,`onMouseDown`,`onMouseUp`,`onKeyPress`,`onKeyDown`,`onKeyUp`],alert:[`onKeyUp`,`onKeyDown`,`onKeyPress`],body:[`onError`,`onLoad`],dialog:[`onKeyUp`,`onKeyDown`,`onKeyPress`],iframe:[`onError`,`onLoad`],img:[`onError`,`onLoad`]}],"jsx-a11y/no-noninteractive-element-to-interactive-role":[`error`,{ul:[`listbox`,`menu`,`menubar`,`radiogroup`,`tablist`,`tree`,`treegrid`],ol:[`listbox`,`menu`,`menubar`,`radiogroup`,`tablist`,`tree`,`treegrid`],li:[`menuitem`,`menuitemradio`,`menuitemcheckbox`,`option`,`row`,`tab`,`treeitem`],table:[`grid`],td:[`gridcell`],fieldset:[`radiogroup`,`presentation`]}],"jsx-a11y/no-noninteractive-tabindex":[`error`,{tags:[],roles:[`tabpanel`],allowExpressionValues:!0}],"jsx-a11y/no-redundant-roles":`error`,"jsx-a11y/no-static-element-interactions":[`error`,{allowExpressionValues:!0,handlers:[`onClick`,`onMouseDown`,`onMouseUp`,`onKeyPress`,`onKeyDown`,`onKeyUp`]}],"jsx-a11y/role-has-required-aria-props":`error`,"jsx-a11y/role-supports-aria-props":`error`,"jsx-a11y/scope":`error`,"jsx-a11y/tabindex-no-positive":`error`,"react/display-name":2,"react/jsx-key":2,"react/jsx-no-comment-textnodes":2,"react/jsx-no-duplicate-props":2,"react/jsx-no-target-blank":2,"react/jsx-no-undef":2,"react/no-children-prop":2,"react/no-danger-with-children":2,"react/no-direct-mutation-state":2,"react/no-find-dom-node":2,"react/no-is-mounted":2,"react/no-render-return-value":2,"react/no-string-refs":2,"react/no-unescaped-entities":2,"react/no-unknown-property":2,"react/require-render-return":2,"react/rules-of-hooks":`error`,"react/exhaustive-deps":`warn`,"react-perf/jsx-no-new-array-as-prop":`error`,"react-perf/jsx-no-new-function-as-prop":`error`,"react-perf/jsx-no-new-object-as-prop":`error`,"no-use-before-define":`off`},f={"max-classes-per-file":`off`,"no-magic-numbers":`off`,"import/first":`off`},p={"typescript/no-deprecated":`error`,"typescript/no-floating-promises":`error`,"typescript/no-misused-promises":`error`},m={"typescript/ban-ts-comment":[`error`,{"ts-expect-error":`allow-with-description`,"ts-ignore":`allow-with-description`,"ts-nocheck":`allow-with-description`,"ts-check":`allow-with-description`}],"typescript/no-array-constructor":`error`,"typescript/no-duplicate-enum-values":`error`,"typescript/no-empty-object-type":`error`,"typescript/no-explicit-any":`error`,"typescript/no-extra-non-null-assertion":`error`,"typescript/no-misused-new":`error`,"typescript/no-namespace":`error`,"typescript/no-non-null-asserted-optional-chain":`error`,"typescript/no-require-imports":`error`,"typescript/no-this-alias":`error`,"typescript/no-unnecessary-type-constraint":`error`,"typescript/no-unsafe-declaration-merging":`error`,"typescript/no-unsafe-function-type":`error`,"typescript/no-unused-expressions":`error`,"typescript/no-unused-vars":`error`,"typescript/no-wrapper-object-types":`error`,"typescript/prefer-as-const":`error`,"typescript/prefer-namespace-keyword":`error`,"typescript/triple-slash-reference":`error`,"typescript/dot-notation":`error`,"no-array-constructor":`off`,"no-empty-function":`off`,"dot-notation":`off`,"no-unused-expressions":`off`,"no-unused-vars":`off`,"no-useless-constructor":`off`,"import/extensions":`off`},h={"vitest/no-focused-tests":`error`,"vitest/no-disabled-tests":`error`,"vitest/no-identical-title":`error`,"vitest/no-conditional-expect":`error`,"vitest/no-standalone-expect":`error`,"vitest/require-mock-type-parameters":`off`,"vitest/valid-expect":`error`},g={base:{globals:e.es2023,rules:o},browser:{globals:e.browser,rules:s},jsdoc:{rules:c},node:{globals:e.node,rules:u},react:{rules:d},tests:{rules:f},typescript:{rules:m}},_=(...e)=>e.reduce((e,t)=>(Object.assign(e,t?.rules),e),{}),v=(e,t=[])=>_(...e,...t.map(e=>({rules:e}))),y=e=>Object.fromEntries(Object.keys(g[e].globals).map(e=>[e,`off`])),b=e=>Object.hasOwn(e,`files`),x=e=>e?Array.isArray(e)?e.reduce((e,t)=>(b(t)?e.configOverrides.push(t):e.ruleOverrides.push(t),e),{configOverrides:[],ruleOverrides:[]}):{configOverrides:[],ruleOverrides:[e]}:{configOverrides:[],ruleOverrides:[]},S=(e,t=[])=>{if(t.length===0)return e;let n=e[`no-underscore-dangle`]||a;if(!Array.isArray(n))return e;let[r,o]=n,s=typeof o==`object`&&o?o:{};return{...e,"no-underscore-dangle":[r,{...i,...s,allow:Array.from(new Set([...i.allow,...s.allow||[],...t]))}]}},C=({globals:t={},doingTestsSetup:n})=>n?t:Object.entries(t).reduce((t,[n,r])=>{if(n.startsWith(`$`)){let r=n.slice(1);if(!Object.hasOwn(e,r))throw Error(`Unknown global group: "${r}".`);Object.assign(t,e[r])}else t[n]=r===!0?`writable`:r;return t},{}),w=e=>{if(!t.includes(e)){let e=t.map(e=>`"${e}"`).join(` or `);throw Error(`Environment must be ${e}.`)}return e},T=e=>Array.isArray(e)?e.slice():[e],E=e=>e===void 0?[]:typeof e==`string`&&Object.hasOwn(r,e)?r[e].slice():T(e),D=({tests:e,productionEnv:t,productionTs:n})=>e===!0?{env:t,files:[...r.colocated,...r.directory],framework:`vitest`,ts:n}:typeof e==`string`?{env:t,files:r[e].slice(),framework:`vitest`,ts:n}:{env:e.env??t,files:E(e.files),framework:e.framework||`vitest`,ts:e.ts??n},O=({env:e,testConfig:t,tests:n,ts:r=!1})=>t?{doingTestsSetup:!0,testConfig:t}:n?{doingTestsSetup:!1,testConfig:D({tests:n,productionEnv:e,productionTs:r})}:{doingTestsSetup:!1,testConfig:void 0},k=t=>{let{env:n,extensions:r,globals:i,jsdoc:a,nextjs:o,react:s,ts:c=!0,typeAware:u,baseFragment:d=g.base,baseExtensionFragment:f}=t,m=f??r?.base,_=w(n),{doingTestsSetup:v,testConfig:y}=O({env:_,testConfig:t.testConfig,tests:t.tests,ts:c}),b=[d,g[_]],x=C({globals:i,doingTestsSetup:v}),S=[`import`],T=[];return _===`node`&&S.push(`node`),a&&(b.push(g.jsdoc),S.push(`jsdoc`)),c&&b.push(g.typescript),u&&b.push({rules:p}),(c||u)&&S.push(`typescript`),s&&(b.push(g.react),S.push(`react`,`jsx-a11y`,`react-perf`)),o&&(b.push({rules:l}),S.push(`nextjs`)),y?.framework===`vitest`&&(S.push(`vitest`),v&&(b.push({rules:h}),T.push(e.vitest))),m&&b.push(m),r?.[_]&&b.push(r[_]),a&&r?.jsdoc&&b.push(r.jsdoc),c&&r?.typescript&&b.push(r.typescript),s&&r?.react&&b.push(r.react),{env:_,fragments:b,globals:x,plugins:S,testConfig:y,configGlobals:T.length>0?Object.assign({},...T):void 0}},A=({parentEnv:e,testConfig:t,allowedDangleNames:n,extensions:r,extraRules:i=[],globals:a})=>{let{env:o,fragments:s,globals:c,configGlobals:l}=k({env:t.env,extensions:r,globals:a,testConfig:t,ts:t.ts,baseFragment:g.tests,baseExtensionFragment:r?.tests}),u=S(v(s,i),n);if(t.files.length===0)throw Error(`Custom test configuration requires at least one file glob.`);return{files:t.files,globals:{...y(e),...g[o].globals,...c,...l},rules:u}},j=({override:e,options:t,parentEnv:n,rootRuleOverrides:r})=>{let{files:i,ignores:a,rules:o,tests:s,...c}=e,{env:l,fragments:u,globals:d,plugins:f,testConfig:p}=k({...t,...c,env:e.env??n,tests:s}),m=[...r,...o?[o]:[]];return{override:{excludeFiles:a,files:T(i),globals:{...y(n),...g[l].globals,...d},rules:S(v(u,m),t.allowedDangleNames)},plugins:f,testOverride:p?A({parentEnv:n,testConfig:p,allowedDangleNames:t.allowedDangleNames,extensions:c.extensions??t.extensions,extraRules:m,globals:c.globals??t.globals}):void 0}},M=e=>{let{fragments:t,globals:r,plugins:i,env:a,testConfig:o}=k(e),{allowedDangleNames:s,extensions:c,ignores:l,typeAware:u}=e,{configOverrides:d,ruleOverrides:f}=x(e.overrides),p=[],m=i.slice();o&&p.push(A({parentEnv:a,testConfig:o,allowedDangleNames:s,extensions:c,extraRules:f,globals:r}));for(let t of d){let n=j({override:t,options:e,parentEnv:a,rootRuleOverrides:f});p.push(n.override),n.testOverride&&p.push(n.testOverride);for(let e of n.plugins)m.includes(e)||m.push(e)}let h=S(v(t,f),s);return{globals:{...g.base.globals,...g[a].globals,...r},ignorePatterns:[...n,...l||[]],options:u?{typeAware:!0}:void 0,plugins:m,rules:h,overrides:p.length>0?p:void 0}},N=[`.next/`,`out/`,`build/`,`next-env.d.ts`],P=({globals:e={},ignores:t=[],...n})=>M({...n,env:`node`,globals:{$browser:!0,...e},ignores:[...N,...t],nextjs:!0,react:!0,ts:!0});export{M as createConfig,P as createNextjsConfig,g as extensionFragments};
2
2
  //# sourceMappingURL=index.js.map