@cogitator-ai/wasm-tools 0.5.10 → 0.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 (123) hide show
  1. package/README.md +84 -25
  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/file-watcher.d.ts.map +1 -1
  7. package/dist/manager/file-watcher.js +6 -0
  8. package/dist/manager/file-watcher.js.map +1 -1
  9. package/dist/manager/types.d.ts +11 -3
  10. package/dist/manager/types.d.ts.map +1 -1
  11. package/dist/manager/wasm-loader.d.ts +1 -0
  12. package/dist/manager/wasm-loader.d.ts.map +1 -1
  13. package/dist/manager/wasm-loader.js +26 -5
  14. package/dist/manager/wasm-loader.js.map +1 -1
  15. package/dist/manager/wasm-tool-manager.d.ts +6 -0
  16. package/dist/manager/wasm-tool-manager.d.ts.map +1 -1
  17. package/dist/manager/wasm-tool-manager.js +115 -30
  18. package/dist/manager/wasm-tool-manager.js.map +1 -1
  19. package/dist/runtime.d.ts +11 -0
  20. package/dist/runtime.d.ts.map +1 -0
  21. package/dist/runtime.js +104 -0
  22. package/dist/runtime.js.map +1 -0
  23. package/dist/wasm/base64.wasm +0 -0
  24. package/dist/wasm/calc.wasm +0 -0
  25. package/dist/wasm/compression.wasm +0 -0
  26. package/dist/wasm/csv.wasm +0 -0
  27. package/dist/wasm/datetime.wasm +0 -0
  28. package/dist/wasm/diff.wasm +0 -0
  29. package/dist/wasm/hash.wasm +0 -0
  30. package/dist/wasm/json.wasm +0 -0
  31. package/dist/wasm/markdown.wasm +0 -0
  32. package/dist/wasm/regex.wasm +0 -0
  33. package/dist/wasm/signing.wasm +0 -0
  34. package/dist/wasm/slug.wasm +0 -0
  35. package/dist/wasm/validation.wasm +0 -0
  36. package/dist/wasm/xml.wasm +0 -0
  37. package/package.json +5 -6
  38. package/dist/__tests__/file-watcher.test.d.ts +0 -2
  39. package/dist/__tests__/file-watcher.test.d.ts.map +0 -1
  40. package/dist/__tests__/file-watcher.test.js +0 -99
  41. package/dist/__tests__/file-watcher.test.js.map +0 -1
  42. package/dist/__tests__/index.test.d.ts +0 -2
  43. package/dist/__tests__/index.test.d.ts.map +0 -1
  44. package/dist/__tests__/index.test.js +0 -226
  45. package/dist/__tests__/index.test.js.map +0 -1
  46. package/dist/__tests__/wasm-loader.test.d.ts +0 -2
  47. package/dist/__tests__/wasm-loader.test.d.ts.map +0 -1
  48. package/dist/__tests__/wasm-loader.test.js +0 -68
  49. package/dist/__tests__/wasm-loader.test.js.map +0 -1
  50. package/dist/__tests__/wasm-tool-manager.test.d.ts +0 -2
  51. package/dist/__tests__/wasm-tool-manager.test.d.ts.map +0 -1
  52. package/dist/__tests__/wasm-tool-manager.test.js +0 -166
  53. package/dist/__tests__/wasm-tool-manager.test.js.map +0 -1
  54. package/dist/plugins/base64.d.ts +0 -12
  55. package/dist/plugins/base64.d.ts.map +0 -1
  56. package/dist/plugins/base64.js +0 -95
  57. package/dist/plugins/base64.js.map +0 -1
  58. package/dist/plugins/calc.d.ts +0 -12
  59. package/dist/plugins/calc.d.ts.map +0 -1
  60. package/dist/plugins/calc.js +0 -95
  61. package/dist/plugins/calc.js.map +0 -1
  62. package/dist/plugins/compression.d.ts +0 -2
  63. package/dist/plugins/compression.d.ts.map +0 -1
  64. package/dist/plugins/compression.js +0 -545
  65. package/dist/plugins/compression.js.map +0 -1
  66. package/dist/plugins/csv.d.ts +0 -2
  67. package/dist/plugins/csv.d.ts.map +0 -1
  68. package/dist/plugins/csv.js +0 -136
  69. package/dist/plugins/csv.js.map +0 -1
  70. package/dist/plugins/datetime.d.ts +0 -2
  71. package/dist/plugins/datetime.d.ts.map +0 -1
  72. package/dist/plugins/datetime.js +0 -186
  73. package/dist/plugins/datetime.js.map +0 -1
  74. package/dist/plugins/diff.d.ts +0 -2
  75. package/dist/plugins/diff.d.ts.map +0 -1
  76. package/dist/plugins/diff.js +0 -187
  77. package/dist/plugins/diff.js.map +0 -1
  78. package/dist/plugins/hash.d.ts +0 -12
  79. package/dist/plugins/hash.d.ts.map +0 -1
  80. package/dist/plugins/hash.js +0 -309
  81. package/dist/plugins/hash.js.map +0 -1
  82. package/dist/plugins/json.d.ts +0 -12
  83. package/dist/plugins/json.d.ts.map +0 -1
  84. package/dist/plugins/json.js +0 -70
  85. package/dist/plugins/json.js.map +0 -1
  86. package/dist/plugins/markdown.d.ts +0 -2
  87. package/dist/plugins/markdown.d.ts.map +0 -1
  88. package/dist/plugins/markdown.js +0 -213
  89. package/dist/plugins/markdown.js.map +0 -1
  90. package/dist/plugins/regex.d.ts +0 -2
  91. package/dist/plugins/regex.d.ts.map +0 -1
  92. package/dist/plugins/regex.js +0 -120
  93. package/dist/plugins/regex.js.map +0 -1
  94. package/dist/plugins/signing.d.ts +0 -2
  95. package/dist/plugins/signing.d.ts.map +0 -1
  96. package/dist/plugins/signing.js +0 -576
  97. package/dist/plugins/signing.js.map +0 -1
  98. package/dist/plugins/slug.d.ts +0 -2
  99. package/dist/plugins/slug.d.ts.map +0 -1
  100. package/dist/plugins/slug.js +0 -180
  101. package/dist/plugins/slug.js.map +0 -1
  102. package/dist/plugins/validation.d.ts +0 -2
  103. package/dist/plugins/validation.d.ts.map +0 -1
  104. package/dist/plugins/validation.js +0 -105
  105. package/dist/plugins/validation.js.map +0 -1
  106. package/dist/plugins/xml.d.ts +0 -2
  107. package/dist/plugins/xml.d.ts.map +0 -1
  108. package/dist/plugins/xml.js +0 -297
  109. package/dist/plugins/xml.js.map +0 -1
  110. package/dist/temp/base64.js +0 -102
  111. package/dist/temp/calc.js +0 -102
  112. package/dist/temp/compression.js +0 -738
  113. package/dist/temp/csv.js +0 -155
  114. package/dist/temp/datetime.js +0 -201
  115. package/dist/temp/diff.js +0 -198
  116. package/dist/temp/hash.js +0 -423
  117. package/dist/temp/json.js +0 -80
  118. package/dist/temp/markdown.js +0 -224
  119. package/dist/temp/regex.js +0 -141
  120. package/dist/temp/signing.js +0 -584
  121. package/dist/temp/slug.js +0 -198
  122. package/dist/temp/validation.js +0 -125
  123. package/dist/temp/xml.js +0 -295
package/dist/temp/csv.js DELETED
@@ -1,155 +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
- let result;
121
- let rowCount;
122
- let columnCount;
123
- let headers;
124
- if (input.operation === "parse") {
125
- const hasHeaders = input.headers ?? false;
126
- const parsed = parseCsv(input.data, delimiter, quote, hasHeaders);
127
- result = parsed.rows;
128
- headers = parsed.headers;
129
- rowCount = parsed.rows.length;
130
- columnCount = parsed.rows[0]?.length ?? 0;
131
- } else {
132
- headers = input.headers;
133
- result = stringifyCsv(input.data, delimiter, quote, headers);
134
- rowCount = input.data.length;
135
- columnCount = input.data[0]?.length ?? 0;
136
- }
137
- const output = {
138
- result,
139
- rowCount,
140
- columnCount,
141
- headers
142
- };
143
- Host.outputString(JSON.stringify(output));
144
- return 0;
145
- } catch (error) {
146
- const output = {
147
- result: [],
148
- rowCount: 0,
149
- columnCount: 0,
150
- error: error instanceof Error ? error.message : String(error)
151
- };
152
- Host.outputString(JSON.stringify(output));
153
- return 1;
154
- }
155
- }
@@ -1,201 +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) return 0;
30
- const sign = match[1] === "+" ? 1 : -1;
31
- const hours = parseInt(match[2], 10);
32
- const minutes = parseInt(match[3], 10);
33
- return sign * (hours * 60 + minutes) * 60 * 1e3;
34
- }
35
- function parseDate(dateStr) {
36
- const isoMatch = /^(\d{4})-(\d{2})-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})(?:\.(\d{3}))?(?:Z|([+-]\d{2}:?\d{2}))?)?$/.exec(
37
- dateStr
38
- );
39
- if (isoMatch) {
40
- const [, year, month, day, hour = "0", min = "0", sec = "0", ms = "0", tz] = isoMatch;
41
- const date = new Date(
42
- Date.UTC(
43
- parseInt(year, 10),
44
- parseInt(month, 10) - 1,
45
- parseInt(day, 10),
46
- parseInt(hour, 10),
47
- parseInt(min, 10),
48
- parseInt(sec, 10),
49
- parseInt(ms, 10)
50
- )
51
- );
52
- if (tz) {
53
- const offset = parseOffset(tz);
54
- date.setTime(date.getTime() - offset);
55
- }
56
- return date;
57
- }
58
- const timestamp = Date.parse(dateStr);
59
- if (!isNaN(timestamp)) {
60
- return new Date(timestamp);
61
- }
62
- throw new Error(`Cannot parse date: ${dateStr}`);
63
- }
64
- function formatDate(date, formatStr, offsetMs = 0) {
65
- const adjusted = new Date(date.getTime() + offsetMs);
66
- const year = adjusted.getUTCFullYear();
67
- const month = adjusted.getUTCMonth() + 1;
68
- const day = adjusted.getUTCDate();
69
- const hours = adjusted.getUTCHours();
70
- const minutes = adjusted.getUTCMinutes();
71
- const seconds = adjusted.getUTCSeconds();
72
- const ms = adjusted.getUTCMilliseconds();
73
- const pad = (n, len = 2) => String(n).padStart(len, "0");
74
- const offsetHours = Math.floor(Math.abs(offsetMs) / 36e5);
75
- const offsetMins = Math.floor(Math.abs(offsetMs) % 36e5 / 6e4);
76
- const offsetSign = offsetMs >= 0 ? "+" : "-";
77
- const offsetStr = offsetMs === 0 ? "Z" : `${offsetSign}${pad(offsetHours)}:${pad(offsetMins)}`;
78
- 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);
79
- }
80
- function addToDate(date, amount, unit) {
81
- const result = new Date(date.getTime());
82
- switch (unit) {
83
- case "years":
84
- result.setUTCFullYear(result.getUTCFullYear() + amount);
85
- break;
86
- case "months":
87
- result.setUTCMonth(result.getUTCMonth() + amount);
88
- break;
89
- case "days":
90
- result.setUTCDate(result.getUTCDate() + amount);
91
- break;
92
- case "hours":
93
- result.setUTCHours(result.getUTCHours() + amount);
94
- break;
95
- case "minutes":
96
- result.setUTCMinutes(result.getUTCMinutes() + amount);
97
- break;
98
- case "seconds":
99
- result.setUTCSeconds(result.getUTCSeconds() + amount);
100
- break;
101
- case "milliseconds":
102
- result.setTime(result.getTime() + amount);
103
- break;
104
- default:
105
- throw new Error(`Unknown unit: ${unit}`);
106
- }
107
- return result;
108
- }
109
- function dateDiff(date1, date2, unit) {
110
- const diffMs = date2.getTime() - date1.getTime();
111
- switch (unit) {
112
- case "years":
113
- return date2.getUTCFullYear() - date1.getUTCFullYear();
114
- case "months":
115
- return (date2.getUTCFullYear() - date1.getUTCFullYear()) * 12 + (date2.getUTCMonth() - date1.getUTCMonth());
116
- case "days":
117
- return Math.floor(diffMs / (24 * 60 * 60 * 1e3));
118
- case "hours":
119
- return Math.floor(diffMs / (60 * 60 * 1e3));
120
- case "minutes":
121
- return Math.floor(diffMs / (60 * 1e3));
122
- case "seconds":
123
- return Math.floor(diffMs / 1e3);
124
- case "milliseconds":
125
- return diffMs;
126
- default:
127
- return diffMs;
128
- }
129
- }
130
- function datetime() {
131
- try {
132
- const inputStr = Host.inputString();
133
- const input = JSON.parse(inputStr);
134
- const offsetMs = parseOffset(input.timezone);
135
- let date;
136
- let result;
137
- switch (input.operation) {
138
- case "now":
139
- date = /* @__PURE__ */ new Date();
140
- result = date.toISOString();
141
- break;
142
- case "parse":
143
- if (!input.date) throw new Error("date is required for parse operation");
144
- date = parseDate(input.date);
145
- result = date.toISOString();
146
- break;
147
- case "format": {
148
- if (!input.date) throw new Error("date is required for format operation");
149
- date = parseDate(input.date);
150
- const format = input.format ?? "YYYY-MM-DDTHH:mm:ssZ";
151
- result = formatDate(date, format, offsetMs);
152
- break;
153
- }
154
- case "add":
155
- if (!input.date) throw new Error("date is required for add operation");
156
- if (input.amount === void 0) throw new Error("amount is required for add operation");
157
- if (!input.unit) throw new Error("unit is required for add operation");
158
- date = parseDate(input.date);
159
- date = addToDate(date, input.amount, input.unit);
160
- result = date.toISOString();
161
- break;
162
- case "subtract":
163
- if (!input.date) throw new Error("date is required for subtract operation");
164
- if (input.amount === void 0)
165
- throw new Error("amount is required for subtract operation");
166
- if (!input.unit) throw new Error("unit is required for subtract operation");
167
- date = parseDate(input.date);
168
- date = addToDate(date, -input.amount, input.unit);
169
- result = date.toISOString();
170
- break;
171
- case "diff": {
172
- if (!input.date) throw new Error("date is required for diff operation");
173
- if (!input.endDate) throw new Error("endDate is required for diff operation");
174
- date = parseDate(input.date);
175
- const endDate = parseDate(input.endDate);
176
- result = dateDiff(date, endDate, input.unit ?? "milliseconds");
177
- break;
178
- }
179
- default:
180
- throw new Error(`Unknown operation: ${input.operation}`);
181
- }
182
- const outputDate = input.operation === "diff" ? parseDate(input.date) : date;
183
- const output = {
184
- result,
185
- iso: outputDate.toISOString(),
186
- unix: Math.floor(outputDate.getTime() / 1e3),
187
- formatted: input.format ? formatDate(outputDate, input.format, offsetMs) : void 0
188
- };
189
- Host.outputString(JSON.stringify(output));
190
- return 0;
191
- } catch (error) {
192
- const output = {
193
- result: "",
194
- iso: "",
195
- unix: 0,
196
- error: error instanceof Error ? error.message : String(error)
197
- };
198
- Host.outputString(JSON.stringify(output));
199
- return 1;
200
- }
201
- }
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
- }