@udondan/avanti 0.22.0 → 0.23.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 +168 -12
- package/dist/commands/diff.d.ts.map +1 -1
- package/dist/commands/diff.js +21 -12
- package/dist/commands/diff.js.map +1 -1
- package/dist/commands/lock.d.ts.map +1 -1
- package/dist/commands/lock.js +8 -4
- package/dist/commands/lock.js.map +1 -1
- package/dist/commands/pull.d.ts.map +1 -1
- package/dist/commands/pull.js +38 -16
- package/dist/commands/pull.js.map +1 -1
- package/dist/condition.js +2 -2
- package/dist/condition.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +41 -5
- package/dist/config.js.map +1 -1
- package/dist/diff.d.ts +0 -4
- package/dist/diff.d.ts.map +1 -1
- package/dist/diff.js +0 -51
- package/dist/diff.js.map +1 -1
- package/dist/paths.d.ts +7 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +141 -0
- package/dist/paths.js.map +1 -0
- package/dist/sources/index.js +2 -2
- package/dist/sources/index.js.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/variables.d.ts +5 -0
- package/dist/variables.d.ts.map +1 -1
- package/dist/variables.js +186 -1
- package/dist/variables.js.map +1 -1
- package/dist/writer.d.ts +1 -0
- package/dist/writer.d.ts.map +1 -1
- package/dist/writer.js +42 -1
- package/dist/writer.js.map +1 -1
- package/package.json +2 -2
package/dist/writer.js
CHANGED
|
@@ -34,13 +34,18 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.atomicWrite = atomicWrite;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
37
38
|
const fs = __importStar(require("fs"));
|
|
38
39
|
const path = __importStar(require("path"));
|
|
39
40
|
function atomicWrite(targets, deletions = []) {
|
|
40
41
|
// Stage each file as a sibling temp file on the same filesystem as the
|
|
41
42
|
// destination so that renameSync (rename(2)) is atomic on POSIX.
|
|
42
43
|
const staged = [];
|
|
44
|
+
const backupTemps = [];
|
|
43
45
|
try {
|
|
46
|
+
// Phase 1: write all temp files. No backups yet — if any write fails we
|
|
47
|
+
// don't want orphaned backup files for targets whose destinations haven't
|
|
48
|
+
// changed yet.
|
|
44
49
|
for (const t of targets) {
|
|
45
50
|
const dir = path.dirname(t.targetPath);
|
|
46
51
|
if (!fs.existsSync(dir)) {
|
|
@@ -66,7 +71,35 @@ function atomicWrite(targets, deletions = []) {
|
|
|
66
71
|
}
|
|
67
72
|
staged.push({ tmp: tmpFile, dest: t.targetPath, effectiveMode });
|
|
68
73
|
}
|
|
69
|
-
//
|
|
74
|
+
// Phase 2: all staging succeeded — now create backups.
|
|
75
|
+
// Phase 2a: copy each source file to a uniquely-named temp in the backup
|
|
76
|
+
// dir. If any copy fails, no backup destination has been touched yet.
|
|
77
|
+
const backupRenames = [];
|
|
78
|
+
for (const t of targets) {
|
|
79
|
+
if (t.backupPath &&
|
|
80
|
+
fs.lstatSync(t.targetPath, { throwIfNoEntry: false })?.isFile()) {
|
|
81
|
+
const backupDir = path.dirname(t.backupPath);
|
|
82
|
+
if (!fs.existsSync(backupDir)) {
|
|
83
|
+
fs.mkdirSync(backupDir, { recursive: true });
|
|
84
|
+
}
|
|
85
|
+
// Copy via a uniquely-named temp file then rename so that:
|
|
86
|
+
// (a) a symlink at backupPath is replaced, not followed, and
|
|
87
|
+
// (b) a predictable temp path cannot be pre-created as a symlink.
|
|
88
|
+
const backupTmp = path.join(backupDir, '.' +
|
|
89
|
+
path.basename(t.backupPath) +
|
|
90
|
+
'.' +
|
|
91
|
+
crypto.randomBytes(8).toString('hex') +
|
|
92
|
+
'.avanti-tmp');
|
|
93
|
+
backupTemps.push(backupTmp);
|
|
94
|
+
fs.copyFileSync(t.targetPath, backupTmp);
|
|
95
|
+
backupRenames.push({ tmp: backupTmp, dest: t.backupPath });
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Phase 2b: all copies succeeded — rename each backup temp into place.
|
|
99
|
+
for (const { tmp, dest } of backupRenames) {
|
|
100
|
+
fs.renameSync(tmp, dest);
|
|
101
|
+
}
|
|
102
|
+
// Phase 3: atomically rename each temp file into place
|
|
70
103
|
for (const s of staged) {
|
|
71
104
|
fs.renameSync(s.tmp, s.dest);
|
|
72
105
|
if (s.effectiveMode !== undefined) {
|
|
@@ -75,6 +108,14 @@ function atomicWrite(targets, deletions = []) {
|
|
|
75
108
|
}
|
|
76
109
|
}
|
|
77
110
|
finally {
|
|
111
|
+
for (const tmp of backupTemps) {
|
|
112
|
+
try {
|
|
113
|
+
fs.rmSync(tmp, { force: true });
|
|
114
|
+
}
|
|
115
|
+
catch {
|
|
116
|
+
// already renamed into place or never created
|
|
117
|
+
}
|
|
118
|
+
}
|
|
78
119
|
for (const s of staged) {
|
|
79
120
|
try {
|
|
80
121
|
fs.rmSync(s.tmp, { force: true });
|
package/dist/writer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@udondan/avanti",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.23.0",
|
|
4
4
|
"description": "Assemble local files from any source via a declarative YAML spec",
|
|
5
5
|
"bin": {
|
|
6
6
|
"avanti": "dist/cli.js"
|
|
@@ -69,7 +69,7 @@
|
|
|
69
69
|
"eslint": "10.4.0",
|
|
70
70
|
"eslint-config-prettier": "10.1.8",
|
|
71
71
|
"prettier": "3.8.3",
|
|
72
|
-
"tsx": "4.22.
|
|
72
|
+
"tsx": "4.22.1",
|
|
73
73
|
"typescript": "6.0.3",
|
|
74
74
|
"typescript-eslint": "8.59.3",
|
|
75
75
|
"vitest": "4.1.6"
|