@udondan/avanti 0.23.1 → 0.25.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 (100) hide show
  1. package/README.md +578 -65
  2. package/dist/commands/diff.d.ts.map +1 -1
  3. package/dist/commands/diff.js +82 -15
  4. package/dist/commands/diff.js.map +1 -1
  5. package/dist/commands/lock.d.ts.map +1 -1
  6. package/dist/commands/lock.js +3 -2
  7. package/dist/commands/lock.js.map +1 -1
  8. package/dist/commands/log.d.ts.map +1 -1
  9. package/dist/commands/log.js +7 -5
  10. package/dist/commands/log.js.map +1 -1
  11. package/dist/commands/pull.d.ts.map +1 -1
  12. package/dist/commands/pull.js +695 -32
  13. package/dist/commands/pull.js.map +1 -1
  14. package/dist/commands/reset.d.ts.map +1 -1
  15. package/dist/commands/reset.js +43 -11
  16. package/dist/commands/reset.js.map +1 -1
  17. package/dist/commands/revert.d.ts.map +1 -1
  18. package/dist/commands/revert.js +68 -14
  19. package/dist/commands/revert.js.map +1 -1
  20. package/dist/condition.d.ts.map +1 -1
  21. package/dist/condition.js +9 -6
  22. package/dist/condition.js.map +1 -1
  23. package/dist/config-writeback.d.ts.map +1 -1
  24. package/dist/config-writeback.js +33 -4
  25. package/dist/config-writeback.js.map +1 -1
  26. package/dist/config.d.ts.map +1 -1
  27. package/dist/config.js +396 -10
  28. package/dist/config.js.map +1 -1
  29. package/dist/diff.d.ts +25 -1
  30. package/dist/diff.d.ts.map +1 -1
  31. package/dist/diff.js +410 -28
  32. package/dist/diff.js.map +1 -1
  33. package/dist/extract.d.ts +4 -0
  34. package/dist/extract.d.ts.map +1 -0
  35. package/dist/extract.js +142 -0
  36. package/dist/extract.js.map +1 -0
  37. package/dist/filter.d.ts +3 -0
  38. package/dist/filter.d.ts.map +1 -0
  39. package/dist/filter.js +126 -0
  40. package/dist/filter.js.map +1 -0
  41. package/dist/history.d.ts +7 -1
  42. package/dist/history.d.ts.map +1 -1
  43. package/dist/history.js +89 -9
  44. package/dist/history.js.map +1 -1
  45. package/dist/paths.d.ts +4 -0
  46. package/dist/paths.d.ts.map +1 -1
  47. package/dist/paths.js +97 -0
  48. package/dist/paths.js.map +1 -1
  49. package/dist/processors/ini.d.ts +33 -0
  50. package/dist/processors/ini.d.ts.map +1 -0
  51. package/dist/processors/ini.js +500 -0
  52. package/dist/processors/ini.js.map +1 -0
  53. package/dist/processors/insert.d.ts.map +1 -1
  54. package/dist/processors/insert.js +338 -15
  55. package/dist/processors/insert.js.map +1 -1
  56. package/dist/processors/on.d.ts +4 -0
  57. package/dist/processors/on.d.ts.map +1 -0
  58. package/dist/processors/on.js +54 -0
  59. package/dist/processors/on.js.map +1 -0
  60. package/dist/ref.d.ts +21 -0
  61. package/dist/ref.d.ts.map +1 -0
  62. package/dist/ref.js +65 -0
  63. package/dist/ref.js.map +1 -0
  64. package/dist/sources/bitbucket.d.ts.map +1 -1
  65. package/dist/sources/bitbucket.js +51 -12
  66. package/dist/sources/bitbucket.js.map +1 -1
  67. package/dist/sources/git.d.ts.map +1 -1
  68. package/dist/sources/git.js +54 -6
  69. package/dist/sources/git.js.map +1 -1
  70. package/dist/sources/github.d.ts +1 -0
  71. package/dist/sources/github.d.ts.map +1 -1
  72. package/dist/sources/github.js +287 -50
  73. package/dist/sources/github.js.map +1 -1
  74. package/dist/sources/gitlab.d.ts +1 -0
  75. package/dist/sources/gitlab.d.ts.map +1 -1
  76. package/dist/sources/gitlab.js +387 -28
  77. package/dist/sources/gitlab.js.map +1 -1
  78. package/dist/sources/index.d.ts +3 -1
  79. package/dist/sources/index.d.ts.map +1 -1
  80. package/dist/sources/index.js +206 -44
  81. package/dist/sources/index.js.map +1 -1
  82. package/dist/sources/local.d.ts +3 -0
  83. package/dist/sources/local.d.ts.map +1 -1
  84. package/dist/sources/local.js +44 -0
  85. package/dist/sources/local.js.map +1 -1
  86. package/dist/types.d.ts +71 -6
  87. package/dist/types.d.ts.map +1 -1
  88. package/dist/types.js.map +1 -1
  89. package/dist/variables-remote.d.ts.map +1 -1
  90. package/dist/variables-remote.js +88 -7
  91. package/dist/variables-remote.js.map +1 -1
  92. package/dist/variables.d.ts +1 -0
  93. package/dist/variables.d.ts.map +1 -1
  94. package/dist/variables.js +133 -12
  95. package/dist/variables.js.map +1 -1
  96. package/dist/writer.d.ts +18 -0
  97. package/dist/writer.d.ts.map +1 -1
  98. package/dist/writer.js +968 -25
  99. package/dist/writer.js.map +1 -1
  100. package/package.json +12 -8
package/dist/diff.js CHANGED
@@ -38,6 +38,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  exports.computeDeleteDiff = computeDeleteDiff;
40
40
  exports.computeDiff = computeDiff;
41
+ exports.buildNewFileDiff = buildNewFileDiff;
42
+ exports.buildNewSymlinkDiff = buildNewSymlinkDiff;
43
+ exports.computeSymlinkDiff = computeSymlinkDiff;
41
44
  exports.formatDiff = formatDiff;
42
45
  exports.printDiffs = printDiffs;
43
46
  const fs = __importStar(require("fs"));
@@ -45,55 +48,346 @@ const diff_1 = require("diff");
45
48
  const chalk_1 = __importDefault(require("chalk"));
46
49
  const binary_1 = require("./binary");
47
50
  function computeDeleteDiff(targetPath) {
48
- if (!fs.existsSync(targetPath)) {
49
- return { targetPath, isNew: false, hasChanges: false, patch: '' };
51
+ let oldBuf;
52
+ try {
53
+ const stat = fs.lstatSync(targetPath, { throwIfNoEntry: false });
54
+ if (stat === undefined) {
55
+ return {
56
+ targetPath,
57
+ isNew: false,
58
+ hasChanges: false,
59
+ contentChanged: false,
60
+ patch: '',
61
+ };
62
+ }
63
+ if (stat.isSymbolicLink()) {
64
+ let linkTarget;
65
+ try {
66
+ linkTarget = fs.readlinkSync(targetPath);
67
+ }
68
+ catch (err) {
69
+ const code = err.code;
70
+ if (code !== 'EACCES' && code !== 'EPERM')
71
+ throw err;
72
+ // Symlink exists but reading its target requires elevated privileges.
73
+ return {
74
+ targetPath,
75
+ isNew: false,
76
+ isDelete: true,
77
+ hasChanges: true,
78
+ contentChanged: true,
79
+ patch: '',
80
+ isUnreadable: true,
81
+ isSymlink: true,
82
+ };
83
+ }
84
+ const patch = (0, diff_1.createTwoFilesPatch)(targetPath, '/dev/null', `-> ${linkTarget}\n`, '', undefined, 'deleted');
85
+ return {
86
+ targetPath,
87
+ isNew: false,
88
+ isDelete: true,
89
+ hasChanges: true,
90
+ contentChanged: true,
91
+ patch,
92
+ isSymlink: true,
93
+ };
94
+ }
95
+ oldBuf = fs.readFileSync(targetPath);
96
+ }
97
+ catch (err) {
98
+ const code = err.code;
99
+ if (code === 'ENOENT') {
100
+ // Dangling symlink — lstatSync saw the symlink but readFileSync followed
101
+ // it to a non-existent target. Treat as a binary delete (no diff available).
102
+ return {
103
+ targetPath,
104
+ isNew: false,
105
+ isDelete: true,
106
+ hasChanges: true,
107
+ contentChanged: true,
108
+ patch: '',
109
+ isBinary: true,
110
+ };
111
+ }
112
+ if (code !== 'EACCES' && code !== 'EPERM')
113
+ throw err;
114
+ // File exists but is unreadable (e.g. root-owned 0600).
115
+ return {
116
+ targetPath,
117
+ isNew: false,
118
+ isDelete: true,
119
+ hasChanges: true,
120
+ contentChanged: true,
121
+ patch: '',
122
+ isUnreadable: true,
123
+ };
50
124
  }
51
- const oldBuf = fs.readFileSync(targetPath);
52
125
  if ((0, binary_1.isBinary)(oldBuf)) {
53
126
  return {
54
127
  targetPath,
55
128
  isNew: false,
56
129
  isDelete: true,
57
130
  hasChanges: true,
131
+ contentChanged: true,
58
132
  patch: '',
59
133
  isBinary: true,
60
134
  };
61
135
  }
62
136
  const oldContent = oldBuf.toString('utf8');
63
137
  const patch = (0, diff_1.createTwoFilesPatch)(targetPath, '/dev/null', oldContent, '', undefined, 'deleted');
64
- return { targetPath, isNew: false, hasChanges: true, patch };
138
+ return {
139
+ targetPath,
140
+ isNew: false,
141
+ hasChanges: true,
142
+ contentChanged: true,
143
+ patch,
144
+ };
65
145
  }
66
- function computeDiff(targetPath, newContent) {
67
- const isNew = !fs.existsSync(targetPath);
68
- const oldBuf = isNew ? Buffer.alloc(0) : fs.readFileSync(targetPath);
146
+ function computeDiff(targetPath, newContent, desiredMode) {
147
+ let isNew = false;
148
+ let oldBuf = Buffer.alloc(0);
149
+ let isUnreadable = false;
150
+ let lstatFailed = false;
151
+ let stat;
152
+ try {
153
+ stat = fs.lstatSync(targetPath, { throwIfNoEntry: false });
154
+ }
155
+ catch (err) {
156
+ const code = err.code;
157
+ if (code !== 'EACCES' && code !== 'EPERM')
158
+ throw err;
159
+ // lstatSync failed — parent directory not searchable. Existence is unknown;
160
+ // treat as existing (conservative). pull.ts uses sudoFileExists to verify
161
+ // the true state after authenticating.
162
+ lstatFailed = true;
163
+ isUnreadable = true;
164
+ isNew = false;
165
+ }
166
+ if (!lstatFailed) {
167
+ isNew = stat === undefined;
168
+ if (!isNew) {
169
+ try {
170
+ oldBuf = fs.readFileSync(targetPath);
171
+ }
172
+ catch (err) {
173
+ const code = err.code;
174
+ if (code === 'ENOENT') {
175
+ // Dangling symlink — lstatSync saw the symlink but readFileSync
176
+ // followed it to a non-existent target. Treat as empty content:
177
+ // the diff will show the full new content being written.
178
+ // isUnreadable stays false; oldBuf stays empty Buffer.
179
+ }
180
+ else if (code === 'EACCES' || code === 'EPERM') {
181
+ // File exists but is unreadable (e.g. root-owned 0600).
182
+ isUnreadable = true;
183
+ }
184
+ else {
185
+ throw err;
186
+ }
187
+ }
188
+ }
189
+ }
190
+ let modeChange;
191
+ if (!isNew && desiredMode && process.platform !== 'win32') {
192
+ const desired = parseInt(desiredMode, 8);
193
+ if (!isNaN(desired)) {
194
+ try {
195
+ const stat = fs.lstatSync(targetPath, { throwIfNoEntry: false });
196
+ if (stat !== undefined && !stat.isSymbolicLink()) {
197
+ const current = stat.mode & 0o7777;
198
+ if (desired !== current) {
199
+ modeChange = { from: current, to: desired };
200
+ }
201
+ }
202
+ }
203
+ catch (err) {
204
+ const code = err.code;
205
+ if (code !== 'EACCES' && code !== 'EPERM')
206
+ throw err;
207
+ // Cannot stat unreadable file — skip mode detection.
208
+ }
209
+ }
210
+ }
211
+ if (isUnreadable) {
212
+ return {
213
+ targetPath,
214
+ isNew: false,
215
+ hasChanges: true,
216
+ contentChanged: true,
217
+ patch: '',
218
+ isUnreadable: true,
219
+ ...(lstatFailed && { lstatFailed: true }),
220
+ modeChange,
221
+ };
222
+ }
69
223
  const binary = (0, binary_1.isBinary)(newContent) || (0, binary_1.isBinary)(oldBuf);
70
224
  if (binary) {
71
- const hasChanges = isNew || !newContent.equals(oldBuf);
72
- return { targetPath, isNew, hasChanges, patch: '', isBinary: true };
225
+ const contentChanged = isNew || !newContent.equals(oldBuf);
226
+ const hasChanges = contentChanged || modeChange !== undefined;
227
+ return {
228
+ targetPath,
229
+ isNew,
230
+ hasChanges,
231
+ contentChanged,
232
+ patch: '',
233
+ isBinary: true,
234
+ modeChange,
235
+ };
73
236
  }
74
237
  const oldContent = oldBuf.toString('utf8');
75
238
  const newText = newContent.toString('utf8');
76
- const hasChanges = oldContent !== newText;
77
- const patch = (0, diff_1.createTwoFilesPatch)(isNew ? '/dev/null' : targetPath, targetPath, oldContent, newText, isNew ? '' : undefined, isNew ? 'new file' : undefined);
78
- return { targetPath, isNew, hasChanges, patch };
239
+ const contentChanged = oldContent !== newText;
240
+ const hasChanges = contentChanged || modeChange !== undefined;
241
+ const patch = contentChanged
242
+ ? (0, diff_1.createTwoFilesPatch)(isNew ? '/dev/null' : targetPath, targetPath, oldContent, newText, isNew ? '' : undefined, isNew ? 'new file' : undefined)
243
+ : '';
244
+ return {
245
+ targetPath,
246
+ isNew,
247
+ hasChanges,
248
+ contentChanged,
249
+ patch,
250
+ modeChange,
251
+ };
252
+ }
253
+ /** Build a new-file FileDiff from content without reading disk. Used when
254
+ * lstatFailed initially but sudo confirms the file does not yet exist. */
255
+ function buildNewFileDiff(targetPath, newContent, modeChange) {
256
+ if ((0, binary_1.isBinary)(newContent)) {
257
+ return {
258
+ targetPath,
259
+ isNew: true,
260
+ hasChanges: true,
261
+ contentChanged: true,
262
+ patch: '',
263
+ isBinary: true,
264
+ modeChange,
265
+ };
266
+ }
267
+ const newText = newContent.toString('utf8');
268
+ const patch = (0, diff_1.createTwoFilesPatch)('/dev/null', targetPath, '', newText, '', 'new file');
269
+ return {
270
+ targetPath,
271
+ isNew: true,
272
+ hasChanges: true,
273
+ contentChanged: true,
274
+ patch,
275
+ modeChange,
276
+ };
277
+ }
278
+ /** Build a new-symlink FileDiff without reading disk. Used when lstatFailed
279
+ * initially but sudo confirms the path does not yet exist — calling
280
+ * computeSymlinkDiff again would still EACCES on the parent directory. */
281
+ function buildNewSymlinkDiff(targetPath, symlinkTarget) {
282
+ const patch = (0, diff_1.createTwoFilesPatch)('/dev/null', targetPath, '', `-> ${symlinkTarget}\n`, '', 'new symlink');
283
+ return {
284
+ targetPath,
285
+ isNew: true,
286
+ hasChanges: true,
287
+ contentChanged: true,
288
+ patch,
289
+ isSymlink: true,
290
+ };
291
+ }
292
+ function computeSymlinkDiff(targetPath, symlinkTarget) {
293
+ let stat;
294
+ try {
295
+ stat = fs.lstatSync(targetPath, { throwIfNoEntry: false });
296
+ }
297
+ catch (err) {
298
+ const code = err.code;
299
+ if (code !== 'EACCES' && code !== 'EPERM')
300
+ throw err;
301
+ return {
302
+ targetPath,
303
+ isNew: false,
304
+ hasChanges: true,
305
+ contentChanged: true,
306
+ patch: '',
307
+ isUnreadable: true,
308
+ lstatFailed: true,
309
+ isSymlink: true,
310
+ };
311
+ }
312
+ if (stat === undefined) {
313
+ const patch = (0, diff_1.createTwoFilesPatch)('/dev/null', targetPath, '', `-> ${symlinkTarget}\n`, '', 'new symlink');
314
+ return {
315
+ targetPath,
316
+ isNew: true,
317
+ hasChanges: true,
318
+ contentChanged: true,
319
+ patch,
320
+ isSymlink: true,
321
+ };
322
+ }
323
+ if (!stat.isSymbolicLink()) {
324
+ if (stat.isDirectory()) {
325
+ // Symlinks cannot replace existing directories — write will fail.
326
+ // Return a diff marked isDirectory so callers can surface an error
327
+ // rather than attempting a write that will fail with EISDIR.
328
+ return {
329
+ targetPath,
330
+ isNew: false,
331
+ hasChanges: true,
332
+ contentChanged: true,
333
+ patch: '',
334
+ isSymlink: true,
335
+ isDirectory: true,
336
+ };
337
+ }
338
+ const existingLabel = stat.isFile() ? 'regular file' : 'special file';
339
+ const patch = (0, diff_1.createTwoFilesPatch)(targetPath, targetPath, `[${existingLabel}]\n`, `-> ${symlinkTarget}\n`, `was ${existingLabel}`, 'replaced by symlink');
340
+ return {
341
+ targetPath,
342
+ isNew: false,
343
+ hasChanges: true,
344
+ contentChanged: true,
345
+ patch,
346
+ isSymlink: true,
347
+ };
348
+ }
349
+ let currentTarget;
350
+ try {
351
+ currentTarget = fs.readlinkSync(targetPath);
352
+ }
353
+ catch (err) {
354
+ const code = err.code;
355
+ if (code !== 'EACCES' && code !== 'EPERM')
356
+ throw err;
357
+ return {
358
+ targetPath,
359
+ isNew: false,
360
+ hasChanges: true,
361
+ contentChanged: true,
362
+ patch: '',
363
+ isUnreadable: true,
364
+ isSymlink: true,
365
+ };
366
+ }
367
+ if (currentTarget === symlinkTarget) {
368
+ return {
369
+ targetPath,
370
+ isNew: false,
371
+ hasChanges: false,
372
+ contentChanged: false,
373
+ patch: '',
374
+ isSymlink: true,
375
+ };
376
+ }
377
+ const patch = (0, diff_1.createTwoFilesPatch)(targetPath, targetPath, `-> ${currentTarget}\n`, `-> ${symlinkTarget}\n`, 'symlink target changed', 'symlink target changed');
378
+ return {
379
+ targetPath,
380
+ isNew: false,
381
+ hasChanges: true,
382
+ contentChanged: true,
383
+ patch,
384
+ isSymlink: true,
385
+ };
79
386
  }
80
387
  function formatDiff(diff) {
81
388
  if (!diff.hasChanges)
82
389
  return '';
83
- if (diff.isBinary) {
84
- const label = diff.isNew
85
- ? 'new binary file'
86
- : diff.isDelete
87
- ? 'binary file deleted'
88
- : 'binary file changed';
89
- const oldPath = diff.isNew ? '/dev/null' : diff.targetPath;
90
- const newPath = diff.isDelete ? '/dev/null' : diff.targetPath;
91
- return (chalk_1.default.bold(`--- ${oldPath}\n+++ ${newPath}`) +
92
- '\n' +
93
- chalk_1.default.cyan(`@@ ${label} @@`));
94
- }
95
- const lines = diff.patch.split('\n');
96
- const colored = lines.map((line) => {
390
+ const colorLine = (line) => {
97
391
  if (line.startsWith('+++') || line.startsWith('---'))
98
392
  return chalk_1.default.bold(line);
99
393
  if (line.startsWith('@@'))
@@ -103,8 +397,96 @@ function formatDiff(diff) {
103
397
  if (line.startsWith('-'))
104
398
  return chalk_1.default.red(line);
105
399
  return line;
106
- });
107
- return colored.join('\n');
400
+ };
401
+ if (diff.isSymlink) {
402
+ if (diff.isDirectory) {
403
+ return (chalk_1.default.bold(`--- ${diff.targetPath}\n+++ ${diff.targetPath}`) +
404
+ '\n' +
405
+ chalk_1.default.red('@@ ERROR: target is an existing directory; symlinks cannot replace directories @@'));
406
+ }
407
+ if (diff.isUnreadable) {
408
+ const newPath = diff.isDelete ? '/dev/null' : diff.targetPath;
409
+ const label = diff.isDelete
410
+ ? 'symlink deleted (existing target unreadable — diff unavailable)'
411
+ : 'symlink (existing state unreadable)';
412
+ return (chalk_1.default.bold(`--- ${diff.targetPath}\n+++ ${newPath}`) +
413
+ '\n' +
414
+ chalk_1.default.cyan(`@@ ${label} @@`));
415
+ }
416
+ return diff.patch.split('\n').map(colorLine).join('\n');
417
+ }
418
+ let modeFrom = '';
419
+ let modeTo = '';
420
+ if (diff.modeChange) {
421
+ modeFrom = chalk_1.default.red(`-old mode ${diff.modeChange.from.toString(8).padStart(6, '0')}`);
422
+ modeTo = chalk_1.default.green(`+new mode ${diff.modeChange.to.toString(8).padStart(6, '0')}`);
423
+ }
424
+ if (diff.isUnreadable) {
425
+ // If content was confirmed unchanged via sudo re-read (contentChanged=false),
426
+ // fall through to mode-only rendering so the diff accurately shows only
427
+ // the permission change rather than the "unreadable content" placeholder.
428
+ if (!diff.contentChanged && diff.modeChange) {
429
+ // intentional fall-through to mode-only block below
430
+ }
431
+ else {
432
+ const newPath = diff.isDelete ? '/dev/null' : diff.targetPath;
433
+ const label = diff.isDelete
434
+ ? 'file deleted (unreadable — no diff available)'
435
+ : 'file updated (existing content unreadable — diff unavailable)';
436
+ let out = chalk_1.default.bold(`--- ${diff.targetPath}\n+++ ${newPath}`) + '\n';
437
+ if (diff.modeChange)
438
+ out += modeFrom + '\n' + modeTo + '\n';
439
+ out += chalk_1.default.cyan(`@@ ${label} @@`);
440
+ return out;
441
+ }
442
+ }
443
+ if (diff.isBinary) {
444
+ let out = '';
445
+ if (diff.contentChanged) {
446
+ const label = diff.isNew
447
+ ? 'new binary file'
448
+ : diff.isDelete
449
+ ? 'binary file deleted'
450
+ : 'binary file changed';
451
+ const oldPath = diff.isNew ? '/dev/null' : diff.targetPath;
452
+ const newPath = diff.isDelete ? '/dev/null' : diff.targetPath;
453
+ out += chalk_1.default.bold(`--- ${oldPath}\n+++ ${newPath}`) + '\n';
454
+ if (diff.modeChange)
455
+ out += modeFrom + '\n' + modeTo + '\n';
456
+ out += chalk_1.default.cyan(`@@ ${label} @@`);
457
+ }
458
+ else if (diff.modeChange) {
459
+ // Mode-only binary: emit file header + mode lines.
460
+ out +=
461
+ chalk_1.default.bold(`--- ${diff.targetPath}\n+++ ${diff.targetPath}`) + '\n';
462
+ out += modeFrom + '\n' + modeTo;
463
+ }
464
+ return out;
465
+ }
466
+ if (diff.contentChanged) {
467
+ const lines = diff.patch.split('\n');
468
+ if (diff.modeChange) {
469
+ // Inject mode lines after the +++ header line (git-style: header → mode
470
+ // change → hunks). Find +++ by scan rather than fixed index because
471
+ // createTwoFilesPatch may prepend Index:/=== lines before the header.
472
+ const plusPlusIdx = lines.findIndex((l) => l.startsWith('+++'));
473
+ if (plusPlusIdx >= 0) {
474
+ const before = lines.slice(0, plusPlusIdx + 1).map(colorLine);
475
+ const after = lines.slice(plusPlusIdx + 1).map(colorLine);
476
+ return [...before, modeFrom, modeTo, ...after].join('\n');
477
+ }
478
+ }
479
+ return lines.map(colorLine).join('\n');
480
+ }
481
+ // Mode-only text file.
482
+ if (diff.modeChange) {
483
+ return (chalk_1.default.bold(`--- ${diff.targetPath}\n+++ ${diff.targetPath}`) +
484
+ '\n' +
485
+ modeFrom +
486
+ '\n' +
487
+ modeTo);
488
+ }
489
+ return '';
108
490
  }
109
491
  function printDiffs(diffs) {
110
492
  const changed = diffs.filter((d) => d.hasChanges);
package/dist/diff.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type ArchiveFormat = 'zip' | 'tar' | 'tar.gz' | 'tar.bz2' | 'tar.xz';
2
+ export declare function detectArchiveFormat(filename: string): ArchiveFormat | null;
3
+ export declare function extractArchive(buffer: Buffer, filename: string): Promise<Map<string, Buffer>>;
4
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"AAKA,MAAM,MAAM,aAAa,GAAG,KAAK,GAAG,KAAK,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,CAAC;AAE5E,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAQ1E;AAoFD,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAc9B"}
@@ -0,0 +1,142 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.detectArchiveFormat = detectArchiveFormat;
40
+ exports.extractArchive = extractArchive;
41
+ const path = __importStar(require("path"));
42
+ const stream_1 = require("stream");
43
+ const tar_1 = require("tar");
44
+ const unzipper_1 = __importDefault(require("unzipper"));
45
+ function detectArchiveFormat(filename) {
46
+ const lower = filename.toLowerCase();
47
+ if (lower.endsWith('.zip'))
48
+ return 'zip';
49
+ if (lower.endsWith('.tar.gz') || lower.endsWith('.tgz'))
50
+ return 'tar.gz';
51
+ if (lower.endsWith('.tar.bz2'))
52
+ return 'tar.bz2';
53
+ if (lower.endsWith('.tar.xz'))
54
+ return 'tar.xz';
55
+ if (lower.endsWith('.tar'))
56
+ return 'tar';
57
+ return null;
58
+ }
59
+ function normalizePath(p) {
60
+ const normalized = path.posix.normalize(p.replace(/\\/g, '/'));
61
+ if (!normalized || normalized === '.')
62
+ return null;
63
+ if (normalized.startsWith('/') ||
64
+ /^[A-Za-z]:/.test(normalized) ||
65
+ normalized.split('/').includes('..')) {
66
+ throw new Error(`Archive contains unsafe entry path "${p}" — rejecting to prevent path traversal`);
67
+ }
68
+ return normalized;
69
+ }
70
+ async function extractZip(buffer) {
71
+ const directory = await unzipper_1.default.Open.buffer(buffer);
72
+ const files = new Map();
73
+ for (const entry of directory.files) {
74
+ if (entry.type === 'Directory')
75
+ continue;
76
+ const normalized = normalizePath(entry.path);
77
+ if (normalized === null)
78
+ continue;
79
+ if (files.has(normalized)) {
80
+ throw new Error(`Archive contains duplicate path "${normalized}" (original entry: "${entry.path}")`);
81
+ }
82
+ files.set(normalized, await entry.buffer());
83
+ }
84
+ return files;
85
+ }
86
+ async function extractTar(buffer) {
87
+ const files = new Map();
88
+ await new Promise((resolve, reject) => {
89
+ const parser = new tar_1.Parser();
90
+ parser.on('entry', (entry) => {
91
+ if (entry.type !== 'File' &&
92
+ entry.type !== 'OldFile' &&
93
+ entry.type !== 'ContiguousFile') {
94
+ entry.resume();
95
+ return;
96
+ }
97
+ let normalized;
98
+ try {
99
+ normalized = normalizePath(entry.path);
100
+ }
101
+ catch (err) {
102
+ const error = err instanceof Error ? err : new Error(String(err));
103
+ reject(error);
104
+ entry.resume();
105
+ return;
106
+ }
107
+ if (normalized === null) {
108
+ entry.resume();
109
+ return;
110
+ }
111
+ const key = normalized;
112
+ const originalPath = entry.path;
113
+ const chunks = [];
114
+ entry.on('data', (chunk) => chunks.push(chunk));
115
+ entry.on('end', () => {
116
+ if (files.has(key)) {
117
+ reject(new Error(`Archive contains duplicate path "${key}" (original entry: "${originalPath}")`));
118
+ return;
119
+ }
120
+ files.set(key, Buffer.concat(chunks));
121
+ });
122
+ entry.on('error', reject);
123
+ });
124
+ parser.on('finish', resolve);
125
+ parser.on('error', reject);
126
+ stream_1.Readable.from([buffer]).pipe(parser);
127
+ });
128
+ return files;
129
+ }
130
+ async function extractArchive(buffer, filename) {
131
+ const format = detectArchiveFormat(filename);
132
+ if (format === null) {
133
+ throw new Error(`Cannot extract "${filename}": unrecognised archive format (.zip, .tar, .tar.gz, .tgz, .tar.bz2, .tar.xz)`);
134
+ }
135
+ if (format === 'zip')
136
+ return extractZip(buffer);
137
+ if (format === 'tar.bz2' || format === 'tar.xz') {
138
+ throw new Error(`Cannot extract "${filename}": ${format} is not yet supported; decompress the file first with bzip2/xz`);
139
+ }
140
+ return extractTar(buffer);
141
+ }
142
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../src/extract.ts"],"names":[],"mappings":"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"}