@cogitator-ai/wasm-tools 0.5.11 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (119) hide show
  1. package/README.md +85 -26
  2. package/dist/index.d.ts +22 -3
  3. package/dist/index.d.ts.map +1 -1
  4. package/dist/index.js +81 -14
  5. package/dist/index.js.map +1 -1
  6. package/dist/manager/types.d.ts +2 -0
  7. package/dist/manager/types.d.ts.map +1 -1
  8. package/dist/manager/wasm-loader.d.ts.map +1 -1
  9. package/dist/manager/wasm-loader.js +11 -2
  10. package/dist/manager/wasm-loader.js.map +1 -1
  11. package/dist/manager/wasm-tool-manager.d.ts +1 -0
  12. package/dist/manager/wasm-tool-manager.d.ts.map +1 -1
  13. package/dist/manager/wasm-tool-manager.js +56 -13
  14. package/dist/manager/wasm-tool-manager.js.map +1 -1
  15. package/dist/runtime.d.ts +11 -0
  16. package/dist/runtime.d.ts.map +1 -0
  17. package/dist/runtime.js +104 -0
  18. package/dist/runtime.js.map +1 -0
  19. package/dist/wasm/base64.wasm +0 -0
  20. package/dist/wasm/calc.wasm +0 -0
  21. package/dist/wasm/compression.wasm +0 -0
  22. package/dist/wasm/csv.wasm +0 -0
  23. package/dist/wasm/datetime.wasm +0 -0
  24. package/dist/wasm/diff.wasm +0 -0
  25. package/dist/wasm/hash.wasm +0 -0
  26. package/dist/wasm/json.wasm +0 -0
  27. package/dist/wasm/markdown.wasm +0 -0
  28. package/dist/wasm/regex.wasm +0 -0
  29. package/dist/wasm/signing.wasm +0 -0
  30. package/dist/wasm/slug.wasm +0 -0
  31. package/dist/wasm/validation.wasm +0 -0
  32. package/dist/wasm/xml.wasm +0 -0
  33. package/package.json +13 -12
  34. package/dist/__tests__/file-watcher.test.d.ts +0 -2
  35. package/dist/__tests__/file-watcher.test.d.ts.map +0 -1
  36. package/dist/__tests__/file-watcher.test.js +0 -99
  37. package/dist/__tests__/file-watcher.test.js.map +0 -1
  38. package/dist/__tests__/index.test.d.ts +0 -2
  39. package/dist/__tests__/index.test.d.ts.map +0 -1
  40. package/dist/__tests__/index.test.js +0 -226
  41. package/dist/__tests__/index.test.js.map +0 -1
  42. package/dist/__tests__/wasm-loader.test.d.ts +0 -2
  43. package/dist/__tests__/wasm-loader.test.d.ts.map +0 -1
  44. package/dist/__tests__/wasm-loader.test.js +0 -68
  45. package/dist/__tests__/wasm-loader.test.js.map +0 -1
  46. package/dist/__tests__/wasm-tool-manager.test.d.ts +0 -2
  47. package/dist/__tests__/wasm-tool-manager.test.d.ts.map +0 -1
  48. package/dist/__tests__/wasm-tool-manager.test.js +0 -166
  49. package/dist/__tests__/wasm-tool-manager.test.js.map +0 -1
  50. package/dist/plugins/base64.d.ts +0 -12
  51. package/dist/plugins/base64.d.ts.map +0 -1
  52. package/dist/plugins/base64.js +0 -144
  53. package/dist/plugins/base64.js.map +0 -1
  54. package/dist/plugins/calc.d.ts +0 -12
  55. package/dist/plugins/calc.d.ts.map +0 -1
  56. package/dist/plugins/calc.js +0 -102
  57. package/dist/plugins/calc.js.map +0 -1
  58. package/dist/plugins/compression.d.ts +0 -2
  59. package/dist/plugins/compression.d.ts.map +0 -1
  60. package/dist/plugins/compression.js +0 -549
  61. package/dist/plugins/compression.js.map +0 -1
  62. package/dist/plugins/csv.d.ts +0 -2
  63. package/dist/plugins/csv.d.ts.map +0 -1
  64. package/dist/plugins/csv.js +0 -142
  65. package/dist/plugins/csv.js.map +0 -1
  66. package/dist/plugins/datetime.d.ts +0 -2
  67. package/dist/plugins/datetime.d.ts.map +0 -1
  68. package/dist/plugins/datetime.js +0 -199
  69. package/dist/plugins/datetime.js.map +0 -1
  70. package/dist/plugins/diff.d.ts +0 -2
  71. package/dist/plugins/diff.d.ts.map +0 -1
  72. package/dist/plugins/diff.js +0 -187
  73. package/dist/plugins/diff.js.map +0 -1
  74. package/dist/plugins/hash.d.ts +0 -12
  75. package/dist/plugins/hash.d.ts.map +0 -1
  76. package/dist/plugins/hash.js +0 -310
  77. package/dist/plugins/hash.js.map +0 -1
  78. package/dist/plugins/json.d.ts +0 -12
  79. package/dist/plugins/json.d.ts.map +0 -1
  80. package/dist/plugins/json.js +0 -70
  81. package/dist/plugins/json.js.map +0 -1
  82. package/dist/plugins/markdown.d.ts +0 -2
  83. package/dist/plugins/markdown.d.ts.map +0 -1
  84. package/dist/plugins/markdown.js +0 -213
  85. package/dist/plugins/markdown.js.map +0 -1
  86. package/dist/plugins/regex.d.ts +0 -2
  87. package/dist/plugins/regex.d.ts.map +0 -1
  88. package/dist/plugins/regex.js +0 -120
  89. package/dist/plugins/regex.js.map +0 -1
  90. package/dist/plugins/signing.d.ts +0 -2
  91. package/dist/plugins/signing.d.ts.map +0 -1
  92. package/dist/plugins/signing.js +0 -589
  93. package/dist/plugins/signing.js.map +0 -1
  94. package/dist/plugins/slug.d.ts +0 -2
  95. package/dist/plugins/slug.d.ts.map +0 -1
  96. package/dist/plugins/slug.js +0 -183
  97. package/dist/plugins/slug.js.map +0 -1
  98. package/dist/plugins/validation.d.ts +0 -2
  99. package/dist/plugins/validation.d.ts.map +0 -1
  100. package/dist/plugins/validation.js +0 -105
  101. package/dist/plugins/validation.js.map +0 -1
  102. package/dist/plugins/xml.d.ts +0 -2
  103. package/dist/plugins/xml.d.ts.map +0 -1
  104. package/dist/plugins/xml.js +0 -297
  105. package/dist/plugins/xml.js.map +0 -1
  106. package/dist/temp/base64.js +0 -149
  107. package/dist/temp/calc.js +0 -108
  108. package/dist/temp/compression.js +0 -742
  109. package/dist/temp/csv.js +0 -161
  110. package/dist/temp/datetime.js +0 -217
  111. package/dist/temp/diff.js +0 -198
  112. package/dist/temp/hash.js +0 -424
  113. package/dist/temp/json.js +0 -80
  114. package/dist/temp/markdown.js +0 -224
  115. package/dist/temp/regex.js +0 -141
  116. package/dist/temp/signing.js +0 -600
  117. package/dist/temp/slug.js +0 -201
  118. package/dist/temp/validation.js +0 -125
  119. package/dist/temp/xml.js +0 -295
package/dist/temp/csv.js DELETED
@@ -1,161 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/plugins/csv.ts
21
- var csv_exports = {};
22
- __export(csv_exports, {
23
- csv: () => csv
24
- });
25
- module.exports = __toCommonJS(csv_exports);
26
- function parseCsv(data, delimiter, quote, hasHeaders) {
27
- const rows = [];
28
- let currentRow = [];
29
- let currentField = "";
30
- let inQuotes = false;
31
- let i = 0;
32
- while (i < data.length) {
33
- const char = data[i];
34
- const nextChar = data[i + 1];
35
- if (inQuotes) {
36
- if (char === quote) {
37
- if (nextChar === quote) {
38
- currentField += quote;
39
- i += 2;
40
- continue;
41
- } else {
42
- inQuotes = false;
43
- i++;
44
- continue;
45
- }
46
- } else {
47
- currentField += char;
48
- i++;
49
- continue;
50
- }
51
- }
52
- if (char === quote) {
53
- inQuotes = true;
54
- i++;
55
- continue;
56
- }
57
- if (char === delimiter) {
58
- currentRow.push(currentField);
59
- currentField = "";
60
- i++;
61
- continue;
62
- }
63
- if (char === "\r" && nextChar === "\n") {
64
- currentRow.push(currentField);
65
- rows.push(currentRow);
66
- currentRow = [];
67
- currentField = "";
68
- i += 2;
69
- continue;
70
- }
71
- if (char === "\n" || char === "\r") {
72
- currentRow.push(currentField);
73
- rows.push(currentRow);
74
- currentRow = [];
75
- currentField = "";
76
- i++;
77
- continue;
78
- }
79
- currentField += char;
80
- i++;
81
- }
82
- if (currentField || currentRow.length > 0) {
83
- currentRow.push(currentField);
84
- rows.push(currentRow);
85
- }
86
- const filteredRows = rows.filter((row) => row.length > 0 && !(row.length === 1 && row[0] === ""));
87
- if (hasHeaders && filteredRows.length > 0) {
88
- const headers = filteredRows[0];
89
- return { rows: filteredRows.slice(1), headers };
90
- }
91
- return { rows: filteredRows };
92
- }
93
- function stringifyCsv(data, delimiter, quote, headers) {
94
- const rows = [];
95
- const escapeField = (field) => {
96
- if (field === null || field === void 0) return "";
97
- const str = String(field);
98
- const needsQuotes = str.includes(delimiter) || str.includes(quote) || str.includes("\n") || str.includes("\r");
99
- if (needsQuotes) {
100
- const escapedQuote = quote.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
101
- const escaped = str.replace(new RegExp(escapedQuote, "g"), quote + quote);
102
- return quote + escaped + quote;
103
- }
104
- return str;
105
- };
106
- if (headers && headers.length > 0) {
107
- rows.push(headers.map(escapeField).join(delimiter));
108
- }
109
- for (const row of data) {
110
- rows.push(row.map(escapeField).join(delimiter));
111
- }
112
- return rows.join("\n");
113
- }
114
- function csv() {
115
- try {
116
- const inputStr = Host.inputString();
117
- const input = JSON.parse(inputStr);
118
- const delimiter = input.delimiter ?? ",";
119
- const quote = input.quote ?? '"';
120
- if (delimiter.length !== 1) {
121
- throw new Error(`Delimiter must be a single character, got "${delimiter}"`);
122
- }
123
- if (quote.length !== 1) {
124
- throw new Error(`Quote must be a single character, got "${quote}"`);
125
- }
126
- let result;
127
- let rowCount;
128
- let columnCount;
129
- let headers;
130
- if (input.operation === "parse") {
131
- const hasHeaders = input.headers ?? false;
132
- const parsed = parseCsv(input.data, delimiter, quote, hasHeaders);
133
- result = parsed.rows;
134
- headers = parsed.headers;
135
- rowCount = parsed.rows.length;
136
- columnCount = parsed.rows[0]?.length ?? 0;
137
- } else {
138
- headers = input.headers;
139
- result = stringifyCsv(input.data, delimiter, quote, headers);
140
- rowCount = input.data.length;
141
- columnCount = input.data[0]?.length ?? 0;
142
- }
143
- const output = {
144
- result,
145
- rowCount,
146
- columnCount,
147
- headers
148
- };
149
- Host.outputString(JSON.stringify(output));
150
- return 0;
151
- } catch (error) {
152
- const output = {
153
- result: [],
154
- rowCount: 0,
155
- columnCount: 0,
156
- error: error instanceof Error ? error.message : String(error)
157
- };
158
- Host.outputString(JSON.stringify(output));
159
- return 1;
160
- }
161
- }
@@ -1,217 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/plugins/datetime.ts
21
- var datetime_exports = {};
22
- __export(datetime_exports, {
23
- datetime: () => datetime
24
- });
25
- module.exports = __toCommonJS(datetime_exports);
26
- function parseOffset(tz) {
27
- if (!tz || tz === "UTC" || tz === "Z") return 0;
28
- const match = /^([+-])(\d{2}):?(\d{2})$/.exec(tz);
29
- if (!match) {
30
- throw new Error(
31
- `Unsupported timezone format: "${tz}". Use UTC, Z, or an offset like +05:30 / -0800.`
32
- );
33
- }
34
- const sign = match[1] === "+" ? 1 : -1;
35
- const hours = parseInt(match[2], 10);
36
- const minutes = parseInt(match[3], 10);
37
- return sign * (hours * 60 + minutes) * 60 * 1e3;
38
- }
39
- function parseDate(dateStr) {
40
- const isoMatch = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(?:Z|([+-]\d{2}:?\d{2}))?)?$/.exec(
41
- dateStr
42
- );
43
- if (isoMatch) {
44
- const [, year, month, day, hour = "0", min = "0", sec = "0", ms = "0", tz] = isoMatch;
45
- const date = new Date(
46
- Date.UTC(
47
- parseInt(year, 10),
48
- parseInt(month, 10) - 1,
49
- parseInt(day, 10),
50
- parseInt(hour, 10),
51
- parseInt(min, 10),
52
- parseInt(sec, 10),
53
- parseInt(ms, 10)
54
- )
55
- );
56
- if (tz) {
57
- const offset = parseOffset(tz);
58
- date.setTime(date.getTime() - offset);
59
- }
60
- return date;
61
- }
62
- const timestamp = Date.parse(dateStr);
63
- if (!isNaN(timestamp)) {
64
- return new Date(timestamp);
65
- }
66
- throw new Error(`Cannot parse date: ${dateStr}`);
67
- }
68
- function formatDate(date, formatStr, offsetMs = 0) {
69
- const adjusted = new Date(date.getTime() + offsetMs);
70
- const year = adjusted.getUTCFullYear();
71
- const month = adjusted.getUTCMonth() + 1;
72
- const day = adjusted.getUTCDate();
73
- const hours = adjusted.getUTCHours();
74
- const minutes = adjusted.getUTCMinutes();
75
- const seconds = adjusted.getUTCSeconds();
76
- const ms = adjusted.getUTCMilliseconds();
77
- const pad = (n, len = 2) => String(n).padStart(len, "0");
78
- const offsetHours = Math.floor(Math.abs(offsetMs) / 36e5);
79
- const offsetMins = Math.floor(Math.abs(offsetMs) % 36e5 / 6e4);
80
- const offsetSign = offsetMs >= 0 ? "+" : "-";
81
- const offsetStr = offsetMs === 0 ? "Z" : `${offsetSign}${pad(offsetHours)}:${pad(offsetMins)}`;
82
- return formatStr.replace("YYYY", String(year)).replace("MM", pad(month)).replace("DD", pad(day)).replace("HH", pad(hours)).replace("mm", pad(minutes)).replace("ss", pad(seconds)).replace("SSS", pad(ms, 3)).replace("Z", offsetStr);
83
- }
84
- function addToDate(date, amount, unit) {
85
- const result = new Date(date.getTime());
86
- switch (unit) {
87
- case "years":
88
- result.setUTCFullYear(result.getUTCFullYear() + amount);
89
- break;
90
- case "months":
91
- result.setUTCMonth(result.getUTCMonth() + amount);
92
- break;
93
- case "days":
94
- result.setUTCDate(result.getUTCDate() + amount);
95
- break;
96
- case "hours":
97
- result.setUTCHours(result.getUTCHours() + amount);
98
- break;
99
- case "minutes":
100
- result.setUTCMinutes(result.getUTCMinutes() + amount);
101
- break;
102
- case "seconds":
103
- result.setUTCSeconds(result.getUTCSeconds() + amount);
104
- break;
105
- case "milliseconds":
106
- result.setTime(result.getTime() + amount);
107
- break;
108
- default:
109
- throw new Error(`Unknown unit: ${unit}`);
110
- }
111
- return result;
112
- }
113
- function dateDiff(date1, date2, unit) {
114
- const diffMs = date2.getTime() - date1.getTime();
115
- switch (unit) {
116
- case "years": {
117
- let years = date2.getUTCFullYear() - date1.getUTCFullYear();
118
- const m1 = date1.getUTCMonth();
119
- const m2 = date2.getUTCMonth();
120
- if (m2 < m1 || m2 === m1 && date2.getUTCDate() < date1.getUTCDate()) {
121
- years--;
122
- }
123
- return years;
124
- }
125
- case "months": {
126
- let months = (date2.getUTCFullYear() - date1.getUTCFullYear()) * 12 + (date2.getUTCMonth() - date1.getUTCMonth());
127
- if (date2.getUTCDate() < date1.getUTCDate()) {
128
- months--;
129
- }
130
- return months;
131
- }
132
- case "days":
133
- return Math.floor(diffMs / (24 * 60 * 60 * 1e3));
134
- case "hours":
135
- return Math.floor(diffMs / (60 * 60 * 1e3));
136
- case "minutes":
137
- return Math.floor(diffMs / (60 * 1e3));
138
- case "seconds":
139
- return Math.floor(diffMs / 1e3);
140
- case "milliseconds":
141
- return diffMs;
142
- default:
143
- return diffMs;
144
- }
145
- }
146
- function datetime() {
147
- try {
148
- const inputStr = Host.inputString();
149
- const input = JSON.parse(inputStr);
150
- const offsetMs = parseOffset(input.timezone);
151
- let date;
152
- let result;
153
- switch (input.operation) {
154
- case "now":
155
- date = /* @__PURE__ */ new Date();
156
- result = date.toISOString();
157
- break;
158
- case "parse":
159
- if (!input.date) throw new Error("date is required for parse operation");
160
- date = parseDate(input.date);
161
- result = date.toISOString();
162
- break;
163
- case "format": {
164
- if (!input.date) throw new Error("date is required for format operation");
165
- date = parseDate(input.date);
166
- const format = input.format ?? "YYYY-MM-DDTHH:mm:ssZ";
167
- result = formatDate(date, format, offsetMs);
168
- break;
169
- }
170
- case "add":
171
- if (!input.date) throw new Error("date is required for add operation");
172
- if (input.amount === void 0) throw new Error("amount is required for add operation");
173
- if (!input.unit) throw new Error("unit is required for add operation");
174
- date = parseDate(input.date);
175
- date = addToDate(date, input.amount, input.unit);
176
- result = date.toISOString();
177
- break;
178
- case "subtract":
179
- if (!input.date) throw new Error("date is required for subtract operation");
180
- if (input.amount === void 0)
181
- throw new Error("amount is required for subtract operation");
182
- if (!input.unit) throw new Error("unit is required for subtract operation");
183
- date = parseDate(input.date);
184
- date = addToDate(date, -input.amount, input.unit);
185
- result = date.toISOString();
186
- break;
187
- case "diff": {
188
- if (!input.date) throw new Error("date is required for diff operation");
189
- if (!input.endDate) throw new Error("endDate is required for diff operation");
190
- date = parseDate(input.date);
191
- const endDate = parseDate(input.endDate);
192
- result = dateDiff(date, endDate, input.unit ?? "milliseconds");
193
- break;
194
- }
195
- default:
196
- throw new Error(`Unknown operation: ${input.operation}`);
197
- }
198
- const outputDate = input.operation === "diff" ? parseDate(input.date) : date;
199
- const output = {
200
- result,
201
- iso: outputDate.toISOString(),
202
- unix: Math.floor(outputDate.getTime() / 1e3),
203
- formatted: input.format ? formatDate(outputDate, input.format, offsetMs) : void 0
204
- };
205
- Host.outputString(JSON.stringify(output));
206
- return 0;
207
- } catch (error) {
208
- const output = {
209
- result: "",
210
- iso: "",
211
- unix: 0,
212
- error: error instanceof Error ? error.message : String(error)
213
- };
214
- Host.outputString(JSON.stringify(output));
215
- return 1;
216
- }
217
- }
package/dist/temp/diff.js DELETED
@@ -1,198 +0,0 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
9
- };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
-
20
- // src/plugins/diff.ts
21
- var diff_exports = {};
22
- __export(diff_exports, {
23
- diff: () => diff
24
- });
25
- module.exports = __toCommonJS(diff_exports);
26
- function myersDiff(oldArr, newArr) {
27
- const n = oldArr.length;
28
- const m = newArr.length;
29
- const max = n + m;
30
- if (max === 0) return [];
31
- const v = { 1: 0 };
32
- const trace = [];
33
- outer: for (let d = 0; d <= max; d++) {
34
- trace.push({ ...v });
35
- for (let k = -d; k <= d; k += 2) {
36
- let x2;
37
- if (k === -d || k !== d && v[k - 1] < v[k + 1]) {
38
- x2 = v[k + 1];
39
- } else {
40
- x2 = v[k - 1] + 1;
41
- }
42
- let y2 = x2 - k;
43
- while (x2 < n && y2 < m && oldArr[x2] === newArr[y2]) {
44
- x2++;
45
- y2++;
46
- }
47
- v[k] = x2;
48
- if (x2 >= n && y2 >= m) {
49
- break outer;
50
- }
51
- }
52
- }
53
- const changes = [];
54
- let x = n;
55
- let y = m;
56
- for (let d = trace.length - 1; d >= 0; d--) {
57
- const vPrev = trace[d];
58
- const k = x - y;
59
- let prevK;
60
- if (k === -d || k !== d && vPrev[k - 1] < vPrev[k + 1]) {
61
- prevK = k + 1;
62
- } else {
63
- prevK = k - 1;
64
- }
65
- const prevX = vPrev[prevK];
66
- const prevY = prevX - prevK;
67
- while (x > prevX && y > prevY) {
68
- changes.unshift({
69
- type: "equal",
70
- value: oldArr[x - 1],
71
- lineNumber: { original: x, modified: y }
72
- });
73
- x--;
74
- y--;
75
- }
76
- if (d > 0) {
77
- if (x === prevX) {
78
- changes.unshift({
79
- type: "add",
80
- value: newArr[y - 1],
81
- lineNumber: { modified: y }
82
- });
83
- y--;
84
- } else {
85
- changes.unshift({
86
- type: "remove",
87
- value: oldArr[x - 1],
88
- lineNumber: { original: x }
89
- });
90
- x--;
91
- }
92
- }
93
- }
94
- return changes;
95
- }
96
- function formatUnified(changes, context) {
97
- const lines = [];
98
- let i = 0;
99
- while (i < changes.length) {
100
- let start = i;
101
- while (start > 0 && i - start < context && changes[start - 1].type === "equal") {
102
- start--;
103
- }
104
- let end = i;
105
- while (end < changes.length) {
106
- if (changes[end].type !== "equal") {
107
- let nextChange = end + 1;
108
- while (nextChange < changes.length && changes[nextChange].type === "equal") {
109
- nextChange++;
110
- }
111
- if (nextChange - end <= context * 2 && nextChange < changes.length) {
112
- end = nextChange;
113
- } else {
114
- end = Math.min(end + context, changes.length - 1);
115
- break;
116
- }
117
- }
118
- end++;
119
- }
120
- if (end >= changes.length) end = changes.length - 1;
121
- let hasChanges = false;
122
- for (let j = start; j <= end; j++) {
123
- if (changes[j].type !== "equal") {
124
- hasChanges = true;
125
- break;
126
- }
127
- }
128
- if (hasChanges) {
129
- for (let j = start; j <= end; j++) {
130
- const change = changes[j];
131
- if (change.type === "add") {
132
- lines.push(`+ ${change.value}`);
133
- } else if (change.type === "remove") {
134
- lines.push(`- ${change.value}`);
135
- } else {
136
- lines.push(` ${change.value}`);
137
- }
138
- }
139
- }
140
- i = end + 1;
141
- while (i < changes.length && changes[i].type === "equal") {
142
- i++;
143
- }
144
- }
145
- return lines.join("\n");
146
- }
147
- function formatInline(changes) {
148
- const lines = [];
149
- for (const change of changes) {
150
- if (change.type === "add") {
151
- lines.push(`[+] ${change.value}`);
152
- } else if (change.type === "remove") {
153
- lines.push(`[-] ${change.value}`);
154
- } else {
155
- lines.push(` ${change.value}`);
156
- }
157
- }
158
- return lines.join("\n");
159
- }
160
- function diff() {
161
- try {
162
- const inputStr = Host.inputString();
163
- const input = JSON.parse(inputStr);
164
- const format = input.format ?? "unified";
165
- const context = input.context ?? 3;
166
- const oldLines = input.original.split("\n");
167
- const newLines = input.modified.split("\n");
168
- const changes = myersDiff(oldLines, newLines);
169
- const additions = changes.filter((c) => c.type === "add").length;
170
- const deletions = changes.filter((c) => c.type === "remove").length;
171
- let diffStr;
172
- if (format === "json") {
173
- diffStr = JSON.stringify(changes);
174
- } else if (format === "inline") {
175
- diffStr = formatInline(changes);
176
- } else {
177
- diffStr = formatUnified(changes, context);
178
- }
179
- const output = {
180
- diff: diffStr,
181
- additions,
182
- deletions,
183
- changes
184
- };
185
- Host.outputString(JSON.stringify(output));
186
- return 0;
187
- } catch (error) {
188
- const output = {
189
- diff: "",
190
- additions: 0,
191
- deletions: 0,
192
- changes: [],
193
- error: error instanceof Error ? error.message : String(error)
194
- };
195
- Host.outputString(JSON.stringify(output));
196
- return 1;
197
- }
198
- }