@sectui/operations 0.0.0-stage → 0.1.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 (147) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -2
  3. package/dist/args.d.ts +8 -0
  4. package/dist/args.js +47 -0
  5. package/dist/args.js.map +1 -0
  6. package/dist/cli-flags.d.ts +7 -0
  7. package/dist/cli-flags.js +28 -0
  8. package/dist/cli-flags.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +185 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/completions.d.ts +3 -0
  13. package/dist/completions.js +113 -0
  14. package/dist/completions.js.map +1 -0
  15. package/dist/display.d.ts +4 -0
  16. package/dist/display.js +29 -0
  17. package/dist/display.js.map +1 -0
  18. package/dist/errors.d.ts +6 -0
  19. package/dist/errors.js +7 -0
  20. package/dist/errors.js.map +1 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +5 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/operation.d.ts +64 -0
  25. package/dist/operation.js +5 -0
  26. package/dist/operation.js.map +1 -0
  27. package/dist/operations/base/alphabets.d.ts +28 -0
  28. package/dist/operations/base/alphabets.js +27 -0
  29. package/dist/operations/base/alphabets.js.map +1 -0
  30. package/dist/operations/base/base32.d.ts +33 -0
  31. package/dist/operations/base/base32.js +85 -0
  32. package/dist/operations/base/base32.js.map +1 -0
  33. package/dist/operations/base/base58.d.ts +34 -0
  34. package/dist/operations/base/base58.js +43 -0
  35. package/dist/operations/base/base58.js.map +1 -0
  36. package/dist/operations/base/base62.d.ts +28 -0
  37. package/dist/operations/base/base62.js +43 -0
  38. package/dist/operations/base/base62.js.map +1 -0
  39. package/dist/operations/base/base64.d.ts +19 -0
  40. package/dist/operations/base/base64.js +72 -0
  41. package/dist/operations/base/base64.js.map +1 -0
  42. package/dist/operations/base/base64url.d.ts +15 -0
  43. package/dist/operations/base/base64url.js +44 -0
  44. package/dist/operations/base/base64url.js.map +1 -0
  45. package/dist/operations/base/big-number.d.ts +6 -0
  46. package/dist/operations/base/big-number.js +54 -0
  47. package/dist/operations/base/big-number.js.map +1 -0
  48. package/dist/operations/color/hex-to-rgb.d.ts +14 -0
  49. package/dist/operations/color/hex-to-rgb.js +41 -0
  50. package/dist/operations/color/hex-to-rgb.js.map +1 -0
  51. package/dist/operations/data/json-format.d.ts +20 -0
  52. package/dist/operations/data/json-format.js +33 -0
  53. package/dist/operations/data/json-format.js.map +1 -0
  54. package/dist/operations/data/json.d.ts +20 -0
  55. package/dist/operations/data/json.js +59 -0
  56. package/dist/operations/data/json.js.map +1 -0
  57. package/dist/operations/data/yaml.d.ts +21 -0
  58. package/dist/operations/data/yaml.js +54 -0
  59. package/dist/operations/data/yaml.js.map +1 -0
  60. package/dist/operations/extract/extract.d.ts +55 -0
  61. package/dist/operations/extract/extract.js +129 -0
  62. package/dist/operations/extract/extract.js.map +1 -0
  63. package/dist/operations/hash/bcrypt.d.ts +16 -0
  64. package/dist/operations/hash/bcrypt.js +45 -0
  65. package/dist/operations/hash/bcrypt.js.map +1 -0
  66. package/dist/operations/hash/hashes.d.ts +10 -0
  67. package/dist/operations/hash/hashes.js +29 -0
  68. package/dist/operations/hash/hashes.js.map +1 -0
  69. package/dist/operations/hex/from-hex.d.ts +1 -0
  70. package/dist/operations/hex/from-hex.js +31 -0
  71. package/dist/operations/hex/from-hex.js.map +1 -0
  72. package/dist/operations/hex/to-hex.d.ts +31 -0
  73. package/dist/operations/hex/to-hex.js +44 -0
  74. package/dist/operations/hex/to-hex.js.map +1 -0
  75. package/dist/operations/html/entities.d.ts +2 -0
  76. package/dist/operations/html/entities.js +69 -0
  77. package/dist/operations/html/entities.js.map +1 -0
  78. package/dist/operations/html/html-decode.d.ts +1 -0
  79. package/dist/operations/html/html-decode.js +36 -0
  80. package/dist/operations/html/html-decode.js.map +1 -0
  81. package/dist/operations/html/html-encode.d.ts +8 -0
  82. package/dist/operations/html/html-encode.js +30 -0
  83. package/dist/operations/html/html-encode.js.map +1 -0
  84. package/dist/operations/text/case.d.ts +14 -0
  85. package/dist/operations/text/case.js +85 -0
  86. package/dist/operations/text/case.js.map +1 -0
  87. package/dist/operations/text/count.d.ts +19 -0
  88. package/dist/operations/text/count.js +59 -0
  89. package/dist/operations/text/count.js.map +1 -0
  90. package/dist/operations/text/line-operations.d.ts +48 -0
  91. package/dist/operations/text/line-operations.js +134 -0
  92. package/dist/operations/text/line-operations.js.map +1 -0
  93. package/dist/operations/text/lines.d.ts +13 -0
  94. package/dist/operations/text/lines.js +22 -0
  95. package/dist/operations/text/lines.js.map +1 -0
  96. package/dist/operations/text/text-operations.d.ts +37 -0
  97. package/dist/operations/text/text-operations.js +79 -0
  98. package/dist/operations/text/text-operations.js.map +1 -0
  99. package/dist/operations/url/url-decode.d.ts +8 -0
  100. package/dist/operations/url/url-decode.js +56 -0
  101. package/dist/operations/url/url-decode.js.map +1 -0
  102. package/dist/operations/url/url-encode.d.ts +8 -0
  103. package/dist/operations/url/url-encode.js +37 -0
  104. package/dist/operations/url/url-encode.js.map +1 -0
  105. package/dist/registry.d.ts +395 -0
  106. package/dist/registry.js +131 -0
  107. package/dist/registry.js.map +1 -0
  108. package/dist/template.d.ts +23 -0
  109. package/dist/template.js +198 -0
  110. package/dist/template.js.map +1 -0
  111. package/package.json +67 -4
  112. package/src/args.ts +47 -0
  113. package/src/cli-flags.ts +29 -0
  114. package/src/cli.ts +189 -0
  115. package/src/completions.ts +129 -0
  116. package/src/display.ts +29 -0
  117. package/src/errors.ts +6 -0
  118. package/src/index.ts +4 -0
  119. package/src/operation.ts +62 -0
  120. package/src/operations/base/alphabets.ts +33 -0
  121. package/src/operations/base/base32.ts +84 -0
  122. package/src/operations/base/base58.ts +45 -0
  123. package/src/operations/base/base62.ts +44 -0
  124. package/src/operations/base/base64.ts +76 -0
  125. package/src/operations/base/base64url.ts +45 -0
  126. package/src/operations/base/big-number.ts +54 -0
  127. package/src/operations/color/hex-to-rgb.ts +42 -0
  128. package/src/operations/data/json-format.ts +33 -0
  129. package/src/operations/data/json.ts +53 -0
  130. package/src/operations/data/yaml.ts +56 -0
  131. package/src/operations/extract/extract.ts +135 -0
  132. package/src/operations/hash/bcrypt.ts +44 -0
  133. package/src/operations/hash/hashes.ts +64 -0
  134. package/src/operations/hex/from-hex.ts +31 -0
  135. package/src/operations/hex/to-hex.ts +46 -0
  136. package/src/operations/html/entities.ts +71 -0
  137. package/src/operations/html/html-decode.ts +36 -0
  138. package/src/operations/html/html-encode.ts +31 -0
  139. package/src/operations/text/case.ts +140 -0
  140. package/src/operations/text/count.ts +61 -0
  141. package/src/operations/text/line-operations.ts +144 -0
  142. package/src/operations/text/lines.ts +22 -0
  143. package/src/operations/text/text-operations.ts +85 -0
  144. package/src/operations/url/url-decode.ts +55 -0
  145. package/src/operations/url/url-encode.ts +38 -0
  146. package/src/registry.ts +152 -0
  147. package/src/template.ts +214 -0
@@ -0,0 +1,134 @@
1
+ import { defineOperation } from "../../operation.js";
2
+ import { mapLines, mapText } from "./lines.js";
3
+ export const sortLines = defineOperation({
4
+ id: "sort-lines",
5
+ name: "Sort lines",
6
+ description: "Sorts the lines by Unicode code point, like `LC_ALL=C sort`, or in natural order.",
7
+ category: "Text",
8
+ output: "binary",
9
+ aliases: ["sort", "order"],
10
+ args: {
11
+ reverse: { type: "boolean", name: "Reverse", description: "Sort in descending order.", default: false },
12
+ ignoreCase: { type: "boolean", name: "Ignore case", default: false },
13
+ natural: {
14
+ type: "boolean",
15
+ name: "Natural order",
16
+ description: 'Compare numbers by value ("2" before "10") and letters alphabetically ("a" before "B").',
17
+ default: false,
18
+ },
19
+ },
20
+ examples: [
21
+ { input: "b\nB\na\n10\n2", output: "10\n2\nB\na\nb" },
22
+ { input: "b\nB\na\n10\n2", args: { natural: true, ignoreCase: true }, output: "2\n10\na\nb\nB" },
23
+ { input: "a\nc\nb", args: { reverse: true }, output: "c\nb\na" },
24
+ ],
25
+ run(input, { reverse, ignoreCase, natural }) {
26
+ const collator = new Intl.Collator("en", { numeric: true, sensitivity: ignoreCase ? "accent" : "variant" });
27
+ const key = (line) => (ignoreCase ? line.toLowerCase() : line);
28
+ const compare = natural ? collator.compare : (a, b) => (key(a) < key(b) ? -1 : key(a) > key(b) ? 1 : 0);
29
+ return mapText(input, (text) => mapLines(text, (lines) => lines.toSorted(reverse ? (a, b) => compare(b, a) : compare)));
30
+ },
31
+ });
32
+ /** Mulberry32, seeded with the FNV-1a hash of the seed: reproducible, not cryptographically secure. */
33
+ function seededRandom(seed) {
34
+ let state = 0x811c9dc5;
35
+ for (const byte of new TextEncoder().encode(seed))
36
+ state = Math.imul(state ^ byte, 0x01000193);
37
+ return () => {
38
+ state = (state + 0x6d2b79f5) | 0;
39
+ let t = Math.imul(state ^ (state >>> 15), 1 | state);
40
+ t = (t + Math.imul(t ^ (t >>> 7), 61 | t)) ^ t;
41
+ return ((t ^ (t >>> 14)) >>> 0) / 2 ** 32;
42
+ };
43
+ }
44
+ const secureRandom = () => crypto.getRandomValues(new Uint32Array(1))[0] / 2 ** 32;
45
+ export const shuffleLines = defineOperation({
46
+ id: "shuffle-lines",
47
+ name: "Shuffle lines",
48
+ description: "Puts the lines in a random order.",
49
+ category: "Text",
50
+ output: "binary",
51
+ aliases: ["shuf", "randomize"],
52
+ args: {
53
+ seed: {
54
+ type: "string",
55
+ name: "Seed",
56
+ description: "Gives the same order every time for the same seed and input. Leave empty for a random order.",
57
+ default: "",
58
+ },
59
+ },
60
+ examples: [{ input: "a\nb\nc\nd", args: { seed: "42" }, output: "c\na\nd\nb" }],
61
+ run(input, { seed }) {
62
+ const random = seed ? seededRandom(seed) : secureRandom;
63
+ return mapText(input, (text) => mapLines(text, (lines) => {
64
+ // Fisher-Yates.
65
+ const shuffled = [...lines];
66
+ for (let i = shuffled.length - 1; i > 0; i--) {
67
+ const j = Math.floor(random() * (i + 1));
68
+ [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]];
69
+ }
70
+ return shuffled;
71
+ }));
72
+ },
73
+ });
74
+ export const uniqueLines = defineOperation({
75
+ id: "unique-lines",
76
+ name: "Unique lines",
77
+ description: "Removes duplicate lines, keeping the first occurrence of each, even when duplicates are not adjacent.",
78
+ category: "Text",
79
+ output: "binary",
80
+ aliases: ["uniq", "dedupe", "remove duplicates"],
81
+ args: {
82
+ ignoreCase: { type: "boolean", name: "Ignore case", default: false },
83
+ },
84
+ examples: [
85
+ { input: "a\nb\na\nc\nb", output: "a\nb\nc" },
86
+ { input: "a\nA\nb", args: { ignoreCase: true }, output: "a\nb" },
87
+ ],
88
+ run(input, { ignoreCase }) {
89
+ return mapText(input, (text) => mapLines(text, (lines) => {
90
+ const seen = new Set();
91
+ return lines.filter((line) => {
92
+ const key = ignoreCase ? line.toLowerCase() : line;
93
+ if (seen.has(key))
94
+ return false;
95
+ seen.add(key);
96
+ return true;
97
+ });
98
+ }));
99
+ },
100
+ });
101
+ export const reverseLines = defineOperation({
102
+ id: "reverse-lines",
103
+ name: "Reverse lines",
104
+ description: "Reverses the order of the lines, like `tac`.",
105
+ category: "Text",
106
+ output: "binary",
107
+ aliases: ["tac"],
108
+ args: {},
109
+ examples: [{ input: "a\nb\nc\n", output: "c\nb\na\n" }],
110
+ run: (input) => mapText(input, (text) => mapLines(text, (lines) => lines.toReversed())),
111
+ });
112
+ export const addLineNumbers = defineOperation({
113
+ id: "add-line-numbers",
114
+ name: "Add line numbers",
115
+ description: "Prefixes every line with its number, right-aligned, like `cat -n`.",
116
+ category: "Text",
117
+ output: "binary",
118
+ aliases: ["line numberer", "nl", "cat -n"],
119
+ args: {
120
+ start: { type: "number", name: "First number", default: 1 },
121
+ separator: { type: "string", name: "Separator", description: "Placed between the number and the line.", default: " " },
122
+ },
123
+ examples: [
124
+ { input: "a\nb", output: "1 a\n2 b" },
125
+ { input: "a\nb\nc", args: { start: 9, separator: ": " }, output: " 9: a\n10: b\n11: c" },
126
+ ],
127
+ run(input, { start, separator }) {
128
+ return mapText(input, (text) => mapLines(text, (lines) => {
129
+ const width = Math.max(String(start).length, String(start + lines.length - 1).length);
130
+ return lines.map((line, i) => String(start + i).padStart(width) + separator + line);
131
+ }));
132
+ },
133
+ });
134
+ //# sourceMappingURL=line-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line-operations.js","sourceRoot":"","sources":["../../../src/operations/text/line-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Splits text into lines. The line ending is CRLF if the text contains one, else LF. A final line
3
+ * ending does not start a new line: "a\nb\n" gives ["a", "b"], and "" gives no lines.
4
+ */
5
+ export declare function splitLines(text: string): {
6
+ lines: string[];
7
+ eol: string;
8
+ trailing: boolean;
9
+ };
10
+ /** Applies `fn` to the lines of `text`, keeping its line ending and final line ending. */
11
+ export declare function mapLines(text: string, fn: (lines: string[]) => string[]): string;
12
+ /** Decodes the input as UTF-8, transforms it, and encodes the result back. */
13
+ export declare function mapText(input: Uint8Array, fn: (text: string) => string): Uint8Array;
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Splits text into lines. The line ending is CRLF if the text contains one, else LF. A final line
3
+ * ending does not start a new line: "a\nb\n" gives ["a", "b"], and "" gives no lines.
4
+ */
5
+ export function splitLines(text) {
6
+ const eol = text.includes("\r\n") ? "\r\n" : "\n";
7
+ const trailing = text.endsWith(eol);
8
+ const body = trailing ? text.slice(0, -eol.length) : text;
9
+ return { lines: text === "" ? [] : body.split(eol), eol, trailing };
10
+ }
11
+ /** Applies `fn` to the lines of `text`, keeping its line ending and final line ending. */
12
+ export function mapLines(text, fn) {
13
+ const { lines, eol, trailing } = splitLines(text);
14
+ if (!lines.length)
15
+ return text;
16
+ return fn(lines).join(eol) + (trailing ? eol : "");
17
+ }
18
+ /** Decodes the input as UTF-8, transforms it, and encodes the result back. */
19
+ export function mapText(input, fn) {
20
+ return new TextEncoder().encode(fn(new TextDecoder().decode(input)));
21
+ }
22
+ //# sourceMappingURL=lines.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lines.js","sourceRoot":"","sources":["../../../src/operations/text/lines.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;IAClD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;AACtE,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,QAAQ,CAAC,IAAY,EAAE,EAAiC;IACtE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,OAAO,CAAC,KAAiB,EAAE,EAA4B;IACrE,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACvE,CAAC"}
@@ -0,0 +1,37 @@
1
+ export declare const reverseText: import("../../operation.ts").Operation<"reverse-text", {}, never>;
2
+ export declare const removeNewlines: import("../../operation.ts").Operation<"remove-newlines", {
3
+ readonly replacement: {
4
+ readonly type: "string";
5
+ readonly name: "Replacement";
6
+ readonly default: "";
7
+ };
8
+ }, never>;
9
+ export declare const removeWhitespace: import("../../operation.ts").Operation<"remove-whitespace", {
10
+ readonly keepNewlines: {
11
+ readonly type: "boolean";
12
+ readonly name: "Keep line breaks";
13
+ readonly default: false;
14
+ };
15
+ }, never>;
16
+ export declare const escapeQuotes: import("../../operation.ts").Operation<"escape-quotes", {
17
+ readonly quotes: {
18
+ readonly type: "select";
19
+ readonly name: "Quotes";
20
+ readonly options: readonly [{
21
+ readonly value: "double";
22
+ readonly label: 'Double quotes (")';
23
+ }, {
24
+ readonly value: "single";
25
+ readonly label: "Single quotes (')";
26
+ }, {
27
+ readonly value: "both";
28
+ readonly label: "Both";
29
+ }];
30
+ readonly default: "double";
31
+ };
32
+ readonly escapeBackslashes: {
33
+ readonly type: "boolean";
34
+ readonly name: "Escape backslashes";
35
+ readonly default: true;
36
+ };
37
+ }, never>;
@@ -0,0 +1,79 @@
1
+ import { defineOperation } from "../../operation.js";
2
+ import { mapText } from "./lines.js";
3
+ export const reverseText = defineOperation({
4
+ id: "reverse-text",
5
+ name: "Reverse text",
6
+ description: 'Reverses the order of the characters. Accented letters and emoji stay intact. e.g. "héllo" becomes "olléh".',
7
+ category: "Text",
8
+ output: "binary",
9
+ aliases: ["reverse string", "mirror"],
10
+ args: {},
11
+ examples: [
12
+ { input: "héllo", output: "olléh" },
13
+ { input: "a👍🏽b", output: "b👍🏽a" },
14
+ ],
15
+ run: (input) => mapText(input, (text) => {
16
+ const graphemes = [...new Intl.Segmenter().segment(text)].map((s) => s.segment);
17
+ return graphemes.reverse().join("");
18
+ }),
19
+ });
20
+ export const removeNewlines = defineOperation({
21
+ id: "remove-newlines",
22
+ name: "Remove newlines",
23
+ description: "Removes every line break (LF, CRLF and CR), or replaces it with the given text.",
24
+ category: "Text",
25
+ output: "binary",
26
+ aliases: ["join lines", "single line", "strip newlines"],
27
+ args: {
28
+ replacement: { type: "string", name: "Replacement", default: "" },
29
+ },
30
+ examples: [
31
+ { input: "a\nb\r\nc", output: "abc" },
32
+ { input: "a\nb\nc", args: { replacement: ", " }, output: "a, b, c" },
33
+ ],
34
+ run: (input, { replacement }) => mapText(input, (text) => text.replace(/\r\n|\r|\n/g, replacement)),
35
+ });
36
+ export const removeWhitespace = defineOperation({
37
+ id: "remove-whitespace",
38
+ name: "Remove whitespace",
39
+ description: "Removes all spaces, tabs, line breaks and other Unicode whitespace.",
40
+ category: "Text",
41
+ output: "binary",
42
+ aliases: ["remove spaces", "strip whitespace", "trim"],
43
+ args: {
44
+ keepNewlines: { type: "boolean", name: "Keep line breaks", default: false },
45
+ },
46
+ examples: [
47
+ { input: "a b\tc\nd", output: "abcd" },
48
+ { input: "a b\nc d", args: { keepNewlines: true }, output: "ab\ncd" },
49
+ ],
50
+ run: (input, { keepNewlines }) => mapText(input, (text) => text.replace(keepNewlines ? /[^\S\r\n]+/g : /\s+/g, "")),
51
+ });
52
+ const QUOTES = [
53
+ { value: "double", label: 'Double quotes (")' },
54
+ { value: "single", label: "Single quotes (')" },
55
+ { value: "both", label: "Both" },
56
+ ];
57
+ const QUOTE_PATTERNS = { double: '"', single: "'", both: "\"'" };
58
+ export const escapeQuotes = defineOperation({
59
+ id: "escape-quotes",
60
+ name: "Escape quotes",
61
+ description: 'Puts a backslash before quotes, and before backslashes so the result is unambiguous. e.g. say "hi" becomes say \\"hi\\".',
62
+ category: "Text",
63
+ output: "binary",
64
+ aliases: ["escape string", "addslashes"],
65
+ args: {
66
+ quotes: { type: "select", name: "Quotes", options: QUOTES, default: "double" },
67
+ escapeBackslashes: { type: "boolean", name: "Escape backslashes", default: true },
68
+ },
69
+ examples: [
70
+ { input: 'say "hi" \\o/', output: 'say \\"hi\\" \\\\o/' },
71
+ { input: `it's "ok"`, args: { quotes: "single" }, output: `it\\'s "ok"` },
72
+ { input: `'a' "b" \\`, args: { quotes: "both", escapeBackslashes: false }, output: `\\'a\\' \\"b\\" \\` },
73
+ ],
74
+ run(input, { quotes, escapeBackslashes }) {
75
+ const pattern = new RegExp(`[${QUOTE_PATTERNS[quotes]}${escapeBackslashes ? "\\\\" : ""}]`, "g");
76
+ return mapText(input, (text) => text.replace(pattern, "\\$&"));
77
+ },
78
+ });
79
+ //# sourceMappingURL=text-operations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-operations.js","sourceRoot":"","sources":["../../../src/operations/text/text-operations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare const urlDecode: import("../../operation.ts").Operation<"url-decode", {
2
+ readonly plusAsSpace: {
3
+ readonly type: "boolean";
4
+ readonly name: "Treat \"+\" as space";
5
+ readonly description: "HTML form behavior (application/x-www-form-urlencoded).";
6
+ readonly default: true;
7
+ };
8
+ }, "url-encode">;
@@ -0,0 +1,56 @@
1
+ import { defineOperation } from "../../operation.js";
2
+ const PERCENT = 0x25;
3
+ const PLUS = 0x2b;
4
+ const SPACE = 0x20;
5
+ function hexValue(byte) {
6
+ if (byte === undefined)
7
+ return -1;
8
+ if (byte >= 0x30 && byte <= 0x39)
9
+ return byte - 0x30;
10
+ const lower = byte | 0x20;
11
+ if (lower >= 0x61 && lower <= 0x66)
12
+ return lower - 0x61 + 10;
13
+ return -1;
14
+ }
15
+ export const urlDecode = defineOperation({
16
+ id: "url-decode",
17
+ name: "URL Decode",
18
+ description: "Decodes %XX sequences (percent-encoding) into bytes. Invalid sequences are left as is.",
19
+ category: "Encoding",
20
+ output: "binary",
21
+ aliases: ["percent decode", "urldecode"],
22
+ inverse: "url-encode",
23
+ infoUrl: "https://wikipedia.org/wiki/Percent-encoding",
24
+ args: {
25
+ plusAsSpace: {
26
+ type: "boolean",
27
+ name: 'Treat "+" as space',
28
+ description: "HTML form behavior (application/x-www-form-urlencoded).",
29
+ default: true,
30
+ },
31
+ },
32
+ examples: [
33
+ { input: "a%20b%26c%3D%C3%A9", output: "a b&c=é" },
34
+ { input: "a+b", output: "a b" },
35
+ { input: "a+b", args: { plusAsSpace: false }, output: "a+b" },
36
+ ],
37
+ run(input, { plusAsSpace }) {
38
+ const out = new Uint8Array(input.length);
39
+ let n = 0;
40
+ for (let i = 0; i < input.length; i++) {
41
+ const byte = input[i];
42
+ if (byte === PERCENT) {
43
+ const hi = hexValue(input[i + 1]);
44
+ const lo = hexValue(input[i + 2]);
45
+ if (hi >= 0 && lo >= 0) {
46
+ out[n++] = (hi << 4) | lo;
47
+ i += 2;
48
+ continue;
49
+ }
50
+ }
51
+ out[n++] = byte === PLUS && plusAsSpace ? SPACE : byte;
52
+ }
53
+ return out.slice(0, n);
54
+ },
55
+ });
56
+ //# sourceMappingURL=url-decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-decode.js","sourceRoot":"","sources":["../../../src/operations/url/url-decode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,IAAI,GAAG,IAAI,CAAC;AAClB,MAAM,KAAK,GAAG,IAAI,CAAC;AAEnB,SAAS,QAAQ,CAAC,IAAwB;IACxC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,CAAC,CAAC,CAAC;IAClC,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,IAAI,GAAG,IAAI,CAAC;IACrD,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,KAAK,GAAG,IAAI,GAAG,EAAE,CAAC;IAC7D,OAAO,CAAC,CAAC,CAAC;AACZ,CAAC;AAED,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,wFAAwF;IACrG,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;IAChB,OAAO,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC;IACxC,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE;QACJ,WAAW,EAAE;YACX,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,yDAAyD;YACtE,OAAO,EAAE,IAAI;SACd;KACF;IACD,QAAQ,EAAE;QACR,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,EAAE,SAAS,EAAE;QAClD,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE;QAC/B,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE;KAC9D;IACD,GAAG,CAAC,KAAK,EAAE,EAAE,WAAW,EAAE;QACxB,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;YACvB,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;gBACrB,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClC,MAAM,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;gBAClC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;oBACvB,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,CAAC;oBAC1B,CAAC,IAAI,CAAC,CAAC;oBACP,SAAS;gBACX,CAAC;YACH,CAAC;YACD,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACzD,CAAC;QACD,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC;CACF,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export declare const urlEncode: import("../../operation.ts").Operation<"url-encode", {
2
+ readonly encodeAll: {
3
+ readonly type: "boolean";
4
+ readonly name: "Encode all special chars";
5
+ readonly description: "Also encode reserved characters such as / ? & = (like encodeURIComponent).";
6
+ readonly default: false;
7
+ };
8
+ }, "url-decode">;
@@ -0,0 +1,37 @@
1
+ import { defineOperation } from "../../operation.js";
2
+ // RFC 3986 unreserved characters.
3
+ const UNRESERVED = /[A-Za-z0-9\-_.~]/;
4
+ // Characters also left untouched by `encodeURI`.
5
+ const URI_SAFE = /[A-Za-z0-9\-_.~!*'();/?:@&=+$,#]/;
6
+ export const urlEncode = defineOperation({
7
+ id: "url-encode",
8
+ name: "URL Encode",
9
+ description: 'Encodes bytes as %XX sequences (percent-encoding). e.g. "a b" becomes "a%20b".',
10
+ category: "Encoding",
11
+ output: "text",
12
+ aliases: ["percent encode", "urlencode"],
13
+ inverse: "url-decode",
14
+ infoUrl: "https://wikipedia.org/wiki/Percent-encoding",
15
+ args: {
16
+ encodeAll: {
17
+ type: "boolean",
18
+ name: "Encode all special chars",
19
+ description: "Also encode reserved characters such as / ? & = (like encodeURIComponent).",
20
+ default: false,
21
+ },
22
+ },
23
+ examples: [
24
+ { input: "a b&c=é", output: "a%20b&c=%C3%A9" },
25
+ { input: "a b&c=é", args: { encodeAll: true }, output: "a%20b%26c%3D%C3%A9" },
26
+ ],
27
+ run(input, { encodeAll }) {
28
+ const keep = encodeAll ? UNRESERVED : URI_SAFE;
29
+ let out = "";
30
+ for (const byte of input) {
31
+ const ch = String.fromCharCode(byte);
32
+ out += byte < 0x80 && keep.test(ch) ? ch : "%" + byte.toString(16).toUpperCase().padStart(2, "0");
33
+ }
34
+ return new TextEncoder().encode(out);
35
+ },
36
+ });
37
+ //# sourceMappingURL=url-encode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-encode.js","sourceRoot":"","sources":["../../../src/operations/url/url-encode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAErD,kCAAkC;AAClC,MAAM,UAAU,GAAG,kBAAkB,CAAC;AACtC,iDAAiD;AACjD,MAAM,QAAQ,GAAG,kCAAkC,CAAC;AAEpD,MAAM,CAAC,MAAM,SAAS,GAAG,eAAe,CAAC;IACvC,EAAE,EAAE,YAAY;IAChB,IAAI,EAAE,YAAY;IAClB,WAAW,EAAE,gFAAgF;IAC7F,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,CAAC,gBAAgB,EAAE,WAAW,CAAC;IACxC,OAAO,EAAE,YAAY;IACrB,OAAO,EAAE,6CAA6C;IACtD,IAAI,EAAE;QACJ,SAAS,EAAE;YACT,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,0BAA0B;YAChC,WAAW,EAAE,4EAA4E;YACzF,OAAO,EAAE,KAAK;SACf;KACF;IACD,QAAQ,EAAE;QACR,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,gBAAgB,EAAE;QAC9C,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,oBAAoB,EAAE;KAC9E;IACD,GAAG,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE;QACtB,MAAM,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC/C,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACrC,GAAG,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACpG,CAAC;QACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IACvC,CAAC;CACF,CAAC,CAAC"}