@js-toolkit/configs 3.101.2 → 3.101.4

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
@@ -1,7 +1,179 @@
1
- # Utils for projects configuration and build
1
+ # @js-toolkit/configs
2
2
 
3
3
  [![npm package](https://img.shields.io/npm/v/@js-toolkit/configs.svg?style=flat-square)](https://www.npmjs.org/package/@js-toolkit/configs)
4
+ [![license](https://img.shields.io/npm/l/@js-toolkit/configs.svg?style=flat-square)](https://www.npmjs.org/package/@js-toolkit/configs)
4
5
 
5
- Preconfigured configurations for Webpack, ESLint, Babel, Prettier, TypeScript, JavaScript, CSS, etc.
6
+ Preconfigured configurations for Webpack, ESLint, Babel, Prettier, TypeScript, JavaScript, and CSS. Utilities for project environment variables, build config, and path resolution.
6
7
 
7
- Utilities for project custom environment variables and useful project configuration file.
8
+ ## Install
9
+
10
+ ```bash
11
+ yarn add @js-toolkit/configs
12
+ # or
13
+ npm install @js-toolkit/configs
14
+ ```
15
+
16
+ ## Requirements
17
+
18
+ - Node.js 16+
19
+ - Peer dependencies: install as needed for the modules you use (e.g. `eslint`, `webpack`, `typescript`, `prettier`)
20
+
21
+ ## Package Contents
22
+
23
+ | Module | Description |
24
+ |--------|--------------|
25
+ | `eslint/common` | Base ESLint rules (JS/TS, import, promise, standard) |
26
+ | `eslint/web` | ESLint for web (React, JSX, a11y) |
27
+ | `eslint/universal` | Universal ESLint config |
28
+ | `paths` | Project paths, glob helpers for TS/JS |
29
+ | `webpack/web.config` | Webpack config for browser builds |
30
+ | `webpack/node.config` | Webpack config for Node builds |
31
+ | `buildConfig` | Build config from `build.config.js` |
32
+ | `appEnv` | NODE_ENV and APP_* environment variables |
33
+ | `getInstalledPackage` | Check if a package is installed (from cwd) |
34
+ | `prettier` | Prettier config |
35
+ | `ts/common` | TypeScript config for libraries |
36
+ | `ts/bundler` | TypeScript config for bundler targets |
37
+ | `babel/*` | Babel presets (react, ts, env) |
38
+ | `css/postcssConfig` | PostCSS config |
39
+ | `css/stylelintrc` | Stylelint config |
40
+
41
+ ## Usage Examples
42
+
43
+ ### ESLint
44
+
45
+ ```javascript
46
+ // eslint.config.js (flat config)
47
+ const common = require('@js-toolkit/configs/eslint/common');
48
+
49
+ module.exports = [
50
+ ...common,
51
+ {
52
+ rules: {
53
+ '@typescript-eslint/no-explicit-any': 'off',
54
+ },
55
+ },
56
+ ];
57
+ ```
58
+
59
+ ```javascript
60
+ // eslint.config.js with web (React) rules
61
+ const { getTSExtensions, getFilesGlob } = require('@js-toolkit/configs/paths');
62
+
63
+ module.exports = [
64
+ ...require('@js-toolkit/configs/eslint/common'),
65
+ ...require('@js-toolkit/configs/eslint/web'),
66
+ {
67
+ rules: { 'class-methods-use-this': 'off' },
68
+ },
69
+ {
70
+ files: [getFilesGlob(getTSExtensions(), 'src/')],
71
+ languageOptions: {
72
+ parserOptions: { projectService: { defaultProject: 'tsconfig.json' } },
73
+ },
74
+ },
75
+ ];
76
+ ```
77
+
78
+ ### Paths and globs
79
+
80
+ ```javascript
81
+ const {
82
+ getFilesGlob,
83
+ getTSExtensions,
84
+ getJSExtensions,
85
+ getTSXExtensions,
86
+ } = require('@js-toolkit/configs/paths');
87
+
88
+ // Glob for all TS files in src/
89
+ getFilesGlob(getTSExtensions(), 'src/'); // 'src/**/*.{ts,mts,cts,tsx,...}'
90
+
91
+ // Extensions arrays
92
+ getTSExtensions(); // ['.ts', '.mts', '.cts', '.tsx', ...]
93
+ getJSExtensions(); // ['.js', '.mjs', '.cjs', '.jsx', ...]
94
+ ```
95
+
96
+ ### Build config
97
+
98
+ Create `build.config.js` in your project root:
99
+
100
+ ```javascript
101
+ module.exports = {
102
+ output: { root: 'dist' },
103
+ web: {
104
+ root: 'web',
105
+ sources: ['src'],
106
+ assets: ['src/assets'],
107
+ staticContent: ['public'],
108
+ tsconfig: 'tsconfig.json',
109
+ output: { root: 'web', js: 'js' },
110
+ },
111
+ };
112
+ ```
113
+
114
+ ```javascript
115
+ const { getBuildConfig, resolveConfigPath } = require('@js-toolkit/configs/buildConfig');
116
+
117
+ const config = getBuildConfig();
118
+ config.envStringify(); // { 'process.env.buildConfig': '...' }
119
+
120
+ // Custom config path
121
+ const configPath = resolveConfigPath(['build.config', 'build.config.local'], [process.cwd()]);
122
+ ```
123
+
124
+ ### App environment
125
+
126
+ ```javascript
127
+ const appEnv = require('@js-toolkit/configs/appEnv').default;
128
+
129
+ if (appEnv.dev) {
130
+ // development mode
131
+ }
132
+ appEnv.ifDev(devValue, prodValue);
133
+ appEnv.ifProd(prodValue, devValue);
134
+
135
+ // Custom APP_* vars (from process.env)
136
+ appEnv.raw.APP_API_URL;
137
+ ```
138
+
139
+ ### Prettier
140
+
141
+ ```javascript
142
+ // prettier.config.js
143
+ module.exports = require('@js-toolkit/configs/prettier');
144
+ ```
145
+
146
+ ### TypeScript
147
+
148
+ ```json
149
+ // tsconfig.json
150
+ {
151
+ "extends": "@js-toolkit/configs/ts/common.tsconfig.json",
152
+ "compilerOptions": {
153
+ "outDir": "dist"
154
+ }
155
+ }
156
+ ```
157
+
158
+ ### Check installed package
159
+
160
+ ```javascript
161
+ const { getInstalledPackage } = require('@js-toolkit/configs/getInstalledPackage');
162
+
163
+ // Resolve from project's node_modules (cwd)
164
+ const pkg = getInstalledPackage('typescript-eslint', { resolveFromCwd: true });
165
+ // pkg === 'typescript-eslint' if installed, undefined otherwise
166
+ ```
167
+
168
+ ## build.config.js structure
169
+
170
+ | Key | Description |
171
+ |-----|-------------|
172
+ | `output.root` | Output directory (default: `build`) |
173
+ | `web` | Web app config: `root`, `sources`, `assets`, `staticContent`, `tsconfig`, `output` |
174
+ | `node` | Node app config: `root`, `sources`, `tsconfig`, `output` |
175
+ | `shared` | Shared code: `root`, `sources`, `tsconfig` |
176
+
177
+ ## Repository
178
+
179
+ [https://github.com/js-toolkit/configs](https://github.com/js-toolkit/configs)
package/eslint/common.js CHANGED
@@ -1 +1 @@
1
- "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var n=Object.getOwnPropertyDescriptor(t,r);n&&!("get"in n?!t.__esModule:n.writable||n.configurable)||(n={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,n)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(null!=t)for(var s=e(t),n=0;n<s.length;n++)"default"!==s[n]&&__createBinding(r,t,s[n]);return __setModuleDefault(r,t),r}}(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createTypeScriptImportResolver=createTypeScriptImportResolver,exports.create=create;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),globals_1=__importDefault(require("globals")),config_1=require("eslint/config"),js_1=__importDefault(require("@eslint/js")),compat_1=require("@eslint/compat"),paths_1=__importStar(require("../paths")),getInstalledPackage_1=require("../getInstalledPackage"),consts_1=require("./consts"),hasBabelParser=!!(0,getInstalledPackage_1.getInstalledPackage)("@babel/eslint-parser"),hasPromisePlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-promise"),hasImportXPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-import-x"),hasImportPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-import"),hasConfigStandard=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-standard"),hasConfigAirbnbBase=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-airbnb-base"),hasJsDocPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-jsdoc"),hasTsDocPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-tsdoc"),hasPrettierEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-prettier/recommended"),hasTypescriptEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("typescript-eslint"),hasImportResolverTypescript=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-import-resolver-typescript"),withFilteredStandardRules=()=>{const e=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-n");return{rules:Object.entries(require("eslint-config-standard").rules??{}).reduce((t,[r,s])=>(r.startsWith("import/")?hasImportPlugin&&!hasImportXPlugin?t[r]=s:hasImportXPlugin&&(t[r.replace("import/","import-x/")]=s):r.startsWith("n/")?e&&(t[r]=s):r.startsWith("promise/")?hasPromisePlugin&&(t[r]=s):t[r]=s,t),{})}},filterAirbnbRules=()=>{const e=require("eslint-config-airbnb-base").extends.map(e=>({rules:e.endsWith("imports.js")?hasImportXPlugin&&Object.entries(require(e).rules).reduce((e,[t,r])=>(e[t.replace("import/","import-x/")]=r,e),{})||hasImportPlugin&&require(e).rules||{}:require(e).rules}));return(0,compat_1.fixupConfigRules)(e)};function createTypeScriptImportResolver(e){return require("eslint-import-resolver-typescript").createTypeScriptImportResolver({extensions:paths_1.moduleExtensions,...e})}function create(e){const t=hasTypescriptEslintPlugin&&path_1.default.resolve(e,consts_1.eslintTsProject),r=t&&fs_1.default.existsSync(t)?t:path_1.default.resolve(e,"tsconfig.json");return[js_1.default.configs.recommended,...hasPromisePlugin?[require("eslint-plugin-promise").configs["flat/recommended"]]:[],...hasImportPlugin&&!hasImportXPlugin?require("eslint-plugin-import").flatConfigs.recommended:[],...hasImportXPlugin?[require("eslint-plugin-import-x").flatConfigs.recommended]:[],...hasConfigStandard?[withFilteredStandardRules()]:[],...hasJsDocPlugin?[{...require("eslint-plugin-jsdoc").configs["flat/recommended"],files:[(0,paths_1.getFilesGlob)((0,paths_1.getJSExtensions)())]}]:[],...hasConfigAirbnbBase?filterAirbnbRules():[],{languageOptions:{ecmaVersion:"latest",parserOptions:{ecmaVersion:"latest"},globals:{...globals_1.default.node},...hasBabelParser&&{parser:require("@babel/eslint-parser"),parserOptions:{requireConfigFile:!1}}},linterOptions:{reportUnusedDisableDirectives:!0},settings:{...hasImportPlugin&&!hasImportXPlugin&&{"import/extensions":(0,paths_1.getJSExtensions)(),"import-x/extensions":(0,paths_1.getJSExtensions)(),"import/resolver":{node:{extensions:(0,paths_1.getJSExtensions)(),moduleDirectory:["node_modules",...paths_1.default.web.sources,...paths_1.default.node.sources,...paths_1.default.shared.sources].filter(e=>!!e)}},...hasBabelParser&&{"import/parsers":{"@babel/eslint-parser":(0,paths_1.getJSExtensions)()}}},...hasImportXPlugin&&{"import-x/resolver-next":[require("eslint-plugin-import-x").createNodeResolver({extensions:(0,paths_1.getJSExtensions)(),modules:["node_modules",...paths_1.default.web.sources,...paths_1.default.node.sources,...paths_1.default.shared.sources].filter(e=>!!e)})],...hasBabelParser&&{"import-x/parsers":{"@babel/eslint-parser":(0,paths_1.getJSExtensions)()}}}},rules:{"lines-between-class-members":["error","always",{exceptAfterSingleLine:!0}],"func-names":["warn","as-needed",{generators:"as-needed"}],"no-console":"off","no-unused-expressions":["error",{allowShortCircuit:!0}],"no-plusplus":["error",{allowForLoopAfterthoughts:!0}],"no-param-reassign":["error",{props:!1}],"no-promise-executor-return":["error",{allowVoid:!0}],"no-restricted-exports":["error",{restrictedNamedExports:["then"],restrictDefaultExports:{named:!0,namedFrom:!0,namespaceFrom:!0,defaultFrom:!1}}],"no-restricted-syntax":["error","ForInStatement","LabeledStatement","WithStatement","CallExpression[callee.name='setTimeout'][arguments.length!=2]","CallExpression[arguments.length!=2] > MemberExpression[object.name='window'][property.name='setTimeout']"],...(hasImportPlugin||hasImportXPlugin)&&Object.entries({"import/no-extraneous-dependencies":["error",{devDependencies:!0}],"import/extensions":["error","ignorePackages",paths_1.moduleExtensions.reduce((e,t)=>({...e,[t.substring(1)]:"never"}),{"":"never"})],"import/order":["error",{groups:["builtin","external","internal","parent","sibling","index","object"]}],"import/prefer-default-export":"off"}).reduce((e,[t,r])=>(hasImportXPlugin?e[t.replace("import/","import-x/")]=r:e[t]=r,e),{}),...hasPromisePlugin&&{"promise/always-return":"off","promise/catch-or-return":["error",{allowFinally:!0,allowThenStrict:!0}]}}},...hasTypescriptEslintPlugin?(()=>{const t=require("typescript-eslint");return(0,config_1.defineConfig)({extends:[...t.configs.strictTypeChecked,...t.configs.stylisticTypeChecked,...hasImportPlugin&&!hasImportXPlugin?require("eslint-plugin-import").flatConfigs.recommended:[],...hasImportXPlugin?[require("eslint-plugin-import-x").flatConfigs.typescript]:[]],files:[(0,paths_1.getFilesGlob)((0,paths_1.getTSExtensions)())],plugins:{...hasTsDocPlugin&&{tsdoc:require("eslint-plugin-tsdoc")}},languageOptions:{parserOptions:{tsconfigRootDir:e,projectService:{defaultProject:r,allowDefaultProject:["*.config.ts","*.config.mts","packages/*/*.config.ts","packages/*/*.config.mts"]}}},settings:{...hasImportPlugin&&!hasImportXPlugin&&{"import/extensions":paths_1.moduleExtensions,"import/resolver":{node:{extensions:paths_1.moduleExtensions},typescript:{project:r}},"import/parsers":{"@typescript-eslint/parser":paths_1.moduleExtensions,...hasBabelParser&&{"@babel/eslint-parser":[]}}},...hasImportXPlugin&&{"import-x/extensions":paths_1.moduleExtensions,"import-x/external-module-folders":["node_modules","node_modules/@types"],"import-x/parsers":{"@typescript-eslint/parser":paths_1.moduleExtensions,...hasBabelParser&&{"@babel/eslint-parser":[]}},"import-x/resolver-next":[hasImportResolverTypescript?createTypeScriptImportResolver({project:r}):[],require("eslint-plugin-import-x").createNodeResolver({extensions:paths_1.moduleExtensions,tsconfig:{configFile:r}})]}},rules:{"no-useless-constructor":"off","no-void":["error",{allowAsStatement:!0}],"@typescript-eslint/explicit-member-accessibility":"off","@typescript-eslint/explicit-function-return-type":["warn",{allowExpressions:!0,allowTypedFunctionExpressions:!0,allowHigherOrderFunctions:!0,allowDirectConstAssertionInArrowFunctions:!0,allowConciseArrowFunctionExpressionsStartingWithVoid:!0}],"no-use-before-define":"off","@typescript-eslint/no-use-before-define":"error","no-shadow":"off","@typescript-eslint/no-shadow":["error",{ignoreTypeValueShadow:!0}],"no-empty-function":"off","@typescript-eslint/no-empty-function":["error",{allow:["private-constructors","protected-constructors","decoratedFunctions"]}],"@typescript-eslint/no-unused-expressions":["error",{allowShortCircuit:!0}],"@typescript-eslint/prefer-nullish-coalescing":["error",{ignorePrimitives:{string:!0},ignoreMixedLogicalExpressions:!0}],"@typescript-eslint/no-unnecessary-condition":["error",{checkTypePredicates:!0,allowConstantLoopConditions:"only-allowed-literals"}],"@typescript-eslint/no-confusing-void-expression":["error",{ignoreVoidReturningFunctions:!0}],...hasImportXPlugin&&{"import-x/named":"off"},...hasTsDocPlugin&&{"tsdoc/syntax":"warn"}}})})():[],...hasPrettierEslintPlugin?[require("eslint-plugin-prettier/recommended")]:[],{files:[(0,paths_1.getFilesGlob)([".d.ts"])],rules:{"max-classes-per-file":"off"}},{ignores:["node_modules","dist","build",".yarn"]}]}const config=create(process.cwd());module.exports=config,module.exports.create=create,module.exports.createTypeScriptImportResolver=createTypeScriptImportResolver,exports.default=config;
1
+ "use strict";var __createBinding=this&&this.__createBinding||(Object.create?function(e,t,r,s){void 0===s&&(s=r);var o=Object.getOwnPropertyDescriptor(t,r);o&&!("get"in o?!t.__esModule:o.writable||o.configurable)||(o={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,s,o)}:function(e,t,r,s){void 0===s&&(s=r),e[s]=t[r]}),__setModuleDefault=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),__importStar=this&&this.__importStar||function(){var e=function(t){return e=Object.getOwnPropertyNames||function(e){var t=[];for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[t.length]=r);return t},e(t)};return function(t){if(t&&t.__esModule)return t;var r={};if(null!=t)for(var s=e(t),o=0;o<s.length;o++)"default"!==s[o]&&__createBinding(r,t,s[o]);return __setModuleDefault(r,t),r}}(),__importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.createTypeScriptImportResolver=createTypeScriptImportResolver,exports.create=create;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path")),globals_1=__importDefault(require("globals")),config_1=require("eslint/config"),js_1=__importDefault(require("@eslint/js")),compat_1=require("@eslint/compat"),paths_1=__importStar(require("../paths")),getInstalledPackage_1=require("../getInstalledPackage"),consts_1=require("./consts"),hasBabelParser=!!(0,getInstalledPackage_1.getInstalledPackage)("@babel/eslint-parser",{resolveFromCwd:!0}),hasPromisePlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-promise",{resolveFromCwd:!0}),hasImportXPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-import-x",{resolveFromCwd:!0}),hasImportPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-import",{resolveFromCwd:!0}),hasConfigStandard=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-standard",{resolveFromCwd:!0}),hasConfigAirbnbBase=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-airbnb-base",{resolveFromCwd:!0}),hasJsDocPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-jsdoc",{resolveFromCwd:!0}),hasTsDocPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-tsdoc",{resolveFromCwd:!0}),hasPrettierEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-prettier/recommended",{resolveFromCwd:!0}),hasTypescriptEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("typescript-eslint",{resolveFromCwd:!0}),hasImportResolverTypescript=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-import-resolver-typescript",{resolveFromCwd:!0}),withFilteredStandardRules=()=>{const e=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-n",{resolveFromCwd:!0});return{rules:Object.entries(require("eslint-config-standard").rules??{}).reduce((t,[r,s])=>(r.startsWith("import/")?hasImportPlugin&&!hasImportXPlugin?t[r]=s:hasImportXPlugin&&(t[r.replace("import/","import-x/")]=s):r.startsWith("n/")?e&&(t[r]=s):r.startsWith("promise/")?hasPromisePlugin&&(t[r]=s):t[r]=s,t),{})}},filterAirbnbRules=()=>{const e=require("eslint-config-airbnb-base").extends.map(e=>({rules:e.endsWith("imports.js")?hasImportXPlugin&&Object.entries(require(e).rules).reduce((e,[t,r])=>(e[t.replace("import/","import-x/")]=r,e),{})||hasImportPlugin&&require(e).rules||{}:require(e).rules}));return(0,compat_1.fixupConfigRules)(e)};function createTypeScriptImportResolver(e){return require("eslint-import-resolver-typescript").createTypeScriptImportResolver({extensions:paths_1.moduleExtensions,...e})}function create(e){const t=hasTypescriptEslintPlugin&&path_1.default.resolve(e,consts_1.eslintTsProject),r=t&&fs_1.default.existsSync(t)?t:path_1.default.resolve(e,"tsconfig.json");return[js_1.default.configs.recommended,...hasPromisePlugin?[require("eslint-plugin-promise").configs["flat/recommended"]]:[],...hasImportPlugin&&!hasImportXPlugin?require("eslint-plugin-import").flatConfigs.recommended:[],...hasImportXPlugin?[require("eslint-plugin-import-x").flatConfigs.recommended]:[],...hasConfigStandard?[withFilteredStandardRules()]:[],...hasJsDocPlugin?[{...require("eslint-plugin-jsdoc").configs["flat/recommended"],files:[(0,paths_1.getFilesGlob)((0,paths_1.getJSExtensions)())]}]:[],...hasConfigAirbnbBase?filterAirbnbRules():[],{languageOptions:{ecmaVersion:"latest",parserOptions:{ecmaVersion:"latest"},globals:{...globals_1.default.node},...hasBabelParser&&{parser:require("@babel/eslint-parser"),parserOptions:{requireConfigFile:!1}}},linterOptions:{reportUnusedDisableDirectives:!0},settings:{...hasImportPlugin&&!hasImportXPlugin&&{"import/extensions":(0,paths_1.getJSExtensions)(),"import-x/extensions":(0,paths_1.getJSExtensions)(),"import/resolver":{node:{extensions:(0,paths_1.getJSExtensions)(),moduleDirectory:["node_modules",...paths_1.default.web.sources,...paths_1.default.node.sources,...paths_1.default.shared.sources].filter(e=>!!e)}},...hasBabelParser&&{"import/parsers":{"@babel/eslint-parser":(0,paths_1.getJSExtensions)()}}},...hasImportXPlugin&&{"import-x/resolver-next":[require("eslint-plugin-import-x").createNodeResolver({extensions:(0,paths_1.getJSExtensions)(),modules:["node_modules",...paths_1.default.web.sources,...paths_1.default.node.sources,...paths_1.default.shared.sources].filter(e=>!!e)})],...hasBabelParser&&{"import-x/parsers":{"@babel/eslint-parser":(0,paths_1.getJSExtensions)()}}}},rules:{"lines-between-class-members":["error","always",{exceptAfterSingleLine:!0}],"func-names":["warn","as-needed",{generators:"as-needed"}],"no-console":"off","no-unused-expressions":["error",{allowShortCircuit:!0}],"no-plusplus":["error",{allowForLoopAfterthoughts:!0}],"no-param-reassign":["error",{props:!1}],"no-promise-executor-return":["error",{allowVoid:!0}],"no-restricted-exports":["error",{restrictedNamedExports:["then"],restrictDefaultExports:{named:!0,namedFrom:!0,namespaceFrom:!0,defaultFrom:!1}}],"no-restricted-syntax":["error","ForInStatement","LabeledStatement","WithStatement","CallExpression[callee.name='setTimeout'][arguments.length!=2]","CallExpression[arguments.length!=2] > MemberExpression[object.name='window'][property.name='setTimeout']"],...(hasImportPlugin||hasImportXPlugin)&&Object.entries({"import/no-extraneous-dependencies":["error",{devDependencies:!0}],"import/extensions":["error","ignorePackages",paths_1.moduleExtensions.reduce((e,t)=>({...e,[t.substring(1)]:"never"}),{"":"never"})],"import/order":["error",{groups:["builtin","external","internal","parent","sibling","index","object"]}],"import/prefer-default-export":"off"}).reduce((e,[t,r])=>(hasImportXPlugin?e[t.replace("import/","import-x/")]=r:e[t]=r,e),{}),...hasPromisePlugin&&{"promise/always-return":"off","promise/catch-or-return":["error",{allowFinally:!0,allowThenStrict:!0}]}}},...hasTypescriptEslintPlugin?(()=>{const t=require("typescript-eslint");return(0,config_1.defineConfig)({extends:[...t.configs.strictTypeChecked,...t.configs.stylisticTypeChecked,...hasImportPlugin&&!hasImportXPlugin?require("eslint-plugin-import").flatConfigs.recommended:[],...hasImportXPlugin?[require("eslint-plugin-import-x").flatConfigs.typescript]:[]],files:[(0,paths_1.getFilesGlob)((0,paths_1.getTSExtensions)())],plugins:{...hasTsDocPlugin&&{tsdoc:require("eslint-plugin-tsdoc")}},languageOptions:{parserOptions:{tsconfigRootDir:e,projectService:{defaultProject:r,allowDefaultProject:["*.config.ts","*.config.mts","packages/*/*.config.ts","packages/*/*.config.mts"]}}},settings:{...hasImportPlugin&&!hasImportXPlugin&&{"import/extensions":paths_1.moduleExtensions,"import/resolver":{node:{extensions:paths_1.moduleExtensions},typescript:{project:r}},"import/parsers":{"@typescript-eslint/parser":paths_1.moduleExtensions,...hasBabelParser&&{"@babel/eslint-parser":[]}}},...hasImportXPlugin&&{"import-x/extensions":paths_1.moduleExtensions,"import-x/external-module-folders":["node_modules","node_modules/@types"],"import-x/parsers":{"@typescript-eslint/parser":paths_1.moduleExtensions,...hasBabelParser&&{"@babel/eslint-parser":[]}},"import-x/resolver-next":[hasImportResolverTypescript?createTypeScriptImportResolver({project:r}):[],require("eslint-plugin-import-x").createNodeResolver({extensions:paths_1.moduleExtensions,tsconfig:{configFile:r}})]}},rules:{"no-useless-constructor":"off","no-void":["error",{allowAsStatement:!0}],"@typescript-eslint/explicit-member-accessibility":"off","@typescript-eslint/explicit-function-return-type":["warn",{allowExpressions:!0,allowTypedFunctionExpressions:!0,allowHigherOrderFunctions:!0,allowDirectConstAssertionInArrowFunctions:!0,allowConciseArrowFunctionExpressionsStartingWithVoid:!0}],"no-use-before-define":"off","@typescript-eslint/no-use-before-define":"error","no-shadow":"off","@typescript-eslint/no-shadow":["error",{ignoreTypeValueShadow:!0}],"no-empty-function":"off","@typescript-eslint/no-empty-function":["error",{allow:["private-constructors","protected-constructors","decoratedFunctions"]}],"@typescript-eslint/no-unused-expressions":["error",{allowShortCircuit:!0}],"@typescript-eslint/prefer-nullish-coalescing":["error",{ignorePrimitives:{string:!0,number:!0},ignoreMixedLogicalExpressions:!0}],"@typescript-eslint/no-unnecessary-condition":["error",{checkTypePredicates:!1,allowConstantLoopConditions:"only-allowed-literals"}],"@typescript-eslint/no-confusing-void-expression":["error",{ignoreVoidReturningFunctions:!0}],"@typescript-eslint/restrict-template-expressions":["error",{allowNumber:!0,allowBoolean:!0}],...hasImportXPlugin&&{"import-x/named":"off"},...hasTsDocPlugin&&{"tsdoc/syntax":"warn"}}})})():[],...hasPrettierEslintPlugin?[require("eslint-plugin-prettier/recommended")]:[],{files:[(0,paths_1.getFilesGlob)([".d.ts"])],rules:{"max-classes-per-file":"off"}},{ignores:["node_modules","dist","build",".yarn"]}]}const config=create(process.cwd());module.exports=config,module.exports.create=create,module.exports.createTypeScriptImportResolver=createTypeScriptImportResolver,exports.default=config;
package/eslint/web.js CHANGED
@@ -1 +1 @@
1
- "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const globals_1=__importDefault(require("globals")),compat_1=require("@eslint/compat"),paths_1=require("../paths"),getInstalledPackage_1=require("../getInstalledPackage"),hasReactPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-react"),hasReactA11yPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-jsx-a11y"),hasReactHooksPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-react-hooks"),hasWCPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-wc"),hasLitPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-lit"),hasMobxPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-mobx"),hasConfigAirbnb=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-airbnb"),hasTypescriptEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("typescript-eslint"),hasPrettierEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-prettier/recommended"),filterAirbnbRules=e=>(0,compat_1.fixupConfigRules)({rules:require(require("eslint-config-airbnb").extends.find(t=>t.endsWith(`${e}.js`))).rules}),config=[{languageOptions:{globals:{...globals_1.default.browser}}},...[hasReactPlugin&&require("eslint-plugin-react/configs/recommended"),...hasReactPlugin&&hasConfigAirbnb?filterAirbnbRules("react"):[],hasReactPlugin&&require("eslint-plugin-react/configs/jsx-runtime"),hasReactPlugin&&{settings:{react:{version:"detect"}},rules:{"react/jsx-props-no-spreading":"off","react/function-component-definition":["error",{namedComponents:"function-declaration",unnamedComponents:["arrow-function","function-expression"]}]}},hasReactA11yPlugin&&require("eslint-plugin-jsx-a11y").flatConfigs.recommended,...hasReactA11yPlugin&&hasConfigAirbnb?filterAirbnbRules("react-a11y"):[],hasReactA11yPlugin&&{rules:{"jsx-a11y/anchor-is-valid":["error",{specialLink:["to"]}],"jsx-a11y/label-has-for":["error",{allowChildren:!0}]}}].filter(Boolean).map(e=>({...e,files:[...e.files??[],(0,paths_1.getFilesGlob)((0,paths_1.getSXExtensions)())]})),...hasReactPlugin&&hasTypescriptEslintPlugin?[{files:[(0,paths_1.getFilesGlob)((0,paths_1.getTSXExtensions)())],rules:{"react/jsx-filename-extension":["error",{extensions:(0,paths_1.getSXExtensions)()}],"react/require-default-props":"off"}}]:[],...hasReactHooksPlugin?[require("eslint-plugin-react-hooks").configs.flat["recommended-latest"],{rules:{"react-hooks/exhaustive-deps":"error"}}]:[],...[hasWCPlugin&&require("eslint-plugin-wc").configs["flat/best-practice"],hasWCPlugin&&{settings:{wc:{elementBaseClasses:["HTMLElement"]}}},hasLitPlugin&&require("eslint-plugin-lit").configs["flat/recommended"],hasLitPlugin&&{settings:{lit:{elementBaseClasses:["LitElement"]}}}].filter(Boolean).map(e=>({...e,files:[...e.files??[],(0,paths_1.getFilesGlob)((0,paths_1.getNonSXExtensions)())]})),...hasPrettierEslintPlugin?[require("eslint-plugin-prettier/recommended")]:[],...hasMobxPlugin?[require("eslint-plugin-mobx").flatConfigs.recommended]:[]];module.exports=config,exports.default=config;
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const globals_1=__importDefault(require("globals")),compat_1=require("@eslint/compat"),paths_1=require("../paths"),getInstalledPackage_1=require("../getInstalledPackage"),hasReactPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-react",{resolveFromCwd:!0}),hasReactA11yPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-jsx-a11y",{resolveFromCwd:!0}),hasReactHooksPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-react-hooks",{resolveFromCwd:!0}),hasWCPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-wc",{resolveFromCwd:!0}),hasLitPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-lit",{resolveFromCwd:!0}),hasMobxPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-mobx",{resolveFromCwd:!0}),hasConfigAirbnb=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-config-airbnb",{resolveFromCwd:!0}),hasTypescriptEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("typescript-eslint",{resolveFromCwd:!0}),hasPrettierEslintPlugin=!!(0,getInstalledPackage_1.getInstalledPackage)("eslint-plugin-prettier/recommended",{resolveFromCwd:!0}),filterAirbnbRules=e=>(0,compat_1.fixupConfigRules)({rules:require(require("eslint-config-airbnb").extends.find(t=>t.endsWith(`${e}.js`))).rules}),config=[...(hasReactPlugin?(()=>{const e=require("eslint-plugin-react");return[e.configs.flat.recommended,e.configs.flat["jsx-runtime"],{languageOptions:{...e.configs.flat.recommended.languageOptions,globals:{...globals_1.default.browser}}},...hasConfigAirbnb?filterAirbnbRules("react"):[],{settings:{react:{version:"19"}},rules:{"react/jsx-props-no-spreading":"off","react/function-component-definition":["error",{namedComponents:"function-declaration",unnamedComponents:["arrow-function","function-expression"]}]}}]})():[{languageOptions:{globals:{...globals_1.default.browser}}}]).map(e=>({...e,files:[...e.files??[],(0,paths_1.getFilesGlob)((0,paths_1.getSXExtensions)())]})),...(hasReactA11yPlugin?[require("eslint-plugin-jsx-a11y").flatConfigs.recommended,...hasConfigAirbnb?filterAirbnbRules("react-a11y"):[],{rules:{"jsx-a11y/anchor-is-valid":["error",{specialLink:["to"]}],"jsx-a11y/label-has-for":["error",{allowChildren:!0}]}}]:[]).map(e=>({...e,files:[...e.files??[],(0,paths_1.getFilesGlob)((0,paths_1.getSXExtensions)())]})),...hasReactPlugin&&hasTypescriptEslintPlugin?[{files:[(0,paths_1.getFilesGlob)((0,paths_1.getTSXExtensions)())],rules:{"react/require-default-props":"off"}}]:[],...hasReactHooksPlugin?[require("eslint-plugin-react-hooks").configs.flat["recommended-latest"],{rules:{"react-hooks/exhaustive-deps":"error"}}]:[],...[hasWCPlugin&&require("eslint-plugin-wc").configs["flat/best-practice"],hasWCPlugin&&{settings:{wc:{elementBaseClasses:["HTMLElement"]}}},hasLitPlugin&&require("eslint-plugin-lit").configs["flat/recommended"],hasLitPlugin&&{settings:{lit:{elementBaseClasses:["LitElement"]}}}].filter(Boolean).map(e=>({...e,files:[...e.files??[],(0,paths_1.getFilesGlob)((0,paths_1.getNonSXExtensions)())]})),...hasPrettierEslintPlugin?[require("eslint-plugin-prettier/recommended")]:[],...hasMobxPlugin?[require("eslint-plugin-mobx").flatConfigs.recommended]:[]];module.exports=config,exports.default=config;
@@ -1 +1,14 @@
1
- export declare function getInstalledPackage(name: string, requireFn?: typeof require): string | undefined;
1
+ export interface GetInstalledPackageOptions {
2
+ requireFn?: typeof require;
3
+ resolveFromCwd?: boolean;
4
+ }
5
+ /**
6
+ * Resolves a package from the linted project's perspective (process.cwd()).
7
+ *
8
+ * - If the project has its own node_modules: only accept packages from
9
+ * cwd/node_modules (reject hoisted deps from root that the project doesn't have).
10
+ * - If the project has no node_modules (flat workspace): accept resolution from root.
11
+ *
12
+ * @param resolveFromCwd - when true, resolve from cwd; when false (default), use plain require.
13
+ */
14
+ export declare function getInstalledPackage(name: string, options?: GetInstalledPackageOptions): string | undefined;
@@ -1 +1 @@
1
- "use strict";function getInstalledPackage(e,t=require){try{return t(e),e}catch{return}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.getInstalledPackage=getInstalledPackage;
1
+ "use strict";var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.getInstalledPackage=getInstalledPackage;const fs_1=__importDefault(require("fs")),path_1=__importDefault(require("path"));function getInstalledPackage(e,t={}){const{requireFn:r=require,resolveFromCwd:s=!1}=t;try{if(!s)return r(e),e;const t=r.resolve(e,{paths:[process.cwd()]}),a=path_1.default.resolve(process.cwd(),"node_modules");if(!fs_1.default.existsSync(a))return e;return!path_1.default.relative(a,t).startsWith("..")?e:void 0}catch{return}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@js-toolkit/configs",
3
- "version": "3.101.2",
3
+ "version": "3.101.4",
4
4
  "description": "Preconfigured configurations",
5
5
  "author": "VZH",
6
6
  "license": "MIT",
@@ -16,7 +16,7 @@
16
16
  "noImplicitReturns": true,
17
17
  "noFallthroughCasesInSwitch": true,
18
18
  "noImplicitOverride": true,
19
- "noUncheckedIndexedAccess": false,
19
+ "noUncheckedIndexedAccess": true,
20
20
  "exactOptionalPropertyTypes": true,
21
21
  "skipLibCheck": true,
22
22
  "importHelpers": true,