spliterator 1.5.2 → 1.6.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 (68) hide show
  1. package/README.md +17 -1
  2. package/out/index.d.ts +0 -2
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +0 -2
  5. package/out/index.js.map +1 -1
  6. package/out/lib/AsyncSpliterator.d.ts +92 -11
  7. package/out/lib/AsyncSpliterator.d.ts.map +1 -1
  8. package/out/lib/AsyncSpliterator.js +153 -81
  9. package/out/lib/AsyncSpliterator.js.map +1 -1
  10. package/out/lib/BufferController.d.ts +12 -0
  11. package/out/lib/BufferController.d.ts.map +1 -1
  12. package/out/lib/BufferController.js +22 -0
  13. package/out/lib/BufferController.js.map +1 -1
  14. package/out/lib/CSVSpliterator.d.ts +30 -24
  15. package/out/lib/CSVSpliterator.d.ts.map +1 -1
  16. package/out/lib/CSVSpliterator.js +83 -33
  17. package/out/lib/CSVSpliterator.js.map +1 -1
  18. package/out/lib/CharacterSequence.d.ts +5 -15
  19. package/out/lib/CharacterSequence.d.ts.map +1 -1
  20. package/out/lib/CharacterSequence.js +15 -49
  21. package/out/lib/CharacterSequence.js.map +1 -1
  22. package/out/lib/JSONSpliterator.js +1 -1
  23. package/out/lib/JSONSpliterator.js.map +1 -1
  24. package/out/lib/SlidingWindow.d.ts +1 -47
  25. package/out/lib/SlidingWindow.d.ts.map +1 -1
  26. package/out/lib/SlidingWindow.js +0 -114
  27. package/out/lib/SlidingWindow.js.map +1 -1
  28. package/out/lib/Spliterator.d.ts +55 -5
  29. package/out/lib/Spliterator.d.ts.map +1 -1
  30. package/out/lib/Spliterator.js +138 -41
  31. package/out/lib/Spliterator.js.map +1 -1
  32. package/out/lib/shared.d.ts +21 -9
  33. package/out/lib/shared.d.ts.map +1 -1
  34. package/out/lib/shared.js +6 -6
  35. package/out/lib/shared.js.map +1 -1
  36. package/out/node/cli/commands/csv.d.ts +44 -0
  37. package/out/node/cli/commands/csv.d.ts.map +1 -0
  38. package/out/node/cli/commands/csv.js +78 -0
  39. package/out/node/cli/commands/csv.js.map +1 -0
  40. package/out/node/cli/commands/iterate.d.ts +37 -0
  41. package/out/node/cli/commands/iterate.d.ts.map +1 -0
  42. package/out/node/cli/commands/iterate.js +54 -0
  43. package/out/node/cli/commands/iterate.js.map +1 -0
  44. package/out/node/cli/index.d.ts +9 -0
  45. package/out/node/cli/index.d.ts.map +1 -0
  46. package/out/node/cli/index.js +34 -0
  47. package/out/node/cli/index.js.map +1 -0
  48. package/out/node/cli/utils.d.ts +52 -0
  49. package/out/node/cli/utils.d.ts.map +1 -0
  50. package/out/node/cli/utils.js +70 -0
  51. package/out/node/cli/utils.js.map +1 -0
  52. package/out/node/fs/index.d.ts +58 -0
  53. package/out/node/fs/index.d.ts.map +1 -0
  54. package/out/node/fs/index.js +142 -0
  55. package/out/node/fs/index.js.map +1 -0
  56. package/package.json +9 -4
  57. package/out/lib/DelimitedChunkReader.d.ts +0 -67
  58. package/out/lib/DelimitedChunkReader.d.ts.map +0 -1
  59. package/out/lib/DelimitedChunkReader.js +0 -113
  60. package/out/lib/DelimitedChunkReader.js.map +0 -1
  61. package/out/lib/DelimiterTransformer.d.ts +0 -27
  62. package/out/lib/DelimiterTransformer.d.ts.map +0 -1
  63. package/out/lib/DelimiterTransformer.js +0 -26
  64. package/out/lib/DelimiterTransformer.js.map +0 -1
  65. package/out/lib/node/fs.d.ts +0 -98
  66. package/out/lib/node/fs.d.ts.map +0 -1
  67. package/out/lib/node/fs.js +0 -162
  68. package/out/lib/node/fs.js.map +0 -1
@@ -0,0 +1,44 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ * @file Yargs command to split a CSV file.
6
+ */
7
+ import { ArgumentsCamelCase, Argv } from "yargs";
8
+ import { PluckArgv } from "../utils.js";
9
+ export declare const command = "csv [source] [destination]";
10
+ export declare const describe = false;
11
+ export declare const builder: (argv: Argv) => Argv<{
12
+ split: string;
13
+ } & {
14
+ join: string;
15
+ } & {
16
+ "skip-empty": boolean;
17
+ } & {
18
+ take: number | undefined;
19
+ } & {
20
+ drop: number;
21
+ } & {
22
+ debug: boolean;
23
+ } & {
24
+ "reader-high-water-mark": number;
25
+ } & {
26
+ "writer-high-water-mark": number;
27
+ } & {
28
+ filter: string | undefined;
29
+ } & {
30
+ source: unknown;
31
+ } & {
32
+ destination: unknown;
33
+ } & {
34
+ header: boolean;
35
+ } & {
36
+ transformers: string | undefined;
37
+ } & {
38
+ "column-delimiter": string;
39
+ } & {
40
+ mode: string;
41
+ }>;
42
+ export type CSVCommandArgs = PluckArgv<typeof builder>;
43
+ export declare const handler: (argv: ArgumentsCamelCase<CSVCommandArgs>) => Promise<void>;
44
+ //# sourceMappingURL=csv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAAyB,SAAS,EAAqB,MAAM,aAAa,CAAA;AAEjF,eAAO,MAAM,OAAO,+BAA+B,CAAA;AACnD,eAAO,MAAM,QAAQ,QAAQ,CAAA;AAE7B,eAAO,MAAM,OAAO,SAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BjC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,OAAO,CAAC,CAAA;AAEtD,eAAO,MAAM,OAAO,SAAgB,kBAAkB,CAAC,cAAc,CAAC,kBA6CrE,CAAA"}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ * @file Yargs command to split a CSV file.
6
+ */
7
+ import { resolve as resolvePath } from "node:path";
8
+ import { CharacterSequence, CSVSpliterator, } from "spliterator";
9
+ import { createFileWritableStream, createReadStream } from "spliterator/node/fs";
10
+ import { commonCommandsBuilder } from "../utils.js";
11
+ export const command = "csv [source] [destination]";
12
+ export const describe = false;
13
+ export const builder = (argv) => {
14
+ return commonCommandsBuilder(argv)
15
+ .option("header", {
16
+ alias: "h",
17
+ description: "Whether the CSV file has a header",
18
+ default: true,
19
+ boolean: true,
20
+ })
21
+ .option("transformers", {
22
+ alias: "ts",
23
+ description: "Path to JS file exporting transformer functions",
24
+ string: true,
25
+ normalize: true,
26
+ })
27
+ .options("column-delimiter", {
28
+ alias: "c",
29
+ description: "Delimiter to split columns on",
30
+ default: ",",
31
+ })
32
+ .option("mode", {
33
+ alias: "m",
34
+ description: "Output mode",
35
+ choices: ["object", "array"],
36
+ default: "object",
37
+ string: true,
38
+ });
39
+ };
40
+ export const handler = async (argv) => {
41
+ const joinDelimiter = new CharacterSequence(argv.join).decode();
42
+ let transformers = {};
43
+ if (argv.transformers) {
44
+ transformers = await import(resolvePath(argv.transformers));
45
+ }
46
+ let filter = () => true;
47
+ if (argv.filter) {
48
+ const module = await import(resolvePath(argv.filter));
49
+ filter = module.default;
50
+ }
51
+ const [readStream, writeStream] = await Promise.all([
52
+ createReadStream(argv.source, argv.readerHighWaterMark),
53
+ createFileWritableStream(argv.destination, {
54
+ encoding: "utf8",
55
+ highWaterMark: argv.writerHighWaterMark,
56
+ }),
57
+ ]);
58
+ const writer = writeStream.getWriter();
59
+ const spliterator = CSVSpliterator.fromAsync(readStream, {
60
+ mode: argv.mode,
61
+ delimiter: argv.split,
62
+ autoDispose: true,
63
+ header: argv.header,
64
+ transformers,
65
+ columnDelimiter: argv.columnDelimiter,
66
+ take: argv.take,
67
+ drop: argv.drop,
68
+ });
69
+ for await (const row of spliterator) {
70
+ const emit = await filter(row);
71
+ if (!emit)
72
+ continue;
73
+ await writer.write(JSON.stringify(row));
74
+ await writer.write(joinDelimiter);
75
+ }
76
+ await writer.close();
77
+ };
78
+ //# sourceMappingURL=csv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { ArgumentsCamelCase, Argv } from "yargs";
7
+ import { PluckArgv } from "../utils.js";
8
+ export declare const command = "$0 [source] [destination]";
9
+ export declare const describe = false;
10
+ export declare const builder: (argv: Argv) => Argv<{
11
+ split: string;
12
+ } & {
13
+ join: string;
14
+ } & {
15
+ "skip-empty": boolean;
16
+ } & {
17
+ take: number | undefined;
18
+ } & {
19
+ drop: number;
20
+ } & {
21
+ debug: boolean;
22
+ } & {
23
+ "reader-high-water-mark": number;
24
+ } & {
25
+ "writer-high-water-mark": number;
26
+ } & {
27
+ filter: string | undefined;
28
+ } & {
29
+ source: unknown;
30
+ } & {
31
+ destination: unknown;
32
+ } & {
33
+ transformer: string | undefined;
34
+ }>;
35
+ export type IterateCommandArgs = PluckArgv<typeof builder>;
36
+ export declare const handler: (argv: ArgumentsCamelCase<IterateCommandArgs>) => Promise<void>;
37
+ //# sourceMappingURL=iterate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/iterate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAChD,OAAO,EAIN,SAAS,EAET,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,OAAO,8BAA8B,CAAA;AAClD,eAAO,MAAM,QAAQ,QAAQ,CAAA;AAE7B,eAAO,MAAM,OAAO,SAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;;;EAMjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,OAAO,CAAC,CAAA;AAE1D,eAAO,MAAM,OAAO,SAAgB,kBAAkB,CAAC,kBAAkB,CAAC,kBA0CzE,CAAA"}
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { resolve as resolvePath } from "node:path";
7
+ import { CharacterSequence, Spliterator } from "spliterator";
8
+ import { createFileWritableStream, createReadStream } from "spliterator/node/fs";
9
+ import { commonCommandsBuilder, } from "../utils.js";
10
+ export const command = "$0 [source] [destination]";
11
+ export const describe = false;
12
+ export const builder = (argv) => {
13
+ return commonCommandsBuilder(argv).option("transformer", {
14
+ alias: "t",
15
+ description: "Path to JS file exporting a default transformer function",
16
+ string: true,
17
+ });
18
+ };
19
+ export const handler = async (argv) => {
20
+ let transformer = (line) => line;
21
+ const joinDelimiter = new CharacterSequence(argv.join);
22
+ if (argv.transformer) {
23
+ const module = await import(resolvePath(argv.transformer));
24
+ transformer = module.default;
25
+ }
26
+ let filter = () => true;
27
+ if (argv.filter) {
28
+ const module = await import(resolvePath(argv.filter));
29
+ filter = module.default;
30
+ }
31
+ const [readStream, writeStream] = await Promise.all([
32
+ createReadStream(argv.source, argv.readerHighWaterMark),
33
+ createFileWritableStream(argv.destination, {
34
+ highWaterMark: argv.writerHighWaterMark,
35
+ }),
36
+ ]);
37
+ const writer = writeStream.getWriter();
38
+ const spliterator = Spliterator.from(readStream, {
39
+ delimiter: argv.split,
40
+ skipEmpty: argv.skipEmpty,
41
+ take: argv.take,
42
+ drop: argv.drop,
43
+ debug: argv.debug,
44
+ });
45
+ for await (const line of spliterator) {
46
+ const transformed = await transformer(line);
47
+ const emit = await filter(line);
48
+ if (!emit)
49
+ continue;
50
+ await writer.write(transformed);
51
+ await writer.write(joinDelimiter);
52
+ }
53
+ };
54
+ //# sourceMappingURL=iterate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"iterate.js","sourceRoot":"","sources":["../../../../node/cli/commands/iterate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,WAAW,CAAA;AAClD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEhF,OAAO,EACN,qBAAqB,GAKrB,MAAM,aAAa,CAAA;AAEpB,MAAM,CAAC,MAAM,OAAO,GAAG,2BAA2B,CAAA;AAClD,MAAM,CAAC,MAAM,QAAQ,GAAG,KAAK,CAAA;AAE7B,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,IAAU,EAAE,EAAE;IACrC,OAAO,qBAAqB,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,EAAE;QACxD,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,0DAA0D;QACvE,MAAM,EAAE,IAAI;KACZ,CAAC,CAAA;AACH,CAAC,CAAA;AAID,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAAE,IAA4C,EAAE,EAAE;IAC7E,IAAI,WAAW,GAAoB,CAAC,IAAgB,EAAE,EAAE,CAAC,IAAI,CAAA;IAC7D,MAAM,aAAa,GAAG,IAAI,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEtD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;QACtB,MAAM,MAAM,GAAiC,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAA;QACxF,WAAW,GAAG,MAAM,CAAC,OAAO,CAAA;IAC7B,CAAC;IAED,IAAI,MAAM,GAAsB,GAAG,EAAE,CAAC,IAAI,CAAA;IAC1C,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QACjB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAA;QACrD,MAAM,GAAG,MAAM,CAAC,OAAO,CAAA;IACxB,CAAC;IAED,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;QACnD,gBAAgB,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,mBAAmB,CAAC;QACvD,wBAAwB,CAAC,IAAI,CAAC,WAAW,EAAE;YAC1C,aAAa,EAAE,IAAI,CAAC,mBAAmB;SACvC,CAAC;KACF,CAAC,CAAA;IAEF,MAAM,MAAM,GAAG,WAAW,CAAC,SAAS,EAAE,CAAA;IAEtC,MAAM,WAAW,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE;QAChD,SAAS,EAAE,IAAI,CAAC,KAAK;QACrB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CAAA;IAEF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,WAAW,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,CAAA;QAE3C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAA;QAE/B,IAAI,CAAC,IAAI;YAAE,SAAQ;QAEnB,MAAM,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;QAC/B,MAAM,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IAClC,CAAC;AACF,CAAC,CAAA"}
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @copyright Sister Software
4
+ * @license AGPL-3.0
5
+ * @author Teffen Ellis, et al.
6
+ * @file CLI entry point for the Spliterator library.
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
@@ -0,0 +1,34 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @copyright Sister Software
4
+ * @license AGPL-3.0
5
+ * @author Teffen Ellis, et al.
6
+ * @file CLI entry point for the Spliterator library.
7
+ */
8
+ import { hideBin } from "yargs/helpers";
9
+ import yargs from "yargs/yargs";
10
+ const argv = yargs(hideBin(process.argv));
11
+ argv
12
+ .command(await import("./commands/iterate.js"))
13
+ .usage([
14
+ // ---
15
+ "Iterate over a file, line by line, writing the transformed output to a new file.",
16
+ "$0 [source] [destination]",
17
+ "",
18
+ ].join("\n"))
19
+ .command(await import("./commands/csv.js"))
20
+ .usage([
21
+ // ---
22
+ "Split a CSV file into JSONL format.",
23
+ "$0 csv [source] [destination]",
24
+ "",
25
+ ].join("\n"))
26
+ .epilogue([
27
+ // ---
28
+ "Sister Software, AGPL-3.0",
29
+ "https://sister.software",
30
+ ].join("\n"))
31
+ .wrap(Math.min(120, argv.terminalWidth()))
32
+ .scriptName("spliterator")
33
+ .parse();
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AACvC,OAAO,KAAK,MAAM,aAAa,CAAA;AAE/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAA;AAEzC,IAAI;KACF,OAAO,CAAC,MAAM,MAAM,CAAC,uBAAuB,CAAC,CAAC;KAC9C,KAAK,CACL;IACC,MAAM;IACN,kFAAkF;IAClF,2BAA2B;IAC3B,EAAE;CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ;KACA,OAAO,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;KAC1C,KAAK,CACL;IACC,MAAM;IACN,qCAAqC;IACrC,+BAA+B;IAC/B,EAAE;CACF,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ;KACA,QAAQ,CACR;IACC,MAAM;IACN,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CACZ;KACA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;KACzC,UAAU,CAAC,aAAa,CAAC;KACzB,KAAK,EAAE,CAAA"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { Argv } from "yargs";
7
+ export type PluckArgv<T extends (...args: any[]) => any> = ReturnType<T> extends Argv<infer U> ? U : never;
8
+ export declare const commonCommandsBuilder: (argv: Argv) => Argv<{
9
+ split: string;
10
+ } & {
11
+ join: string;
12
+ } & {
13
+ "skip-empty": boolean;
14
+ } & {
15
+ take: number | undefined;
16
+ } & {
17
+ drop: number;
18
+ } & {
19
+ debug: boolean;
20
+ } & {
21
+ "reader-high-water-mark": number;
22
+ } & {
23
+ "writer-high-water-mark": number;
24
+ } & {
25
+ filter: string | undefined;
26
+ } & {
27
+ source: unknown;
28
+ } & {
29
+ destination: unknown;
30
+ }>;
31
+ export type CommonCommandArgs = PluckArgv<typeof commonCommandsBuilder>;
32
+ /**
33
+ * A function that filters lines from a spliterator's output.
34
+ *
35
+ * @param line - The line to filter, typically a `Uint8Array`.
36
+ *
37
+ * @returns Whether to include the line in the output.
38
+ */
39
+ export type SpliteratorFilter = (line: unknown) => boolean | PromiseLike<boolean>;
40
+ /**
41
+ * A function that transforms lines from a spliterator's output.
42
+ *
43
+ * This occurs **before** filtering.
44
+ */
45
+ export type LineTransformer<T = unknown> = (line: Uint8Array) => T | PromiseLike<T>;
46
+ /**
47
+ * The default export from a module that exports a `LineTransformer`.
48
+ */
49
+ export type LineTransformerModuleExports = {
50
+ default: LineTransformer;
51
+ };
52
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../node/cli/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAE5B,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,IAAI,UAAU,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE1G,eAAO,MAAM,qBAAqB,SAAU,IAAI;;;;;;;;;;;;;;;;;;;;;;EA+D/C,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG,SAAS,CAAC,OAAO,qBAAqB,CAAC,CAAA;AAEvE;;;;;;GAMG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,CAAA;AAEjF;;;;GAIG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,UAAU,KAAK,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAA;AAEnF;;GAEG;AACH,MAAM,MAAM,4BAA4B,GAAG;IAC1C,OAAO,EAAE,eAAe,CAAA;CACxB,CAAA"}
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ export const commonCommandsBuilder = (argv) => {
7
+ return argv
8
+ .option("split", {
9
+ alias: "s",
10
+ description: "Delimiter to split lines on",
11
+ default: "\n",
12
+ defaultDescription: "<newline>",
13
+ })
14
+ .option("join", {
15
+ alias: "j",
16
+ description: "Delimiter to join lines on",
17
+ default: "\n",
18
+ defaultDescription: "<newline>",
19
+ })
20
+ .option("skip-empty", {
21
+ alias: "e",
22
+ description: "Skip empty lines",
23
+ default: true,
24
+ })
25
+ .option("take", {
26
+ alias: "t",
27
+ description: "Number of lines to take",
28
+ defaultDescription: "Infinity",
29
+ number: true,
30
+ })
31
+ .option("drop", {
32
+ alias: "p",
33
+ description: "Number of lines to drop",
34
+ default: 0,
35
+ })
36
+ .option("debug", {
37
+ alias: "v",
38
+ description: "Debug mode",
39
+ default: false,
40
+ })
41
+ .option("reader-high-water-mark", {
42
+ alias: "w",
43
+ description: "High water mark for the read stream",
44
+ default: 4096 * 16, // 64 KiB
45
+ })
46
+ .options("writer-high-water-mark", {
47
+ alias: "W",
48
+ description: "High water mark for the write stream",
49
+ default: 4096 * 16 * 4, // 256 KiB
50
+ })
51
+ .option("filter", {
52
+ alias: "f",
53
+ description: "Path to JS file exporting default a filter function",
54
+ string: true,
55
+ normalize: true,
56
+ })
57
+ .positional("source", {
58
+ description: "Path to the source input file",
59
+ alias: "i",
60
+ string: true,
61
+ demandOption: true,
62
+ })
63
+ .positional("destination", {
64
+ description: "Path to the destination output file",
65
+ alias: "o",
66
+ string: true,
67
+ demandOption: true,
68
+ });
69
+ };
70
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../node/cli/utils.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,IAAU,EAAE,EAAE;IACnD,OAAO,IAAI;SACT,MAAM,CAAC,OAAO,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,6BAA6B;QAC1C,OAAO,EAAE,IAAI;QACb,kBAAkB,EAAE,WAAW;KAC/B,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,4BAA4B;QACzC,OAAO,EAAE,IAAI;QACb,kBAAkB,EAAE,WAAW;KAC/B,CAAC;SACD,MAAM,CAAC,YAAY,EAAE;QACrB,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,kBAAkB;QAC/B,OAAO,EAAE,IAAI;KACb,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,yBAAyB;QACtC,kBAAkB,EAAE,UAAU;QAC9B,MAAM,EAAE,IAAI;KACZ,CAAC;SACD,MAAM,CAAC,MAAM,EAAE;QACf,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,yBAAyB;QACtC,OAAO,EAAE,CAAC;KACV,CAAC;SACD,MAAM,CAAC,OAAO,EAAE;QAChB,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,YAAY;QACzB,OAAO,EAAE,KAAK;KACd,CAAC;SACD,MAAM,CAAC,wBAAwB,EAAE;QACjC,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,IAAI,GAAG,EAAE,EAAE,SAAS;KAC7B,CAAC;SACD,OAAO,CAAC,wBAAwB,EAAE;QAClC,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,sCAAsC;QACnD,OAAO,EAAE,IAAI,GAAG,EAAE,GAAG,CAAC,EAAE,UAAU;KAClC,CAAC;SACD,MAAM,CAAC,QAAQ,EAAE;QACjB,KAAK,EAAE,GAAG;QACV,WAAW,EAAE,qDAAqD;QAClE,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI;KACf,CAAC;SACD,UAAU,CAAC,QAAQ,EAAE;QACrB,WAAW,EAAE,+BAA+B;QAC5C,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;KAClB,CAAC;SACD,UAAU,CAAC,aAAa,EAAE;QAC1B,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,GAAG;QACV,MAAM,EAAE,IAAI;QACZ,YAAY,EAAE,IAAI;KAClB,CAAC,CAAA;AACJ,CAAC,CAAA"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { CreateWriteStreamOptions } from "node:fs/promises";
7
+ import { WritableStream } from "node:stream/web";
8
+ import { AsyncChunkIterator, AsyncDataResource } from "../../lib/shared.js";
9
+ /**
10
+ * Create a readable stream from a file system source.
11
+ *
12
+ * If the source is not a string or URL, this function will return `process.stdin`.
13
+ *
14
+ * @param source The source to read from.
15
+ * @param highWaterMark The buffer chunk size to read from the file.
16
+ *
17
+ * @returns The readable stream.
18
+ */
19
+ export declare function createReadStream(source: unknown, highWaterMark: number): Promise<AsyncChunkIterator>;
20
+ /**
21
+ * Create a writable stream from a file system destination.
22
+ *
23
+ * Unlike Node's native `fs.createWriteStream`, this function will return `process.stdout` if the
24
+ * destination is not a string or URL.
25
+ *
26
+ * @param destination The destination to write to.
27
+ *
28
+ * @returns The writable stream.
29
+ */
30
+ export declare function createFileWritableStream(destination: unknown, options?: CreateWriteStreamOptions): Promise<WritableStream>;
31
+ export interface CreateChunkIteratorOptions {
32
+ /**
33
+ * The buffer chunk size to read from the file, i.e. the high-water mark for the file read.
34
+ */
35
+ highWaterMark?: number;
36
+ /**
37
+ * The byte position to start reading from.
38
+ */
39
+ start?: number;
40
+ }
41
+ /**
42
+ * Read the size of a file from a source.
43
+ *
44
+ * @param source The source to read the file size from.
45
+ *
46
+ * @returns The file size in bytes.
47
+ * @internal
48
+ */
49
+ export declare function readFileSize(source: AsyncDataResource): Promise<number>;
50
+ /**
51
+ * Create an async chunk iterator from a source.
52
+ *
53
+ * @param source The source to create the chunk iterator from.
54
+ * @internal
55
+ */
56
+ export declare function createChunkIterator(source: AsyncDataResource | AsyncChunkIterator, { highWaterMark, start }?: CreateChunkIteratorOptions): Promise<AsyncChunkIterator>;
57
+ export default createChunkIterator;
58
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../node/fs/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,wBAAwB,EAAc,MAAM,kBAAkB,CAAA;AAEvE,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAA;AAChD,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAoB,MAAM,qBAAqB,CAAA;AAE7F;;;;;;;;;GASG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAgB1G;AAED;;;;;;;;;GASG;AACH,wBAAsB,wBAAwB,CAC7C,WAAW,EAAE,OAAO,EACpB,OAAO,GAAE,wBAA6B,GACpC,OAAO,CAAC,cAAc,CAAC,CAiDzB;AAED,MAAM,WAAW,0BAA0B;IAC1C;;OAEG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;IAEtB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,CAU7E;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACxC,MAAM,EAAE,iBAAiB,GAAG,kBAAkB,EAC9C,EAAE,aAAyB,EAAE,KAAS,EAAE,GAAE,0BAA+B,GACvE,OAAO,CAAC,kBAAkB,CAAC,CAuC7B;AAED,eAAe,mBAAmB,CAAA"}
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license AGPL-3.0
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ import { open, stat } from "node:fs/promises";
7
+ import { WritableStream } from "node:stream/web";
8
+ import { isFileHandleLike } from "../../lib/shared.js";
9
+ /**
10
+ * Create a readable stream from a file system source.
11
+ *
12
+ * If the source is not a string or URL, this function will return `process.stdin`.
13
+ *
14
+ * @param source The source to read from.
15
+ * @param highWaterMark The buffer chunk size to read from the file.
16
+ *
17
+ * @returns The readable stream.
18
+ */
19
+ export async function createReadStream(source, highWaterMark) {
20
+ if (typeof source !== "string" || !source) {
21
+ // We check if STDIN is a TTY to prevent blocking the terminal.
22
+ if (process.stdin.isTTY) {
23
+ throw new TypeError("No source file provided. provide a source argument or pipe data to STDIN.");
24
+ }
25
+ return process.stdin;
26
+ }
27
+ const handle = await open(source, "r");
28
+ return handle.createReadStream({
29
+ autoClose: true,
30
+ highWaterMark,
31
+ });
32
+ }
33
+ /**
34
+ * Create a writable stream from a file system destination.
35
+ *
36
+ * Unlike Node's native `fs.createWriteStream`, this function will return `process.stdout` if the
37
+ * destination is not a string or URL.
38
+ *
39
+ * @param destination The destination to write to.
40
+ *
41
+ * @returns The writable stream.
42
+ */
43
+ export async function createFileWritableStream(destination, options = {}) {
44
+ let nodeWriteStream;
45
+ if (typeof destination !== "string" || !destination) {
46
+ nodeWriteStream = process.stdout;
47
+ }
48
+ else {
49
+ const handle = await open(destination, "w");
50
+ nodeWriteStream = handle.createWriteStream({
51
+ autoClose: true,
52
+ ...options,
53
+ });
54
+ }
55
+ nodeWriteStream.once("error", (error) => {
56
+ console.error("Failed to write to the destination stream:", error);
57
+ process.exit(1);
58
+ });
59
+ return new WritableStream({
60
+ async write(chunk) {
61
+ const canWrite = nodeWriteStream.write(chunk);
62
+ if (canWrite)
63
+ return Promise.resolve();
64
+ return new Promise((resolve) => {
65
+ nodeWriteStream.once("drain", resolve);
66
+ });
67
+ },
68
+ async abort(reason) {
69
+ return new Promise((resolve, reject) => {
70
+ if ("destroy" in nodeWriteStream) {
71
+ nodeWriteStream.destroy(reason);
72
+ }
73
+ nodeWriteStream.once("error", reject);
74
+ nodeWriteStream.once("close", resolve);
75
+ });
76
+ },
77
+ async close() {
78
+ return new Promise((resolve, reject) => {
79
+ nodeWriteStream.end();
80
+ nodeWriteStream.once("error", reject);
81
+ nodeWriteStream.once("finish", resolve);
82
+ });
83
+ },
84
+ });
85
+ }
86
+ /**
87
+ * Read the size of a file from a source.
88
+ *
89
+ * @param source The source to read the file size from.
90
+ *
91
+ * @returns The file size in bytes.
92
+ * @internal
93
+ */
94
+ export async function readFileSize(source) {
95
+ if (typeof source === "string" || source instanceof URL) {
96
+ return stat(source).then(({ size }) => size);
97
+ }
98
+ if (isFileHandleLike(source)) {
99
+ return source.stat().then(({ size }) => size);
100
+ }
101
+ throw new TypeError("The provided source does not support file size retrieval.");
102
+ }
103
+ /**
104
+ * Create an async chunk iterator from a source.
105
+ *
106
+ * @param source The source to create the chunk iterator from.
107
+ * @internal
108
+ */
109
+ export async function createChunkIterator(source, { highWaterMark = 4096 * 16, start = 0 } = {}) {
110
+ if (!source) {
111
+ throw new TypeError("Cannot create a chunk iterator from an undefined or null source.");
112
+ }
113
+ if (typeof source === "string" || source instanceof URL) {
114
+ const handle = await open(source, "r");
115
+ const readStream = handle.createReadStream({
116
+ start,
117
+ highWaterMark,
118
+ autoClose: true,
119
+ });
120
+ return readStream;
121
+ }
122
+ if (Symbol.asyncIterator in source) {
123
+ return source;
124
+ }
125
+ if (isFileHandleLike(source)) {
126
+ if (source.createReadStream) {
127
+ return source.createReadStream({
128
+ start,
129
+ highWaterMark,
130
+ });
131
+ }
132
+ if (source.readableWebStream) {
133
+ return source.readableWebStream({
134
+ type: "bytes",
135
+ });
136
+ }
137
+ throw new TypeError("The provided file handle does not support readable web streams.");
138
+ }
139
+ throw new TypeError("The provided source does not support async iteration.");
140
+ }
141
+ export default createChunkIterator;
142
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/fs/index.ts"],"names":[],"mappings":"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"}