@t4h.framework/fs 0.5.0 → 0.7.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.
Files changed (73) hide show
  1. package/.ai/skills/framework-fs/SKILL.md +23 -3
  2. package/.ai/skills/framework-fs-split/SKILL.md +350 -0
  3. package/README.md +297 -3
  4. package/dist/FileSystemClaim.d.ts +4 -0
  5. package/dist/FileSystemClaim.d.ts.map +1 -1
  6. package/dist/FileSystemClaim.js.map +1 -1
  7. package/dist/activities/FileJoinActivity.d.ts +59 -0
  8. package/dist/activities/FileJoinActivity.d.ts.map +1 -0
  9. package/dist/activities/FileJoinActivity.js +74 -0
  10. package/dist/activities/FileJoinActivity.js.map +1 -0
  11. package/dist/activities/FileReadActivity.d.ts +22 -0
  12. package/dist/activities/FileReadActivity.d.ts.map +1 -0
  13. package/dist/activities/FileReadActivity.js +68 -0
  14. package/dist/activities/FileReadActivity.js.map +1 -0
  15. package/dist/activities/FileSplitActivity.d.ts +31 -28
  16. package/dist/activities/FileSplitActivity.d.ts.map +1 -1
  17. package/dist/activities/FileSplitActivity.js +40 -34
  18. package/dist/activities/FileSplitActivity.js.map +1 -1
  19. package/dist/activities/__tests__/FileJoinActivity.spec.d.ts +2 -0
  20. package/dist/activities/__tests__/FileJoinActivity.spec.d.ts.map +1 -0
  21. package/dist/activities/__tests__/FileJoinActivity.spec.js +323 -0
  22. package/dist/activities/__tests__/FileJoinActivity.spec.js.map +1 -0
  23. package/dist/activities/__tests__/FileReadActivity.spec.d.ts +2 -0
  24. package/dist/activities/__tests__/FileReadActivity.spec.d.ts.map +1 -0
  25. package/dist/activities/__tests__/FileReadActivity.spec.js +120 -0
  26. package/dist/activities/__tests__/FileReadActivity.spec.js.map +1 -0
  27. package/dist/activities/__tests__/FileSplitActivity.spec.js +135 -132
  28. package/dist/activities/__tests__/FileSplitActivity.spec.js.map +1 -1
  29. package/dist/constants/operations.d.ts +3 -0
  30. package/dist/constants/operations.d.ts.map +1 -0
  31. package/dist/constants/operations.js +18 -0
  32. package/dist/constants/operations.js.map +1 -0
  33. package/dist/fs.d.ts +4 -0
  34. package/dist/fs.d.ts.map +1 -1
  35. package/dist/fs.js +4 -0
  36. package/dist/fs.js.map +1 -1
  37. package/dist/helpers/CSV.d.ts +14 -0
  38. package/dist/helpers/CSV.d.ts.map +1 -0
  39. package/dist/helpers/CSV.js +44 -0
  40. package/dist/helpers/CSV.js.map +1 -0
  41. package/dist/helpers/__tests__/byte-delimiter-scanner.spec.d.ts +2 -0
  42. package/dist/helpers/__tests__/byte-delimiter-scanner.spec.d.ts.map +1 -0
  43. package/dist/helpers/__tests__/byte-delimiter-scanner.spec.js +196 -0
  44. package/dist/helpers/__tests__/byte-delimiter-scanner.spec.js.map +1 -0
  45. package/dist/helpers/byte-delimiter-scanner.d.ts +43 -0
  46. package/dist/helpers/byte-delimiter-scanner.d.ts.map +1 -0
  47. package/dist/helpers/byte-delimiter-scanner.js +85 -0
  48. package/dist/helpers/byte-delimiter-scanner.js.map +1 -0
  49. package/dist/tools/assert-where-serializable.d.ts +2 -0
  50. package/dist/tools/assert-where-serializable.d.ts.map +1 -0
  51. package/dist/tools/assert-where-serializable.js +19 -0
  52. package/dist/tools/assert-where-serializable.js.map +1 -0
  53. package/package.json +11 -5
  54. package/dist/ActivityFileSystemClaim.d.ts +0 -7
  55. package/dist/ActivityFileSystemClaim.d.ts.map +0 -1
  56. package/dist/ActivityFileSystemClaim.js +0 -3
  57. package/dist/ActivityFileSystemClaim.js.map +0 -1
  58. package/dist/helpers/__tests__/csv-reader.spec.d.ts +0 -2
  59. package/dist/helpers/__tests__/csv-reader.spec.d.ts.map +0 -1
  60. package/dist/helpers/__tests__/csv-reader.spec.js +0 -60
  61. package/dist/helpers/__tests__/csv-reader.spec.js.map +0 -1
  62. package/dist/helpers/csv-reader.d.ts +0 -8
  63. package/dist/helpers/csv-reader.d.ts.map +0 -1
  64. package/dist/helpers/csv-reader.js +0 -14
  65. package/dist/helpers/csv-reader.js.map +0 -1
  66. package/dist/helpers/parsers.d.ts +0 -9
  67. package/dist/helpers/parsers.d.ts.map +0 -1
  68. package/dist/helpers/parsers.js +0 -14
  69. package/dist/helpers/parsers.js.map +0 -1
  70. package/dist/testing/index.d.ts +0 -3
  71. package/dist/testing/index.d.ts.map +0 -1
  72. package/dist/testing/index.js +0 -32
  73. package/dist/testing/index.js.map +0 -1
@@ -0,0 +1,196 @@
1
+ import { Readable } from 'node:stream';
2
+ import { buffer } from 'node:stream/consumers';
3
+ import { describe, expect, it } from 'vitest';
4
+ import { ByteDelimiterScanner, } from '../byte-delimiter-scanner.js';
5
+ async function scan(chunks, options) {
6
+ const scanner = new ByteDelimiterScanner(options);
7
+ const output = await buffer(Readable.from(chunks.map(chunk => Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk))).pipe(scanner));
8
+ return { ranges: scanner.ranges, output };
9
+ }
10
+ describe('ByteDelimiterScanner', () => {
11
+ it('cuts at every delimiter, discarding it by default', async () => {
12
+ const { ranges } = await scan(['foo\nbar\nbaz'], {
13
+ delimiter: { value: '\n' },
14
+ });
15
+ expect(ranges).toEqual([
16
+ { start: 0, end: 3 },
17
+ { start: 4, end: 7 },
18
+ { start: 8, end: 11 },
19
+ ]);
20
+ });
21
+ it('skips the empty final slice when the file ends with a delimiter', async () => {
22
+ const { ranges } = await scan(['foo\nbar\n'], {
23
+ delimiter: { value: '\n' },
24
+ });
25
+ expect(ranges).toEqual([
26
+ { start: 0, end: 3 },
27
+ { start: 4, end: 7 },
28
+ ]);
29
+ });
30
+ it('keeps empty slices when skipEmpty is off', async () => {
31
+ const { ranges } = await scan(['foo\n\nbar'], {
32
+ delimiter: { value: '\n' },
33
+ skipEmpty: false,
34
+ });
35
+ expect(ranges).toEqual([
36
+ { start: 0, end: 3 },
37
+ { start: 4, end: 4 },
38
+ { start: 5, end: 8 },
39
+ ]);
40
+ });
41
+ it('passes the bytes through unchanged', async () => {
42
+ const content = 'foo\nbar\nbaz\n';
43
+ const { output } = await scan([content], { delimiter: { value: '\n' } });
44
+ expect(output.toString()).toBe(content);
45
+ });
46
+ it('finds a delimiter split across chunk boundaries', async () => {
47
+ const { ranges } = await scan(['foo\r', '\nbar'], {
48
+ delimiter: { value: '\r\n' },
49
+ });
50
+ expect(ranges).toEqual([
51
+ { start: 0, end: 3 },
52
+ { start: 5, end: 8 },
53
+ ]);
54
+ });
55
+ it('does not double count a match ending inside the kept tail', async () => {
56
+ const { ranges } = await scan(['a\n10b', '\n10c'], {
57
+ delimiter: { value: '\n10', keep: { next: 2 } },
58
+ });
59
+ expect(ranges).toEqual([
60
+ { start: 0, end: 1 },
61
+ { start: 2, end: 5 },
62
+ { start: 6, end: 9 },
63
+ ]);
64
+ });
65
+ it('supports the positional record-start cut: newline dies, marker stays with the next slice', async () => {
66
+ const content = '10A;x\n10B;y\n10C;z';
67
+ const { ranges } = await scan([content], {
68
+ delimiter: { value: '\n10', keep: { next: 2 } },
69
+ });
70
+ expect(ranges).toEqual([
71
+ { start: 0, end: 5 },
72
+ { start: 6, end: 11 },
73
+ { start: 12, end: 17 },
74
+ ]);
75
+ expect(content.slice(6, 11)).toBe('10B;y');
76
+ });
77
+ it('supports keeping delimiter bytes with the previous slice', async () => {
78
+ const { ranges } = await scan(['a;b;c'], {
79
+ delimiter: { value: ';', keep: { previous: 1 } },
80
+ });
81
+ expect(ranges).toEqual([
82
+ { start: 0, end: 2 },
83
+ { start: 2, end: 4 },
84
+ { start: 4, end: 5 },
85
+ ]);
86
+ });
87
+ it('cuts only every N occurrences to group records', async () => {
88
+ const { ranges } = await scan(['a\nb\nc\nd'], {
89
+ delimiter: { value: '\n' },
90
+ every: 2,
91
+ });
92
+ expect(ranges).toEqual([
93
+ { start: 0, end: 3 },
94
+ { start: 4, end: 7 },
95
+ ]);
96
+ });
97
+ it('yields the whole file as one slice when the delimiter never occurs', async () => {
98
+ const { ranges } = await scan(['no-delimiter-here'], {
99
+ delimiter: { value: '\n' },
100
+ });
101
+ expect(ranges).toEqual([{ start: 0, end: 17 }]);
102
+ });
103
+ it('converts the delimiter to bytes using the configured encoding', async () => {
104
+ const { ranges } = await scan([Buffer.from('aébé', 'latin1')], {
105
+ delimiter: { value: 'é' },
106
+ encoding: 'latin1',
107
+ });
108
+ expect(ranges).toEqual([
109
+ { start: 0, end: 1 },
110
+ { start: 2, end: 3 },
111
+ ]);
112
+ });
113
+ it('rejects an empty delimiter', () => {
114
+ expect(() => new ByteDelimiterScanner({ delimiter: { value: '' } })).toThrow(/must not be empty/);
115
+ });
116
+ it('rejects keep sizes exceeding the delimiter length', () => {
117
+ expect(() => new ByteDelimiterScanner({
118
+ delimiter: { value: ';', keep: { previous: 1, next: 1 } },
119
+ })).toThrow(/must not exceed/);
120
+ });
121
+ it('rejects a non-positive every', () => {
122
+ expect(() => new ByteDelimiterScanner({ delimiter: { value: ';' }, every: 0 })).toThrow(/positive integer/);
123
+ });
124
+ it('trims leading bytes: the window opens after the header', async () => {
125
+ const content = '0HEADER\n10A;x\n10B;y';
126
+ const { ranges } = await scan([content], {
127
+ delimiter: { value: '\n10', keep: { next: 2 } },
128
+ trim: { start: 8 },
129
+ });
130
+ expect(ranges).toEqual([
131
+ { start: 8, end: 13 },
132
+ { start: 14, end: 19 },
133
+ ]);
134
+ expect(content.slice(8, 13)).toBe('10A;x');
135
+ });
136
+ it('trims trailing bytes: the trailer fused into the last slice is cut off', async () => {
137
+ const content = '10A;x\n10B;y\n9TRAILER';
138
+ const { ranges } = await scan([content], {
139
+ delimiter: { value: '\n10', keep: { next: 2 } },
140
+ trim: { end: 9 },
141
+ });
142
+ expect(ranges).toEqual([
143
+ { start: 0, end: 5 },
144
+ { start: 6, end: 11 },
145
+ ]);
146
+ expect(content.slice(6, 11)).toBe('10B;y');
147
+ });
148
+ it('trims both ends and keeps every counting only real records', async () => {
149
+ const content = 'HDR\na\nb\nc\nd\nTRL';
150
+ const { ranges } = await scan([content], {
151
+ delimiter: { value: '\n' },
152
+ every: 2,
153
+ trim: { start: 4, end: 4 },
154
+ });
155
+ expect(ranges).toEqual([
156
+ { start: 4, end: 7 },
157
+ { start: 8, end: 11 },
158
+ ]);
159
+ expect(content.slice(4, 7)).toBe('a\nb');
160
+ expect(content.slice(8, 11)).toBe('c\nd');
161
+ });
162
+ it('drops slices sealed entirely inside the trailing trim', async () => {
163
+ const { ranges } = await scan(['a\nb\nTRL\n'], {
164
+ delimiter: { value: '\n' },
165
+ trim: { end: 4 },
166
+ });
167
+ expect(ranges).toEqual([
168
+ { start: 0, end: 1 },
169
+ { start: 2, end: 3 },
170
+ ]);
171
+ });
172
+ it('yields no slices when the trims consume the whole file', async () => {
173
+ const { ranges } = await scan(['HDR\nTRL'], {
174
+ delimiter: { value: '\n' },
175
+ trim: { start: 4, end: 3 },
176
+ });
177
+ expect(ranges).toEqual([]);
178
+ });
179
+ it('ignores delimiters inside the leading trim across chunk boundaries', async () => {
180
+ const { ranges } = await scan(['HD', 'R\na', '\nb'], {
181
+ delimiter: { value: '\n' },
182
+ trim: { start: 4 },
183
+ });
184
+ expect(ranges).toEqual([
185
+ { start: 4, end: 5 },
186
+ { start: 6, end: 7 },
187
+ ]);
188
+ });
189
+ it('rejects negative trim sizes', () => {
190
+ expect(() => new ByteDelimiterScanner({
191
+ delimiter: { value: ';' },
192
+ trim: { start: -1 },
193
+ })).toThrow(/non-negative integers/);
194
+ });
195
+ });
196
+ //# sourceMappingURL=byte-delimiter-scanner.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byte-delimiter-scanner.spec.js","sourceRoot":"","sources":["../../../src/helpers/__tests__/byte-delimiter-scanner.spec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ import { Transform, type TransformCallback } from 'node:stream';
2
+ export type ByteRange = {
3
+ start: number;
4
+ end: number;
5
+ };
6
+ export type FileSplitDelimiter = {
7
+ value: string;
8
+ keep?: {
9
+ previous?: number;
10
+ next?: number;
11
+ };
12
+ };
13
+ export type ByteTrim = {
14
+ start?: number;
15
+ end?: number;
16
+ };
17
+ export type ByteDelimiterScannerOptions = {
18
+ delimiter: FileSplitDelimiter;
19
+ every?: number;
20
+ trim?: ByteTrim;
21
+ skipEmpty?: boolean;
22
+ encoding?: BufferEncoding;
23
+ };
24
+ export declare class ByteDelimiterScanner extends Transform {
25
+ readonly ranges: ByteRange[];
26
+ private readonly delimiter;
27
+ private readonly keepPrevious;
28
+ private readonly keepNext;
29
+ private readonly cutEvery;
30
+ private readonly trimStart;
31
+ private readonly trimEnd;
32
+ private readonly skipEmpty;
33
+ private pending;
34
+ private pendingAt;
35
+ private sliceStart;
36
+ private matches;
37
+ constructor({ delimiter, every, trim, skipEmpty, encoding, }: ByteDelimiterScannerOptions);
38
+ _transform(chunk: Buffer, _encoding: BufferEncoding, callback: TransformCallback): void;
39
+ _flush(callback: TransformCallback): void;
40
+ private scan;
41
+ private cut;
42
+ }
43
+ //# sourceMappingURL=byte-delimiter-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byte-delimiter-scanner.d.ts","sourceRoot":"","sources":["../../src/helpers/byte-delimiter-scanner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAE/D,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAA;IACb,GAAG,EAAE,MAAM,CAAA;CACZ,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,CAAC,EAAE;QACL,QAAQ,CAAC,EAAE,MAAM,CAAA;QACjB,IAAI,CAAC,EAAE,MAAM,CAAA;KACd,CAAA;CACF,CAAA;AAED,MAAM,MAAM,QAAQ,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,GAAG,CAAC,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,2BAA2B,GAAG;IACxC,SAAS,EAAE,kBAAkB,CAAA;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,IAAI,CAAC,EAAE,QAAQ,CAAA;IACf,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B,CAAA;AAED,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,SAAgB,MAAM,EAAE,SAAS,EAAE,CAAK;IAExC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAQ;IACrC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IAEnC,OAAO,CAAC,OAAO,CAA0B;IACzC,OAAO,CAAC,SAAS,CAAI;IACrB,OAAO,CAAC,UAAU,CAAI;IACtB,OAAO,CAAC,OAAO,CAAI;gBAEP,EACV,SAAS,EACT,KAAS,EACT,IAAI,EACJ,SAAgB,EAChB,QAAiB,GAClB,EAAE,2BAA2B;IAmCvB,UAAU,CACf,KAAK,EAAE,MAAM,EACb,SAAS,EAAE,cAAc,EACzB,QAAQ,EAAE,iBAAiB;IAStB,MAAM,CAAC,QAAQ,EAAE,iBAAiB;IAsBzC,OAAO,CAAC,IAAI;IAgCZ,OAAO,CAAC,GAAG;CAKZ"}
@@ -0,0 +1,85 @@
1
+ import { Transform } from 'node:stream';
2
+ export class ByteDelimiterScanner extends Transform {
3
+ ranges = [];
4
+ delimiter;
5
+ keepPrevious;
6
+ keepNext;
7
+ cutEvery;
8
+ trimStart;
9
+ trimEnd;
10
+ skipEmpty;
11
+ pending = Buffer.alloc(0);
12
+ pendingAt = 0;
13
+ sliceStart = 0;
14
+ matches = 0;
15
+ constructor({ delimiter, every = 1, trim, skipEmpty = true, encoding = 'utf8', }) {
16
+ super();
17
+ this.delimiter = Buffer.from(delimiter.value, encoding);
18
+ this.keepPrevious = delimiter.keep?.previous ?? 0;
19
+ this.keepNext = delimiter.keep?.next ?? 0;
20
+ this.cutEvery = every;
21
+ this.trimStart = trim?.start ?? 0;
22
+ this.trimEnd = trim?.end ?? 0;
23
+ this.skipEmpty = skipEmpty;
24
+ this.sliceStart = this.trimStart;
25
+ if (this.delimiter.length === 0)
26
+ throw new TypeError('Split delimiter must not be empty');
27
+ if (this.keepPrevious < 0 || this.keepNext < 0)
28
+ throw new TypeError('Split delimiter keep sizes must not be negative');
29
+ if (this.keepPrevious + this.keepNext > this.delimiter.length)
30
+ throw new TypeError('Split delimiter keep sizes must not exceed the delimiter length');
31
+ if (!Number.isInteger(every) || every < 1)
32
+ throw new TypeError('Split every must be a positive integer');
33
+ if (!Number.isInteger(this.trimStart) ||
34
+ !Number.isInteger(this.trimEnd) ||
35
+ this.trimStart < 0 ||
36
+ this.trimEnd < 0)
37
+ throw new TypeError('Split trim sizes must be non-negative integers');
38
+ }
39
+ _transform(chunk, _encoding, callback) {
40
+ this.scan(this.pending.length > 0 ? Buffer.concat([this.pending, chunk]) : chunk);
41
+ callback(null, chunk);
42
+ }
43
+ _flush(callback) {
44
+ const limit = this.pendingAt + this.pending.length - this.trimEnd;
45
+ while (true) {
46
+ const last = this.ranges.at(-1);
47
+ if (!last || last.end <= limit)
48
+ break;
49
+ if (last.start >= limit) {
50
+ this.ranges.pop();
51
+ continue;
52
+ }
53
+ last.end = limit;
54
+ }
55
+ if (this.sliceStart <= limit)
56
+ this.cut(this.sliceStart, limit);
57
+ callback();
58
+ }
59
+ scan(buffer) {
60
+ let searchFrom = 0;
61
+ while (true) {
62
+ const index = buffer.indexOf(this.delimiter, searchFrom);
63
+ if (index === -1)
64
+ break;
65
+ const at = this.pendingAt + index;
66
+ searchFrom = index + this.delimiter.length;
67
+ if (at < this.trimStart)
68
+ continue;
69
+ this.matches += 1;
70
+ if (this.matches % this.cutEvery !== 0)
71
+ continue;
72
+ this.cut(this.sliceStart, at + this.keepPrevious);
73
+ this.sliceStart = at + this.delimiter.length - this.keepNext;
74
+ }
75
+ const tail = Math.max(searchFrom, buffer.length - (this.delimiter.length - 1));
76
+ this.pending = buffer.subarray(tail);
77
+ this.pendingAt += tail;
78
+ }
79
+ cut(start, end) {
80
+ if (this.skipEmpty && end <= start)
81
+ return;
82
+ this.ranges.push({ start, end });
83
+ }
84
+ }
85
+ //# sourceMappingURL=byte-delimiter-scanner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"byte-delimiter-scanner.js","sourceRoot":"","sources":["../../src/helpers/byte-delimiter-scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function assertWhereSerializable(node: unknown, path: string): void;
2
+ //# sourceMappingURL=assert-where-serializable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-where-serializable.d.ts","sourceRoot":"","sources":["../../src/tools/assert-where-serializable.ts"],"names":[],"mappings":"AAEA,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CA6BzE"}
@@ -0,0 +1,19 @@
1
+ import { OPERATIONS } from '../constants/operations.js';
2
+ export function assertWhereSerializable(node, path) {
3
+ if (typeof node === 'function' || node instanceof RegExp)
4
+ throw new TypeError(`Join where must serialize into the workflow history, found ${typeof node === 'function' ? 'a function' : 'a RegExp'} at ${path}`);
5
+ if (typeof node === 'undefined')
6
+ throw new TypeError(`Join where must serialize into the workflow history, found undefined at ${path}`);
7
+ if (node === null || typeof node !== 'object')
8
+ return;
9
+ if (Array.isArray(node)) {
10
+ node.forEach((item, index) => assertWhereSerializable(item, `${path}[${index}]`));
11
+ return;
12
+ }
13
+ for (const [key, value] of Object.entries(node)) {
14
+ if (key.startsWith('$') && !(key in OPERATIONS))
15
+ throw new TypeError(`Unsupported join where operator ${key} at ${path}`);
16
+ assertWhereSerializable(value, `${path}.${key}`);
17
+ }
18
+ }
19
+ //# sourceMappingURL=assert-where-serializable.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assert-where-serializable.js","sourceRoot":"","sources":["../../src/tools/assert-where-serializable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAA;AAEvD,MAAM,UAAU,uBAAuB,CAAC,IAAa,EAAE,IAAY;IACjE,IAAI,OAAO,IAAI,KAAK,UAAU,IAAI,IAAI,YAAY,MAAM;QACtD,MAAM,IAAI,SAAS,CACjB,8DACE,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,UAC9C,OAAO,IAAI,EAAE,CACd,CAAA;IAEH,IAAI,OAAO,IAAI,KAAK,WAAW;QAC7B,MAAM,IAAI,SAAS,CACjB,2EAA2E,IAAI,EAAE,CAClF,CAAA;IAEH,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAM;IAErD,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAC3B,uBAAuB,CAAC,IAAI,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CACnD,CAAA;QAED,OAAM;IACR,CAAC;IAED,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAChD,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC;YAC7C,MAAM,IAAI,SAAS,CAAC,mCAAmC,GAAG,OAAO,IAAI,EAAE,CAAC,CAAA;QAE1E,uBAAuB,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAA;IAClD,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@t4h.framework/fs",
3
- "version": "0.5.0",
3
+ "version": "0.7.0",
4
4
  "description": "File system module for the T4H Framework",
5
5
  "homepage": "https://github.com/tech4humans-brasil/framework/tree/main/packages/fs",
6
6
  "bugs": "https://github.com/tech4humans-brasil/framework/issues",
@@ -27,17 +27,23 @@
27
27
  "build": "tsc --project tsconfig.build.json",
28
28
  "check-types": "tsc --noEmit",
29
29
  "lint": "eslint .",
30
- "prepublishOnly": "yarn build"
30
+ "prepublishOnly": "yarn build",
31
+ "test": "vitest run",
32
+ "test:watch": "vitest"
31
33
  },
32
34
  "devDependencies": {
33
- "@t4h.framework/core": "^0.8.0",
34
- "typescript": "^5.9.3"
35
+ "@t4h.framework/core": "^0.9.0",
36
+ "typescript": "^5.9.3",
37
+ "vitest": "^4.0.18"
35
38
  },
36
39
  "peerDependencies": {
37
- "@t4h.framework/core": "^0.8.0"
40
+ "@t4h.framework/core": "^0.9.0"
38
41
  },
39
42
  "packageManager": "yarn@4.12.0",
40
43
  "engines": {
41
44
  "node": ">=22"
45
+ },
46
+ "dependencies": {
47
+ "sift": "^17.1.3"
42
48
  }
43
49
  }
@@ -1,7 +0,0 @@
1
- import type { Readable } from 'node:stream';
2
- import type { Binary } from '@t4h.framework/core';
3
- export declare abstract class ActivityFileSystemClaim {
4
- abstract write(path: string, readable: Readable | Buffer): Binary | Promise<Binary>;
5
- abstract read(path: string): Binary | Promise<Binary>;
6
- }
7
- //# sourceMappingURL=ActivityFileSystemClaim.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ActivityFileSystemClaim.d.ts","sourceRoot":"","sources":["../src/ActivityFileSystemClaim.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAEjD,8BAAsB,uBAAuB;aAC3B,KAAK,CACnB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,QAAQ,GAAG,MAAM,GAC1B,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;aAEX,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAC7D"}
@@ -1,3 +0,0 @@
1
- export class ActivityFileSystemClaim {
2
- }
3
- //# sourceMappingURL=ActivityFileSystemClaim.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ActivityFileSystemClaim.js","sourceRoot":"","sources":["../src/ActivityFileSystemClaim.ts"],"names":[],"mappings":"AAIA,MAAM,OAAgB,uBAAuB;CAO5C"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=csv-reader.spec.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csv-reader.spec.d.ts","sourceRoot":"","sources":["../../../src/helpers/__tests__/csv-reader.spec.ts"],"names":[],"mappings":""}
@@ -1,60 +0,0 @@
1
- import { Readable } from 'node:stream';
2
- import { describe, expect, it, vi } from 'vitest';
3
- import { csvReader } from '../csv-reader.js';
4
- async function collect(iterable) {
5
- const records = [];
6
- for await (const record of iterable)
7
- records.push(record);
8
- return records;
9
- }
10
- describe('csvReader', () => {
11
- it('parses rows into objects keyed by the header row', async () => {
12
- const stream = Readable.from(['name,age\nalice,30\nbob,25\n']);
13
- const records = await collect(csvReader(stream));
14
- expect(records).toEqual([
15
- JSON.stringify({ name: 'alice', age: '30' }),
16
- JSON.stringify({ name: 'bob', age: '25' }),
17
- ]);
18
- });
19
- it('uses comma as the default delimiter', async () => {
20
- const stream = Readable.from(['a,b\n1,2\n']);
21
- const records = await collect(csvReader(stream));
22
- expect(records).toEqual([JSON.stringify({ a: '1', b: '2' })]);
23
- });
24
- it('respects a custom delimiter', async () => {
25
- const stream = Readable.from(['a;b\n1;2\n']);
26
- const records = await collect(csvReader(stream, { delimiter: ';' }));
27
- expect(records).toEqual([JSON.stringify({ a: '1', b: '2' })]);
28
- });
29
- it('tolerates rows with a mismatched column count (relax_column_count)', async () => {
30
- const stream = Readable.from(['a,b\n1\n2,3,4\n']);
31
- const records = await collect(csvReader(stream, { delimiter: ',' }));
32
- expect(records).toEqual([
33
- JSON.stringify({ a: '1' }),
34
- JSON.stringify({ a: '2', b: '3' }),
35
- ]);
36
- });
37
- it('yields nothing for an empty stream', async () => {
38
- const stream = Readable.from(['']);
39
- const records = await collect(csvReader(stream));
40
- expect(records).toEqual([]);
41
- });
42
- it('yields nothing when only the header row is present', async () => {
43
- const stream = Readable.from(['a,b\n']);
44
- const records = await collect(csvReader(stream));
45
- expect(records).toEqual([]);
46
- });
47
- it('sets the stream encoding when the encoding option is provided', async () => {
48
- const stream = Readable.from(['a,b\n1,2\n']);
49
- const setEncoding = vi.spyOn(stream, 'setEncoding');
50
- await collect(csvReader(stream, { encoding: 'latin1' }));
51
- expect(setEncoding).toHaveBeenCalledWith('latin1');
52
- });
53
- it('does not touch the stream encoding when no encoding option is provided', async () => {
54
- const stream = Readable.from(['a,b\n1,2\n']);
55
- const setEncoding = vi.spyOn(stream, 'setEncoding');
56
- await collect(csvReader(stream));
57
- expect(setEncoding).not.toHaveBeenCalled();
58
- });
59
- });
60
- //# sourceMappingURL=csv-reader.spec.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csv-reader.spec.js","sourceRoot":"","sources":["../../../src/helpers/__tests__/csv-reader.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAEjD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,KAAK,UAAU,OAAO,CAAI,QAA0B;IAClD,MAAM,OAAO,GAAQ,EAAE,CAAA;IAEvB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,QAAQ;QAAE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;IAEzD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,QAAQ,CAAC,WAAW,EAAE,GAAG,EAAE;IACzB,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAA;QAE9D,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;SAC3C,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;QAE5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;QAE5C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAEpE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAA;IAC/D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;QAClF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAA;QAEjD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,CAAC,CAAC,CAAA;QAEpE,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;SACnC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;QAElC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAA;QAEvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IAC7B,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAEnD,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;QAExD,MAAM,CAAC,WAAW,CAAC,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAA;IACpD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAA;QAC5C,MAAM,WAAW,GAAG,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;QAEnD,MAAM,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;QAEhC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAA;IAC5C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1,8 +0,0 @@
1
- import type { Readable } from 'node:stream';
2
- interface Options {
3
- delimiter?: string;
4
- encoding?: BufferEncoding;
5
- }
6
- export declare function csvReader(stream: Readable, options?: Options): AsyncGenerator<string, void, unknown>;
7
- export {};
8
- //# sourceMappingURL=csv-reader.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csv-reader.d.ts","sourceRoot":"","sources":["../../src/helpers/csv-reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,UAAU,OAAO;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B;AAED,wBAAuB,SAAS,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,OAAO,yCAcnE"}
@@ -1,14 +0,0 @@
1
- import { parse } from 'csv-parse';
2
- export async function* csvReader(stream, options) {
3
- if (options?.encoding)
4
- stream.setEncoding(options.encoding);
5
- const reader = stream.pipe(parse({
6
- delimiter: options?.delimiter,
7
- columns: true,
8
- relax_column_count: true,
9
- }));
10
- for await (const record of reader) {
11
- yield JSON.stringify(record);
12
- }
13
- }
14
- //# sourceMappingURL=csv-reader.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"csv-reader.js","sourceRoot":"","sources":["../../src/helpers/csv-reader.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAOjC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,SAAS,CAAC,MAAgB,EAAE,OAAiB;IAClE,IAAI,OAAO,EAAE,QAAQ;QAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAE3D,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,KAAK,CAAC;QACJ,SAAS,EAAE,OAAO,EAAE,SAAS;QAC7B,OAAO,EAAE,IAAI;QACb,kBAAkB,EAAE,IAAI;KACzB,CAAC,CACH,CAAA;IAED,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,MAAM,EAAE,CAAC;QAClC,MAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IAC9B,CAAC;AACH,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { Readable } from 'node:stream';
2
- export type Parser = (stream: Readable, options: {
3
- encoding: BufferEncoding;
4
- delimiter?: string;
5
- }) => AsyncIterable<string>;
6
- export type ParserFormat = 'txt' | 'ndjson' | 'csv' | string;
7
- export declare const parsers: Map<string, Parser>;
8
- export declare function registerParser(name: ParserFormat, parser: Parser): void;
9
- //# sourceMappingURL=parsers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/helpers/parsers.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAI3C,MAAM,MAAM,MAAM,GAAG,CACnB,MAAM,EAAE,QAAQ,EAChB,OAAO,EAAE;IAAE,QAAQ,EAAE,cAAc,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,KACtD,aAAa,CAAC,MAAM,CAAC,CAAA;AAE1B,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,CAAA;AAE5D,eAAO,MAAM,OAAO,qBAQlB,CAAA;AAEF,wBAAgB,cAAc,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAEvE"}
@@ -1,14 +0,0 @@
1
- import { createInterface } from 'node:readline';
2
- import { csvReader } from './csv-reader.js';
3
- export const parsers = new Map([
4
- ['txt', stream => createInterface({ input: stream, crlfDelay: Infinity })],
5
- ['ndjson', stream => createInterface({ input: stream, crlfDelay: Infinity })],
6
- [
7
- 'csv',
8
- (stream, { encoding, delimiter }) => csvReader(stream, { encoding, delimiter }),
9
- ],
10
- ]);
11
- export function registerParser(name, parser) {
12
- parsers.set(name, parser);
13
- }
14
- //# sourceMappingURL=parsers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parsers.js","sourceRoot":"","sources":["../../src/helpers/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAA;AAG/C,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAA;AAS3C,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,GAAG,CAAuB;IACnD,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC,QAAQ,EAAE,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC7E;QACE,KAAK;QACL,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAClC,SAAS,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;KAC7C;CACF,CAAC,CAAA;AAEF,MAAM,UAAU,cAAc,CAAC,IAAkB,EAAE,MAAc;IAC/D,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;AAC3B,CAAC"}
@@ -1,3 +0,0 @@
1
- import { FileSystemClaim } from '../FileSystemClaim.js';
2
- export declare function mockFileSystemClaim(implementation?: Partial<FileSystemClaim>): import("@t4h.framework/core").ClaimProvider<FileSystemClaim>;
3
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAmBvD,wBAAgB,mBAAmB,CACjC,cAAc,GAAE,OAAO,CAAC,eAAe,CAAM,gEAiB9C"}
@@ -1,32 +0,0 @@
1
- import { Readable } from 'node:stream';
2
- import { Binary } from '@t4h.framework/core';
3
- import { mockClaim } from '@t4h.framework/core/testing';
4
- import { FileSystemClaim } from '../FileSystemClaim.js';
5
- class MemoryBinary extends Binary {
6
- data;
7
- contentType;
8
- constructor(data, contentType) {
9
- super();
10
- this.data = data;
11
- this.contentType = contentType;
12
- }
13
- get contentLength() {
14
- return this.data.byteLength;
15
- }
16
- stream() {
17
- return Readable.from(this.data);
18
- }
19
- }
20
- export function mockFileSystemClaim(implementation = {}) {
21
- return mockClaim(FileSystemClaim, {
22
- write: async (_filepath, readable) => {
23
- const chunks = [];
24
- for await (const chunk of readable)
25
- chunks.push(Buffer.from(chunk));
26
- return new MemoryBinary(Buffer.concat(chunks), 'application/octet-stream');
27
- },
28
- read: async (filepath) => new MemoryBinary(Buffer.from(filepath), 'application/octet-stream'),
29
- ...implementation,
30
- });
31
- }
32
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAA;AAEtC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAA;AAEvD,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,MAAM,YAAa,SAAQ,MAAM;IAEZ;IACD;IAFlB,YACmB,IAAY,EACb,WAAmB;QAEnC,KAAK,EAAE,CAAA;QAHU,SAAI,GAAJ,IAAI,CAAQ;QACb,gBAAW,GAAX,WAAW,CAAQ;IAGrC,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAA;IAC7B,CAAC;IAEM,MAAM;QACX,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IACjC,CAAC;CACF;AAED,MAAM,UAAU,mBAAmB,CACjC,iBAA2C,EAAE;IAE7C,OAAO,SAAS,CAAC,eAAe,EAAE;QAChC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAE,EAAE;YACnC,MAAM,MAAM,GAAa,EAAE,CAAA;YAE3B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,QAAQ;gBAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;YAEnE,OAAO,IAAI,YAAY,CACrB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EACrB,0BAA0B,CAC3B,CAAA;QACH,CAAC;QACD,IAAI,EAAE,KAAK,EAAC,QAAQ,EAAC,EAAE,CACrB,IAAI,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,0BAA0B,CAAC;QACrE,GAAG,cAAc;KAClB,CAAC,CAAA;AACJ,CAAC"}