@adbayb/stack 2.37.0 → 2.38.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.
@@ -77,6 +77,7 @@ export const config = createConfig(
77
77
  "no-extra-boolean-cast": "error",
78
78
  "no-fallthrough": "error",
79
79
  "no-global-assign": "error",
80
+ "no-implicit-coercion": "error",
80
81
  "no-invalid-regexp": "error",
81
82
  "no-irregular-whitespace": "error",
82
83
  "no-lonely-if": "error",
@@ -124,7 +125,6 @@ export const config = createConfig(
124
125
  "prefer-spread": "error",
125
126
  "prefer-template": "error",
126
127
  "require-yield": "error",
127
- "sort-imports": ["error", { ignoreDeclarationSort: true }],
128
128
  "sort-vars": "error",
129
129
  "use-isnan": "error",
130
130
  "valid-typeof": "error",
@@ -81,6 +81,7 @@ export const config = createConfig(
81
81
  "@eslint-react/use-state": "error",
82
82
  "@eslint-react/web-api-no-leaked-event-listener": "error",
83
83
  "@eslint-react/web-api-no-leaked-fetch": "error",
84
+ "@eslint-react/web-api-no-leaked-intersection-observer": "error",
84
85
  "@eslint-react/web-api-no-leaked-interval": "error",
85
86
  "@eslint-react/web-api-no-leaked-resize-observer": "error",
86
87
  "@eslint-react/web-api-no-leaked-timeout": "error",
@@ -9,6 +9,7 @@ export const config = createConfig({
9
9
  unicorn: unicornPlugin,
10
10
  },
11
11
  rules: {
12
+ "unicorn/better-dom-traversing": "error",
12
13
  "unicorn/better-regex": "error",
13
14
  "unicorn/catch-error-name": [
14
15
  "error",
@@ -16,15 +17,21 @@ export const config = createConfig({
16
17
  name: "error",
17
18
  },
18
19
  ],
20
+ "unicorn/consistent-class-member-order": "error",
21
+ "unicorn/consistent-compound-words": "error",
19
22
  "unicorn/consistent-empty-array-spread": "error",
20
23
  "unicorn/consistent-existence-index-check": "error",
24
+ "unicorn/consistent-export-decorator-position": "error",
21
25
  "unicorn/consistent-function-scoping": "error",
26
+ "unicorn/consistent-json-file-read": "error",
27
+ "unicorn/consistent-optional-chaining": "error",
22
28
  "unicorn/consistent-template-literal-escape": "error",
23
29
  "unicorn/custom-error-definition": "error",
24
30
  "unicorn/error-message": "error",
25
31
  "unicorn/escape-case": "error",
26
32
  "unicorn/expiring-todo-comments": "error",
27
33
  "unicorn/explicit-length-check": "error",
34
+ "unicorn/explicit-timer-delay": "error",
28
35
  "unicorn/filename-case": [
29
36
  "error",
30
37
  {
@@ -32,9 +39,11 @@ export const config = createConfig({
32
39
  camelCase: true,
33
40
  pascalCase: true,
34
41
  },
42
+ checkDirectories: false,
35
43
  },
36
44
  ],
37
45
  "unicorn/isolated-functions": "error",
46
+ "unicorn/max-nested-calls": ["error", { max: 3 }],
38
47
  "unicorn/new-for-builtins": "error",
39
48
  "unicorn/no-abusive-eslint-disable": "error",
40
49
  "unicorn/no-array-callback-reference": "error",
@@ -43,81 +52,128 @@ export const config = createConfig({
43
52
  "unicorn/no-await-expression-member": "error",
44
53
  "unicorn/no-await-in-promise-methods": "error",
45
54
  "unicorn/no-console-spaces": "error",
55
+ "unicorn/no-declarations-before-early-exit": "error",
46
56
  "unicorn/no-document-cookie": "error",
57
+ "unicorn/no-duplicate-loops": "error",
47
58
  "unicorn/no-empty-file": "error",
59
+ "unicorn/no-error-property-assignment": "error",
48
60
  "unicorn/no-for-loop": "error",
61
+ "unicorn/no-global-object-property-assignment": "error",
49
62
  "unicorn/no-immediate-mutation": "error",
63
+ "unicorn/no-incorrect-template-string-interpolation": "error",
50
64
  "unicorn/no-instanceof-array": "error",
51
65
  "unicorn/no-invalid-fetch-options": "error",
52
66
  "unicorn/no-invalid-remove-event-listener": "error",
53
67
  "unicorn/no-lonely-if": "error",
68
+ "unicorn/no-mismatched-map-key": "error",
69
+ "unicorn/no-negated-array-predicate": "error",
70
+ "unicorn/no-negated-comparison": "error",
54
71
  "unicorn/no-negated-condition": "error",
55
72
  "unicorn/no-nested-ternary": "error",
56
73
  "unicorn/no-new-buffer": "error",
57
74
  "unicorn/no-object-as-default-parameter": "error",
75
+ "unicorn/no-object-methods-with-collections": "error",
58
76
  "unicorn/no-process-exit": "error",
77
+ "unicorn/no-redundant-comparison": "error",
78
+ "unicorn/no-return-array-push": "error",
59
79
  "unicorn/no-single-promise-in-promise-methods": "error",
60
80
  "unicorn/no-static-only-class": "error",
81
+ "unicorn/no-subtraction-comparison": "error",
82
+ "unicorn/no-top-level-side-effects": "error",
61
83
  "unicorn/no-typeof-undefined": "error",
62
84
  "unicorn/no-unnecessary-array-flat-depth": "error",
63
85
  "unicorn/no-unnecessary-array-splice-count": "error",
86
+ "unicorn/no-unnecessary-global-this": "error",
64
87
  "unicorn/no-unnecessary-polyfills": "error",
65
88
  "unicorn/no-unnecessary-slice-end": "error",
89
+ "unicorn/no-unnecessary-splice": "error",
66
90
  "unicorn/no-unreadable-array-destructuring": "error",
67
91
  "unicorn/no-unreadable-iife": "error",
92
+ "unicorn/no-unreadable-object-destructuring": "error",
93
+ "unicorn/no-unsafe-buffer-conversion": "error",
94
+ "unicorn/no-unsafe-property-key": "error",
95
+ "unicorn/no-unsafe-string-replacement": "error",
68
96
  "unicorn/no-unused-properties": "error",
97
+ "unicorn/no-useless-boolean-cast": "error",
69
98
  "unicorn/no-useless-collection-argument": "error",
99
+ "unicorn/no-useless-concat": "error",
100
+ "unicorn/no-useless-else": "error",
70
101
  "unicorn/no-useless-error-capture-stack-trace": "error",
71
102
  "unicorn/no-useless-fallback-in-spread": "error",
72
103
  "unicorn/no-useless-iterator-to-array": "error",
73
104
  "unicorn/no-useless-length-check": "error",
74
105
  "unicorn/no-useless-promise-resolve-reject": "error",
106
+ "unicorn/no-useless-recursion": "error",
75
107
  "unicorn/no-useless-spread": "error",
108
+ "unicorn/no-useless-template-literals": "error",
76
109
  "unicorn/no-zero-fractions": "error",
77
110
  "unicorn/number-literal-case": "error",
78
111
  "unicorn/numeric-separators-style": "error",
79
112
  "unicorn/prefer-add-event-listener": "error",
113
+ "unicorn/prefer-add-event-listener-options": "error",
80
114
  "unicorn/prefer-array-find": "error",
81
115
  "unicorn/prefer-array-flat": "error",
82
116
  "unicorn/prefer-array-flat-map": "error",
117
+ "unicorn/prefer-array-from-map": "error",
83
118
  "unicorn/prefer-array-index-of": "error",
84
119
  "unicorn/prefer-array-some": "error",
85
120
  "unicorn/prefer-at": "error",
121
+ "unicorn/prefer-await": "error",
86
122
  "unicorn/prefer-bigint-literals": "error",
87
123
  "unicorn/prefer-blob-reading-methods": "error",
88
124
  "unicorn/prefer-class-fields": "error",
89
125
  "unicorn/prefer-classlist-toggle": "error",
90
126
  "unicorn/prefer-code-point": "error",
91
127
  "unicorn/prefer-date-now": "error",
128
+ "unicorn/prefer-direct-iteration": "error",
92
129
  "unicorn/prefer-dom-node-append": "error",
93
130
  "unicorn/prefer-dom-node-remove": "error",
94
131
  "unicorn/prefer-dom-node-text-content": "error",
132
+ "unicorn/prefer-early-return": "error",
95
133
  "unicorn/prefer-event-target": "error",
96
- "unicorn/prefer-export-from": ["error", { ignoreUsedVariables: true }],
134
+ "unicorn/prefer-export-from": ["error", { checkUsedVariables: false }],
135
+ "unicorn/prefer-global-number-constants": "error",
97
136
  "unicorn/prefer-global-this": "error",
137
+ "unicorn/prefer-identifier-import-export-specifiers": "error",
98
138
  "unicorn/prefer-import-meta-properties": "error",
99
139
  "unicorn/prefer-includes": "error",
140
+ "unicorn/prefer-iterable-in-constructor": "error",
141
+ "unicorn/prefer-iterator-to-array": "error",
100
142
  "unicorn/prefer-keyboard-event-key": "error",
143
+ "unicorn/prefer-location-assign": "error",
101
144
  "unicorn/prefer-logical-operator-over-ternary": "error",
102
145
  "unicorn/prefer-math-min-max": "error",
103
146
  "unicorn/prefer-math-trunc": "error",
147
+ "unicorn/prefer-minimal-ternary": "error",
104
148
  "unicorn/prefer-modern-dom-apis": "error",
105
149
  "unicorn/prefer-modern-math-apis": "error",
106
150
  "unicorn/prefer-module": "error",
107
151
  "unicorn/prefer-native-coercion-functions": "error",
108
152
  "unicorn/prefer-negative-index": "error",
153
+ "unicorn/prefer-number-coercion": "error",
154
+ "unicorn/prefer-number-is-safe-integer": "error",
109
155
  "unicorn/prefer-number-properties": "error",
156
+ "unicorn/prefer-object-define-properties": "error",
157
+ "unicorn/prefer-object-destructuring-defaults": "error",
110
158
  "unicorn/prefer-object-from-entries": "error",
159
+ "unicorn/prefer-object-iterable-methods": "error",
111
160
  "unicorn/prefer-optional-catch-binding": "error",
161
+ "unicorn/prefer-path2d": "error",
162
+ "unicorn/prefer-private-class-fields": "error",
112
163
  "unicorn/prefer-prototype-methods": "error",
113
164
  "unicorn/prefer-query-selector": "error",
114
165
  "unicorn/prefer-reflect-apply": "error",
115
166
  "unicorn/prefer-regexp-test": "error",
116
167
  "unicorn/prefer-response-static-json": "error",
168
+ "unicorn/prefer-scoped-selector": "error",
117
169
  "unicorn/prefer-set-has": "error",
118
170
  "unicorn/prefer-set-size": "error",
119
171
  "unicorn/prefer-simple-condition-first": "error",
172
+ "unicorn/prefer-simple-sort-comparator": "error",
173
+ "unicorn/prefer-single-array-predicate": "error",
120
174
  "unicorn/prefer-single-call": "error",
175
+ "unicorn/prefer-single-object-destructuring": "error",
176
+ "unicorn/prefer-smaller-scope": "error",
121
177
  "unicorn/prefer-spread": "error",
122
178
  "unicorn/prefer-string-raw": "error",
123
179
  "unicorn/prefer-string-replace-all": "error",
@@ -129,6 +185,9 @@ export const config = createConfig({
129
185
  "unicorn/prefer-ternary": "error",
130
186
  "unicorn/prefer-top-level-await": "error",
131
187
  "unicorn/prefer-type-error": "error",
188
+ "unicorn/prefer-uint8array-base64": "error",
189
+ "unicorn/prefer-unicode-code-point-escapes": "error",
190
+ "unicorn/prefer-url-href": "error",
132
191
  "unicorn/prevent-abbreviations": [
133
192
  "error",
134
193
  {
@@ -137,8 +196,10 @@ export const config = createConfig({
137
196
  ],
138
197
  "unicorn/relative-url-style": ["error", "always"],
139
198
  "unicorn/require-array-join-separator": "error",
199
+ "unicorn/require-array-sort-compare": "error",
140
200
  "unicorn/require-module-attributes": "error",
141
201
  "unicorn/require-number-to-fixed-digits-argument": "error",
202
+ "unicorn/require-proxy-trap-boolean-return": "error",
142
203
  "unicorn/switch-case-braces": "error",
143
204
  "unicorn/switch-case-break-position": "error",
144
205
  "unicorn/template-indent": "error",
package/dist/index.js CHANGED
@@ -30,7 +30,8 @@ function assert(expectedCondition, createError) {
30
30
  */
31
31
  const botMessage = (input) => {
32
32
  const { type } = input;
33
- (type === "error" ? console.error : console.log)(helpers.format(`
33
+ const log = console[type === "error" ? "error" : "log"];
34
+ log(helpers.format(`
34
35
  ╭─────╮
35
36
  │ ◠ ◠ ${input.title}
36
37
  │ ${type === "error" ? "◠" : "◡"} │ ${input.description}
@@ -97,7 +98,7 @@ const request = { async get(url, responseType) {
97
98
  status: response.status,
98
99
  statusText: response.statusText
99
100
  })})`);
100
- return responseType === "text" ? response.text() : response.json();
101
+ return response[responseType === "text" ? "text" : "json"]();
101
102
  } };
102
103
  const eslint = (options) => async (files = []) => {
103
104
  let eslintFiles = [];
@@ -220,8 +221,7 @@ const checkDependency = async () => {
220
221
  }
221
222
  };
222
223
  const checkDependencyVersionRange = ({ dependencies, devDependencies, name, peerDependencies }) => {
223
- for (const dependencyName of Object.keys(devDependencies)) {
224
- const version = devDependencies[dependencyName];
224
+ for (const [dependencyName, version] of Object.entries(devDependencies)) {
225
225
  assertVersion(version, {
226
226
  consumedBy: name,
227
227
  name: dependencyName
@@ -231,8 +231,7 @@ const checkDependencyVersionRange = ({ dependencies, devDependencies, name, peer
231
231
  name: dependencyName
232
232
  });
233
233
  }
234
- for (const dependencyName of Object.keys(dependencies)) {
235
- const version = dependencies[dependencyName];
234
+ for (const [dependencyName, version] of Object.entries(dependencies)) {
236
235
  assertVersion(version, {
237
236
  consumedBy: name,
238
237
  name: dependencyName
@@ -242,8 +241,7 @@ const checkDependencyVersionRange = ({ dependencies, devDependencies, name, peer
242
241
  name: dependencyName
243
242
  });
244
243
  }
245
- for (const dependencyName of Object.keys(peerDependencies)) {
246
- const version = peerDependencies[dependencyName];
244
+ for (const [dependencyName, version] of Object.entries(peerDependencies)) {
247
245
  assertVersion(version, {
248
246
  consumedBy: name,
249
247
  name: dependencyName
@@ -261,9 +259,8 @@ const createPackagesVersionMismatchChecker = () => {
261
259
  const packageName = package_.name;
262
260
  const isDevelopment = type === "development";
263
261
  const store = isDevelopment ? monorepoDevelopmentDependencies : monorepoDependencies;
264
- const dependencies = isDevelopment ? package_.devDependencies : package_.dependencies;
265
- for (const dependencyName of Object.keys(dependencies)) {
266
- const depVersion = dependencies[dependencyName];
262
+ const dependencies = package_[isDevelopment ? "devDependencies" : "dependencies"];
263
+ for (const [dependencyName, depVersion] of Object.entries(dependencies)) {
267
264
  if (!depVersion) continue;
268
265
  const storedVersion = store.get(dependencyName);
269
266
  if (!storedVersion) {
@@ -425,13 +422,13 @@ const isDirectoryExistAndNotEmpty = (path) => {
425
422
  return existsSync(path) && readdirSync(path).length > 0;
426
423
  };
427
424
  const retrieveIgnoredFiles = async () => {
428
- return (await helpers.exec("git clean -fdXn")).split(/\n|\r\n/).filter((cleanOutput) => !PRESERVE_FILES.some((excludedFile) => cleanOutput.includes(excludedFile))).map((cleanOutput) => cleanOutput.split(" ").at(-1));
425
+ return (await helpers.exec("git clean -fdXn")).split(/\n|\r\n/).filter((cleanOutput) => PRESERVE_FILES.every((excludedFile) => !cleanOutput.includes(excludedFile))).map((cleanOutput) => cleanOutput.split(" ").at(-1));
429
426
  };
430
427
  const PRESERVE_FILES = ["node_modules"];
431
428
 
432
429
  //#endregion
433
430
  //#region package.json
434
- var version = "2.37.0";
431
+ var version = "2.38.0";
435
432
 
436
433
  //#endregion
437
434
  //#region src/commands/create.ts
@@ -598,7 +595,7 @@ const fixFormatting = async (files) => {
598
595
  if (files.length === 0) prettierFiles.push(`"**/!(${PRETTIER_IGNORE_FILES.join("|")})"`);
599
596
  else {
600
597
  prettierFiles = files.filter((file) => {
601
- return !PRETTIER_IGNORE_FILES.some((filename) => file.endsWith(filename));
598
+ return PRETTIER_IGNORE_FILES.every((filename) => !file.endsWith(filename));
602
599
  });
603
600
  if (prettierFiles.length === 0) return;
604
601
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@adbayb/stack",
3
- "version": "2.37.0",
3
+ "version": "2.38.0",
4
4
  "description": "My opinionated JavaScript-based toolchain",
5
5
  "keywords": [
6
6
  "stack",
@@ -43,33 +43,33 @@
43
43
  "@changesets/cli": "^2.31.0",
44
44
  "@commitlint/cli": "^21.0.2",
45
45
  "@commitlint/config-conventional": "^21.0.2",
46
- "@eslint-react/eslint-plugin": "^5.8.7",
46
+ "@eslint-react/eslint-plugin": "^5.9.0",
47
47
  "@eslint/compat": "^2.1.0",
48
48
  "@stylistic/eslint-plugin": "^5.10.0",
49
- "@vitest/eslint-plugin": "^1.6.18",
50
- "eslint": "^10.4.1",
49
+ "@vitest/eslint-plugin": "^1.6.20",
50
+ "eslint": "^10.5.0",
51
51
  "eslint-config-prettier": "^10.1.8",
52
- "eslint-import-resolver-typescript": "^4.4.4",
52
+ "eslint-import-resolver-typescript": "^4.4.5",
53
53
  "eslint-plugin-depend": "^1.5.0",
54
54
  "eslint-plugin-import-x": "^4.16.2",
55
- "eslint-plugin-jsdoc": "^63.0.0",
56
- "eslint-plugin-mdx": "^3.7.1",
57
- "eslint-plugin-n": "^18.0.1",
55
+ "eslint-plugin-jsdoc": "^63.0.2",
56
+ "eslint-plugin-mdx": "^3.8.1",
57
+ "eslint-plugin-n": "^18.1.0",
58
58
  "eslint-plugin-perfectionist": "^5.9.0",
59
59
  "eslint-plugin-prettier": "^5.5.6",
60
60
  "eslint-plugin-sonarjs": "^4.0.3",
61
- "eslint-plugin-unicorn": "^64.0.0",
61
+ "eslint-plugin-unicorn": "^66.0.0",
62
62
  "fdir": "^6.5.0",
63
63
  "globals": "^17.6.0",
64
- "prettier": "^3.8.3",
64
+ "prettier": "^3.8.4",
65
65
  "prettier-plugin-packagejson": "^3.0.2",
66
66
  "termost": "^1.9.1",
67
- "turbo": "^2.9.16",
67
+ "turbo": "^2.9.18",
68
68
  "typescript": "^6.0.3",
69
- "typescript-eslint": "^8.60.0"
69
+ "typescript-eslint": "^8.61.0"
70
70
  },
71
71
  "devDependencies": {
72
- "@types/node": "24.12.4",
72
+ "@types/node": "24.13.2",
73
73
  "quickbundle": "3.0.0"
74
74
  },
75
75
  "publishConfig": {
@@ -14,13 +14,11 @@
14
14
  "sideEffects": false,
15
15
  "type": "module",
16
16
  "exports": {
17
- ".": {
18
- "source": "./src/index.ts",
19
- "types": "./dist/index.d.ts",
20
- "require": "./dist/index.cjs",
21
- "import": "./dist/index.mjs",
22
- "default": "./dist/index.mjs"
23
- }
17
+ "source": "./src/index.ts",
18
+ "types": "./dist/index.d.ts",
19
+ "require": "./dist/index.cjs",
20
+ "import": "./dist/index.mjs",
21
+ "default": "./dist/index.mjs"
24
22
  },
25
23
  "files": [
26
24
  "dist"
@@ -14,13 +14,11 @@
14
14
  "sideEffects": false,
15
15
  "type": "module",
16
16
  "exports": {
17
- ".": {
18
- "source": "./src/index.ts",
19
- "types": "./dist/index.d.ts",
20
- "require": "./dist/index.cjs",
21
- "import": "./dist/index.mjs",
22
- "default": "./dist/index.mjs"
23
- }
17
+ "source": "./src/index.ts",
18
+ "types": "./dist/index.d.ts",
19
+ "require": "./dist/index.cjs",
20
+ "import": "./dist/index.mjs",
21
+ "default": "./dist/index.mjs"
24
22
  },
25
23
  "files": [
26
24
  "dist"