logicstamp-context 0.5.4 → 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.
- package/README.md +8 -11
- package/dist/cli/commands/context/incrementalWatch.d.ts.map +1 -1
- package/dist/cli/commands/context/incrementalWatch.js +25 -2
- package/dist/cli/commands/context/incrementalWatch.js.map +1 -1
- package/dist/cli/commands/context/watchMode.d.ts.map +1 -1
- package/dist/cli/commands/context/watchMode.js +72 -57
- package/dist/cli/commands/context/watchMode.js.map +1 -1
- package/dist/cli/handlers/compareHandler.js +16 -16
- package/dist/cli/handlers/compareHandler.js.map +1 -1
- package/dist/core/pack/loader.d.ts.map +1 -1
- package/dist/core/pack/loader.js +89 -4
- package/dist/core/pack/loader.js.map +1 -1
- package/dist/utils/cleanup.d.ts +17 -0
- package/dist/utils/cleanup.d.ts.map +1 -1
- package/dist/utils/cleanup.js +76 -4
- package/dist/utils/cleanup.js.map +1 -1
- package/dist/utils/config.d.ts +16 -4
- package/dist/utils/config.d.ts.map +1 -1
- package/dist/utils/config.js +138 -23
- package/dist/utils/config.js.map +1 -1
- package/dist/utils/fileLock.d.ts +56 -0
- package/dist/utils/fileLock.d.ts.map +1 -0
- package/dist/utils/fileLock.js +189 -0
- package/dist/utils/fileLock.js.map +1 -0
- package/dist/utils/fsx.d.ts +6 -0
- package/dist/utils/fsx.d.ts.map +1 -1
- package/dist/utils/fsx.js +58 -38
- package/dist/utils/fsx.js.map +1 -1
- package/dist/utils/schemaValidator.d.ts +24 -0
- package/dist/utils/schemaValidator.d.ts.map +1 -0
- package/dist/utils/schemaValidator.js +137 -0
- package/dist/utils/schemaValidator.js.map +1 -0
- package/package.json +6 -5
package/dist/utils/config.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Utilities for managing LogicStamp configuration
|
|
3
3
|
*/
|
|
4
|
-
import { readFile, writeFile, mkdir, access } from 'node:fs/promises';
|
|
4
|
+
import { readFile, writeFile, mkdir, access, rename, unlink } from 'node:fs/promises';
|
|
5
5
|
import { join } from 'node:path';
|
|
6
|
+
import { randomUUID } from 'node:crypto';
|
|
6
7
|
import { debugError } from './debug.js';
|
|
8
|
+
import { withLock } from './fileLock.js';
|
|
7
9
|
/**
|
|
8
10
|
* Ensure config directory exists with consistent error handling
|
|
9
11
|
* @param configDir - Directory path to create
|
|
@@ -82,16 +84,28 @@ export async function readConfig(projectRoot) {
|
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
/**
|
|
85
|
-
* Write config to disk
|
|
87
|
+
* Write config to disk using atomic write (temp file + rename)
|
|
88
|
+
* This prevents corruption if the process crashes mid-write
|
|
86
89
|
*/
|
|
87
90
|
export async function writeConfig(projectRoot, config) {
|
|
88
91
|
const configDir = getConfigDir(projectRoot);
|
|
89
92
|
const configPath = getConfigPath(projectRoot);
|
|
93
|
+
const tempPath = `${configPath}.${randomUUID()}.tmp`;
|
|
90
94
|
await ensureConfigDir(configDir, 'writeConfig');
|
|
91
95
|
try {
|
|
92
|
-
|
|
96
|
+
// Write to temp file first
|
|
97
|
+
await writeFile(tempPath, JSON.stringify(config, null, 2), 'utf-8');
|
|
98
|
+
// Atomic rename (prevents partial writes on crash)
|
|
99
|
+
await rename(tempPath, configPath);
|
|
93
100
|
}
|
|
94
101
|
catch (error) {
|
|
102
|
+
// Clean up temp file if it exists
|
|
103
|
+
try {
|
|
104
|
+
await unlink(tempPath);
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
// Ignore cleanup errors
|
|
108
|
+
}
|
|
95
109
|
const err = error;
|
|
96
110
|
debugError('config', 'writeConfig', {
|
|
97
111
|
configPath,
|
|
@@ -104,11 +118,18 @@ export async function writeConfig(projectRoot, config) {
|
|
|
104
118
|
}
|
|
105
119
|
/**
|
|
106
120
|
* Update config with new values (merges with existing)
|
|
121
|
+
* Uses file locking to prevent race conditions when multiple processes update config
|
|
107
122
|
*/
|
|
108
123
|
export async function updateConfig(projectRoot, updates) {
|
|
109
|
-
const
|
|
110
|
-
const
|
|
111
|
-
|
|
124
|
+
const configDir = getConfigDir(projectRoot);
|
|
125
|
+
const configPath = getConfigPath(projectRoot);
|
|
126
|
+
// Ensure directory exists before acquiring lock (lock file needs parent directory)
|
|
127
|
+
await ensureConfigDir(configDir, 'updateConfig');
|
|
128
|
+
await withLock(configPath, async () => {
|
|
129
|
+
const existing = await readConfig(projectRoot);
|
|
130
|
+
const merged = { ...existing, ...updates };
|
|
131
|
+
await writeConfig(projectRoot, merged);
|
|
132
|
+
});
|
|
112
133
|
}
|
|
113
134
|
/**
|
|
114
135
|
* Get the watch status file path for a project
|
|
@@ -145,29 +166,52 @@ export async function isWatchModeActive(projectRoot) {
|
|
|
145
166
|
}
|
|
146
167
|
}
|
|
147
168
|
/**
|
|
148
|
-
* Read watch status from disk
|
|
169
|
+
* Read watch status from disk.
|
|
170
|
+
* Always validates that the PID is still running - if not, cleans up the stale file.
|
|
171
|
+
* This handles Windows where signal handlers may not fire on process exit.
|
|
149
172
|
*/
|
|
150
173
|
export async function readWatchStatus(projectRoot) {
|
|
151
174
|
try {
|
|
152
175
|
const statusPath = getWatchStatusPath(projectRoot);
|
|
153
176
|
const content = await readFile(statusPath, 'utf-8');
|
|
154
|
-
|
|
177
|
+
const status = JSON.parse(content);
|
|
178
|
+
// Validate PID is still running
|
|
179
|
+
if (status.pid) {
|
|
180
|
+
try {
|
|
181
|
+
// signal 0 checks if process exists without sending a signal
|
|
182
|
+
process.kill(status.pid, 0);
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Process doesn't exist - clean up stale file and return null
|
|
186
|
+
await deleteWatchStatus(projectRoot);
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return status;
|
|
155
191
|
}
|
|
156
192
|
catch {
|
|
157
193
|
return null;
|
|
158
194
|
}
|
|
159
195
|
}
|
|
160
196
|
/**
|
|
161
|
-
* Write watch status to disk
|
|
197
|
+
* Write watch status to disk using atomic write (temp file + rename)
|
|
162
198
|
*/
|
|
163
199
|
export async function writeWatchStatus(projectRoot, status) {
|
|
164
200
|
const configDir = getConfigDir(projectRoot);
|
|
165
201
|
const statusPath = getWatchStatusPath(projectRoot);
|
|
202
|
+
const tempPath = `${statusPath}.${randomUUID()}.tmp`;
|
|
166
203
|
await ensureConfigDir(configDir, 'writeWatchStatus');
|
|
167
204
|
try {
|
|
168
|
-
await writeFile(
|
|
205
|
+
await writeFile(tempPath, JSON.stringify(status, null, 2), 'utf-8');
|
|
206
|
+
await rename(tempPath, statusPath);
|
|
169
207
|
}
|
|
170
208
|
catch (error) {
|
|
209
|
+
try {
|
|
210
|
+
await unlink(tempPath);
|
|
211
|
+
}
|
|
212
|
+
catch {
|
|
213
|
+
// Ignore cleanup errors
|
|
214
|
+
}
|
|
171
215
|
const err = error;
|
|
172
216
|
debugError('config', 'writeWatchStatus', {
|
|
173
217
|
statusPath,
|
|
@@ -236,28 +280,40 @@ async function ensureConfigDirSilent(configDir, context) {
|
|
|
236
280
|
}
|
|
237
281
|
/**
|
|
238
282
|
* Append a log entry to watch logs
|
|
283
|
+
* Uses file locking to prevent race conditions when multiple processes append logs
|
|
284
|
+
* Uses atomic write (temp file + rename) to prevent corruption on crash
|
|
239
285
|
*/
|
|
240
286
|
export async function appendWatchLog(projectRoot, entry) {
|
|
241
287
|
const configDir = getConfigDir(projectRoot);
|
|
242
288
|
const logsPath = getWatchLogsPath(projectRoot);
|
|
289
|
+
const tempPath = `${logsPath}.${randomUUID()}.tmp`;
|
|
243
290
|
// Non-fatal - continue even if directory can't be created
|
|
244
291
|
if (!await ensureConfigDirSilent(configDir, 'appendWatchLog')) {
|
|
245
292
|
return;
|
|
246
293
|
}
|
|
247
294
|
try {
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
295
|
+
await withLock(logsPath, async () => {
|
|
296
|
+
// Read existing logs
|
|
297
|
+
const logs = await readWatchLogs(projectRoot);
|
|
298
|
+
const maxEntries = logs.maxEntries || 100;
|
|
299
|
+
// Add new entry at the beginning (most recent first)
|
|
300
|
+
logs.entries.unshift(entry);
|
|
301
|
+
// Trim to max entries
|
|
302
|
+
if (logs.entries.length > maxEntries) {
|
|
303
|
+
logs.entries = logs.entries.slice(0, maxEntries);
|
|
304
|
+
}
|
|
305
|
+
// Atomic write: temp file + rename
|
|
306
|
+
await writeFile(tempPath, JSON.stringify(logs, null, 2), 'utf-8');
|
|
307
|
+
await rename(tempPath, logsPath);
|
|
308
|
+
});
|
|
259
309
|
}
|
|
260
310
|
catch (error) {
|
|
311
|
+
try {
|
|
312
|
+
await unlink(tempPath);
|
|
313
|
+
}
|
|
314
|
+
catch {
|
|
315
|
+
// Ignore cleanup errors
|
|
316
|
+
}
|
|
261
317
|
const err = error;
|
|
262
318
|
debugError('config', 'appendWatchLog', {
|
|
263
319
|
logsPath,
|
|
@@ -281,6 +337,57 @@ export async function clearWatchLogs(projectRoot) {
|
|
|
281
337
|
// File doesn't exist or can't be deleted - ignore
|
|
282
338
|
}
|
|
283
339
|
}
|
|
340
|
+
/**
|
|
341
|
+
* Write the current state diff to watch logs (overwrites, not appends)
|
|
342
|
+
* This gives "git diff" semantics - shows current state relative to baseline
|
|
343
|
+
* If there are no changes, the log file is cleared
|
|
344
|
+
*/
|
|
345
|
+
export async function writeWatchState(projectRoot, entry) {
|
|
346
|
+
const configDir = getConfigDir(projectRoot);
|
|
347
|
+
const logsPath = getWatchLogsPath(projectRoot);
|
|
348
|
+
const tempPath = `${logsPath}.${randomUUID()}.tmp`;
|
|
349
|
+
// Non-fatal - continue even if directory can't be created
|
|
350
|
+
if (!await ensureConfigDirSilent(configDir, 'writeWatchState')) {
|
|
351
|
+
return;
|
|
352
|
+
}
|
|
353
|
+
try {
|
|
354
|
+
await withLock(logsPath, async () => {
|
|
355
|
+
if (!entry) {
|
|
356
|
+
// No changes from baseline - clear the log
|
|
357
|
+
try {
|
|
358
|
+
await unlink(logsPath);
|
|
359
|
+
}
|
|
360
|
+
catch {
|
|
361
|
+
// File doesn't exist - ignore
|
|
362
|
+
}
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
// Write single entry representing current state diff
|
|
366
|
+
const logs = {
|
|
367
|
+
entries: [entry],
|
|
368
|
+
};
|
|
369
|
+
// Atomic write: temp file + rename
|
|
370
|
+
await writeFile(tempPath, JSON.stringify(logs, null, 2), 'utf-8');
|
|
371
|
+
await rename(tempPath, logsPath);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
374
|
+
catch (error) {
|
|
375
|
+
try {
|
|
376
|
+
await unlink(tempPath);
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
// Ignore cleanup errors
|
|
380
|
+
}
|
|
381
|
+
const err = error;
|
|
382
|
+
debugError('config', 'writeWatchState', {
|
|
383
|
+
logsPath,
|
|
384
|
+
operation: 'writeFile',
|
|
385
|
+
message: err.message,
|
|
386
|
+
code: err.code,
|
|
387
|
+
});
|
|
388
|
+
// Non-fatal - continue even if log can't be written
|
|
389
|
+
}
|
|
390
|
+
}
|
|
284
391
|
/**
|
|
285
392
|
* Get the strict watch violations report file path
|
|
286
393
|
*/
|
|
@@ -301,19 +408,27 @@ export async function readStrictWatchStatus(projectRoot) {
|
|
|
301
408
|
}
|
|
302
409
|
}
|
|
303
410
|
/**
|
|
304
|
-
* Write strict watch status to disk
|
|
411
|
+
* Write strict watch status to disk using atomic write (temp file + rename)
|
|
305
412
|
*/
|
|
306
413
|
export async function writeStrictWatchStatus(projectRoot, status) {
|
|
307
414
|
const configDir = getConfigDir(projectRoot);
|
|
308
415
|
const reportPath = getStrictWatchReportPath(projectRoot);
|
|
416
|
+
const tempPath = `${reportPath}.${randomUUID()}.tmp`;
|
|
309
417
|
// Non-fatal - continue even if directory can't be created
|
|
310
418
|
if (!await ensureConfigDirSilent(configDir, 'writeStrictWatchStatus')) {
|
|
311
419
|
return;
|
|
312
420
|
}
|
|
313
421
|
try {
|
|
314
|
-
await writeFile(
|
|
422
|
+
await writeFile(tempPath, JSON.stringify(status, null, 2), 'utf-8');
|
|
423
|
+
await rename(tempPath, reportPath);
|
|
315
424
|
}
|
|
316
425
|
catch (error) {
|
|
426
|
+
try {
|
|
427
|
+
await unlink(tempPath);
|
|
428
|
+
}
|
|
429
|
+
catch {
|
|
430
|
+
// Ignore cleanup errors
|
|
431
|
+
}
|
|
317
432
|
const err = error;
|
|
318
433
|
debugError('config', 'writeStrictWatchStatus', {
|
|
319
434
|
reportPath,
|
package/dist/utils/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAW,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAAC,SAAiB,EAAE,OAAe;IAC/D,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE;YAC5B,SAAS;YACT,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CACb,sCAAsC,SAAS,MAAM,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CACjH,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,gBAAgB,CAAC,GAA0B,EAAE,QAAgB,EAAE,QAAgB;IACtF,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,QAAQ;YACX,OAAO,oCAAoC,QAAQ,GAAG,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,kCAAkC,QAAQ,GAAG,CAAC;QACvD,KAAK,QAAQ;YACX,OAAO,2CAA2C,QAAQ,GAAG,CAAC;QAChE;YACE,OAAO,mBAAmB,QAAQ,KAAK,QAAQ,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IACvE,CAAC;AACH,CAAC;AASD;;GAEG;AACH,MAAM,UAAU,YAAY,CAAC,WAAmB;IAC9C,OAAO,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,WAAmB;IAC/C,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,aAAa,CAAC,CAAC;AACxD,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,aAAa,CAAC,WAAW,CAAC,CAAC,CAAC;QACzC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB,EAAE,MAAwB;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,aAAa,CAAC,WAAW,CAAC,CAAC;IAE9C,MAAM,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAEhD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,aAAa,EAAE;YAClC,UAAU;YACV,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,aAAa,CAAC,CAAC,CAAC;IACpE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,WAAmB,EAAE,OAAkC;IACxF,MAAM,QAAQ,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC/C,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAC3C,MAAM,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;AACzC,CAAC;AAkBD;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IACpD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,2BAA2B,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QAEzB,oCAAoC;QACpC,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,MAAM,MAAM,GAAgB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEhD,oCAAoC;QACpC,IAAI,CAAC;YACH,kDAAkD;YAClD,mDAAmD;YACnD,sEAAsE;YACtE,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,qDAAqD;YACrD,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;YACrC,OAAO,KAAK,CAAC;QACf,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,KAAK,IAAI,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,WAAmB;IACvD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAgB,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,WAAmB,EAAE,MAAmB;IAC7E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;IAEnD,MAAM,eAAe,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IAErD,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,kBAAkB,EAAE;YACvC,UAAU;YACV,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,mBAAmB,CAAC,CAAC,CAAC;IAC1E,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,WAAmB;IACzD,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,kBAAkB,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC;AAoDD;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAClD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,8BAA8B,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,WAAmB;IACrD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAc,CAAC;QAC9C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,0CAA0C;QAC1C,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;IAC1C,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,OAAe;IACrE,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,OAAO,EAAE;YAC5B,SAAS;YACT,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB,EAAE,KAAoB;IAC5E,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAE/C,0DAA0D;IAC1D,IAAI,CAAC,MAAM,qBAAqB,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE,CAAC;QAC9D,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,qBAAqB;QACrB,MAAM,IAAI,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,CAAC;QAC9C,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,IAAI,GAAG,CAAC;QAE1C,qDAAqD;QACrD,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAE5B,sBAAsB;QACtB,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,UAAU,EAAE,CAAC;YACrC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC;QACnD,CAAC;QAED,qBAAqB;QACrB,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACpE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,gBAAgB,EAAE;YACrC,QAAQ;YACR,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,oDAAoD;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAmB;IACtD,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;QAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC;AA8ED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,WAAmB;IAC1D,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,CAAC,EAAE,8BAA8B,CAAC,CAAC;AACzE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,WAAmB;IAC7D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAsB,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,WAAmB,EAAE,MAAyB;IACzF,MAAM,SAAS,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;IAC5C,MAAM,UAAU,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;IAEzD,0DAA0D;IAC1D,IAAI,CAAC,MAAM,qBAAqB,CAAC,SAAS,EAAE,wBAAwB,CAAC,EAAE,CAAC;QACtE,OAAO;IACT,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IACxE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,UAAU,CAAC,QAAQ,EAAE,wBAAwB,EAAE;YAC7C,UAAU;YACV,SAAS,EAAE,WAAW;YACtB,OAAO,EAAE,GAAG,CAAC,OAAO;YACpB,IAAI,EAAE,GAAG,CAAC,IAAI;SACf,CAAC,CAAC;QACH,uDAAuD;IACzD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,WAAmB;IAC/D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,wBAAwB,CAAC,WAAW,CAAC,CAAC;QACzD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;QACpD,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,kDAAkD;IACpD,CAAC;AACH,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight file locking utility for preventing TOCTOU race conditions
|
|
3
|
+
* Uses exclusive file creation with PID tracking for stale lock detection
|
|
4
|
+
*/
|
|
5
|
+
export interface LockOptions {
|
|
6
|
+
/** Maximum time to wait for lock acquisition in ms (default: 5000) */
|
|
7
|
+
timeout?: number;
|
|
8
|
+
/** Time between retry attempts in ms (default: 50) */
|
|
9
|
+
retryInterval?: number;
|
|
10
|
+
/** Maximum age of a lock file before considering it stale in ms (default: 30000) */
|
|
11
|
+
staleThreshold?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface LockRelease {
|
|
14
|
+
/** Release the lock */
|
|
15
|
+
release: () => Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Acquire an exclusive lock on a file
|
|
19
|
+
*
|
|
20
|
+
* @param filePath - Path to the file to lock (lock file will be filePath + '.lock')
|
|
21
|
+
* @param options - Lock options
|
|
22
|
+
* @returns Lock release function, or null if lock could not be acquired
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```typescript
|
|
26
|
+
* const lock = await acquireLock('/path/to/config.json');
|
|
27
|
+
* if (!lock) {
|
|
28
|
+
* throw new Error('Could not acquire lock');
|
|
29
|
+
* }
|
|
30
|
+
* try {
|
|
31
|
+
* // Do read-modify-write operations
|
|
32
|
+
* } finally {
|
|
33
|
+
* await lock.release();
|
|
34
|
+
* }
|
|
35
|
+
* ```
|
|
36
|
+
*/
|
|
37
|
+
export declare function acquireLock(filePath: string, options?: LockOptions): Promise<LockRelease | null>;
|
|
38
|
+
/**
|
|
39
|
+
* Execute a function while holding an exclusive lock
|
|
40
|
+
*
|
|
41
|
+
* @param filePath - Path to the file to lock
|
|
42
|
+
* @param fn - Function to execute while holding the lock
|
|
43
|
+
* @param options - Lock options
|
|
44
|
+
* @returns Result of the function, or throws if lock could not be acquired
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* ```typescript
|
|
48
|
+
* await withLock('/path/to/config.json', async () => {
|
|
49
|
+
* const config = await readConfig();
|
|
50
|
+
* config.value = 'new';
|
|
51
|
+
* await writeConfig(config);
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function withLock<T>(filePath: string, fn: () => Promise<T>, options?: LockOptions): Promise<T>;
|
|
56
|
+
//# sourceMappingURL=fileLock.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLock.d.ts","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,MAAM,WAAW,WAAW;IAC1B,sEAAsE;IACtE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,oFAAoF;IACpF,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,uBAAuB;IACvB,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B;AA8FD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,WAAW,CAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA2D7B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,QAAQ,CAAC,CAAC,EAC9B,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,WAAgB,GACxB,OAAO,CAAC,CAAC,CAAC,CAYZ"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight file locking utility for preventing TOCTOU race conditions
|
|
3
|
+
* Uses exclusive file creation with PID tracking for stale lock detection
|
|
4
|
+
*/
|
|
5
|
+
import { open, unlink, readFile } from 'node:fs/promises';
|
|
6
|
+
import { constants } from 'node:fs';
|
|
7
|
+
/**
|
|
8
|
+
* Check if a process is still running
|
|
9
|
+
* Returns: true = alive, false = dead, 'unknown' = can't determine (e.g., permission denied)
|
|
10
|
+
*/
|
|
11
|
+
function isProcessAlive(pid) {
|
|
12
|
+
// PIDs must be positive integers and within reasonable bounds
|
|
13
|
+
// Windows max PID is around 4 million, Unix typically higher but still bounded
|
|
14
|
+
if (!Number.isInteger(pid) || pid <= 0 || pid > 4194304) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
try {
|
|
18
|
+
// Signal 0 doesn't send a signal, just checks if process exists
|
|
19
|
+
process.kill(pid, 0);
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
catch (error) {
|
|
23
|
+
const err = error;
|
|
24
|
+
// ESRCH = no such process (definitely dead)
|
|
25
|
+
// EPERM = process exists but we don't have permission to signal it (still alive!)
|
|
26
|
+
if (err.code === 'EPERM') {
|
|
27
|
+
return 'unknown'; // Process exists but we can't signal it - don't assume stale
|
|
28
|
+
}
|
|
29
|
+
return false; // ESRCH or other error - process is dead
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Check if lock file is stale (process dead or too old)
|
|
34
|
+
*/
|
|
35
|
+
async function isLockStale(lockPath, staleThreshold) {
|
|
36
|
+
try {
|
|
37
|
+
const content = await readFile(lockPath, 'utf-8');
|
|
38
|
+
// If file is empty, another process just created it and is writing - not stale
|
|
39
|
+
if (!content.trim()) {
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
let lockData;
|
|
43
|
+
try {
|
|
44
|
+
lockData = JSON.parse(content);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
// Can't parse JSON - likely another process is mid-write, not stale
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
// Check if the process that created the lock is still alive
|
|
51
|
+
const alive = isProcessAlive(lockData.pid);
|
|
52
|
+
if (alive === 'unknown') {
|
|
53
|
+
// Can't determine if process is alive (permission denied) - be conservative, don't delete
|
|
54
|
+
// Only consider stale if lock is VERY old (5x threshold)
|
|
55
|
+
const age = Date.now() - lockData.timestamp;
|
|
56
|
+
return age > staleThreshold * 5;
|
|
57
|
+
}
|
|
58
|
+
if (alive === false) {
|
|
59
|
+
return true; // Process is definitely dead
|
|
60
|
+
}
|
|
61
|
+
// Process is alive - check if the lock is too old (safety net for hung processes)
|
|
62
|
+
const age = Date.now() - lockData.timestamp;
|
|
63
|
+
if (age > staleThreshold) {
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
const err = error;
|
|
70
|
+
// File doesn't exist - either never created or already removed
|
|
71
|
+
if (err.code === 'ENOENT') {
|
|
72
|
+
return true;
|
|
73
|
+
}
|
|
74
|
+
// Other read errors - be conservative, assume not stale
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Remove a stale lock file
|
|
80
|
+
*/
|
|
81
|
+
async function removeStale(lockPath) {
|
|
82
|
+
try {
|
|
83
|
+
await unlink(lockPath);
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Ignore errors - another process may have removed it
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Acquire an exclusive lock on a file
|
|
91
|
+
*
|
|
92
|
+
* @param filePath - Path to the file to lock (lock file will be filePath + '.lock')
|
|
93
|
+
* @param options - Lock options
|
|
94
|
+
* @returns Lock release function, or null if lock could not be acquired
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* ```typescript
|
|
98
|
+
* const lock = await acquireLock('/path/to/config.json');
|
|
99
|
+
* if (!lock) {
|
|
100
|
+
* throw new Error('Could not acquire lock');
|
|
101
|
+
* }
|
|
102
|
+
* try {
|
|
103
|
+
* // Do read-modify-write operations
|
|
104
|
+
* } finally {
|
|
105
|
+
* await lock.release();
|
|
106
|
+
* }
|
|
107
|
+
* ```
|
|
108
|
+
*/
|
|
109
|
+
export async function acquireLock(filePath, options = {}) {
|
|
110
|
+
const { timeout = 5000, retryInterval = 50, staleThreshold = 30000, } = options;
|
|
111
|
+
const lockPath = `${filePath}.lock`;
|
|
112
|
+
const startTime = Date.now();
|
|
113
|
+
let released = false;
|
|
114
|
+
const lockContent = {
|
|
115
|
+
pid: process.pid,
|
|
116
|
+
timestamp: Date.now(),
|
|
117
|
+
};
|
|
118
|
+
while (Date.now() - startTime < timeout) {
|
|
119
|
+
try {
|
|
120
|
+
// Try to create lock file exclusively (fails if exists)
|
|
121
|
+
const handle = await open(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY);
|
|
122
|
+
await handle.writeFile(JSON.stringify(lockContent));
|
|
123
|
+
await handle.close();
|
|
124
|
+
// Lock acquired
|
|
125
|
+
return {
|
|
126
|
+
release: async () => {
|
|
127
|
+
if (released)
|
|
128
|
+
return;
|
|
129
|
+
released = true;
|
|
130
|
+
try {
|
|
131
|
+
await unlink(lockPath);
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// Ignore errors during release
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
catch (error) {
|
|
140
|
+
const err = error;
|
|
141
|
+
if (err.code === 'EEXIST') {
|
|
142
|
+
// Lock file exists - check if it's stale
|
|
143
|
+
if (await isLockStale(lockPath, staleThreshold)) {
|
|
144
|
+
await removeStale(lockPath);
|
|
145
|
+
// Retry immediately after removing stale lock
|
|
146
|
+
continue;
|
|
147
|
+
}
|
|
148
|
+
// Lock is held by another active process - wait and retry
|
|
149
|
+
await new Promise(resolve => setTimeout(resolve, retryInterval));
|
|
150
|
+
continue;
|
|
151
|
+
}
|
|
152
|
+
// Other error (e.g., permission denied, directory doesn't exist)
|
|
153
|
+
// Don't retry for these errors
|
|
154
|
+
return null;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Timeout reached
|
|
158
|
+
return null;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Execute a function while holding an exclusive lock
|
|
162
|
+
*
|
|
163
|
+
* @param filePath - Path to the file to lock
|
|
164
|
+
* @param fn - Function to execute while holding the lock
|
|
165
|
+
* @param options - Lock options
|
|
166
|
+
* @returns Result of the function, or throws if lock could not be acquired
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* await withLock('/path/to/config.json', async () => {
|
|
171
|
+
* const config = await readConfig();
|
|
172
|
+
* config.value = 'new';
|
|
173
|
+
* await writeConfig(config);
|
|
174
|
+
* });
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
export async function withLock(filePath, fn, options = {}) {
|
|
178
|
+
const lock = await acquireLock(filePath, options);
|
|
179
|
+
if (!lock) {
|
|
180
|
+
throw new Error(`Could not acquire lock for "${filePath}" within timeout`);
|
|
181
|
+
}
|
|
182
|
+
try {
|
|
183
|
+
return await fn();
|
|
184
|
+
}
|
|
185
|
+
finally {
|
|
186
|
+
await lock.release();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=fileLock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/fsx.d.ts
CHANGED
|
@@ -28,6 +28,12 @@ export interface FileWithText {
|
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
30
|
* Find files matching glob patterns
|
|
31
|
+
*
|
|
32
|
+
* Resilient behavior:
|
|
33
|
+
* - Processes all patterns even if some fail
|
|
34
|
+
* - Returns partial results from successful patterns
|
|
35
|
+
* - Only throws if ALL patterns fail
|
|
36
|
+
* - Logs warnings for partial failures (via debugError)
|
|
31
37
|
*/
|
|
32
38
|
export declare function globFiles(searchPath: string, extensions?: string): Promise<string[]>;
|
|
33
39
|
/**
|
package/dist/utils/fsx.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fsx.d.ts","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED
|
|
1
|
+
{"version":3,"file":"fsx.d.ts","sourceRoot":"","sources":["../../src/utils/fsx.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAWH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAmB,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CA0EnB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAoC9E;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAkB5E;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAStE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAEhE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,CAEtD;AAED;;GAEG;AACH,wBAAsB,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAQ1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAKtD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAczE"}
|