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.
@@ -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
- await writeFile(configPath, JSON.stringify(config, null, 2), 'utf-8');
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 existing = await readConfig(projectRoot);
110
- const merged = { ...existing, ...updates };
111
- await writeConfig(projectRoot, merged);
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
- return JSON.parse(content);
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(statusPath, JSON.stringify(status, null, 2), 'utf-8');
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
- // Read existing logs
249
- const logs = await readWatchLogs(projectRoot);
250
- const maxEntries = logs.maxEntries || 100;
251
- // Add new entry at the beginning (most recent first)
252
- logs.entries.unshift(entry);
253
- // Trim to max entries
254
- if (logs.entries.length > maxEntries) {
255
- logs.entries = logs.entries.slice(0, maxEntries);
256
- }
257
- // Write back to disk
258
- await writeFile(logsPath, JSON.stringify(logs, null, 2), 'utf-8');
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(reportPath, JSON.stringify(status, null, 2), 'utf-8');
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,
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"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"}
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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"}
@@ -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
  /**
@@ -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;;GAEG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,MAAM,EAClB,UAAU,GAAE,MAAmB,GAC9B,OAAO,CAAC,MAAM,EAAE,CAAC,CA2DnB;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"}
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"}