@udondan/avanti 0.22.0 → 0.23.1
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 +169 -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/log.d.ts.map +1 -1
- package/dist/commands/log.js +66 -40
- package/dist/commands/log.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/history.d.ts +1 -0
- package/dist/history.d.ts.map +1 -1
- package/dist/history.js +32 -0
- package/dist/history.js.map +1 -1
- package/dist/paths.d.ts +7 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +151 -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/variables.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"variables.d.ts","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAGlD,eAAO,MAAM,aAAa,aAAsB,CAAC;AAGjD,eAAO,MAAM,kBAAkB,aAW7B,CAAC;AAEH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,GAAG,YAAY,GAAG,IAAI,CAMtE;AAOD,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAmBlE;AAgBD,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,GAAG,MAAM,CAmB3E;AAGD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,CAa3D;AAGD,wBAAgB,aAAa,CAAC,GAAG,GAAE,IAAiB,GAAG,SAAS,CAc/D;AAYD,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA2B5D;AA6BD,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM,EAAE,GACpB,IAAI,CAkBN;AASD,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,SAAS,EACf,WAAW,EAAE,MAAM,EAAE,GACpB,MAAM,CAmCR"}
|
package/dist/variables.js
CHANGED
|
@@ -1,13 +1,65 @@
|
|
|
1
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
|
+
})();
|
|
2
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
36
|
exports.RESERVED_VAR_NAMES = exports.RESERVED_VARS = void 0;
|
|
4
37
|
exports.validateVariables = validateVariables;
|
|
5
38
|
exports.resolveVars = resolveVars;
|
|
6
39
|
exports.resolveVarsShellSafe = resolveVarsShellSafe;
|
|
40
|
+
exports.buildFileVars = buildFileVars;
|
|
41
|
+
exports.buildDateVars = buildDateVars;
|
|
42
|
+
exports.resolveBackupCounter = resolveBackupCounter;
|
|
43
|
+
exports.assertBackupPathAllowed = assertBackupPathAllowed;
|
|
44
|
+
exports.resolveBackupPath = resolveBackupPath;
|
|
45
|
+
const fs = __importStar(require("fs"));
|
|
46
|
+
const os = __importStar(require("os"));
|
|
47
|
+
const path = __importStar(require("path"));
|
|
7
48
|
// $latest is a special sentinel used by the GitLab source to resolve the newest tag.
|
|
8
49
|
exports.RESERVED_VARS = new Set(['latest']);
|
|
9
50
|
// Names users cannot define as variables (passthrough-reserved + system-injected).
|
|
10
|
-
exports.RESERVED_VAR_NAMES = new Set([
|
|
51
|
+
exports.RESERVED_VAR_NAMES = new Set([
|
|
52
|
+
...exports.RESERVED_VARS,
|
|
53
|
+
'self',
|
|
54
|
+
'path',
|
|
55
|
+
'filename',
|
|
56
|
+
'basename',
|
|
57
|
+
'ext',
|
|
58
|
+
'dirname',
|
|
59
|
+
'basedir',
|
|
60
|
+
'date',
|
|
61
|
+
'datetime',
|
|
62
|
+
]);
|
|
11
63
|
function validateVariables(vars) {
|
|
12
64
|
for (const name of Object.keys(vars)) {
|
|
13
65
|
if (exports.RESERVED_VAR_NAMES.has(name)) {
|
|
@@ -70,4 +122,137 @@ function resolveVarsShellSafe(value, vars) {
|
|
|
70
122
|
return shellQuote(vars[varName]);
|
|
71
123
|
});
|
|
72
124
|
}
|
|
125
|
+
// Build the per-file path variables for a resolved absolute target path.
|
|
126
|
+
function buildFileVars(targetPath) {
|
|
127
|
+
const filename = path.basename(targetPath);
|
|
128
|
+
const ext = path.extname(targetPath).replace(/^\./, '');
|
|
129
|
+
const basename = ext ? filename.slice(0, -(ext.length + 1)) : filename;
|
|
130
|
+
const dirname = path.dirname(targetPath);
|
|
131
|
+
return Object.assign(Object.create(null), {
|
|
132
|
+
path: targetPath,
|
|
133
|
+
filename,
|
|
134
|
+
basename,
|
|
135
|
+
ext,
|
|
136
|
+
dirname,
|
|
137
|
+
basedir: path.basename(dirname),
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
// Build date/datetime variables from a given Date (defaults to now).
|
|
141
|
+
function buildDateVars(now = new Date()) {
|
|
142
|
+
const pad = (n, w = 2) => String(n).padStart(w, '0');
|
|
143
|
+
const date = [
|
|
144
|
+
now.getFullYear(),
|
|
145
|
+
pad(now.getMonth() + 1),
|
|
146
|
+
pad(now.getDate()),
|
|
147
|
+
].join('-');
|
|
148
|
+
const datetime = [
|
|
149
|
+
date,
|
|
150
|
+
pad(now.getHours()),
|
|
151
|
+
pad(now.getMinutes()),
|
|
152
|
+
pad(now.getSeconds()),
|
|
153
|
+
].join('-');
|
|
154
|
+
return Object.assign(Object.create(null), { date, datetime });
|
|
155
|
+
}
|
|
156
|
+
// Counter token pattern: one or more 'd' characters preceded by '%'.
|
|
157
|
+
// Width is validated separately (max 3) to give a clear error on oversized tokens.
|
|
158
|
+
const COUNTER_TOKEN = /%d+/g;
|
|
159
|
+
const MAX_COUNTER_WIDTH = 3;
|
|
160
|
+
// Resolve the auto-increment counter in a backup path pattern.
|
|
161
|
+
// The pattern must contain at most one %d/%dd/%ddd token. Width > 3 is
|
|
162
|
+
// rejected to prevent unbounded filesystem scanning. Scans from slot 1
|
|
163
|
+
// upward to find the lowest path that does not yet exist on disk.
|
|
164
|
+
// Throws if all slots are taken or if the token width exceeds the maximum.
|
|
165
|
+
function resolveBackupCounter(pattern) {
|
|
166
|
+
const tokens = [...pattern.matchAll(COUNTER_TOKEN)];
|
|
167
|
+
if (tokens.length === 0)
|
|
168
|
+
return pattern;
|
|
169
|
+
if (tokens.length > 1) {
|
|
170
|
+
throw new Error(`backup path may contain at most one counter token (%d+), found ${tokens.length}: "${pattern}"`);
|
|
171
|
+
}
|
|
172
|
+
const token = tokens[0][0];
|
|
173
|
+
const width = token.length - 1; // number of 'd' characters
|
|
174
|
+
if (width > MAX_COUNTER_WIDTH) {
|
|
175
|
+
throw new Error(`backup counter width ${width} exceeds maximum ${MAX_COUNTER_WIDTH} — use %d, %dd, or %ddd`);
|
|
176
|
+
}
|
|
177
|
+
const max = Math.pow(10, width) - 1;
|
|
178
|
+
for (let i = 1; i <= max; i++) {
|
|
179
|
+
const padded = String(i).padStart(width, '0');
|
|
180
|
+
const candidate = pattern.replace(token, padded);
|
|
181
|
+
if (!fs.lstatSync(candidate, { throwIfNoEntry: false }))
|
|
182
|
+
return candidate;
|
|
183
|
+
}
|
|
184
|
+
throw new Error(`backup path counter exhausted: all slots ${'1'.padStart(width, '0')}–${String(max).padStart(width, '0')} are taken for "${pattern}"`);
|
|
185
|
+
}
|
|
186
|
+
// Expand a backup root entry: resolve ~/ and canonicalize the path.
|
|
187
|
+
// Relative paths are rejected — they would resolve against process.cwd(),
|
|
188
|
+
// not workingDir, making the security boundary invocation-dependent.
|
|
189
|
+
function expandRoot(root) {
|
|
190
|
+
if (root.startsWith('~/')) {
|
|
191
|
+
return path.resolve(os.homedir(), root.slice(2));
|
|
192
|
+
}
|
|
193
|
+
if (!path.isAbsolute(root)) {
|
|
194
|
+
throw new Error(`backup_roots entry "${root}" is a relative path. Use an absolute path or ~/`);
|
|
195
|
+
}
|
|
196
|
+
return path.resolve(root);
|
|
197
|
+
}
|
|
198
|
+
// Normalize a path for containment checks: on Windows paths are
|
|
199
|
+
// case-insensitive and may use either slash; fold both to canonical form.
|
|
200
|
+
function normalizePath(p) {
|
|
201
|
+
if (process.platform === 'win32') {
|
|
202
|
+
return p.replace(/\//g, '\\').toLowerCase();
|
|
203
|
+
}
|
|
204
|
+
return p;
|
|
205
|
+
}
|
|
206
|
+
// Assert that a resolved backup path is allowed given the security model:
|
|
207
|
+
// - Paths within workingDir are always allowed.
|
|
208
|
+
// - All other paths must fall under a declared backup_roots entry.
|
|
209
|
+
function assertBackupPathAllowed(backupPath, workingDir, backupRoots) {
|
|
210
|
+
const bp = normalizePath(backupPath);
|
|
211
|
+
const wd = normalizePath(workingDir);
|
|
212
|
+
const wdPrefix = wd.endsWith(path.sep) ? wd : wd + path.sep;
|
|
213
|
+
if (bp === wd || bp.startsWith(wdPrefix))
|
|
214
|
+
return;
|
|
215
|
+
for (const root of backupRoots) {
|
|
216
|
+
const expanded = normalizePath(expandRoot(root));
|
|
217
|
+
const rootPrefix = expanded.endsWith(path.sep)
|
|
218
|
+
? expanded
|
|
219
|
+
: expanded + path.sep;
|
|
220
|
+
if (bp === expanded || bp.startsWith(rootPrefix))
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
throw new Error(`backup path "${backupPath}" is outside the working directory. ` +
|
|
224
|
+
`Add a backup_roots entry to allow it.`);
|
|
225
|
+
}
|
|
226
|
+
// Resolve a backup path pattern for a given target file.
|
|
227
|
+
// Resolution order:
|
|
228
|
+
// 1. Substitute $ variables (including per-file vars derived from targetPath).
|
|
229
|
+
// 2. Expand ~/ prefix.
|
|
230
|
+
// 3. Resolve relative paths against workingDir.
|
|
231
|
+
// 4. Assert the path is allowed.
|
|
232
|
+
// 5. Resolve %d+ counter (filesystem scan).
|
|
233
|
+
function resolveBackupPath(pattern, targetPath, workingDir, vars, backupRoots) {
|
|
234
|
+
const fileVars = buildFileVars(targetPath);
|
|
235
|
+
const merged = Object.assign(Object.create(null), vars, fileVars);
|
|
236
|
+
let resolved = resolveVars(pattern, merged);
|
|
237
|
+
if (resolved.startsWith('~/')) {
|
|
238
|
+
resolved = path.resolve(os.homedir(), resolved.slice(2));
|
|
239
|
+
}
|
|
240
|
+
else if (!path.isAbsolute(resolved)) {
|
|
241
|
+
resolved = path.resolve(workingDir, resolved);
|
|
242
|
+
}
|
|
243
|
+
else {
|
|
244
|
+
// Already absolute — canonicalize to remove any .. components so that
|
|
245
|
+
// paths like /workdir/../etc/passwd don't bypass assertBackupPathAllowed.
|
|
246
|
+
resolved = path.resolve(resolved);
|
|
247
|
+
}
|
|
248
|
+
if (normalizePath(resolved) === normalizePath(path.resolve(targetPath))) {
|
|
249
|
+
throw new Error(`backup path resolves to the target file itself: "${resolved}"`);
|
|
250
|
+
}
|
|
251
|
+
assertBackupPathAllowed(resolved, workingDir, backupRoots);
|
|
252
|
+
const finalPath = resolveBackupCounter(resolved);
|
|
253
|
+
if (fs.lstatSync(finalPath, { throwIfNoEntry: false })?.isDirectory()) {
|
|
254
|
+
throw new Error(`backup path "${finalPath}" is a directory — specify a file path`);
|
|
255
|
+
}
|
|
256
|
+
return finalPath;
|
|
257
|
+
}
|
|
73
258
|
//# sourceMappingURL=variables.js.map
|
package/dist/variables.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"variables.js","sourceRoot":"","sources":["../src/variables.ts"],"names":[],"mappings":"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"}
|
package/dist/writer.d.ts
CHANGED
package/dist/writer.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../src/writer.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAgB,WAAW,CACzB,OAAO,EAAE,WAAW,EAAE,EACtB,SAAS,GAAE,MAAM,EAAO,GACvB,IAAI,CA2GN"}
|
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.1",
|
|
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"
|