@coherent.js/forms 1.0.0-beta.6 → 1.0.0-beta.7

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.
@@ -0,0 +1,365 @@
1
+ // src/validators.js
2
+ var validators = {
3
+ required: (value, options = {}) => {
4
+ if (value === null || value === void 0 || value === "") {
5
+ return options.message || validators.required.message || "This field is required";
6
+ }
7
+ return null;
8
+ },
9
+ email: (value) => {
10
+ if (!value) return null;
11
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
12
+ if (!emailRegex.test(value)) {
13
+ return "Please enter a valid email address";
14
+ }
15
+ return null;
16
+ },
17
+ minLength: (value, options = {}) => {
18
+ if (!value) return null;
19
+ const min = options.min || 0;
20
+ if (value.length < min) {
21
+ return options.message || `Must be at least ${min} characters`;
22
+ }
23
+ return null;
24
+ },
25
+ maxLength: (value, options = {}) => {
26
+ if (!value) return null;
27
+ const max = options.max || Infinity;
28
+ if (value.length > max) {
29
+ return options.message || `Must be no more than ${max} characters`;
30
+ }
31
+ return null;
32
+ },
33
+ min: (value, options = {}) => {
34
+ if (value === null || value === void 0 || value === "") return null;
35
+ const num = Number(value);
36
+ const minValue = options.min || 0;
37
+ if (isNaN(num) || num < minValue) {
38
+ return options.message || `Must be at least ${minValue}`;
39
+ }
40
+ return null;
41
+ },
42
+ max: (value, options = {}) => {
43
+ if (value === null || value === void 0 || value === "") return null;
44
+ const num = Number(value);
45
+ const maxValue = options.max || Infinity;
46
+ if (isNaN(num) || num > maxValue) {
47
+ return options.message || `Must be no more than ${maxValue}`;
48
+ }
49
+ return null;
50
+ },
51
+ pattern: (value, options = {}) => {
52
+ if (!value) return null;
53
+ const regex = options.pattern || options.regex;
54
+ if (regex && !regex.test(value)) {
55
+ return options.message || "Invalid format";
56
+ }
57
+ return null;
58
+ },
59
+ url: (value) => {
60
+ if (!value) return null;
61
+ try {
62
+ new URL(value);
63
+ return null;
64
+ } catch {
65
+ return "Please enter a valid URL";
66
+ }
67
+ },
68
+ number: (value) => {
69
+ if (value === null || value === void 0 || value === "") return null;
70
+ if (isNaN(Number(value))) {
71
+ return "Must be a valid number";
72
+ }
73
+ return null;
74
+ },
75
+ integer: (value) => {
76
+ if (value === null || value === void 0 || value === "") return null;
77
+ const num = Number(value);
78
+ if (isNaN(num) || !Number.isInteger(num)) {
79
+ return "Must be a whole number";
80
+ }
81
+ return null;
82
+ },
83
+ phone: (value) => {
84
+ if (!value) return null;
85
+ const phoneRegex = /^[\d\s\-\+\(\)]+$/;
86
+ if (!phoneRegex.test(value) || value.replace(/\D/g, "").length < 10) {
87
+ return "Please enter a valid phone number";
88
+ }
89
+ return null;
90
+ },
91
+ date: (value) => {
92
+ if (!value) return null;
93
+ const date = new Date(value);
94
+ if (isNaN(date.getTime())) {
95
+ return "Please enter a valid date";
96
+ }
97
+ return null;
98
+ },
99
+ match: (value, options = {}, translator, allValues = {}) => {
100
+ if (!value) return null;
101
+ const fieldName = options.field || options.fieldName;
102
+ if (value !== allValues[fieldName]) {
103
+ return options.message || `Must match ${fieldName}`;
104
+ }
105
+ return null;
106
+ },
107
+ custom: (value, options = {}, translator, allValues) => {
108
+ const validatorFn = options.validator || options.fn;
109
+ if (!validatorFn) return null;
110
+ const isValid = validatorFn(value, allValues);
111
+ return isValid ? null : options.message || "Validation failed";
112
+ },
113
+ fileType: (value, options = {}) => {
114
+ if (!value) return null;
115
+ const allowedTypes = options.accept || options.types || [];
116
+ if (value.type !== void 0) {
117
+ const fileType = value.type;
118
+ const fileExt = value.name ? value.name.split(".").pop().toLowerCase() : "";
119
+ const isValid = allowedTypes.some((type) => {
120
+ if (type.startsWith(".")) {
121
+ return fileExt === type.slice(1).toLowerCase();
122
+ }
123
+ if (type.includes("/")) {
124
+ if (type.endsWith("/*")) {
125
+ return fileType.startsWith(type.replace("/*", "/"));
126
+ }
127
+ return fileType === type;
128
+ }
129
+ return fileExt === type.toLowerCase();
130
+ });
131
+ if (!isValid) {
132
+ return options.message || `File type must be one of: ${allowedTypes.join(", ")}`;
133
+ }
134
+ return null;
135
+ }
136
+ return null;
137
+ },
138
+ fileSize: (value, options = {}) => {
139
+ if (!value) return null;
140
+ const maxSize = options.maxSize || Infinity;
141
+ if (value.size !== void 0) {
142
+ if (value.size > maxSize) {
143
+ const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);
144
+ return options.message || `File size must be less than ${maxSizeMB}MB`;
145
+ }
146
+ return null;
147
+ }
148
+ return null;
149
+ },
150
+ fileExtension: (value, options = {}) => {
151
+ if (!value) return null;
152
+ const allowedExtensions = options.extensions || [];
153
+ const fileName = value.name || value;
154
+ const ext = `.${fileName.split(".").pop().toLowerCase()}`;
155
+ const isValid = allowedExtensions.some((allowed) => {
156
+ return ext === allowed.toLowerCase();
157
+ });
158
+ if (!isValid) {
159
+ return options.message || `File extension must be one of: ${allowedExtensions.join(", ")}`;
160
+ }
161
+ return null;
162
+ },
163
+ alpha: (value) => {
164
+ if (!value) return null;
165
+ const alphaRegex = /^[a-zA-Z]+$/;
166
+ if (!alphaRegex.test(value)) {
167
+ return "Must contain only letters";
168
+ }
169
+ return null;
170
+ },
171
+ alphanumeric: (value) => {
172
+ if (!value) return null;
173
+ const alphanumericRegex = /^[a-zA-Z0-9]+$/;
174
+ if (!alphanumericRegex.test(value)) {
175
+ return "Must contain only letters and numbers";
176
+ }
177
+ return null;
178
+ },
179
+ uppercase: (value) => {
180
+ if (!value) return null;
181
+ if (value !== value.toUpperCase()) {
182
+ return "Must be uppercase";
183
+ }
184
+ return null;
185
+ },
186
+ // Get a registered validator
187
+ get: (name) => {
188
+ return validators[name];
189
+ },
190
+ // Compose multiple validators
191
+ compose: (validatorList) => {
192
+ return (value, options, translator, allValues) => {
193
+ for (const validator of validatorList) {
194
+ const error = typeof validator === "function" ? validator(value, options, translator, allValues) : null;
195
+ if (error) {
196
+ return error;
197
+ }
198
+ }
199
+ return null;
200
+ };
201
+ },
202
+ // Debounce async validator
203
+ debounce: (validator, delay = 300) => {
204
+ let timeoutId;
205
+ return (value) => {
206
+ return new Promise((resolve) => {
207
+ clearTimeout(timeoutId);
208
+ timeoutId = setTimeout(async () => {
209
+ const result = await validator(value);
210
+ resolve(result);
211
+ }, delay);
212
+ });
213
+ };
214
+ },
215
+ // Cancellable async validator
216
+ cancellable: (validator) => {
217
+ let abortController;
218
+ const wrapped = async (value) => {
219
+ if (abortController) {
220
+ abortController.abort();
221
+ }
222
+ abortController = typeof AbortController !== "undefined" ? new AbortController() : null;
223
+ try {
224
+ return await validator(value, abortController ? abortController.signal : null);
225
+ } catch (error) {
226
+ if (error.name === "AbortError") {
227
+ return null;
228
+ }
229
+ throw error;
230
+ }
231
+ };
232
+ wrapped.cancel = () => {
233
+ if (abortController) {
234
+ abortController.abort();
235
+ }
236
+ };
237
+ return wrapped;
238
+ },
239
+ // Conditional validator
240
+ when: (condition, validator) => {
241
+ return (value, options = {}, translator, allValues = {}) => {
242
+ const context = options.min !== void 0 || options.max !== void 0 ? allValues : options;
243
+ const shouldValidate = typeof condition === "function" ? condition(value, context) : condition;
244
+ if (!shouldValidate) {
245
+ return null;
246
+ }
247
+ return typeof validator === "function" ? validator(value, options, translator, allValues) : null;
248
+ };
249
+ },
250
+ // Validator chain builder
251
+ chain: (options = {}) => {
252
+ const validatorList = [];
253
+ const stopOnFirstError = options.stopOnFirstError !== false;
254
+ const chain = {
255
+ required: (opts) => {
256
+ validatorList.push((v, o, t, a) => validators.required(v, opts || o, t, a));
257
+ return chain;
258
+ },
259
+ email: (opts) => {
260
+ validatorList.push((v, o, t, a) => validators.email(v, opts || o, t, a));
261
+ return chain;
262
+ },
263
+ minLength: (opts) => {
264
+ validatorList.push((v, o, t, a) => validators.minLength(v, opts || o, t, a));
265
+ return chain;
266
+ },
267
+ maxLength: (opts) => {
268
+ validatorList.push((v, o, t, a) => validators.maxLength(v, opts || o, t, a));
269
+ return chain;
270
+ },
271
+ custom: (fn, message) => {
272
+ validatorList.push((v, o, t, a) => {
273
+ const result = fn(v, a);
274
+ return result === null || result === true || result === void 0 ? null : message || result;
275
+ });
276
+ return chain;
277
+ },
278
+ validate: (value, opts, translator, allValues) => {
279
+ if (stopOnFirstError) {
280
+ for (const validator of validatorList) {
281
+ const error = validator(value, opts, translator, allValues);
282
+ if (error) {
283
+ return error;
284
+ }
285
+ }
286
+ return null;
287
+ } else {
288
+ const errors = [];
289
+ for (const validator of validatorList) {
290
+ const error = validator(value, opts, translator, allValues);
291
+ if (error) {
292
+ errors.push(error);
293
+ }
294
+ }
295
+ return errors.length > 0 ? errors : null;
296
+ }
297
+ }
298
+ };
299
+ return chain;
300
+ }
301
+ };
302
+ function validateField(value, validatorList, formData = {}) {
303
+ for (const validator of validatorList) {
304
+ const error = validator(value, formData);
305
+ if (error) {
306
+ return error;
307
+ }
308
+ }
309
+ return null;
310
+ }
311
+ function validateForm(formData, fieldValidators) {
312
+ const errors = {};
313
+ for (const [fieldName, validatorList] of Object.entries(fieldValidators)) {
314
+ const value = formData[fieldName];
315
+ const error = validateField(value, validatorList, formData);
316
+ if (error) {
317
+ errors[fieldName] = error;
318
+ }
319
+ }
320
+ return Object.keys(errors).length > 0 ? errors : null;
321
+ }
322
+ function createValidator(validatorFn, message) {
323
+ return (value, options, translator, allValues) => {
324
+ const result = validatorFn(value, options, translator, allValues);
325
+ if (typeof result === "string") {
326
+ return result;
327
+ }
328
+ if (!result) {
329
+ return null;
330
+ }
331
+ return message || "Validation failed";
332
+ };
333
+ }
334
+ function registerValidator(name, validatorFn) {
335
+ validators[name] = validatorFn;
336
+ }
337
+ function composeValidators(...validatorFns) {
338
+ return (value, options, translator, allValues) => {
339
+ for (const validator of validatorFns) {
340
+ const error = validator(value, options, translator, allValues);
341
+ if (error) {
342
+ return error;
343
+ }
344
+ }
345
+ return null;
346
+ };
347
+ }
348
+ var validators_default = {
349
+ validators,
350
+ validateField,
351
+ validateForm,
352
+ createValidator,
353
+ registerValidator,
354
+ composeValidators
355
+ };
356
+ export {
357
+ composeValidators,
358
+ createValidator,
359
+ validators_default as default,
360
+ registerValidator,
361
+ validateField,
362
+ validateForm,
363
+ validators
364
+ };
365
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/validators.js"],
4
+ "sourcesContent": ["/**\n * Coherent.js Forms - Validators\n * \n * Form validation utilities\n * \n * @module forms/validators\n */\n\n/**\n * Built-in validators with signature: (value, options, translator, allValues) => errorMessage | null\n */\nexport const validators = {\n required: (value, options = {}) => {\n if (value === null || value === undefined || value === '') {\n return options.message || validators.required.message || 'This field is required';\n }\n return null;\n },\n\n email: (value) => {\n if (!value) return null;\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!emailRegex.test(value)) {\n return 'Please enter a valid email address';\n }\n return null;\n },\n\n minLength: (value, options = {}) => {\n if (!value) return null;\n const min = options.min || 0;\n if (value.length < min) {\n return options.message || `Must be at least ${min} characters`;\n }\n return null;\n },\n\n maxLength: (value, options = {}) => {\n if (!value) return null;\n const max = options.max || Infinity;\n if (value.length > max) {\n return options.message || `Must be no more than ${max} characters`;\n }\n return null;\n },\n\n min: (value, options = {}) => {\n if (value === null || value === undefined || value === '') return null;\n const num = Number(value);\n const minValue = options.min || 0;\n if (isNaN(num) || num < minValue) {\n return options.message || `Must be at least ${minValue}`;\n }\n return null;\n },\n\n max: (value, options = {}) => {\n if (value === null || value === undefined || value === '') return null;\n const num = Number(value);\n const maxValue = options.max || Infinity;\n if (isNaN(num) || num > maxValue) {\n return options.message || `Must be no more than ${maxValue}`;\n }\n return null;\n },\n\n pattern: (value, options = {}) => {\n if (!value) return null;\n const regex = options.pattern || options.regex;\n if (regex && !regex.test(value)) {\n return options.message || 'Invalid format';\n }\n return null;\n },\n\n url: (value) => {\n if (!value) return null;\n try {\n new URL(value);\n return null;\n } catch {\n return 'Please enter a valid URL';\n }\n },\n\n number: (value) => {\n if (value === null || value === undefined || value === '') return null;\n if (isNaN(Number(value))) {\n return 'Must be a valid number';\n }\n return null;\n },\n\n integer: (value) => {\n if (value === null || value === undefined || value === '') return null;\n const num = Number(value);\n if (isNaN(num) || !Number.isInteger(num)) {\n return 'Must be a whole number';\n }\n return null;\n },\n\n phone: (value) => {\n if (!value) return null;\n const phoneRegex = /^[\\d\\s\\-\\+\\(\\)]+$/;\n if (!phoneRegex.test(value) || value.replace(/\\D/g, '').length < 10) {\n return 'Please enter a valid phone number';\n }\n return null;\n },\n\n date: (value) => {\n if (!value) return null;\n const date = new Date(value);\n if (isNaN(date.getTime())) {\n return 'Please enter a valid date';\n }\n return null;\n },\n\n match: (value, options = {}, translator, allValues = {}) => {\n if (!value) return null;\n const fieldName = options.field || options.fieldName;\n if (value !== allValues[fieldName]) {\n return options.message || `Must match ${fieldName}`;\n }\n return null;\n },\n\n custom: (value, options = {}, translator, allValues) => {\n const validatorFn = options.validator || options.fn;\n if (!validatorFn) return null;\n const isValid = validatorFn(value, allValues);\n return isValid ? null : (options.message || 'Validation failed');\n },\n\n fileType: (value, options = {}) => {\n if (!value) return null;\n \n const allowedTypes = options.accept || options.types || [];\n \n // Handle File object\n if (value.type !== undefined) {\n const fileType = value.type;\n const fileExt = value.name ? value.name.split('.').pop().toLowerCase() : '';\n \n // Check MIME type or extension\n const isValid = allowedTypes.some(type => {\n if (type.startsWith('.')) {\n return fileExt === type.slice(1).toLowerCase();\n }\n if (type.includes('/')) {\n if (type.endsWith('/*')) {\n return fileType.startsWith(type.replace('/*', '/'));\n }\n return fileType === type;\n }\n return fileExt === type.toLowerCase();\n });\n \n if (!isValid) {\n return options.message || `File type must be one of: ${allowedTypes.join(', ')}`;\n }\n return null;\n }\n \n return null;\n },\n\n fileSize: (value, options = {}) => {\n if (!value) return null;\n \n const maxSize = options.maxSize || Infinity;\n \n // Handle File object\n if (value.size !== undefined) {\n if (value.size > maxSize) {\n const maxSizeMB = (maxSize / (1024 * 1024)).toFixed(2);\n return options.message || `File size must be less than ${maxSizeMB}MB`;\n }\n return null;\n }\n \n return null;\n },\n\n fileExtension: (value, options = {}) => {\n if (!value) return null;\n \n const allowedExtensions = options.extensions || [];\n const fileName = value.name || value;\n const ext = `.${ fileName.split('.').pop().toLowerCase()}`;\n \n const isValid = allowedExtensions.some(allowed => {\n return ext === allowed.toLowerCase();\n });\n \n if (!isValid) {\n return options.message || `File extension must be one of: ${allowedExtensions.join(', ')}`;\n }\n return null;\n },\n\n alpha: (value) => {\n if (!value) return null;\n const alphaRegex = /^[a-zA-Z]+$/;\n if (!alphaRegex.test(value)) {\n return 'Must contain only letters';\n }\n return null;\n },\n\n alphanumeric: (value) => {\n if (!value) return null;\n const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n if (!alphanumericRegex.test(value)) {\n return 'Must contain only letters and numbers';\n }\n return null;\n },\n\n uppercase: (value) => {\n if (!value) return null;\n if (value !== value.toUpperCase()) {\n return 'Must be uppercase';\n }\n return null;\n },\n\n // Get a registered validator\n get: (name) => {\n return validators[name];\n },\n\n // Compose multiple validators\n compose: (validatorList) => {\n return (value, options, translator, allValues) => {\n for (const validator of validatorList) {\n const error = typeof validator === 'function'\n ? validator(value, options, translator, allValues)\n : null;\n if (error) {\n return error;\n }\n }\n return null;\n };\n },\n\n // Debounce async validator\n debounce: (validator, delay = 300) => {\n let timeoutId;\n return (value) => {\n return new Promise((resolve) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(async () => {\n const result = await validator(value);\n resolve(result);\n }, delay);\n });\n };\n },\n\n // Cancellable async validator\n cancellable: (validator) => {\n let abortController;\n const wrapped = async (value) => {\n if (abortController) {\n abortController.abort();\n }\n // AbortController is a global browser/Node.js API\n abortController = typeof AbortController !== 'undefined' ? new AbortController() : null;\n try {\n return await validator(value, abortController ? abortController.signal : null);\n } catch (error) {\n if (error.name === 'AbortError') {\n return null;\n }\n throw error;\n }\n };\n wrapped.cancel = () => {\n if (abortController) {\n abortController.abort();\n }\n };\n return wrapped;\n },\n\n // Conditional validator\n when: (condition, validator) => {\n return (value, options = {}, translator, allValues = {}) => {\n // Pass options as context if it looks like context (has non-validator properties)\n const context = options.min !== undefined || options.max !== undefined ? allValues : options;\n const shouldValidate = typeof condition === 'function' \n ? condition(value, context) \n : condition;\n \n if (!shouldValidate) {\n return null;\n }\n \n return typeof validator === 'function'\n ? validator(value, options, translator, allValues)\n : null;\n };\n },\n\n // Validator chain builder\n chain: (options = {}) => {\n const validatorList = [];\n const stopOnFirstError = options.stopOnFirstError !== false;\n \n const chain = {\n required: (opts) => {\n validatorList.push((v, o, t, a) => validators.required(v, opts || o, t, a));\n return chain;\n },\n email: (opts) => {\n validatorList.push((v, o, t, a) => validators.email(v, opts || o, t, a));\n return chain;\n },\n minLength: (opts) => {\n validatorList.push((v, o, t, a) => validators.minLength(v, opts || o, t, a));\n return chain;\n },\n maxLength: (opts) => {\n validatorList.push((v, o, t, a) => validators.maxLength(v, opts || o, t, a));\n return chain;\n },\n custom: (fn, message) => {\n validatorList.push((v, o, t, a) => {\n // Custom validator returns null if valid, message if invalid\n const result = fn(v, a);\n return result === null || result === true || result === undefined ? null : (message || result);\n });\n return chain;\n },\n validate: (value, opts, translator, allValues) => {\n if (stopOnFirstError) {\n // Stop on first error - return single error or null\n for (const validator of validatorList) {\n const error = validator(value, opts, translator, allValues);\n if (error) {\n return error;\n }\n }\n return null;\n } else {\n // Collect all errors - return array or null\n const errors = [];\n for (const validator of validatorList) {\n const error = validator(value, opts, translator, allValues);\n if (error) {\n errors.push(error);\n }\n }\n return errors.length > 0 ? errors : null;\n }\n }\n };\n \n return chain;\n }\n};\n\n/**\n * Validate a single field\n */\nexport function validateField(value, validatorList, formData = {}) {\n for (const validator of validatorList) {\n const error = validator(value, formData);\n if (error) {\n return error;\n }\n }\n return null;\n}\n\n/**\n * Validate entire form\n */\nexport function validateForm(formData, fieldValidators) {\n const errors = {};\n \n for (const [fieldName, validatorList] of Object.entries(fieldValidators)) {\n const value = formData[fieldName];\n const error = validateField(value, validatorList, formData);\n if (error) {\n errors[fieldName] = error;\n }\n }\n \n return Object.keys(errors).length > 0 ? errors : null;\n}\n\n/**\n * Create a validator\n */\nexport function createValidator(validatorFn, message) {\n return (value, options, translator, allValues) => {\n const result = validatorFn(value, options, translator, allValues);\n // If validator returns a string, use it as the error message\n if (typeof result === 'string') {\n return result;\n }\n // If validator returns falsy (null, false, undefined), no error\n if (!result) {\n return null;\n }\n // If validator returns truthy (true, object, etc), use provided message\n return message || 'Validation failed';\n };\n}\n\n/**\n * Register a custom validator\n */\nexport function registerValidator(name, validatorFn) {\n validators[name] = validatorFn;\n}\n\n/**\n * Compose multiple validators\n */\nexport function composeValidators(...validatorFns) {\n return (value, options, translator, allValues) => {\n for (const validator of validatorFns) {\n const error = validator(value, options, translator, allValues);\n if (error) {\n return error;\n }\n }\n return null;\n };\n}\n\nexport default {\n validators,\n validateField,\n validateForm,\n createValidator,\n registerValidator,\n composeValidators\n};\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coherent.js/forms",
3
- "version": "1.0.0-beta.6",
3
+ "version": "1.0.0-beta.7",
4
4
  "description": "SSR + Hydration form system for Coherent.js applications",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -22,18 +22,26 @@
22
22
  "author": "Coherent.js Team",
23
23
  "license": "MIT",
24
24
  "peerDependencies": {
25
- "@coherent.js/core": "1.0.0-beta.6",
26
- "@coherent.js/state": "1.0.0-beta.6"
25
+ "@coherent.js/core": "1.0.0-beta.7",
26
+ "@coherent.js/state": "1.0.0-beta.7"
27
27
  },
28
28
  "repository": {
29
29
  "type": "git",
30
30
  "url": "git+https://github.com/Tomdrouv1/coherent.js.git"
31
31
  },
32
+ "homepage": "https://github.com/Tomdrouv1/coherent.js",
33
+ "bugs": {
34
+ "url": "https://github.com/Tomdrouv1/coherent.js/issues"
35
+ },
32
36
  "publishConfig": {
33
37
  "access": "public"
34
38
  },
39
+ "engines": {
40
+ "node": ">=20.0.0"
41
+ },
35
42
  "types": "./types/index.d.ts",
36
43
  "files": [
44
+ "dist/",
37
45
  "LICENSE",
38
46
  "README.md",
39
47
  "types/"
@@ -41,6 +49,8 @@
41
49
  "sideEffects": false,
42
50
  "scripts": {
43
51
  "build": "node build.mjs",
44
- "clean": "rm -rf dist"
52
+ "clean": "rm -rf dist",
53
+ "test": "vitest run",
54
+ "test:watch": "vitest"
45
55
  }
46
56
  }