@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.
- package/README.md +578 -65
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +82 -15
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/lock.d.ts.map +1 -1
- package/dist/commands/lock.js +3 -2
- package/dist/commands/lock.js.map +1 -1
- package/dist/commands/log.d.ts.map +1 -1
- package/dist/commands/log.js +7 -5
- package/dist/commands/log.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +695 -32
- package/dist/commands/pull.js.map +1 -1
- package/dist/commands/reset.d.ts.map +1 -1
- package/dist/commands/reset.js +43 -11
- package/dist/commands/reset.js.map +1 -1
- package/dist/commands/revert.d.ts.map +1 -1
- package/dist/commands/revert.js +68 -14
- package/dist/commands/revert.js.map +1 -1
- package/dist/condition.d.ts.map +1 -1
- package/dist/condition.js +9 -6
- package/dist/condition.js.map +1 -1
- package/dist/config-writeback.d.ts.map +1 -1
- package/dist/config-writeback.js +33 -4
- package/dist/config-writeback.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +396 -10
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +25 -1
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +410 -28
- package/dist/diff.js.map +1 -1
- package/dist/extract.d.ts +4 -0
- package/dist/extract.d.ts.map +1 -0
- package/dist/extract.js +142 -0
- package/dist/extract.js.map +1 -0
- package/dist/filter.d.ts +3 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +126 -0
- package/dist/filter.js.map +1 -0
- package/dist/history.d.ts +7 -1
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +89 -9
- package/dist/history.js.map +1 -1
- package/dist/paths.d.ts +4 -0
- package/dist/paths.d.ts.map +1 -1
- package/dist/paths.js +97 -0
- package/dist/paths.js.map +1 -1
- package/dist/processors/ini.d.ts +33 -0
- package/dist/processors/ini.d.ts.map +1 -0
- package/dist/processors/ini.js +500 -0
- package/dist/processors/ini.js.map +1 -0
- package/dist/processors/insert.d.ts.map +1 -1
- package/dist/processors/insert.js +338 -15
- package/dist/processors/insert.js.map +1 -1
- package/dist/processors/on.d.ts +4 -0
- package/dist/processors/on.d.ts.map +1 -0
- package/dist/processors/on.js +54 -0
- package/dist/processors/on.js.map +1 -0
- package/dist/ref.d.ts +21 -0
- package/dist/ref.d.ts.map +1 -0
- package/dist/ref.js +65 -0
- package/dist/ref.js.map +1 -0
- package/dist/sources/bitbucket.d.ts.map +1 -1
- package/dist/sources/bitbucket.js +51 -12
- package/dist/sources/bitbucket.js.map +1 -1
- package/dist/sources/git.d.ts.map +1 -1
- package/dist/sources/git.js +54 -6
- package/dist/sources/git.js.map +1 -1
- package/dist/sources/github.d.ts +1 -0
- package/dist/sources/github.d.ts.map +1 -1
- package/dist/sources/github.js +287 -50
- package/dist/sources/github.js.map +1 -1
- package/dist/sources/gitlab.d.ts +1 -0
- package/dist/sources/gitlab.d.ts.map +1 -1
- package/dist/sources/gitlab.js +387 -28
- package/dist/sources/gitlab.js.map +1 -1
- package/dist/sources/index.d.ts +3 -1
- package/dist/sources/index.d.ts.map +1 -1
- package/dist/sources/index.js +206 -44
- package/dist/sources/index.js.map +1 -1
- package/dist/sources/local.d.ts +3 -0
- package/dist/sources/local.d.ts.map +1 -1
- package/dist/sources/local.js +44 -0
- package/dist/sources/local.js.map +1 -1
- package/dist/types.d.ts +71 -6
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/variables-remote.d.ts.map +1 -1
- package/dist/variables-remote.js +88 -7
- package/dist/variables-remote.js.map +1 -1
- package/dist/variables.d.ts +1 -0
- package/dist/variables.d.ts.map +1 -1
- package/dist/variables.js +133 -12
- package/dist/variables.js.map +1 -1
- package/dist/writer.d.ts +18 -0
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +968 -25
- package/dist/writer.js.map +1 -1
- 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
|
-
|
|
49
|
-
|
|
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 {
|
|
138
|
+
return {
|
|
139
|
+
targetPath,
|
|
140
|
+
isNew: false,
|
|
141
|
+
hasChanges: true,
|
|
142
|
+
contentChanged: true,
|
|
143
|
+
patch,
|
|
144
|
+
};
|
|
65
145
|
}
|
|
66
|
-
function computeDiff(targetPath, newContent) {
|
|
67
|
-
|
|
68
|
-
|
|
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
|
|
72
|
-
|
|
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
|
|
77
|
-
const
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"}
|
package/dist/extract.js
ADDED
|
@@ -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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"}
|