@eslint-react/kit 1.52.10-next.0 → 1.52.10-next.1

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/dist/index.mjs CHANGED
@@ -1,219 +1,284 @@
1
- import { dual, getOrElseUpdate } from '@eslint-react/eff';
2
- import { z } from 'zod/v4';
1
+ import { __export } from "./chunk-B9dir_RE.mjs";
2
+ import { dual, getOrElseUpdate } from "@eslint-react/eff";
3
+ import { z } from "zod/v4";
3
4
 
4
- var __defProp = Object.defineProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
-
10
- // src/JsxConfig/index.ts
11
- var JsxConfig_exports = {};
12
- __export(JsxConfig_exports, {
13
- JsxEmit: () => JsxEmit,
14
- getFromAnnotation: () => getFromAnnotation,
15
- getFromContext: () => getFromContext,
16
- make: () => make
17
- });
18
-
19
- // src/RegExp.ts
5
+ //#region src/RegExp.ts
20
6
  var RegExp_exports = {};
21
7
  __export(RegExp_exports, {
22
- ANNOTATION_JSX: () => ANNOTATION_JSX,
23
- ANNOTATION_JSX_FRAG: () => ANNOTATION_JSX_FRAG,
24
- ANNOTATION_JSX_IMPORT_SOURCE: () => ANNOTATION_JSX_IMPORT_SOURCE,
25
- ANNOTATION_JSX_RUNTIME: () => ANNOTATION_JSX_RUNTIME,
26
- CAMEL_CASE: () => CAMEL_CASE,
27
- COMPONENT_NAME: () => COMPONENT_NAME,
28
- COMPONENT_NAME_LOOSE: () => COMPONENT_NAME_LOOSE,
29
- CONSTANT_CASE: () => CONSTANT_CASE,
30
- HOOK_NAME: () => HOOK_NAME,
31
- HTML_TAG: () => HTML_TAG,
32
- JAVASCRIPT_PROTOCOL: () => JAVASCRIPT_PROTOCOL,
33
- JS_EXT: () => JS_EXT,
34
- JS_IDENTIFIER: () => JS_IDENTIFIER,
35
- KEBAB_CASE: () => KEBAB_CASE,
36
- PASCAL_CASE: () => PASCAL_CASE,
37
- REGEXP_STR: () => REGEXP_STR,
38
- SNAKE_CASE: () => SNAKE_CASE,
39
- TS_EXT: () => TS_EXT,
40
- isRegExp: () => isRegExp,
41
- toRegExp: () => toRegExp
8
+ ANNOTATION_JSX: () => ANNOTATION_JSX,
9
+ ANNOTATION_JSX_FRAG: () => ANNOTATION_JSX_FRAG,
10
+ ANNOTATION_JSX_IMPORT_SOURCE: () => ANNOTATION_JSX_IMPORT_SOURCE,
11
+ ANNOTATION_JSX_RUNTIME: () => ANNOTATION_JSX_RUNTIME,
12
+ CAMEL_CASE: () => CAMEL_CASE,
13
+ COMPONENT_NAME: () => COMPONENT_NAME,
14
+ COMPONENT_NAME_LOOSE: () => COMPONENT_NAME_LOOSE,
15
+ CONSTANT_CASE: () => CONSTANT_CASE,
16
+ HOOK_NAME: () => HOOK_NAME,
17
+ HTML_TAG: () => HTML_TAG,
18
+ JAVASCRIPT_PROTOCOL: () => JAVASCRIPT_PROTOCOL,
19
+ JS_EXT: () => JS_EXT,
20
+ JS_IDENTIFIER: () => JS_IDENTIFIER,
21
+ KEBAB_CASE: () => KEBAB_CASE,
22
+ PASCAL_CASE: () => PASCAL_CASE,
23
+ REGEXP_STR: () => REGEXP_STR,
24
+ SNAKE_CASE: () => SNAKE_CASE,
25
+ TS_EXT: () => TS_EXT,
26
+ isRegExp: () => isRegExp,
27
+ toRegExp: () => toRegExp
42
28
  });
43
- var HTML_TAG = /^[a-z][^-]*$/u;
44
- var TS_EXT = /^[cm]?tsx?$/u;
45
- var JS_EXT = /^[cm]?jsx?$/u;
46
- var PASCAL_CASE = /^[A-Z][\dA-Za-z]*$/u;
47
- var CAMEL_CASE = /^[a-z][\dA-Za-z]*$/u;
48
- var KEBAB_CASE = /^[a-z][\d\-a-z]*$/u;
49
- var SNAKE_CASE = /^[a-z][\d_a-z]*$/u;
50
- var CONSTANT_CASE = /^[A-Z][\d_A-Z]*$/u;
51
- var JAVASCRIPT_PROTOCOL = /^[\u0000-\u001F ]*j[\t\n\r]*a[\t\n\r]*v[\t\n\r]*a[\t\n\r]*s[\t\n\r]*c[\t\n\r]*r[\t\n\r]*i[\t\n\r]*p[\t\n\r]*t[\t\n\r]*:/iu;
52
- var JS_IDENTIFIER = /^[_$a-z][\w$]*$/i;
53
- var REGEXP_STR = /^\/(.+)\/([A-Za-z]*)$/u;
54
- var ANNOTATION_JSX = /@jsx\s+(\S+)/u;
55
- var ANNOTATION_JSX_FRAG = /@jsxFrag\s+(\S+)/u;
56
- var ANNOTATION_JSX_RUNTIME = /@jsxRuntime\s+(\S+)/u;
57
- var ANNOTATION_JSX_IMPORT_SOURCE = /@jsxImportSource\s+(\S+)/u;
58
- var COMPONENT_NAME = /^[A-Z]/u;
59
- var COMPONENT_NAME_LOOSE = /^_?[A-Z]/u;
60
- var HOOK_NAME = /^use/u;
29
+ /**
30
+ * Regular expressions for matching a HTML tag name
31
+ */
32
+ const HTML_TAG = /^[a-z][^-]*$/u;
33
+ /**
34
+ * Regular expression for matching a TypeScript file extension.
35
+ */
36
+ const TS_EXT = /^[cm]?tsx?$/u;
37
+ /**
38
+ * Regular expression for matching a JavaScript file extension.
39
+ */
40
+ const JS_EXT = /^[cm]?jsx?$/u;
41
+ /**
42
+ * Regular expression for matching a PascalCase string.
43
+ */
44
+ const PASCAL_CASE = /^[A-Z][\dA-Za-z]*$/u;
45
+ /**
46
+ * Regular expression for matching a camelCase string.
47
+ */
48
+ const CAMEL_CASE = /^[a-z][\dA-Za-z]*$/u;
49
+ /**
50
+ * Regular expression for matching a kebab-case string.
51
+ */
52
+ const KEBAB_CASE = /^[a-z][\d\-a-z]*$/u;
53
+ /**
54
+ * Regular expression for matching a snake_case string.
55
+ */
56
+ const SNAKE_CASE = /^[a-z][\d_a-z]*$/u;
57
+ /**
58
+ * Regular expression for matching a CONSTANT_CASE string.
59
+ */
60
+ const CONSTANT_CASE = /^[A-Z][\d_A-Z]*$/u;
61
+ const JAVASCRIPT_PROTOCOL = /^[\u0000-\u001F ]*j[\t\n\r]*a[\t\n\r]*v[\t\n\r]*a[\t\n\r]*s[\t\n\r]*c[\t\n\r]*r[\t\n\r]*i[\t\n\r]*p[\t\n\r]*t[\t\n\r]*:/iu;
62
+ /**
63
+ * Regular expression for matching a valid JavaScript identifier.
64
+ */
65
+ const JS_IDENTIFIER = /^[_$a-z][\w$]*$/i;
66
+ /**
67
+ * Regular expression for matching a RegExp string.
68
+ */
69
+ const REGEXP_STR = /^\/(.+)\/([A-Za-z]*)$/u;
70
+ /**
71
+ * Regular expression for matching a `@jsx` annotation comment.
72
+ */
73
+ const ANNOTATION_JSX = /@jsx\s+(\S+)/u;
74
+ /**
75
+ * Regular expression for matching a `@jsxFrag` annotation comment.
76
+ */
77
+ const ANNOTATION_JSX_FRAG = /@jsxFrag\s+(\S+)/u;
78
+ /**
79
+ * Regular expression for matching a `@jsxRuntime` annotation comment.
80
+ */
81
+ const ANNOTATION_JSX_RUNTIME = /@jsxRuntime\s+(\S+)/u;
82
+ /**
83
+ * Regular expression for matching a `@jsxImportSource` annotation comment.
84
+ */
85
+ const ANNOTATION_JSX_IMPORT_SOURCE = /@jsxImportSource\s+(\S+)/u;
86
+ /**
87
+ * Regular expression for matching a React component name.
88
+ */
89
+ const COMPONENT_NAME = /^[A-Z]/u;
90
+ /**
91
+ * Regular expression for matching a React component name (loose).
92
+ */
93
+ const COMPONENT_NAME_LOOSE = /^_?[A-Z]/u;
94
+ /**
95
+ * Regular expression for matching a React Hook name.
96
+ */
97
+ const HOOK_NAME = /^use/u;
98
+ /**
99
+ * Convert a string to the `RegExp`.
100
+ * Normal strings (e.g. `"foo"`) is converted to `/^foo$/` of `RegExp`.
101
+ * Strings like `"/^foo/i"` are converted to `/^foo/i` of `RegExp`.
102
+ * @see https://github.com/sveltejs/eslint-plugin-svelte/blob/main/packages/eslint-plugin-svelte/src/utils/regexp.ts
103
+ * @param string The string to convert.
104
+ * @returns Returns the `RegExp`.
105
+ */
61
106
  function toRegExp(string) {
62
- const [, pattern, flags = "u"] = REGEXP_STR.exec(string) ?? [];
63
- if (pattern != null) return new RegExp(pattern, flags);
64
- return { test: (s) => s === string };
107
+ const [, pattern, flags = "u"] = REGEXP_STR.exec(string) ?? [];
108
+ if (pattern != null) return new RegExp(pattern, flags);
109
+ return { test: (s) => s === string };
65
110
  }
111
+ /**
112
+ * Checks whether given string is regexp string
113
+ * @param string The string to check
114
+ * @returns boolean
115
+ */
66
116
  function isRegExp(string) {
67
- return REGEXP_STR.test(string);
117
+ return REGEXP_STR.test(string);
68
118
  }
69
119
 
70
- // src/JsxConfig/JsxConfig.ts
71
- var JsxEmit = {
72
- None: 0,
73
- Preserve: 1,
74
- React: 2,
75
- ReactNative: 3,
76
- ReactJSX: 4,
77
- ReactJSXDev: 5
120
+ //#endregion
121
+ //#region src/JsxConfig/JsxConfig.ts
122
+ const JsxEmit = {
123
+ None: 0,
124
+ Preserve: 1,
125
+ React: 2,
126
+ ReactNative: 3,
127
+ ReactJSX: 4,
128
+ ReactJSXDev: 5
78
129
  };
79
- function make() {
80
- return {};
130
+ /**
131
+ * Create a JsxConfig object
132
+ * @returns JsxConfig
133
+ */
134
+ function make$2() {
135
+ return {};
81
136
  }
82
- function getFromContext(context) {
83
- const options = context.sourceCode.parserServices?.program?.getCompilerOptions() ?? {};
84
- return {
85
- jsx: options.jsx ?? JsxEmit.ReactJSX,
86
- jsxFactory: options.jsxFactory ?? "React.createElement",
87
- jsxFragmentFactory: options.jsxFragmentFactory ?? "React.Fragment",
88
- jsxImportSource: options.jsxImportSource ?? "react",
89
- reactNamespace: options.reactNamespace ?? "React"
90
- };
137
+ /**
138
+ * Get JsxConfig from RuleContext
139
+ * @param context The RuleContext
140
+ * @returns JsxConfig
141
+ */
142
+ function getFromContext$1(context) {
143
+ const options = context.sourceCode.parserServices?.program?.getCompilerOptions() ?? {};
144
+ return {
145
+ jsx: options.jsx ?? JsxEmit.ReactJSX,
146
+ jsxFactory: options.jsxFactory ?? "React.createElement",
147
+ jsxFragmentFactory: options.jsxFragmentFactory ?? "React.Fragment",
148
+ jsxImportSource: options.jsxImportSource ?? "react",
149
+ reactNamespace: options.reactNamespace ?? "React"
150
+ };
91
151
  }
92
- var cache = /* @__PURE__ */ new WeakMap();
152
+ const cache = /* @__PURE__ */ new WeakMap();
153
+ /**
154
+ * Get JsxConfig from annotation
155
+ * @param context The RuleContext
156
+ * @returns JsxConfig
157
+ */
93
158
  function getFromAnnotation(context) {
94
- return getOrElseUpdate(
95
- cache,
96
- context.sourceCode,
97
- () => {
98
- const options = make();
99
- if (!context.sourceCode.text.includes("@jsx")) return options;
100
- let jsx, jsxFrag, jsxRuntime, jsxImportSource;
101
- for (const comment of context.sourceCode.getAllComments().reverse()) {
102
- const value = comment.value;
103
- jsx ??= value.match(ANNOTATION_JSX)?.[1];
104
- jsxFrag ??= value.match(ANNOTATION_JSX_FRAG)?.[1];
105
- jsxRuntime ??= value.match(ANNOTATION_JSX_RUNTIME)?.[1];
106
- jsxImportSource ??= value.match(ANNOTATION_JSX_IMPORT_SOURCE)?.[1];
107
- }
108
- if (jsx != null) options.jsxFactory = jsx;
109
- if (jsxFrag != null) options.jsxFragmentFactory = jsxFrag;
110
- if (jsxRuntime != null) options.jsx = jsxRuntime === "classic" ? JsxEmit.React : JsxEmit.ReactJSX;
111
- if (jsxImportSource != null) options.jsxImportSource = jsxImportSource;
112
- return options;
113
- }
114
- );
159
+ return getOrElseUpdate(cache, context.sourceCode, () => {
160
+ const options = make$2();
161
+ if (!context.sourceCode.text.includes("@jsx")) return options;
162
+ let jsx, jsxFrag, jsxRuntime, jsxImportSource;
163
+ for (const comment of context.sourceCode.getAllComments().reverse()) {
164
+ const value = comment.value;
165
+ jsx ??= value.match(ANNOTATION_JSX)?.[1];
166
+ jsxFrag ??= value.match(ANNOTATION_JSX_FRAG)?.[1];
167
+ jsxRuntime ??= value.match(ANNOTATION_JSX_RUNTIME)?.[1];
168
+ jsxImportSource ??= value.match(ANNOTATION_JSX_IMPORT_SOURCE)?.[1];
169
+ }
170
+ if (jsx != null) options.jsxFactory = jsx;
171
+ if (jsxFrag != null) options.jsxFragmentFactory = jsxFrag;
172
+ if (jsxRuntime != null) options.jsx = jsxRuntime === "classic" ? JsxEmit.React : JsxEmit.ReactJSX;
173
+ if (jsxImportSource != null) options.jsxImportSource = jsxImportSource;
174
+ return options;
175
+ });
115
176
  }
116
177
 
117
- // src/LanguagePreference/index.ts
118
- var LanguagePreference_exports = {};
119
- __export(LanguagePreference_exports, {
120
- LanguagePreferenceSchema: () => LanguagePreferenceSchema,
121
- defaultLanguagePreference: () => defaultLanguagePreference,
122
- getFromContext: () => getFromContext2,
123
- make: () => make2
178
+ //#endregion
179
+ //#region src/JsxConfig/index.ts
180
+ var JsxConfig_exports = {};
181
+ __export(JsxConfig_exports, {
182
+ JsxEmit: () => JsxEmit,
183
+ getFromAnnotation: () => getFromAnnotation,
184
+ getFromContext: () => getFromContext$1,
185
+ make: () => make$2
124
186
  });
125
187
 
126
- // src/LanguagePreference/LanguagePreference.ts
127
- function make2() {
128
- return {
129
- indentStyle: "space",
130
- indentWidth: 2,
131
- jsxQuoteStyle: "double",
132
- quoteStyle: "single",
133
- semicolons: "always",
134
- trailingCommas: "all"
135
- };
188
+ //#endregion
189
+ //#region src/LanguagePreference/LanguagePreference.ts
190
+ /**
191
+ * Get a copy of the default LanguagePreference.
192
+ */
193
+ function make$1() {
194
+ return {
195
+ indentStyle: "space",
196
+ indentWidth: 2,
197
+ jsxQuoteStyle: "double",
198
+ quoteStyle: "single",
199
+ semicolons: "always",
200
+ trailingCommas: "all"
201
+ };
136
202
  }
137
- var defaultLanguagePreference = make2();
138
- function getFromContext2() {
139
- throw new Error("getFromContext is not implemented");
203
+ /**
204
+ * A default LanguagePreference object.
205
+ */
206
+ const defaultLanguagePreference = make$1();
207
+ function getFromContext() {
208
+ throw new Error("getFromContext is not implemented");
140
209
  }
141
- var LanguagePreferenceSchema = z.object({
142
- indentStyle: z.optional(
143
- z.union([
144
- z.literal("tab"),
145
- z.literal("space")
146
- ])
147
- ),
148
- indentWidth: z.optional(z.number()),
149
- quoteStyle: z.optional(
150
- z.union([
151
- z.literal("single"),
152
- z.literal("double")
153
- ])
154
- ),
155
- semicolons: z.optional(
156
- z.union([
157
- z.literal("always"),
158
- z.literal("asNeeded")
159
- ])
160
- ),
161
- trailingCommas: z.optional(
162
- z.union([
163
- z.literal("all"),
164
- z.literal("es5"),
165
- z.literal("none")
166
- ])
167
- ),
168
- // JSX specific options
169
- jsxQuoteStyle: z.optional(
170
- z.union([
171
- z.literal("single"),
172
- z.literal("double")
173
- ])
174
- )
210
+
211
+ //#endregion
212
+ //#region src/LanguagePreference/LanguagePreferenceSchema.ts
213
+ /**
214
+ * @internal
215
+ */
216
+ const LanguagePreferenceSchema = z.object({
217
+ indentStyle: z.optional(z.union([z.literal("tab"), z.literal("space")])),
218
+ indentWidth: z.optional(z.number()),
219
+ quoteStyle: z.optional(z.union([z.literal("single"), z.literal("double")])),
220
+ semicolons: z.optional(z.union([z.literal("always"), z.literal("asNeeded")])),
221
+ trailingCommas: z.optional(z.union([
222
+ z.literal("all"),
223
+ z.literal("es5"),
224
+ z.literal("none")
225
+ ])),
226
+ jsxQuoteStyle: z.optional(z.union([z.literal("single"), z.literal("double")]))
175
227
  }, {});
176
228
 
177
- // src/Reporter.ts
229
+ //#endregion
230
+ //#region src/LanguagePreference/index.ts
231
+ var LanguagePreference_exports = {};
232
+ __export(LanguagePreference_exports, {
233
+ LanguagePreferenceSchema: () => LanguagePreferenceSchema,
234
+ defaultLanguagePreference: () => defaultLanguagePreference,
235
+ getFromContext: () => getFromContext,
236
+ make: () => make$1
237
+ });
238
+
239
+ //#endregion
240
+ //#region src/Reporter.ts
178
241
  var Reporter_exports = {};
179
242
  __export(Reporter_exports, {
180
- make: () => make3,
181
- send: () => send,
182
- sendOrElse: () => sendOrElse
243
+ make: () => make,
244
+ send: () => send,
245
+ sendOrElse: () => sendOrElse
183
246
  });
184
- var send = dual(2, (context, descriptor) => {
185
- if (descriptor == null) return;
186
- return context.report(descriptor);
247
+ const send = dual(2, (context, descriptor) => {
248
+ if (descriptor == null) return;
249
+ return context.report(descriptor);
187
250
  });
188
- var sendOrElse = dual(3, (context, descriptor, cb) => {
189
- if (descriptor == null) return cb();
190
- return context.report(descriptor);
251
+ const sendOrElse = dual(3, (context, descriptor, cb) => {
252
+ if (descriptor == null) return cb();
253
+ return context.report(descriptor);
191
254
  });
192
- function make3(context) {
193
- return {
194
- send: (...args) => send(context, ...args),
195
- sendOrElse: (...args) => sendOrElse(context, ...args)
196
- };
255
+ function make(context) {
256
+ return {
257
+ send: (...args) => send(context, ...args),
258
+ sendOrElse: (...args) => sendOrElse(context, ...args)
259
+ };
197
260
  }
198
261
 
199
- // src/Selector.ts
262
+ //#endregion
263
+ //#region src/Selector.ts
200
264
  var Selector_exports = {};
201
265
  __export(Selector_exports, {
202
- DISPLAY_NAME_ASSIGNMENT_EXPRESSION: () => DISPLAY_NAME_ASSIGNMENT_EXPRESSION,
203
- IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION: () => IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION,
204
- OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR: () => OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR
266
+ DISPLAY_NAME_ASSIGNMENT_EXPRESSION: () => DISPLAY_NAME_ASSIGNMENT_EXPRESSION,
267
+ IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION: () => IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION,
268
+ OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR: () => OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR
205
269
  });
206
- var IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION = "ArrowFunctionExpression[body.type!='BlockStatement']";
207
- var OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR = [
208
- "VariableDeclarator",
209
- "[id.type='ObjectPattern']",
210
- "[init.type='Identifier']"
270
+ const IMPLICIT_RETURN_ARROW_FUNCTION_EXPRESSION = "ArrowFunctionExpression[body.type!='BlockStatement']";
271
+ const OBJECT_DESTRUCTURING_VARIABLE_DECLARATOR = [
272
+ "VariableDeclarator",
273
+ "[id.type='ObjectPattern']",
274
+ "[init.type='Identifier']"
211
275
  ].join("");
212
- var DISPLAY_NAME_ASSIGNMENT_EXPRESSION = [
213
- "AssignmentExpression",
214
- "[operator='=']",
215
- "[left.type='MemberExpression']",
216
- "[left.property.name='displayName']"
276
+ const DISPLAY_NAME_ASSIGNMENT_EXPRESSION = [
277
+ "AssignmentExpression",
278
+ "[operator='=']",
279
+ "[left.type='MemberExpression']",
280
+ "[left.property.name='displayName']"
217
281
  ].join("");
218
282
 
219
- export { JsxConfig_exports as JsxConfig, LanguagePreference_exports as LanguagePreference, RegExp_exports as RegExp, Reporter_exports as Reporter, Selector_exports as Selector };
283
+ //#endregion
284
+ export { JsxConfig_exports as JsxConfig, LanguagePreference_exports as LanguagePreference, RegExp_exports as RegExp, Reporter_exports as Reporter, Selector_exports as Selector };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@eslint-react/kit",
3
- "version": "1.52.10-next.0",
3
+ "version": "1.52.10-next.1",
4
4
  "description": "ESLint React's plugin kit for building plugins and rules.",
5
5
  "homepage": "https://github.com/Rel1cx/eslint-react",
6
6
  "bugs": {
@@ -38,11 +38,11 @@
38
38
  "@typescript-eslint/utils": "^8.41.0",
39
39
  "ts-pattern": "^5.8.0",
40
40
  "zod": "^4.1.5",
41
- "@eslint-react/eff": "1.52.10-next.0"
41
+ "@eslint-react/eff": "1.52.10-next.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@tsconfig/node22": "^22.0.2",
45
- "tsup": "^8.5.0",
45
+ "tsdown": "^0.14.2",
46
46
  "type-fest": "^4.41.0",
47
47
  "@local/configs": "0.0.0"
48
48
  },
@@ -50,7 +50,7 @@
50
50
  "node": ">=18.18.0"
51
51
  },
52
52
  "scripts": {
53
- "build": "tsup",
53
+ "build": "tsdown",
54
54
  "build:docs": "typedoc",
55
55
  "lint:publish": "publint",
56
56
  "lint:ts": "tsc --noEmit"