@gjsify/zlib 0.3.21 → 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,373 +0,0 @@
1
- // Reference: Node.js lib/zlib.js
2
- // Reimplemented for GJS using Web Compression API / Gio.ZlibCompressor
3
-
4
- export {
5
- ZlibTransform,
6
- createGzip, createGunzip,
7
- createDeflate, createInflate,
8
- createDeflateRaw, createInflateRaw,
9
- createUnzip,
10
- createBrotliCompress, createBrotliDecompress,
11
- } from './transform-streams.js';
12
-
13
- import Gio from '@girs/gio-2.0';
14
- import GLib from '@girs/glib-2.0';
15
- import type { ZlibOptions } from 'node:zlib';
16
-
17
- type ZlibCallback = (error: Error | null, result: Uint8Array) => void;
18
-
19
- const hasWebCompression = typeof globalThis.CompressionStream !== 'undefined';
20
-
21
- // ---- Gio-based compression for GJS ----
22
-
23
- type GioFormat = 'gzip' | 'deflate' | 'deflate-raw';
24
-
25
- function getGioFormat(format: GioFormat): Gio.ZlibCompressorFormat {
26
- switch (format) {
27
- case 'gzip': return Gio.ZlibCompressorFormat.GZIP;
28
- case 'deflate': return Gio.ZlibCompressorFormat.ZLIB;
29
- case 'deflate-raw': return Gio.ZlibCompressorFormat.RAW;
30
- }
31
- }
32
-
33
- function compressWithGio(data: Uint8Array, format: GioFormat): Uint8Array {
34
- const compressor = new Gio.ZlibCompressor({ format: getGioFormat(format) });
35
- const converter = new Gio.ConverterOutputStream({
36
- base_stream: Gio.MemoryOutputStream.new_resizable(),
37
- converter: compressor,
38
- });
39
-
40
- converter.write_bytes(new GLib.Bytes(data), null);
41
- converter.close(null);
42
-
43
- const memStream = converter.get_base_stream() as Gio.MemoryOutputStream;
44
- const bytes = memStream.steal_as_bytes();
45
- return new Uint8Array(bytes.get_data() ?? []);
46
- }
47
-
48
- function decompressStreamWithGio(data: Uint8Array, format: GioFormat): Uint8Array {
49
- const decompressor = new Gio.ZlibDecompressor({ format: getGioFormat(format) });
50
- const memInput = Gio.MemoryInputStream.new_from_bytes(new GLib.Bytes(data));
51
- const converter = new Gio.ConverterInputStream({
52
- base_stream: memInput,
53
- converter: decompressor,
54
- });
55
-
56
- const chunks: Uint8Array[] = [];
57
- const bufSize = 4096;
58
- while (true) {
59
- const bytes = converter.read_bytes(bufSize, null);
60
- const size = bytes.get_size();
61
- if (size === 0) break;
62
- chunks.push(new Uint8Array(bytes.get_data()!));
63
- }
64
- converter.close(null);
65
-
66
- const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
67
- const result = new Uint8Array(totalLength);
68
- let offset = 0;
69
- for (const chunk of chunks) {
70
- result.set(chunk, offset);
71
- offset += chunk.length;
72
- }
73
- return result;
74
- }
75
-
76
- function findGzipMemberEnd(data: Uint8Array): number {
77
- // Use the low-level convert() API to determine how many bytes a single
78
- // gzip member consumes. The outBuf data is not usable in GJS (not written
79
- // back to JS), but bytes_read is correct.
80
- const decompressor = new Gio.ZlibDecompressor({ format: Gio.ZlibCompressorFormat.GZIP });
81
- const outBuf = new Uint8Array(65536);
82
- let totalRead = 0;
83
- let finished = false;
84
- while (!finished) {
85
- const input = data.subarray(totalRead);
86
- try {
87
- const [result, bytesRead] = decompressor.convert(input, outBuf, Gio.ConverterFlags.NONE);
88
- totalRead += bytesRead;
89
- if (result === Gio.ConverterResult.FINISHED) finished = true;
90
- } catch {
91
- finished = true;
92
- }
93
- }
94
- return totalRead;
95
- }
96
-
97
- function decompressWithGio(data: Uint8Array, format: GioFormat): Uint8Array {
98
- if (format !== 'gzip') {
99
- return decompressStreamWithGio(data, format);
100
- }
101
-
102
- // Gzip: handle concatenated members (Node.js gunzip behavior)
103
- const allChunks: Uint8Array[] = [];
104
- let inputOffset = 0;
105
-
106
- while (inputOffset < data.length) {
107
- // Check for gzip magic bytes
108
- if (data.length - inputOffset < 2 || data[inputOffset] !== 0x1f || data[inputOffset + 1] !== 0x8b) {
109
- break;
110
- }
111
-
112
- const memberData = data.subarray(inputOffset);
113
- // Find where this member ends using the low-level API
114
- const consumed = findGzipMemberEnd(memberData);
115
- if (consumed <= 0) break; // No progress, avoid infinite loop
116
-
117
- // Decompress just this member using ConverterInputStream
118
- const decompressed = decompressStreamWithGio(memberData.subarray(0, consumed), 'gzip');
119
- allChunks.push(decompressed);
120
- inputOffset += consumed;
121
- }
122
-
123
- if (allChunks.length === 0) {
124
- // No valid gzip members found; try decompressing anyway to get proper error
125
- return decompressStreamWithGio(data, 'gzip');
126
- }
127
-
128
- const totalLength = allChunks.reduce((acc, c) => acc + c.length, 0);
129
- const result = new Uint8Array(totalLength);
130
- let offset = 0;
131
- for (const chunk of allChunks) {
132
- result.set(chunk, offset);
133
- offset += chunk.length;
134
- }
135
- return result;
136
- }
137
-
138
- // ---- Compression helpers using Web Compression API ----
139
-
140
- async function compressWithWeb(data: Uint8Array, format: CompressionFormat): Promise<Uint8Array> {
141
- const cs = new CompressionStream(format);
142
- const writer = cs.writable.getWriter();
143
- writer.write(new Uint8Array(data.buffer as ArrayBuffer, data.byteOffset, data.byteLength));
144
- writer.close();
145
-
146
- const chunks: Uint8Array[] = [];
147
- const reader = cs.readable.getReader();
148
- while (true) {
149
- const { done, value } = await reader.read();
150
- if (done) break;
151
- chunks.push(value);
152
- }
153
-
154
- const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
155
- const result = new Uint8Array(totalLength);
156
- let offset = 0;
157
- for (const chunk of chunks) {
158
- result.set(chunk, offset);
159
- offset += chunk.length;
160
- }
161
- return result;
162
- }
163
-
164
- async function decompressWithWeb(data: Uint8Array, format: CompressionFormat): Promise<Uint8Array> {
165
- const ds = new DecompressionStream(format);
166
- const writer = ds.writable.getWriter();
167
- writer.write(new Uint8Array(data.buffer as ArrayBuffer, data.byteOffset, data.byteLength));
168
- writer.close();
169
-
170
- const chunks: Uint8Array[] = [];
171
- const reader = ds.readable.getReader();
172
- while (true) {
173
- const { done, value } = await reader.read();
174
- if (done) break;
175
- chunks.push(value);
176
- }
177
-
178
- const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
179
- const result = new Uint8Array(totalLength);
180
- let offset = 0;
181
- for (const chunk of chunks) {
182
- result.set(chunk, offset);
183
- offset += chunk.length;
184
- }
185
- return result;
186
- }
187
-
188
- // ---- Unified compress/decompress ----
189
-
190
- async function compress(data: Uint8Array, format: GioFormat): Promise<Uint8Array> {
191
- if (hasWebCompression) {
192
- return compressWithWeb(data, format as CompressionFormat);
193
- }
194
- return compressWithGio(data, format);
195
- }
196
-
197
- async function decompress(data: Uint8Array, format: GioFormat): Promise<Uint8Array> {
198
- if (hasWebCompression) {
199
- return decompressWithWeb(data, format as CompressionFormat);
200
- }
201
- return decompressWithGio(data, format);
202
- }
203
-
204
- function toUint8Array(data: string | Uint8Array | ArrayBuffer): Uint8Array {
205
- if (typeof data === 'string') {
206
- return new TextEncoder().encode(data);
207
- }
208
- if (data instanceof ArrayBuffer) {
209
- return new Uint8Array(data);
210
- }
211
- return data;
212
- }
213
-
214
- // ---- Callback-based API ----
215
-
216
- export function gzip(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
217
- export function gzip(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
218
- export function gzip(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
219
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
220
- compress(toUint8Array(data), 'gzip').then(
221
- result => cb(null, result),
222
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
223
- );
224
- }
225
-
226
- export function gunzip(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
227
- export function gunzip(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
228
- export function gunzip(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
229
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
230
- decompress(toUint8Array(data), 'gzip').then(
231
- result => cb(null, result),
232
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
233
- );
234
- }
235
-
236
- export function deflate(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
237
- export function deflate(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
238
- export function deflate(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
239
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
240
- compress(toUint8Array(data), 'deflate').then(
241
- result => cb(null, result),
242
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
243
- );
244
- }
245
-
246
- export function inflate(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
247
- export function inflate(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
248
- export function inflate(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
249
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
250
- decompress(toUint8Array(data), 'deflate').then(
251
- result => cb(null, result),
252
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
253
- );
254
- }
255
-
256
- export function deflateRaw(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
257
- export function deflateRaw(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
258
- export function deflateRaw(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
259
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
260
- compress(toUint8Array(data), 'deflate-raw').then(
261
- result => cb(null, result),
262
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
263
- );
264
- }
265
-
266
- export function inflateRaw(data: string | Uint8Array | ArrayBuffer, callback: ZlibCallback): void;
267
- export function inflateRaw(data: string | Uint8Array | ArrayBuffer, options: ZlibOptions, callback: ZlibCallback): void;
268
- export function inflateRaw(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
269
- const cb = typeof optionsOrCallback === 'function' ? optionsOrCallback : callback!;
270
- decompress(toUint8Array(data), 'deflate-raw').then(
271
- result => cb(null, result),
272
- err => cb(err instanceof Error ? err : new Error(String(err)), new Uint8Array(0))
273
- );
274
- }
275
-
276
- // ---- Sync API (uses Gio.ZlibCompressor / Gio.ZlibDecompressor) ----
277
-
278
- export function gzipSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
279
- return compressWithGio(toUint8Array(data), 'gzip');
280
- }
281
-
282
- export function gunzipSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
283
- return decompressWithGio(toUint8Array(data), 'gzip');
284
- }
285
-
286
- export function deflateSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
287
- return compressWithGio(toUint8Array(data), 'deflate');
288
- }
289
-
290
- export function inflateSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
291
- return decompressWithGio(toUint8Array(data), 'deflate');
292
- }
293
-
294
- export function deflateRawSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
295
- return compressWithGio(toUint8Array(data), 'deflate-raw');
296
- }
297
-
298
- export function inflateRawSync(data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
299
- return decompressWithGio(toUint8Array(data), 'deflate-raw');
300
- }
301
-
302
- // ---- Brotli (not available in GJS — stubs throw at call time) ----
303
-
304
- export function brotliCompress(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
305
- const cb = (typeof optionsOrCallback === 'function' ? optionsOrCallback : callback) as ZlibCallback;
306
- cb(new Error('brotliCompress: Brotli is not supported in this environment'), null as any);
307
- }
308
-
309
- export function brotliDecompress(data: string | Uint8Array | ArrayBuffer, optionsOrCallback: ZlibOptions | ZlibCallback, callback?: ZlibCallback): void {
310
- const cb = (typeof optionsOrCallback === 'function' ? optionsOrCallback : callback) as ZlibCallback;
311
- cb(new Error('brotliDecompress: Brotli is not supported in this environment'), null as any);
312
- }
313
-
314
- export function brotliCompressSync(_data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
315
- throw new Error('brotliCompressSync: Brotli is not supported in this environment');
316
- }
317
-
318
- export function brotliDecompressSync(_data: string | Uint8Array | ArrayBuffer, _options?: ZlibOptions): Uint8Array {
319
- throw new Error('brotliDecompressSync: Brotli is not supported in this environment');
320
- }
321
-
322
- // ---- Constants ----
323
-
324
- export const constants = {
325
- Z_NO_FLUSH: 0,
326
- Z_PARTIAL_FLUSH: 1,
327
- Z_SYNC_FLUSH: 2,
328
- Z_FULL_FLUSH: 3,
329
- Z_FINISH: 4,
330
- Z_BLOCK: 5,
331
- Z_TREES: 6,
332
- Z_OK: 0,
333
- Z_STREAM_END: 1,
334
- Z_NEED_DICT: 2,
335
- Z_ERRNO: -1,
336
- Z_STREAM_ERROR: -2,
337
- Z_DATA_ERROR: -3,
338
- Z_MEM_ERROR: -4,
339
- Z_BUF_ERROR: -5,
340
- Z_VERSION_ERROR: -6,
341
- Z_NO_COMPRESSION: 0,
342
- Z_BEST_SPEED: 1,
343
- Z_BEST_COMPRESSION: 9,
344
- Z_DEFAULT_COMPRESSION: -1,
345
- Z_FILTERED: 1,
346
- Z_HUFFMAN_ONLY: 2,
347
- Z_RLE: 3,
348
- Z_FIXED: 4,
349
- Z_DEFAULT_STRATEGY: 0,
350
- Z_DEFLATED: 8,
351
- };
352
-
353
- // ---- Default export ----
354
-
355
- import {
356
- createGzip, createGunzip,
357
- createDeflate, createInflate,
358
- createDeflateRaw, createInflateRaw,
359
- createUnzip,
360
- createBrotliCompress, createBrotliDecompress,
361
- } from './transform-streams.js';
362
-
363
- export default {
364
- gzip, gunzip, deflate, inflate, deflateRaw, inflateRaw,
365
- gzipSync, gunzipSync, deflateSync, inflateSync, deflateRawSync, inflateRawSync,
366
- brotliCompress, brotliDecompress, brotliCompressSync, brotliDecompressSync,
367
- createGzip, createGunzip,
368
- createDeflate, createInflate,
369
- createDeflateRaw, createInflateRaw,
370
- createUnzip,
371
- createBrotliCompress, createBrotliDecompress,
372
- constants,
373
- };
package/src/test.mts DELETED
@@ -1,6 +0,0 @@
1
-
2
- import { run } from '@gjsify/unit';
3
-
4
- import testSuite from './index.spec.js';
5
-
6
- run({testSuite});
@@ -1,136 +0,0 @@
1
- // Reference: Node.js lib/zlib.js (createGzip, createDeflate, etc.)
2
- // Reimplemented for GJS using Gio.ZlibCompressor wrapped in a Node Transform stream.
3
-
4
- import Gio from '@girs/gio-2.0';
5
- import GLib from '@girs/glib-2.0';
6
- import { Transform } from 'node:stream';
7
- import type { TransformOptions } from 'node:stream';
8
- import type { ZlibOptions } from 'node:zlib';
9
-
10
- type GioFormat = 'gzip' | 'deflate' | 'deflate-raw';
11
-
12
- function getGioCompressorFormat(format: GioFormat): Gio.ZlibCompressorFormat {
13
- switch (format) {
14
- case 'gzip': return Gio.ZlibCompressorFormat.GZIP;
15
- case 'deflate': return Gio.ZlibCompressorFormat.ZLIB;
16
- case 'deflate-raw': return Gio.ZlibCompressorFormat.RAW;
17
- }
18
- }
19
-
20
-
21
- function toUint8Array(chunk: Uint8Array | string): Uint8Array {
22
- if (typeof chunk === 'string') return new TextEncoder().encode(chunk);
23
- return new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);
24
- }
25
-
26
- export class ZlibTransform extends Transform {
27
- private _format: GioFormat;
28
- private _mode: 'compress' | 'decompress';
29
- private _chunks: Uint8Array[] = [];
30
-
31
- constructor(format: GioFormat, mode: 'compress' | 'decompress', options?: ZlibOptions) {
32
- super(options as unknown as TransformOptions);
33
- this._format = format;
34
- this._mode = mode;
35
- }
36
-
37
- _transform(chunk: unknown, _encoding: string, callback: (err?: Error) => void): void {
38
- this._chunks.push(toUint8Array(chunk as Uint8Array | string));
39
- callback();
40
- }
41
-
42
- _flush(callback: (err?: Error) => void): void {
43
- const totalLength = this._chunks.reduce((acc, c) => acc + c.length, 0);
44
- const input = new Uint8Array(totalLength);
45
- let offset = 0;
46
- for (const c of this._chunks) { input.set(c, offset); offset += c.length; }
47
- this._chunks = [];
48
-
49
- try {
50
- const result = this._mode === 'compress'
51
- ? this._compress(input)
52
- : this._decompress(input);
53
- this.push(Buffer.from(result));
54
- callback();
55
- } catch (err) {
56
- callback(err instanceof Error ? err : new Error(String(err)));
57
- }
58
- }
59
-
60
- private _compress(data: Uint8Array): Uint8Array {
61
- const compressor = new Gio.ZlibCompressor({ format: getGioCompressorFormat(this._format) });
62
- const converter = new Gio.ConverterOutputStream({
63
- base_stream: Gio.MemoryOutputStream.new_resizable(),
64
- converter: compressor,
65
- });
66
- converter.write_bytes(new GLib.Bytes(data), null);
67
- converter.close(null);
68
- const memStream = converter.get_base_stream() as Gio.MemoryOutputStream;
69
- const bytes = memStream.steal_as_bytes();
70
- return new Uint8Array(bytes.get_data() ?? []);
71
- }
72
-
73
- private _decompress(data: Uint8Array): Uint8Array {
74
- const decompressor = new Gio.ZlibDecompressor({ format: getGioCompressorFormat(this._format) });
75
- const memInput = Gio.MemoryInputStream.new_from_bytes(new GLib.Bytes(data));
76
- const converter = new Gio.ConverterInputStream({
77
- base_stream: memInput,
78
- converter: decompressor,
79
- });
80
-
81
- const chunks: Uint8Array[] = [];
82
- const bufSize = 4096;
83
- while (true) {
84
- const bytes = converter.read_bytes(bufSize, null);
85
- if (bytes.get_size() === 0) break;
86
- chunks.push(new Uint8Array(bytes.get_data()!));
87
- }
88
- converter.close(null);
89
-
90
- const totalLength = chunks.reduce((acc, c) => acc + c.length, 0);
91
- const result = new Uint8Array(totalLength);
92
- let off = 0;
93
- for (const c of chunks) { result.set(c, off); off += c.length; }
94
- return result;
95
- }
96
- }
97
-
98
- // ---- Factory functions (mirror Node.js API) ----
99
-
100
- export function createGzip(options?: ZlibOptions): ZlibTransform {
101
- return new ZlibTransform('gzip', 'compress', options);
102
- }
103
-
104
- export function createGunzip(options?: ZlibOptions): ZlibTransform {
105
- return new ZlibTransform('gzip', 'decompress', options);
106
- }
107
-
108
- export function createDeflate(options?: ZlibOptions): ZlibTransform {
109
- return new ZlibTransform('deflate', 'compress', options);
110
- }
111
-
112
- export function createInflate(options?: ZlibOptions): ZlibTransform {
113
- return new ZlibTransform('deflate', 'decompress', options);
114
- }
115
-
116
- export function createDeflateRaw(options?: ZlibOptions): ZlibTransform {
117
- return new ZlibTransform('deflate-raw', 'compress', options);
118
- }
119
-
120
- export function createInflateRaw(options?: ZlibOptions): ZlibTransform {
121
- return new ZlibTransform('deflate-raw', 'decompress', options);
122
- }
123
-
124
- export function createUnzip(options?: ZlibOptions): ZlibTransform {
125
- // Unzip auto-detects gzip vs deflate — default to gzip for GJS
126
- return new ZlibTransform('gzip', 'decompress', options);
127
- }
128
-
129
- // Brotli is not available in GLib — stubs that throw at runtime
130
- export function createBrotliCompress(_options?: ZlibOptions): never {
131
- throw new Error('createBrotliCompress is not supported on GJS (no Brotli in GLib)');
132
- }
133
-
134
- export function createBrotliDecompress(_options?: ZlibOptions): never {
135
- throw new Error('createBrotliDecompress is not supported on GJS (no Brotli in GLib)');
136
- }
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
- }