@gjsify/querystring 0.4.0 → 0.4.3

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/src/index.ts DELETED
@@ -1,578 +0,0 @@
1
- // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
2
- // https://github.com/denoland/deno_std/blob/main/node/querystring.ts
3
-
4
- import type { ParsedUrlQuery } from 'node:querystring';
5
-
6
- import { Buffer } from "node:buffer";
7
- import { NodeURIError } from "./error.js";
8
-
9
- const hexTable = new Array(256);
10
- for (let i = 0; i < 256; ++i) {
11
- hexTable[i] = "%" + ((i < 16 ? "0" : "") + i.toString(16)).toUpperCase();
12
- }
13
-
14
- function encodeStr(
15
- str: string,
16
- noEscapeTable: Int8Array,
17
- hexTable: string[],
18
- ): string {
19
- const len = str.length;
20
- if (len === 0) return "";
21
-
22
- let out = "";
23
- let lastPos = 0;
24
-
25
- for (let i = 0; i < len; i++) {
26
- let c = str.charCodeAt(i);
27
- // ASCII
28
- if (c < 0x80) {
29
- if (noEscapeTable[c] === 1) continue;
30
- if (lastPos < i) out += str.slice(lastPos, i);
31
- lastPos = i + 1;
32
- out += hexTable[c];
33
- continue;
34
- }
35
-
36
- if (lastPos < i) out += str.slice(lastPos, i);
37
-
38
- // Multi-byte characters ...
39
- if (c < 0x800) {
40
- lastPos = i + 1;
41
- out += hexTable[0xc0 | (c >> 6)] + hexTable[0x80 | (c & 0x3f)];
42
- continue;
43
- }
44
- if (c < 0xd800 || c >= 0xe000) {
45
- lastPos = i + 1;
46
- out += hexTable[0xe0 | (c >> 12)] +
47
- hexTable[0x80 | ((c >> 6) & 0x3f)] +
48
- hexTable[0x80 | (c & 0x3f)];
49
- continue;
50
- }
51
- // Surrogate pair
52
- ++i;
53
-
54
- // This branch should never happen because all URLSearchParams entries
55
- // should already be converted to USVString. But, included for
56
- // completion's sake anyway.
57
- if (i >= len) throw new ERR_INVALID_URI();
58
-
59
- const c2 = str.charCodeAt(i) & 0x3ff;
60
-
61
- lastPos = i + 1;
62
- c = 0x10000 + (((c & 0x3ff) << 10) | c2);
63
- out += hexTable[0xf0 | (c >> 18)] +
64
- hexTable[0x80 | ((c >> 12) & 0x3f)] +
65
- hexTable[0x80 | ((c >> 6) & 0x3f)] +
66
- hexTable[0x80 | (c & 0x3f)];
67
- }
68
- if (lastPos === 0) return str;
69
- if (lastPos < len) return out + str.slice(lastPos);
70
- return out;
71
- }
72
-
73
- export class ERR_INVALID_URI extends NodeURIError {
74
- constructor() {
75
- super("ERR_INVALID_URI", `URI malformed`);
76
- }
77
- }
78
-
79
- /**
80
- * Alias of querystring.parse()
81
- * @legacy
82
- */
83
- export const decode = parse;
84
-
85
- /**
86
- * Alias of querystring.stringify()
87
- * @legacy
88
- */
89
- export const encode = stringify;
90
-
91
- /**
92
- * replaces encodeURIComponent()
93
- * @see https://www.ecma-international.org/ecma-262/5.1/#sec-15.1.3.4
94
- */
95
- function qsEscape(str: unknown): string {
96
- if (typeof str !== "string") {
97
- if (typeof str === "object") {
98
- str = String(str);
99
- } else {
100
- str += "";
101
- }
102
- }
103
- return encodeStr(str as string, noEscape, hexTable);
104
- }
105
-
106
- /**
107
- * Performs URL percent-encoding on the given `str` in a manner that is optimized for the specific requirements of URL query strings.
108
- * Used by `querystring.stringify()` and is generally not expected to be used directly.
109
- * It is exported primarily to allow application code to provide a replacement percent-encoding implementation if necessary by assigning `querystring.escape` to an alternative function.
110
- * @legacy
111
- * @see Tested in `test-querystring-escape.js`
112
- */
113
- export const escape = qsEscape;
114
-
115
- export type { ParsedUrlQuery };
116
-
117
- interface ParseOptions {
118
- /** The function to use when decoding percent-encoded characters in the query string. */
119
- decodeURIComponent?: (string: string) => string;
120
- /** Specifies the maximum number of keys to parse. */
121
- maxKeys?: number;
122
- }
123
-
124
- // deno-fmt-ignore
125
- const isHexTable = new Int8Array([
126
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
127
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
128
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 32 - 47
129
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
130
- 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 64 - 79
131
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 80 - 95
132
- 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 96 - 111
133
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 112 - 127
134
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 128 ...
135
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
136
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
137
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
138
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
139
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
140
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
141
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ... 256
142
- ]);
143
-
144
- function charCodes(str: string): number[] {
145
- const ret = new Array(str.length);
146
- for (let i = 0; i < str.length; ++i) {
147
- ret[i] = str.charCodeAt(i);
148
- }
149
- return ret;
150
- }
151
-
152
- function addKeyVal(
153
- obj: ParsedUrlQuery,
154
- key: string,
155
- value: string,
156
- keyEncoded: boolean,
157
- valEncoded: boolean,
158
- decode: (encodedURIComponent: string) => string,
159
- ) {
160
- if (key.length > 0 && keyEncoded) {
161
- try {
162
- key = decode(key);
163
- } catch {
164
- // If decode throws, use the raw key as-is
165
- }
166
- }
167
- if (value.length > 0 && valEncoded) {
168
- try {
169
- value = decode(value);
170
- } catch {
171
- // If decode throws, use the raw value as-is
172
- }
173
- }
174
-
175
- if (obj[key] === undefined) {
176
- obj[key] = value;
177
- } else {
178
- const curValue = obj[key];
179
- // A simple Array-specific property check is enough here to
180
- // distinguish from a string value and is faster and still safe
181
- // since we are generating all of the values being assigned.
182
- if ((curValue as string[]).pop) {
183
- (curValue as string[])[curValue!.length] = value;
184
- } else {
185
- obj[key] = [curValue as string, value];
186
- }
187
- }
188
- }
189
-
190
- /**
191
- * Parses a URL query string into a collection of key and value pairs.
192
- * @param str The URL query string to parse
193
- * @param sep The substring used to delimit key and value pairs in the query string. Default: '&'.
194
- * @param eq The substring used to delimit keys and values in the query string. Default: '='.
195
- * @param options The parse options
196
- * @param options.decodeURIComponent The function to use when decoding percent-encoded characters in the query string. Default: `querystring.unescape()`.
197
- * @param options.maxKeys Specifies the maximum number of keys to parse. Specify `0` to remove key counting limitations. Default: `1000`.
198
- * @legacy
199
- * @see Tested in test-querystring.js
200
- */
201
- export function parse(
202
- str: string,
203
- sep = "&",
204
- eq = "=",
205
- { decodeURIComponent = unescape, maxKeys = 1000 }: ParseOptions = {},
206
- ): ParsedUrlQuery {
207
- const obj: ParsedUrlQuery = Object.create(null);
208
-
209
- if (typeof str !== "string" || str.length === 0) {
210
- return obj;
211
- }
212
-
213
- const sepCodes = (!sep ? [38] /* & */ : charCodes(String(sep)));
214
- const eqCodes = (!eq ? [61] /* = */ : charCodes(String(eq)));
215
- const sepLen = sepCodes.length;
216
- const eqLen = eqCodes.length;
217
-
218
- let pairs = 1000;
219
- if (typeof maxKeys === "number") {
220
- // -1 is used in place of a value like Infinity for meaning
221
- // "unlimited pairs" because of additional checks V8 (at least as of v5.4)
222
- // has to do when using variables that contain values like Infinity. Since
223
- // `pairs` is always decremented and checked explicitly for 0, -1 works
224
- // effectively the same as Infinity, while providing a significant
225
- // performance boost.
226
- pairs = maxKeys > 0 ? maxKeys : -1;
227
- }
228
-
229
- let decode = unescape;
230
- if (decodeURIComponent) {
231
- decode = decodeURIComponent;
232
- }
233
- const customDecode = (decode !== unescape);
234
-
235
- let lastPos = 0;
236
- let sepIdx = 0;
237
- let eqIdx = 0;
238
- let key = "";
239
- let value = "";
240
- let keyEncoded = customDecode;
241
- let valEncoded = customDecode;
242
- const plusChar = (customDecode ? "%20" : " ");
243
- let encodeCheck = 0;
244
- for (let i = 0; i < str.length; ++i) {
245
- const code = str.charCodeAt(i);
246
-
247
- // Try matching key/value pair separator (e.g. '&')
248
- if (code === sepCodes[sepIdx]) {
249
- if (++sepIdx === sepLen) {
250
- // Key/value pair separator match!
251
- const end = i - sepIdx + 1;
252
- if (eqIdx < eqLen) {
253
- // We didn't find the (entire) key/value separator
254
- if (lastPos < end) {
255
- // Treat the substring as part of the key instead of the value
256
- key += str.slice(lastPos, end);
257
- } else if (key.length === 0) {
258
- // We saw an empty substring between separators
259
- if (--pairs === 0) {
260
- return obj;
261
- }
262
- lastPos = i + 1;
263
- sepIdx = eqIdx = 0;
264
- continue;
265
- }
266
- } else if (lastPos < end) {
267
- value += str.slice(lastPos, end);
268
- }
269
-
270
- addKeyVal(obj, key, value, keyEncoded, valEncoded, decode);
271
-
272
- if (--pairs === 0) {
273
- return obj;
274
- }
275
- key = value = "";
276
- encodeCheck = 0;
277
- lastPos = i + 1;
278
- sepIdx = eqIdx = 0;
279
- }
280
- } else {
281
- sepIdx = 0;
282
- // Try matching key/value separator (e.g. '=') if we haven't already
283
- if (eqIdx < eqLen) {
284
- if (code === eqCodes[eqIdx]) {
285
- if (++eqIdx === eqLen) {
286
- // Key/value separator match!
287
- const end = i - eqIdx + 1;
288
- if (lastPos < end) {
289
- key += str.slice(lastPos, end);
290
- }
291
- encodeCheck = 0;
292
- lastPos = i + 1;
293
- }
294
- continue;
295
- } else {
296
- eqIdx = 0;
297
- if (!keyEncoded) {
298
- // Try to match an (valid) encoded byte once to minimize unnecessary
299
- // calls to string decoding functions
300
- if (code === 37 /* % */) {
301
- encodeCheck = 1;
302
- continue;
303
- } else if (encodeCheck > 0) {
304
- if (isHexTable[code] === 1) {
305
- if (++encodeCheck === 3) {
306
- keyEncoded = true;
307
- }
308
- continue;
309
- } else {
310
- encodeCheck = 0;
311
- }
312
- }
313
- }
314
- }
315
- if (code === 43 /* + */) {
316
- if (lastPos < i) {
317
- key += str.slice(lastPos, i);
318
- }
319
- key += plusChar;
320
- lastPos = i + 1;
321
- continue;
322
- }
323
- }
324
- if (code === 43 /* + */) {
325
- if (lastPos < i) {
326
- value += str.slice(lastPos, i);
327
- }
328
- value += plusChar;
329
- lastPos = i + 1;
330
- } else if (!valEncoded) {
331
- // Try to match an (valid) encoded byte (once) to minimize unnecessary
332
- // calls to string decoding functions
333
- if (code === 37 /* % */) {
334
- encodeCheck = 1;
335
- } else if (encodeCheck > 0) {
336
- if (isHexTable[code] === 1) {
337
- if (++encodeCheck === 3) {
338
- valEncoded = true;
339
- }
340
- } else {
341
- encodeCheck = 0;
342
- }
343
- }
344
- }
345
- }
346
- }
347
-
348
- // Deal with any leftover key or value data
349
- if (lastPos < str.length) {
350
- if (eqIdx < eqLen) {
351
- key += str.slice(lastPos);
352
- } else if (sepIdx < sepLen) {
353
- value += str.slice(lastPos);
354
- }
355
- } else if (eqIdx === 0 && key.length === 0) {
356
- // We ended on an empty substring
357
- return obj;
358
- }
359
-
360
- addKeyVal(obj, key, value, keyEncoded, valEncoded, decode);
361
-
362
- return obj;
363
- }
364
-
365
- interface StringifyOptions {
366
- /** The function to use when converting URL-unsafe characters to percent-encoding in the query string. */
367
- encodeURIComponent: (string: string) => string;
368
- }
369
-
370
- /**
371
- * These characters do not need escaping when generating query strings:
372
- * ! - . _ ~
373
- * ' ( ) *
374
- * digits
375
- * alpha (uppercase)
376
- * alpha (lowercase)
377
- */
378
- // deno-fmt-ignore
379
- const noEscape = new Int8Array([
380
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0 - 15
381
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 16 - 31
382
- 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 0, // 32 - 47
383
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, // 48 - 63
384
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 64 - 79
385
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, // 80 - 95
386
- 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, // 96 - 111
387
- 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, // 112 - 127
388
- ]);
389
-
390
- function stringifyPrimitive(v: unknown): string {
391
- if (typeof v === "string") {
392
- return v;
393
- }
394
- if (typeof v === "number" && isFinite(v)) {
395
- return "" + v;
396
- }
397
- if (typeof v === "bigint") {
398
- return "" + v;
399
- }
400
- if (typeof v === "boolean") {
401
- return v ? "true" : "false";
402
- }
403
- return "";
404
- }
405
-
406
- function encodeStringifiedCustom(
407
- v: unknown,
408
- encode: (string: string) => string,
409
- ): string {
410
- return encode(stringifyPrimitive(v));
411
- }
412
-
413
- function encodeStringified(v: unknown, encode: (string: string) => string): string {
414
- if (typeof v === "string") {
415
- return (v.length ? encode(v) : "");
416
- }
417
- if (typeof v === "number" && isFinite(v)) {
418
- // Values >= 1e21 automatically switch to scientific notation which requires
419
- // escaping due to the inclusion of a '+' in the output
420
- return (Math.abs(v) < 1e21 ? "" + v : encode("" + v));
421
- }
422
- if (typeof v === "bigint") {
423
- return "" + v;
424
- }
425
- if (typeof v === "boolean") {
426
- return v ? "true" : "false";
427
- }
428
- return "";
429
- }
430
-
431
- /**
432
- * Produces a URL query string from a given obj by iterating through the object's "own properties".
433
- * @param obj The object to serialize into a URL query string.
434
- * @param sep The substring used to delimit key and value pairs in the query string. Default: '&'.
435
- * @param eq The substring used to delimit keys and values in the query string. Default: '='.
436
- * @param options The stringify options
437
- * @param options.encodeURIComponent The function to use when converting URL-unsafe characters to percent-encoding in the query string. Default: `querystring.escape()`.
438
- * @legacy
439
- * @see Tested in `test-querystring.js`
440
- */
441
- export function stringify(
442
- obj: Record<string, unknown>,
443
- sep?: string,
444
- eq?: string,
445
- options?: StringifyOptions,
446
- ): string {
447
- sep ||= "&";
448
- eq ||= "=";
449
- const encode = options ? options.encodeURIComponent : qsEscape;
450
- const convert = options ? encodeStringifiedCustom : encodeStringified;
451
-
452
- if (obj !== null && typeof obj === "object") {
453
- const keys = Object.keys(obj);
454
- const len = keys.length;
455
- let fields = "";
456
- for (let i = 0; i < len; ++i) {
457
- const k = keys[i];
458
- const v = obj[k];
459
- let ks = convert(k, encode);
460
- ks += eq;
461
-
462
- if (Array.isArray(v)) {
463
- const vlen = v.length;
464
- if (vlen === 0) continue;
465
- if (fields) {
466
- fields += sep;
467
- }
468
- for (let j = 0; j < vlen; ++j) {
469
- if (j) {
470
- fields += sep;
471
- }
472
- fields += ks;
473
- fields += convert(v[j], encode);
474
- }
475
- } else {
476
- if (fields) {
477
- fields += sep;
478
- }
479
- fields += ks;
480
- fields += convert(v, encode);
481
- }
482
- }
483
- return fields;
484
- }
485
- return "";
486
- }
487
-
488
- // deno-fmt-ignore
489
- const unhexTable = new Int8Array([
490
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 0 - 15
491
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 16 - 31
492
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 32 - 47
493
- +0, +1, +2, +3, +4, +5, +6, +7, +8, +9, -1, -1, -1, -1, -1, -1, // 48 - 63
494
- -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 64 - 79
495
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 80 - 95
496
- -1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 96 - 111
497
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 112 - 127
498
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // 128 ...
499
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
500
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
501
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
502
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
503
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
504
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
505
- -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // ... 255
506
- ]);
507
-
508
- /**
509
- * A safe fast alternative to decodeURIComponent
510
- */
511
- export function unescapeBuffer(s: string, decodeSpaces = false): Buffer {
512
- const out = new Buffer(s.length);
513
- let index = 0;
514
- let outIndex = 0;
515
- let currentChar;
516
- let nextChar;
517
- let hexHigh;
518
- let hexLow;
519
- const maxLength = s.length - 2;
520
- // Flag to know if some hex chars have been decoded
521
- let hasHex = false;
522
- while (index < s.length) {
523
- currentChar = s.charCodeAt(index);
524
- if (currentChar === 43 /* '+' */ && decodeSpaces) {
525
- out[outIndex++] = 32; // ' '
526
- index++;
527
- continue;
528
- }
529
- if (currentChar === 37 /* '%' */ && index < maxLength) {
530
- currentChar = s.charCodeAt(++index);
531
- hexHigh = unhexTable[currentChar];
532
- if (!(hexHigh >= 0)) {
533
- out[outIndex++] = 37; // '%'
534
- continue;
535
- } else {
536
- nextChar = s.charCodeAt(++index);
537
- hexLow = unhexTable[nextChar];
538
- if (!(hexLow >= 0)) {
539
- out[outIndex++] = 37; // '%'
540
- index--;
541
- } else {
542
- hasHex = true;
543
- currentChar = hexHigh * 16 + hexLow;
544
- }
545
- }
546
- }
547
- out[outIndex++] = currentChar;
548
- index++;
549
- }
550
- return hasHex ? out.slice(0, outIndex) : out;
551
- }
552
-
553
- function qsUnescape(s: string): string {
554
- try {
555
- return decodeURIComponent(s);
556
- } catch {
557
- return unescapeBuffer(s).toString();
558
- }
559
- }
560
-
561
- /**
562
- * Performs decoding of URL percent-encoded characters on the given `str`.
563
- * Used by `querystring.parse()` and is generally not expected to be used directly.
564
- * It is exported primarily to allow application code to provide a replacement decoding implementation if necessary by assigning `querystring.unescape` to an alternative function.
565
- * @legacy
566
- * @see Tested in `test-querystring-escape.js`
567
- */
568
- export const unescape = qsUnescape;
569
-
570
- export default {
571
- parse,
572
- stringify,
573
- decode,
574
- encode,
575
- unescape,
576
- escape,
577
- unescapeBuffer,
578
- };
package/src/test.mts DELETED
@@ -1,4 +0,0 @@
1
-
2
- import { run } from '@gjsify/unit';
3
- import testSuite from './index.spec.js';
4
- run({testSuite});
package/tsconfig.json DELETED
@@ -1,29 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "module": "ESNext",
4
- "target": "ESNext",
5
- "moduleResolution": "bundler",
6
- "types": [
7
- "node"
8
- ],
9
- "experimentalDecorators": true,
10
- "emitDeclarationOnly": true,
11
- "declaration": true,
12
- "allowImportingTsExtensions": true,
13
- "outDir": "lib",
14
- "rootDir": "src",
15
- "declarationDir": "lib/types",
16
- "composite": true,
17
- "skipLibCheck": true,
18
- "allowJs": true,
19
- "checkJs": false,
20
- "strict": false
21
- },
22
- "include": [
23
- "src/**/*.ts"
24
- ],
25
- "exclude": [
26
- "src/test.ts",
27
- "src/test.mts"
28
- ]
29
- }