spliterator 4.0.0 → 6.0.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 (131) hide show
  1. package/README.md +56 -0
  2. package/out/index.d.ts +7 -1
  3. package/out/index.d.ts.map +1 -1
  4. package/out/index.js +7 -1
  5. package/out/index.js.map +1 -1
  6. package/out/lib/AsyncSequence.d.ts +180 -0
  7. package/out/lib/AsyncSequence.d.ts.map +1 -0
  8. package/out/lib/AsyncSequence.js +432 -0
  9. package/out/lib/AsyncSequence.js.map +1 -0
  10. package/out/lib/AsyncSpliterator.d.ts.map +1 -1
  11. package/out/lib/AsyncSpliterator.js +6 -4
  12. package/out/lib/AsyncSpliterator.js.map +1 -1
  13. package/out/lib/BufferController.d.ts.map +1 -1
  14. package/out/lib/BufferController.js.map +1 -1
  15. package/out/lib/CSVSpliterator.d.ts +14 -11
  16. package/out/lib/CSVSpliterator.d.ts.map +1 -1
  17. package/out/lib/CSVSpliterator.js +53 -37
  18. package/out/lib/CSVSpliterator.js.map +1 -1
  19. package/out/lib/CharacterSequence.d.ts +10 -1
  20. package/out/lib/CharacterSequence.d.ts.map +1 -1
  21. package/out/lib/CharacterSequence.js +76 -26
  22. package/out/lib/CharacterSequence.js.map +1 -1
  23. package/out/lib/CompositeDataView.d.ts.map +1 -1
  24. package/out/lib/CompositeDataView.js.map +1 -1
  25. package/out/lib/IndexQueue.d.ts.map +1 -1
  26. package/out/lib/IndexQueue.js +3 -1
  27. package/out/lib/IndexQueue.js.map +1 -1
  28. package/out/lib/JSONSpliterator.d.ts +20 -9
  29. package/out/lib/JSONSpliterator.d.ts.map +1 -1
  30. package/out/lib/JSONSpliterator.js +27 -19
  31. package/out/lib/JSONSpliterator.js.map +1 -1
  32. package/out/lib/PSVSpliterator.js.map +1 -1
  33. package/out/lib/SlidingWindow.d.ts.map +1 -1
  34. package/out/lib/SlidingWindow.js.map +1 -1
  35. package/out/lib/Spliterator.d.ts.map +1 -1
  36. package/out/lib/Spliterator.js +6 -4
  37. package/out/lib/Spliterator.js.map +1 -1
  38. package/out/lib/TSVSpliterator.js.map +1 -1
  39. package/out/lib/TextSpliterator.d.ts +6 -4
  40. package/out/lib/TextSpliterator.d.ts.map +1 -1
  41. package/out/lib/TextSpliterator.js +10 -13
  42. package/out/lib/TextSpliterator.js.map +1 -1
  43. package/out/lib/adaptive-source.d.ts +39 -0
  44. package/out/lib/adaptive-source.d.ts.map +1 -0
  45. package/out/lib/adaptive-source.js +95 -0
  46. package/out/lib/adaptive-source.js.map +1 -0
  47. package/out/lib/casing.js +3 -3
  48. package/out/lib/casing.js.map +1 -1
  49. package/out/lib/chunks.d.ts +20 -0
  50. package/out/lib/chunks.d.ts.map +1 -0
  51. package/out/lib/chunks.js +36 -0
  52. package/out/lib/chunks.js.map +1 -0
  53. package/out/lib/merge-async-iterators.d.ts.map +1 -1
  54. package/out/lib/merge-async-iterators.js +3 -2
  55. package/out/lib/merge-async-iterators.js.map +1 -1
  56. package/out/lib/parallel-map-runtime.d.ts +3 -1
  57. package/out/lib/parallel-map-runtime.d.ts.map +1 -1
  58. package/out/lib/parallel-map-runtime.js +1 -1
  59. package/out/lib/parallel-map-runtime.js.map +1 -1
  60. package/out/lib/parallel-map-worker-entry.js +3 -2
  61. package/out/lib/parallel-map-worker-entry.js.map +1 -1
  62. package/out/lib/parallel-map-workers.d.ts +57 -0
  63. package/out/lib/parallel-map-workers.d.ts.map +1 -0
  64. package/out/lib/parallel-map-workers.js +82 -0
  65. package/out/lib/parallel-map-workers.js.map +1 -0
  66. package/out/lib/parallel-map.d.ts +17 -34
  67. package/out/lib/parallel-map.d.ts.map +1 -1
  68. package/out/lib/parallel-map.js +18 -62
  69. package/out/lib/parallel-map.js.map +1 -1
  70. package/out/lib/pivot.d.ts +30 -0
  71. package/out/lib/pivot.d.ts.map +1 -0
  72. package/out/lib/pivot.js +47 -0
  73. package/out/lib/pivot.js.map +1 -0
  74. package/out/lib/segment-runtime.d.ts.map +1 -1
  75. package/out/lib/segment-runtime.js +7 -4
  76. package/out/lib/segment-runtime.js.map +1 -1
  77. package/out/lib/segment-worker-entry.js +20 -17
  78. package/out/lib/segment-worker-entry.js.map +1 -1
  79. package/out/lib/segment-workers.d.ts +22 -9
  80. package/out/lib/segment-workers.d.ts.map +1 -1
  81. package/out/lib/segment-workers.js +8 -4
  82. package/out/lib/segment-workers.js.map +1 -1
  83. package/out/lib/segments.d.ts +9 -3
  84. package/out/lib/segments.d.ts.map +1 -1
  85. package/out/lib/segments.js +6 -4
  86. package/out/lib/segments.js.map +1 -1
  87. package/out/lib/shared.d.ts +3 -29
  88. package/out/lib/shared.d.ts.map +1 -1
  89. package/out/lib/shared.js +0 -55
  90. package/out/lib/shared.js.map +1 -1
  91. package/out/lib/take.d.ts +16 -0
  92. package/out/lib/take.d.ts.map +1 -1
  93. package/out/lib/take.js +31 -1
  94. package/out/lib/take.js.map +1 -1
  95. package/out/lib/utils.d.ts +37 -0
  96. package/out/lib/utils.d.ts.map +1 -0
  97. package/out/lib/utils.js +39 -0
  98. package/out/lib/utils.js.map +1 -0
  99. package/out/lib/wasm_module.d.ts +9 -3
  100. package/out/lib/wasm_module.d.ts.map +1 -1
  101. package/out/lib/wasm_module.js.map +1 -1
  102. package/out/lib/writer.d.ts +1 -1
  103. package/out/lib/writer.d.ts.map +1 -1
  104. package/out/lib/writer.js +1 -1
  105. package/out/lib/writer.js.map +1 -1
  106. package/out/lib/zip.d.ts +33 -0
  107. package/out/lib/zip.d.ts.map +1 -0
  108. package/out/lib/zip.js +59 -0
  109. package/out/lib/zip.js.map +1 -0
  110. package/out/node/cli/commands/csv.d.ts +3 -38
  111. package/out/node/cli/commands/csv.d.ts.map +1 -1
  112. package/out/node/cli/commands/csv.js +55 -47
  113. package/out/node/cli/commands/csv.js.map +1 -1
  114. package/out/node/cli/commands/iterate.d.ts +3 -31
  115. package/out/node/cli/commands/iterate.d.ts.map +1 -1
  116. package/out/node/cli/commands/iterate.js +45 -24
  117. package/out/node/cli/commands/iterate.js.map +1 -1
  118. package/out/node/cli/index.js +36 -22
  119. package/out/node/cli/index.js.map +1 -1
  120. package/out/node/cli/parse-args.d.ts +120 -0
  121. package/out/node/cli/parse-args.d.ts.map +1 -0
  122. package/out/node/cli/parse-args.js +118 -0
  123. package/out/node/cli/parse-args.js.map +1 -0
  124. package/out/node/cli/utils.d.ts +79 -28
  125. package/out/node/cli/utils.d.ts.map +1 -1
  126. package/out/node/cli/utils.js +63 -63
  127. package/out/node/cli/utils.js.map +1 -1
  128. package/out/node/fs/index.d.ts.map +1 -1
  129. package/out/node/fs/index.js +7 -3
  130. package/out/node/fs/index.js.map +1 -1
  131. package/package.json +13 -17
package/out/lib/zip.js ADDED
@@ -0,0 +1,59 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ */
6
+ export function zippedEntries(zipped) {
7
+ return zipped.slice(0, 2);
8
+ }
9
+ /**
10
+ * Given two iterables, zip them together into a single iterable which yields pairs of elements.
11
+ *
12
+ * If one iterable is longer than the other, the shorter iterable will be padded with `undefined`.
13
+ *
14
+ * @param a The first iterable to zip.
15
+ * @param b The second iterable to zip.
16
+ *
17
+ * @yields Pairs of elements from the two iterables.
18
+ * @see {@linkcode zipAsync} for the asynchronous version.
19
+ */
20
+ export function* zipSync(a, b) {
21
+ const aIterator = a[Symbol.iterator]();
22
+ const bIterator = b[Symbol.iterator]();
23
+ let index = 0;
24
+ while (true) {
25
+ const { done: aDone, value: aValue } = aIterator.next();
26
+ const { done: bDone, value: bValue } = bIterator.next();
27
+ if (aDone && bDone) {
28
+ break;
29
+ }
30
+ yield [aValue, bValue, index];
31
+ index++;
32
+ }
33
+ }
34
+ /**
35
+ * Given two iterables, zip them together into a single iterable which yields pairs of elements.
36
+ *
37
+ * If one iterable is longer than the other, the shorter iterable will be padded with `undefined`.
38
+ *
39
+ * @param a The first iterable to zip.
40
+ * @param b The second iterable to zip.
41
+ *
42
+ * @yields Pairs of elements from the two iterables.
43
+ * @see {@linkcode zipSync} for the synchronous version.
44
+ */
45
+ export async function* zipAsync(a, b) {
46
+ const aIterator = Symbol.asyncIterator in a ? a[Symbol.asyncIterator]() : a[Symbol.iterator]();
47
+ const bIterator = Symbol.asyncIterator in b ? b[Symbol.asyncIterator]() : b[Symbol.iterator]();
48
+ let index = 0;
49
+ while (true) {
50
+ const { done: aDone, value: aValue } = await aIterator.next();
51
+ const { done: bDone, value: bValue } = await bIterator.next();
52
+ if (aDone && bDone) {
53
+ break;
54
+ }
55
+ yield [aValue, bValue, index];
56
+ index++;
57
+ }
58
+ }
59
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../lib/zip.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,MAAM,UAAU,aAAa,CAAO,MAAoB;IACvD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAgC,CAAA;AACzD,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,SAAS,CAAC,CAAC,OAAO,CAAO,CAAc,EAAE,CAAc;IAC5D,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IACtC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAEtC,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QACvD,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC,IAAI,EAAE,CAAA;QAEvD,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACpB,MAAK;QACN,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAE7B,KAAK,EAAE,CAAA;IACR,CAAC;AACF,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,QAAQ,CAC9B,CAAiC,EACjC,CAAiC;IAEjC,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAC9F,MAAM,SAAS,GAAG,MAAM,CAAC,aAAa,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAA;IAE9F,IAAI,KAAK,GAAG,CAAC,CAAA;IAEb,OAAO,IAAI,EAAE,CAAC;QACb,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;QAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAA;QAE7D,IAAI,KAAK,IAAI,KAAK,EAAE,CAAC;YACpB,MAAK;QACN,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,CAAA;QAE7B,KAAK,EAAE,CAAA;IACR,CAAC;AACF,CAAC"}
@@ -2,43 +2,8 @@
2
2
  * @copyright Sister Software
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
- * @file Yargs command to split a CSV file.
5
+ * @file Command to split a CSV file into JSONL format.
6
6
  */
7
- import { type ArgumentsCamelCase, type Argv } from "yargs";
8
- import { type 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>;
7
+ export declare const help: string;
8
+ export declare function run(args: string[]): Promise<void>;
44
9
  //# sourceMappingURL=csv.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAaH,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,IAAI,EAAE,MAAM,OAAO,CAAA;AAE1D,OAAO,EAAyB,KAAK,SAAS,EAA0B,MAAM,aAAa,CAAA;AAE3F,eAAO,MAAM,OAAO,+BAA+B,CAAA;AACnD,eAAO,MAAM,QAAQ,QAAQ,CAAA;AAE7B,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA0BjC,CAAA;AAED,MAAM,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,OAAO,CAAC,CAAA;AAEtD,eAAO,MAAM,OAAO,GAAU,MAAM,kBAAkB,CAAC,cAAc,CAAC,kBA8CrE,CAAA"}
1
+ {"version":3,"file":"csv.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAmBH,eAAO,MAAM,IAAI,QAWL,CAAA;AAEZ,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA4EvD"}
@@ -2,70 +2,78 @@
2
2
  * @copyright Sister Software
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
- * @file Yargs command to split a CSV file.
5
+ * @file Command to split a CSV file into JSONL format.
6
6
  */
7
7
  import { resolve as resolvePath } from "node:path";
8
+ import { parseArgs } from "node:util";
8
9
  import { CharacterSequence, CSVSpliterator, } from "spliterator";
9
10
  import { createFileWritableStream, createReadStream } from "spliterator/node/fs";
10
- import {} from "yargs";
11
- import { commonCommandsBuilder } from "../utils.js";
12
- export const command = "csv [source] [destination]";
13
- export const describe = false;
14
- export const builder = (argv) => {
15
- return commonCommandsBuilder(argv)
16
- .option("header", {
17
- alias: "h",
18
- description: "Whether the CSV file has a header",
19
- default: true,
20
- boolean: true,
21
- })
22
- .option("transformers", {
23
- alias: "ts",
24
- description: "Path to JS file exporting transformer functions",
25
- string: true,
26
- normalize: true,
27
- })
28
- .options("column-delimiter", {
29
- alias: "c",
30
- description: "Delimiter to split columns on",
31
- default: ",",
32
- })
33
- .option("mode", {
34
- alias: "m",
35
- description: "Output mode",
36
- choices: ["object", "array"],
37
- default: "object",
38
- string: true,
11
+ import { commonOptions, commonOptionsHelp, resolveIO, toNumber, usageError } from "../utils.js";
12
+ const MODES = ["object", "array"];
13
+ export const help = [
14
+ "Split a CSV file into JSONL format.",
15
+ "",
16
+ "Usage: spliterator csv [source] [destination] [options]",
17
+ "",
18
+ "Options:",
19
+ commonOptionsHelp,
20
+ " -H, --header Whether the CSV file has a header (default: true, disable with --no-header)",
21
+ " -T, --transformers <path> Path to JS file exporting transformer functions",
22
+ " -c, --column-delimiter <str> Delimiter to split columns on (default: ,)",
23
+ ` -m, --mode <mode> Output mode: ${MODES.join(" | ")} (default: object)`,
24
+ ].join("\n");
25
+ export async function run(args) {
26
+ const { values, positionals } = parseArgs({
27
+ args,
28
+ allowPositionals: true,
29
+ allowNegative: true,
30
+ options: {
31
+ ...commonOptions,
32
+ header: { type: "boolean", short: "H", default: true },
33
+ transformers: { type: "string", short: "T" },
34
+ "column-delimiter": { type: "string", short: "c", default: "," },
35
+ mode: { type: "string", short: "m", default: "object" },
36
+ },
39
37
  });
40
- };
41
- export const handler = async (argv) => {
42
- const joinDelimiter = new CharacterSequence(argv.join).decode();
38
+ if (values.help) {
39
+ console.log(help);
40
+ return;
41
+ }
42
+ const [source, destination] = resolveIO(positionals, values);
43
+ if (!MODES.includes(values.mode)) {
44
+ usageError(`Option --mode expects one of: ${MODES.join(", ")}.`);
45
+ }
46
+ const take = toNumber("take", values.take);
47
+ const drop = toNumber("drop", values.drop);
48
+ const readerHighWaterMark = toNumber("reader-high-water-mark", values["reader-high-water-mark"]);
49
+ const writerHighWaterMark = toNumber("writer-high-water-mark", values["writer-high-water-mark"]);
50
+ const joinDelimiter = new CharacterSequence(values.join).decode();
43
51
  let transformers = {};
44
- if (argv.transformers) {
45
- transformers = await import(resolvePath(argv.transformers));
52
+ if (values.transformers) {
53
+ transformers = await import(resolvePath(values.transformers));
46
54
  }
47
55
  let filter = () => true;
48
- if (argv.filter) {
49
- const module = await import(resolvePath(argv.filter));
56
+ if (values.filter) {
57
+ const module = await import(resolvePath(values.filter));
50
58
  filter = module.default;
51
59
  }
52
60
  const [readStream, writeStream] = await Promise.all([
53
- createReadStream(argv.source, argv.readerHighWaterMark),
54
- createFileWritableStream(argv.destination, {
61
+ createReadStream(source, readerHighWaterMark),
62
+ createFileWritableStream(destination, {
55
63
  encoding: "utf8",
56
- highWaterMark: argv.writerHighWaterMark,
64
+ highWaterMark: writerHighWaterMark,
57
65
  }),
58
66
  ]);
59
67
  const writer = writeStream.getWriter();
60
68
  const spliterator = CSVSpliterator.fromAsync(readStream, {
61
- mode: argv.mode,
62
- delimiter: argv.split,
69
+ mode: values.mode,
70
+ delimiter: values.split,
63
71
  autoDispose: true,
64
- header: argv.header,
72
+ header: values.header,
65
73
  transformers,
66
- columnDelimiter: argv.columnDelimiter,
67
- take: argv.take,
68
- drop: argv.drop,
74
+ columnDelimiter: values["column-delimiter"],
75
+ take,
76
+ drop,
69
77
  });
70
78
  for await (const row of spliterator) {
71
79
  const emit = await filter(row);
@@ -75,5 +83,5 @@ export const handler = async (argv) => {
75
83
  await writer.write(joinDelimiter);
76
84
  }
77
85
  await writer.close();
78
- };
86
+ }
79
87
  //# sourceMappingURL=csv.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"csv.js","sourceRoot":"","sources":["../../../../node/cli/commands/csv.ts"],"names":[],"mappings":"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"}
@@ -2,36 +2,8 @@
2
2
  * @copyright Sister Software
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
+ * @file Default command — iterate over a file, line by line.
5
6
  */
6
- import type { ArgumentsCamelCase, Argv } from "yargs";
7
- import { type 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>;
7
+ export declare const help: string;
8
+ export declare function run(args: string[]): Promise<void>;
37
9
  //# sourceMappingURL=iterate.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"iterate.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/iterate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAErD,OAAO,EAIN,KAAK,SAAS,EAEd,MAAM,aAAa,CAAA;AAEpB,eAAO,MAAM,OAAO,8BAA8B,CAAA;AAClD,eAAO,MAAM,QAAQ,QAAQ,CAAA;AAE7B,eAAO,MAAM,OAAO,GAAI,MAAM,IAAI;;;;;;;;;;;;;;;;;;;;;;;;EAMjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG,SAAS,CAAC,OAAO,OAAO,CAAC,CAAA;AAE1D,eAAO,MAAM,OAAO,GAAU,MAAM,kBAAkB,CAAC,kBAAkB,CAAC,kBA2CzE,CAAA"}
1
+ {"version":3,"file":"iterate.d.ts","sourceRoot":"","sources":["../../../../node/cli/commands/iterate.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAkBH,eAAO,MAAM,IAAI,QAQL,CAAA;AAEZ,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmEvD"}
@@ -2,45 +2,65 @@
2
2
  * @copyright Sister Software
3
3
  * @license MIT
4
4
  * @author Teffen Ellis, et al.
5
+ * @file Default command — iterate over a file, line by line.
5
6
  */
6
7
  import { resolve as resolvePath } from "node:path";
8
+ import { parseArgs } from "node:util";
7
9
  import { CharacterSequence, Spliterator } from "spliterator";
8
10
  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,
11
+ import { commonOptions, commonOptionsHelp, resolveIO, toNumber, } from "../utils.js";
12
+ export const help = [
13
+ "Iterate over a file, line by line, writing the transformed output to a new file.",
14
+ "",
15
+ "Usage: spliterator [source] [destination] [options]",
16
+ "",
17
+ "Options:",
18
+ commonOptionsHelp,
19
+ " -T, --transformer <path> Path to JS file exporting a default transformer function",
20
+ ].join("\n");
21
+ export async function run(args) {
22
+ const { values, positionals } = parseArgs({
23
+ args,
24
+ allowPositionals: true,
25
+ allowNegative: true,
26
+ options: {
27
+ ...commonOptions,
28
+ transformer: { type: "string", short: "T" },
29
+ },
17
30
  });
18
- };
19
- export const handler = async (argv) => {
31
+ if (values.help) {
32
+ console.log(help);
33
+ return;
34
+ }
35
+ const [source, destination] = resolveIO(positionals, values);
36
+ const take = toNumber("take", values.take);
37
+ const drop = toNumber("drop", values.drop);
38
+ const readerHighWaterMark = toNumber("reader-high-water-mark", values["reader-high-water-mark"]);
39
+ const writerHighWaterMark = toNumber("writer-high-water-mark", values["writer-high-water-mark"]);
20
40
  let transformer = (line) => line;
21
- const joinDelimiter = new CharacterSequence(argv.join);
22
- if (argv.transformer) {
23
- const module = await import(resolvePath(argv.transformer));
41
+ const joinDelimiter = new CharacterSequence(values.join);
42
+ if (values.transformer) {
43
+ const module = await import(resolvePath(values.transformer));
24
44
  transformer = module.default;
25
45
  }
26
46
  let filter = () => true;
27
- if (argv.filter) {
28
- const module = await import(resolvePath(argv.filter));
47
+ if (values.filter) {
48
+ const module = await import(resolvePath(values.filter));
29
49
  filter = module.default;
30
50
  }
31
51
  const [readStream, writeStream] = await Promise.all([
32
- createReadStream(argv.source, argv.readerHighWaterMark),
33
- createFileWritableStream(argv.destination, {
34
- highWaterMark: argv.writerHighWaterMark,
52
+ createReadStream(source, readerHighWaterMark),
53
+ createFileWritableStream(destination, {
54
+ highWaterMark: writerHighWaterMark,
35
55
  }),
36
56
  ]);
37
57
  const writer = writeStream.getWriter();
38
58
  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,
59
+ delimiter: values.split,
60
+ skipEmpty: values["skip-empty"],
61
+ take,
62
+ drop,
63
+ debug: values.debug,
44
64
  });
45
65
  for await (const line of spliterator) {
46
66
  const transformed = await transformer(line);
@@ -50,5 +70,6 @@ export const handler = async (argv) => {
50
70
  await writer.write(transformed);
51
71
  await writer.write(joinDelimiter);
52
72
  }
53
- };
73
+ await writer.close();
74
+ }
54
75
  //# sourceMappingURL=iterate.js.map
@@ -1 +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;AAElD,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAGhF,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;IAE1C,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"}
1
+ {"version":3,"file":"iterate.js","sourceRoot":"","sources":["../../../../node/cli/commands/iterate.ts"],"names":[],"mappings":"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"}
@@ -5,30 +5,44 @@
5
5
  * @author Teffen Ellis, et al.
6
6
  * @file CLI entry point for the Spliterator library.
7
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]",
8
+ import { createRequire } from "node:module";
9
+ import * as csv from "./commands/csv.js";
10
+ import * as iterate from "./commands/iterate.js";
11
+ import { usageError } from "./utils.js";
12
+ const rootHelp = [
13
+ iterate.help,
17
14
  "",
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]",
15
+ "Commands:",
16
+ " csv Split a CSV file into JSONL format.",
24
17
  "",
25
- ].join("\n"))
26
- .epilogue([
27
- // ---
28
18
  "Sister Software, AGPL-3.0",
29
19
  "https://sister.software",
30
- ].join("\n"))
31
- .wrap(Math.min(120, argv.terminalWidth()))
32
- .scriptName("spliterator")
33
- .parse();
20
+ ].join("\n");
21
+ const argv = process.argv.slice(2);
22
+ const [first, ...rest] = argv;
23
+ try {
24
+ switch (first) {
25
+ case "csv":
26
+ await csv.run(rest);
27
+ break;
28
+ case "--version":
29
+ console.log(createRequire(import.meta.url)("../../../package.json").version);
30
+ break;
31
+ case undefined:
32
+ case "help":
33
+ case "--help":
34
+ case "-h":
35
+ console.log(rootHelp);
36
+ break;
37
+ default:
38
+ await iterate.run(argv);
39
+ }
40
+ }
41
+ catch (error) {
42
+ // `parseArgs` rejects unknown or malformed flags — report those as usage errors, not crashes.
43
+ if (error instanceof Error && String(error.code).startsWith("ERR_PARSE_ARGS")) {
44
+ usageError(error.message);
45
+ }
46
+ throw error;
47
+ }
34
48
  //# sourceMappingURL=index.js.map
@@ -1 +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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../node/cli/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAA;AAE3C,OAAO,KAAK,GAAG,MAAM,mBAAmB,CAAA;AACxC,OAAO,KAAK,OAAO,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAA;AAEvC,MAAM,QAAQ,GAAG;IAChB,OAAO,CAAC,IAAI;IACZ,EAAE;IACF,WAAW;IACX,qEAAqE;IACrE,EAAE;IACF,2BAA2B;IAC3B,yBAAyB;CACzB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAClC,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAA;AAE7B,IAAI,CAAC;IACJ,QAAQ,KAAK,EAAE,CAAC;QACf,KAAK,KAAK;YACT,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;YACnB,MAAK;QAEN,KAAK,WAAW;YACf,OAAO,CAAC,GAAG,CAAE,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,uBAAuB,CAAyB,CAAC,OAAO,CAAC,CAAA;YACrG,MAAK;QAEN,KAAK,SAAS,CAAC;QACf,KAAK,MAAM,CAAC;QACZ,KAAK,QAAQ,CAAC;QACd,KAAK,IAAI;YACR,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACrB,MAAK;QAEN;YACC,MAAM,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;IACzB,CAAC;AACF,CAAC;AAAC,OAAO,KAAK,EAAE,CAAC;IAChB,8FAA8F;IAC9F,IAAI,KAAK,YAAY,KAAK,IAAI,MAAM,CAAE,KAA+B,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,gBAAgB,CAAC,EAAE,CAAC;QAC1G,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IAC1B,CAAC;IAED,MAAM,KAAK,CAAA;AACZ,CAAC"}
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @copyright Sister Software
3
+ * @license MIT
4
+ * @author Teffen Ellis, et al.
5
+ * @file A minimal command/option layer over Node's built-in `util.parseArgs`.
6
+ */
7
+ /**
8
+ * Declarative description of a single command line option.
9
+ */
10
+ export interface OptionSpec {
11
+ /**
12
+ * The value type. `number` options are parsed as strings and coerced.
13
+ */
14
+ type: "string" | "boolean" | "number";
15
+ /**
16
+ * Single-character alias, e.g. `s` for `-s`.
17
+ */
18
+ short?: string;
19
+ /**
20
+ * Help text shown alongside the option.
21
+ */
22
+ description: string;
23
+ /**
24
+ * Value used when the option is omitted.
25
+ */
26
+ default?: string | number | boolean;
27
+ /**
28
+ * Human-readable stand-in for `default` in help output, e.g. `<newline>`.
29
+ */
30
+ defaultDescription?: string;
31
+ /**
32
+ * Permitted values for string options. Anything else is rejected.
33
+ */
34
+ choices?: readonly string[];
35
+ }
36
+ export type OptionRecord = Record<string, OptionSpec>;
37
+ /**
38
+ * Declarative description of a positional argument.
39
+ */
40
+ export interface PositionalSpec {
41
+ /**
42
+ * Help text shown alongside the positional.
43
+ */
44
+ description: string;
45
+ /**
46
+ * Whether the positional must be present.
47
+ */
48
+ required?: boolean;
49
+ }
50
+ export type PositionalRecord = Record<string, PositionalSpec>;
51
+ type KebabToCamel<T extends string> = T extends `${infer Head}-${infer Tail}` ? `${Head}${Capitalize<KebabToCamel<Tail>>}` : T;
52
+ type OptionValue<S extends OptionSpec> = S extends {
53
+ choices: readonly (infer Choice)[];
54
+ } ? Choice : S["type"] extends "boolean" ? boolean : S["type"] extends "number" ? number : string;
55
+ type OptionalKeys<O extends OptionRecord> = {
56
+ [K in keyof O]: O[K] extends {
57
+ default: unknown;
58
+ } ? never : K;
59
+ }[keyof O];
60
+ /**
61
+ * The parsed shape of an option record, with kebab-case keys camel-cased.
62
+ */
63
+ export type InferOptions<O extends OptionRecord> = {
64
+ [K in Exclude<keyof O, OptionalKeys<O>> & string as KebabToCamel<K>]: OptionValue<O[K]>;
65
+ } & {
66
+ [K in OptionalKeys<O> & string as KebabToCamel<K>]?: OptionValue<O[K]>;
67
+ };
68
+ /**
69
+ * The parsed shape of a positional record.
70
+ */
71
+ export type InferPositionals<P extends PositionalRecord> = {
72
+ [K in keyof P & string as KebabToCamel<K>]: P[K] extends {
73
+ required: true;
74
+ } ? string : string | undefined;
75
+ };
76
+ /**
77
+ * A CLI command — a name, its options, and the handler invoked with parsed arguments.
78
+ */
79
+ export interface Command<O extends OptionRecord = OptionRecord, P extends PositionalRecord = PositionalRecord> {
80
+ /**
81
+ * The subcommand name, or `null` for the default command.
82
+ */
83
+ name: string | null;
84
+ /**
85
+ * One-line summary shown in the top-level help.
86
+ */
87
+ description: string;
88
+ /**
89
+ * Usage line shown in the command's help, sans script name.
90
+ */
91
+ usage: string;
92
+ options: O;
93
+ positionals: P;
94
+ handler: (args: InferOptions<O> & InferPositionals<P>) => Promise<void>;
95
+ }
96
+ /**
97
+ * Identity helper preserving the literal types of a command's option and positional records.
98
+ */
99
+ export declare function defineCommand<O extends OptionRecord, P extends PositionalRecord>(command: Command<O, P>): Command<O, P>;
100
+ /**
101
+ * Thrown when the user supplies arguments the command cannot accept.
102
+ *
103
+ * The CLI entry point prints the message and exits without a stack trace.
104
+ */
105
+ export declare class UsageError extends Error {
106
+ name: string;
107
+ }
108
+ /**
109
+ * Parse `argv` against a command, applying defaults, coercion, and validation.
110
+ *
111
+ * @param command - The command to parse against.
112
+ * @param argv - Arguments following the command name.
113
+ */
114
+ export declare function parseCommand<O extends OptionRecord, P extends PositionalRecord>(command: Command<O, P>, argv: string[]): InferOptions<O> & InferPositionals<P>;
115
+ /**
116
+ * Render the help text for a single command.
117
+ */
118
+ export declare function formatCommandHelp(scriptName: string, command: Command): string;
119
+ export {};
120
+ //# sourceMappingURL=parse-args.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse-args.d.ts","sourceRoot":"","sources":["../../../node/cli/parse-args.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B;;OAEG;IACH,IAAI,EAAE,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAA;IAErC;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAA;IAEd;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAEnC;;OAEG;IACH,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAE3B;;OAEG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;CAC3B;AAED,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAA;AAErD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC9B;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAA;AAE7D,KAAK,YAAY,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,GAAG,MAAM,IAAI,IAAI,MAAM,IAAI,EAAE,GAC1E,GAAG,IAAI,GAAG,UAAU,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,EAAE,GAC1C,CAAC,CAAA;AAEJ,KAAK,WAAW,CAAC,CAAC,SAAS,UAAU,IAAI,CAAC,SAAS;IAAE,OAAO,EAAE,SAAS,CAAC,MAAM,MAAM,CAAC,EAAE,CAAA;CAAE,GACtF,MAAM,GACN,CAAC,CAAC,MAAM,CAAC,SAAS,SAAS,GAC1B,OAAO,GACP,CAAC,CAAC,MAAM,CAAC,SAAS,QAAQ,GACzB,MAAM,GACN,MAAM,CAAA;AAEX,KAAK,YAAY,CAAC,CAAC,SAAS,YAAY,IAAI;KAC1C,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,KAAK,GAAG,CAAC;CAC7D,CAAC,MAAM,CAAC,CAAC,CAAA;AAEV;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,YAAY,IAAI;KACjD,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACvF,GAAG;KACF,CAAC,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACtE,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,gBAAgB,CAAC,CAAC,SAAS,gBAAgB,IAAI;KACzD,CAAC,IAAI,MAAM,CAAC,GAAG,MAAM,IAAI,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS;QAAE,QAAQ,EAAE,IAAI,CAAA;KAAE,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS;CACzG,CAAA;AAED;;GAEG;AACH,MAAM,WAAW,OAAO,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,CAAC,SAAS,gBAAgB,GAAG,gBAAgB;IAC5G;;OAEG;IACH,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAEnB;;OAEG;IACH,WAAW,EAAE,MAAM,CAAA;IAEnB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAA;IAEb,OAAO,EAAE,CAAC,CAAA;IACV,WAAW,EAAE,CAAC,CAAA;IAEd,OAAO,EAAE,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAA;CACvE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,gBAAgB,EAC/E,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,GACpB,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,CAEf;AAMD;;;;GAIG;AACH,qBAAa,UAAW,SAAQ,KAAK;IAC3B,IAAI,SAAe;CAC5B;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,gBAAgB,EAC9E,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EACtB,IAAI,EAAE,MAAM,EAAE,GACZ,YAAY,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAwEvC;AASD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA0B9E"}