logicstamp-context 0.7.1 → 0.8.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 +10 -1
- package/dist/cli/commands/clean.d.ts +2 -1
- package/dist/cli/commands/clean.d.ts.map +1 -1
- package/dist/cli/commands/clean.js +30 -2
- package/dist/cli/commands/clean.js.map +1 -1
- package/dist/cli/commands/compare/cleanup.d.ts +8 -0
- package/dist/cli/commands/compare/cleanup.d.ts.map +1 -0
- package/dist/cli/commands/compare/cleanup.js +27 -0
- package/dist/cli/commands/compare/cleanup.js.map +1 -0
- package/dist/cli/commands/compare/core.d.ts +29 -0
- package/dist/cli/commands/compare/core.d.ts.map +1 -0
- package/dist/cli/commands/compare/core.js +249 -0
- package/dist/cli/commands/compare/core.js.map +1 -0
- package/dist/cli/commands/compare/display.d.ts +9 -0
- package/dist/cli/commands/compare/display.d.ts.map +1 -0
- package/dist/cli/commands/compare/display.js +251 -0
- package/dist/cli/commands/compare/display.js.map +1 -0
- package/dist/cli/commands/compare/index.d.ts +26 -0
- package/dist/cli/commands/compare/index.d.ts.map +1 -0
- package/dist/cli/commands/compare/index.js +33 -0
- package/dist/cli/commands/compare/index.js.map +1 -0
- package/dist/cli/commands/compare/multiFile.d.ts +16 -0
- package/dist/cli/commands/compare/multiFile.d.ts.map +1 -0
- package/dist/cli/commands/compare/multiFile.js +113 -0
- package/dist/cli/commands/compare/multiFile.js.map +1 -0
- package/dist/cli/commands/compare/singleFile.d.ts +20 -0
- package/dist/cli/commands/compare/singleFile.d.ts.map +1 -0
- package/dist/cli/commands/compare/singleFile.js +341 -0
- package/dist/cli/commands/compare/singleFile.js.map +1 -0
- package/dist/cli/commands/{compare.d.ts → compare/types.d.ts} +21 -28
- package/dist/cli/commands/compare/types.d.ts.map +1 -0
- package/dist/cli/commands/compare/types.js +5 -0
- package/dist/cli/commands/compare/types.js.map +1 -0
- package/dist/cli/commands/compare/utils.d.ts +20 -0
- package/dist/cli/commands/compare/utils.d.ts.map +1 -0
- package/dist/cli/commands/compare/utils.js +94 -0
- package/dist/cli/commands/compare/utils.js.map +1 -0
- package/dist/cli/commands/context/watchMode/watchMode.d.ts.map +1 -1
- package/dist/cli/commands/context/watchMode/watchMode.js +2 -107
- package/dist/cli/commands/context/watchMode/watchMode.js.map +1 -1
- package/dist/cli/commands/context.d.ts +1 -0
- package/dist/cli/commands/context.d.ts.map +1 -1
- package/dist/cli/commands/context.js +3 -1
- package/dist/cli/commands/context.js.map +1 -1
- package/dist/cli/handlers/compareHandler.d.ts.map +1 -1
- package/dist/cli/handlers/compareHandler.js +297 -9
- package/dist/cli/handlers/compareHandler.js.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/parser/argumentParser.d.ts +2 -0
- package/dist/cli/parser/argumentParser.d.ts.map +1 -1
- package/dist/cli/parser/argumentParser.js +20 -2
- package/dist/cli/parser/argumentParser.js.map +1 -1
- package/dist/cli/parser/helpText.d.ts.map +1 -1
- package/dist/cli/parser/helpText.js +29 -0
- package/dist/cli/parser/helpText.js.map +1 -1
- package/dist/core/violations.d.ts +36 -0
- package/dist/core/violations.d.ts.map +1 -0
- package/dist/core/violations.js +292 -0
- package/dist/core/violations.js.map +1 -0
- package/dist/extractors/shared/propTypeNormalizer.d.ts.map +1 -1
- package/dist/extractors/shared/propTypeNormalizer.js +2 -1
- package/dist/extractors/shared/propTypeNormalizer.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/utils/fileLock.d.ts.map +1 -1
- package/dist/utils/fileLock.js +79 -5
- package/dist/utils/fileLock.js.map +1 -1
- package/dist/utils/git.d.ts +135 -0
- package/dist/utils/git.d.ts.map +1 -0
- package/dist/utils/git.js +429 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hash.d.ts.map +1 -1
- package/dist/utils/hash.js +20 -4
- package/dist/utils/hash.js.map +1 -1
- package/package.json +2 -1
- package/dist/cli/commands/compare.d.ts.map +0 -1
- package/dist/cli/commands/compare.js +0 -648
- package/dist/cli/commands/compare.js.map +0 -1
|
@@ -313,9 +313,12 @@ ARGUMENTS:
|
|
|
313
313
|
<new.json> Path to new context file or context_main.json
|
|
314
314
|
|
|
315
315
|
OPTIONS:
|
|
316
|
+
--baseline <ref> Compare against a git ref (e.g., git:main, git:HEAD, git:v1.0.0)
|
|
316
317
|
--approve Auto-approve updates (non-interactive, CI-safe)
|
|
317
318
|
--clean-orphaned Auto-delete orphaned files with --approve
|
|
318
319
|
--stats Show token count statistics per folder
|
|
320
|
+
--strict Detect breaking changes (removed props, events, functions)
|
|
321
|
+
and exit with code 1 if errors found
|
|
319
322
|
--skip-gitignore Skip .gitignore setup when compiling fresh context (auto-mode only)
|
|
320
323
|
--quiet Show only diffs (suppress summaries, PASS folders, and token analysis)
|
|
321
324
|
-h, --help Show this help
|
|
@@ -326,6 +329,12 @@ COMPARISON MODES:
|
|
|
326
329
|
→ Detects ADDED, ORPHANED, DRIFT, and PASS status per folder
|
|
327
330
|
→ Shows three-tier output: folder summary, component summary, details
|
|
328
331
|
|
|
332
|
+
Git Baseline Mode:
|
|
333
|
+
Compare current working tree against a git ref (branch, tag, commit)
|
|
334
|
+
→ Uses git worktree to checkout ref in isolation
|
|
335
|
+
→ Generates context for both versions and compares
|
|
336
|
+
→ Useful for PR reviews, CI validation, and release checks
|
|
337
|
+
|
|
329
338
|
Single-File Mode:
|
|
330
339
|
Compares two individual context.json files
|
|
331
340
|
→ Detects added/removed/changed components
|
|
@@ -362,6 +371,24 @@ EXAMPLES:
|
|
|
362
371
|
stamp context compare || exit 1
|
|
363
372
|
CI validation: fail build if drift detected
|
|
364
373
|
|
|
374
|
+
stamp context compare --baseline git:main
|
|
375
|
+
Compare current working tree against main branch
|
|
376
|
+
→ "What changed in this branch vs main?"
|
|
377
|
+
|
|
378
|
+
stamp context compare --baseline git:HEAD
|
|
379
|
+
Compare uncommitted changes against last commit
|
|
380
|
+
|
|
381
|
+
stamp context compare --baseline git:v1.0.0
|
|
382
|
+
Compare against a release tag
|
|
383
|
+
→ "What changed since last release?"
|
|
384
|
+
|
|
385
|
+
stamp context compare --strict
|
|
386
|
+
Detect breaking changes and fail if errors found
|
|
387
|
+
→ Exit code 1 if removed props, events, or functions detected
|
|
388
|
+
|
|
389
|
+
stamp context compare --baseline git:main --strict
|
|
390
|
+
Compare against main with breaking change detection
|
|
391
|
+
|
|
365
392
|
EXIT CODES:
|
|
366
393
|
0 PASS - No drift OR drift approved and updated
|
|
367
394
|
1 DRIFT - Changes detected but not approved
|
|
@@ -414,6 +441,8 @@ BEHAVIOR:
|
|
|
414
441
|
FILES REMOVED:
|
|
415
442
|
• context_main.json Main index file
|
|
416
443
|
• **/context.json All folder context files
|
|
444
|
+
• **/context.toon All folder TOON format bundles
|
|
445
|
+
• **/context_*.toon TOON format variants
|
|
417
446
|
• .logicstamp/ Cache directory (if present)
|
|
418
447
|
|
|
419
448
|
EXAMPLES:
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO
|
|
1
|
+
{"version":3,"file":"helpText.js","sourceRoot":"","sources":["../../../src/cli/parser/helpText.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6EN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkHN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY;IAC1B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiDN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB;IACjC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CN,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa;IAC3B,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCN,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Violation Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent breaking change detection across watch and compare commands.
|
|
5
|
+
* Uses adapters to normalize different input formats to a common internal representation.
|
|
6
|
+
*/
|
|
7
|
+
import type { Violation, ViolationsSummary } from '../utils/config.js';
|
|
8
|
+
import type { BundleChanges } from '../cli/commands/context/watchMode/watchDiff.js';
|
|
9
|
+
import type { CompareResult } from '../cli/commands/compare/types.js';
|
|
10
|
+
export type { Violation, ViolationsSummary } from '../utils/config.js';
|
|
11
|
+
/**
|
|
12
|
+
* Input types for violation detection
|
|
13
|
+
*/
|
|
14
|
+
export type ViolationDetectionInput = {
|
|
15
|
+
type: 'watch';
|
|
16
|
+
changes: BundleChanges;
|
|
17
|
+
} | {
|
|
18
|
+
type: 'compare';
|
|
19
|
+
result: CompareResult;
|
|
20
|
+
gitBaseline?: boolean;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Detect violations from either watch mode or compare mode input
|
|
24
|
+
*/
|
|
25
|
+
export declare function detectViolations(input: ViolationDetectionInput): Violation[];
|
|
26
|
+
/**
|
|
27
|
+
* Create a summary of violations
|
|
28
|
+
*/
|
|
29
|
+
export declare function summarizeViolations(violations: Violation[]): ViolationsSummary;
|
|
30
|
+
/**
|
|
31
|
+
* Display violations to console
|
|
32
|
+
*/
|
|
33
|
+
export declare function displayViolations(violations: Violation[], options?: {
|
|
34
|
+
quiet?: boolean;
|
|
35
|
+
}): void;
|
|
36
|
+
//# sourceMappingURL=violations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violations.d.ts","sourceRoot":"","sources":["../../src/core/violations.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAgB,MAAM,gDAAgD,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAGtE,YAAY,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvE;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,aAAa,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AA2RtE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,uBAAuB,GAAG,SAAS,EAAE,CAM5E;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,EAAE,GAAG,iBAAiB,CAY9E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,SAAS,EAAE,EAAE,OAAO,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,IAAI,CAqBlG"}
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared Violation Detection Module
|
|
3
|
+
*
|
|
4
|
+
* Provides consistent breaking change detection across watch and compare commands.
|
|
5
|
+
* Uses adapters to normalize different input formats to a common internal representation.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Normalize BundleChanges (watch mode) to NormalizedChange array
|
|
9
|
+
*/
|
|
10
|
+
function normalizeFromWatch(changes) {
|
|
11
|
+
const normalized = [];
|
|
12
|
+
// Handle removed contracts
|
|
13
|
+
for (const entryId of changes.removed) {
|
|
14
|
+
normalized.push({
|
|
15
|
+
entryId,
|
|
16
|
+
removed: true,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
// Handle changed contracts
|
|
20
|
+
for (const change of changes.changed) {
|
|
21
|
+
const { entryId, contractDiff } = change;
|
|
22
|
+
if (!contractDiff)
|
|
23
|
+
continue;
|
|
24
|
+
normalized.push({
|
|
25
|
+
entryId,
|
|
26
|
+
props: contractDiff.props,
|
|
27
|
+
emits: contractDiff.emits,
|
|
28
|
+
state: contractDiff.state,
|
|
29
|
+
functions: contractDiff.functions,
|
|
30
|
+
variables: contractDiff.variables,
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
return normalized;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Helper to compute diff between two objects (used for props, emits, state)
|
|
37
|
+
*/
|
|
38
|
+
function diffObjects(oldObj, newObj) {
|
|
39
|
+
const oldKeys = new Set(Object.keys(oldObj));
|
|
40
|
+
const newKeys = new Set(Object.keys(newObj));
|
|
41
|
+
const added = [];
|
|
42
|
+
const removed = [];
|
|
43
|
+
const changed = [];
|
|
44
|
+
for (const key of newKeys) {
|
|
45
|
+
if (!oldKeys.has(key)) {
|
|
46
|
+
added.push(key);
|
|
47
|
+
}
|
|
48
|
+
else if (JSON.stringify(oldObj[key]) !== JSON.stringify(newObj[key])) {
|
|
49
|
+
changed.push({ name: key, old: oldObj[key], new: newObj[key] });
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
for (const key of oldKeys) {
|
|
53
|
+
if (!newKeys.has(key)) {
|
|
54
|
+
removed.push(key);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
return { added, removed, changed };
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Helper to compute diff between two arrays
|
|
61
|
+
*/
|
|
62
|
+
function diffArrays(oldArr, newArr) {
|
|
63
|
+
const oldSet = new Set(oldArr);
|
|
64
|
+
const newSet = new Set(newArr);
|
|
65
|
+
const added = [];
|
|
66
|
+
const removed = [];
|
|
67
|
+
for (const item of newSet) {
|
|
68
|
+
if (!oldSet.has(item))
|
|
69
|
+
added.push(item);
|
|
70
|
+
}
|
|
71
|
+
for (const item of oldSet) {
|
|
72
|
+
if (!newSet.has(item))
|
|
73
|
+
removed.push(item);
|
|
74
|
+
}
|
|
75
|
+
return { added, removed };
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Normalize CompareResult (compare mode) to NormalizedChange array
|
|
79
|
+
*
|
|
80
|
+
* All delta formats now use full old/new values:
|
|
81
|
+
* - props: { old: Record<string, any>, new: Record<string, any> }
|
|
82
|
+
* - emits: { old: Record<string, any>, new: Record<string, any> }
|
|
83
|
+
* - functions: { old: string[], new: string[] }
|
|
84
|
+
* - variables: { old: string[], new: string[] }
|
|
85
|
+
* - state: { old: Record<string, any>, new: Record<string, any> }
|
|
86
|
+
*/
|
|
87
|
+
function normalizeFromCompare(result, gitBaseline) {
|
|
88
|
+
const normalized = [];
|
|
89
|
+
// Handle removed components
|
|
90
|
+
for (const id of result.removed) {
|
|
91
|
+
normalized.push({
|
|
92
|
+
entryId: id,
|
|
93
|
+
removed: true,
|
|
94
|
+
gitBaseline,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
// Handle changed components
|
|
98
|
+
for (const change of result.changed) {
|
|
99
|
+
const { id, deltas } = change;
|
|
100
|
+
const normalizedChange = { entryId: id, gitBaseline };
|
|
101
|
+
for (const delta of deltas) {
|
|
102
|
+
switch (delta.type) {
|
|
103
|
+
case 'props': {
|
|
104
|
+
const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
|
|
105
|
+
? delta.old : {};
|
|
106
|
+
const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
|
|
107
|
+
? delta.new : {};
|
|
108
|
+
normalizedChange.props = diffObjects(oldObj, newObj);
|
|
109
|
+
break;
|
|
110
|
+
}
|
|
111
|
+
case 'emits': {
|
|
112
|
+
const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
|
|
113
|
+
? delta.old : {};
|
|
114
|
+
const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
|
|
115
|
+
? delta.new : {};
|
|
116
|
+
normalizedChange.emits = diffObjects(oldObj, newObj);
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
case 'functions': {
|
|
120
|
+
const oldArr = Array.isArray(delta.old) ? delta.old : [];
|
|
121
|
+
const newArr = Array.isArray(delta.new) ? delta.new : [];
|
|
122
|
+
normalizedChange.functions = diffArrays(oldArr, newArr);
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
case 'variables': {
|
|
126
|
+
const oldArr = Array.isArray(delta.old) ? delta.old : [];
|
|
127
|
+
const newArr = Array.isArray(delta.new) ? delta.new : [];
|
|
128
|
+
normalizedChange.variables = diffArrays(oldArr, newArr);
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
case 'state': {
|
|
132
|
+
const oldObj = (delta.old && typeof delta.old === 'object' && !Array.isArray(delta.old))
|
|
133
|
+
? delta.old : {};
|
|
134
|
+
const newObj = (delta.new && typeof delta.new === 'object' && !Array.isArray(delta.new))
|
|
135
|
+
? delta.new : {};
|
|
136
|
+
normalizedChange.state = diffObjects(oldObj, newObj);
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
// Other delta types (hash, imports, hooks, exports, components, apiSignature)
|
|
140
|
+
// are not breaking changes for violation detection
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
// Only add if there are actual changes to detect
|
|
144
|
+
if (normalizedChange.props || normalizedChange.emits || normalizedChange.state ||
|
|
145
|
+
normalizedChange.functions || normalizedChange.variables) {
|
|
146
|
+
normalized.push(normalizedChange);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return normalized;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Core detection logic - operates on normalized changes
|
|
153
|
+
* Breaking changes are treated as errors, type changes as warnings
|
|
154
|
+
* Note: Missing dependencies are not tracked as violations (they're expected for third-party packages)
|
|
155
|
+
*/
|
|
156
|
+
function detectFromNormalized(changes) {
|
|
157
|
+
const violations = [];
|
|
158
|
+
for (const change of changes) {
|
|
159
|
+
const { entryId } = change;
|
|
160
|
+
// Contract removed is a breaking change
|
|
161
|
+
if (change.removed) {
|
|
162
|
+
violations.push({
|
|
163
|
+
type: 'contract_removed',
|
|
164
|
+
severity: 'error',
|
|
165
|
+
entryId,
|
|
166
|
+
message: `Contract removed: ${entryId}`,
|
|
167
|
+
});
|
|
168
|
+
continue;
|
|
169
|
+
}
|
|
170
|
+
// Removed props are breaking changes
|
|
171
|
+
if (change.props?.removed) {
|
|
172
|
+
for (const propName of change.props.removed) {
|
|
173
|
+
violations.push({
|
|
174
|
+
type: 'breaking_change_prop_removed',
|
|
175
|
+
severity: 'error',
|
|
176
|
+
entryId,
|
|
177
|
+
message: `Breaking change: prop '${propName}' removed from ${entryId}`,
|
|
178
|
+
details: { name: propName },
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
// Changed prop types are breaking changes (warning severity)
|
|
183
|
+
// Skip type changes in git baseline mode to avoid false positives from path differences
|
|
184
|
+
if (change.props?.changed && !change.gitBaseline) {
|
|
185
|
+
for (const prop of change.props.changed) {
|
|
186
|
+
violations.push({
|
|
187
|
+
type: 'breaking_change_prop_type',
|
|
188
|
+
severity: 'warning',
|
|
189
|
+
entryId,
|
|
190
|
+
message: `Prop '${prop.name}' type changed in ${entryId}`,
|
|
191
|
+
details: { name: prop.name, oldValue: prop.old, newValue: prop.new },
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
// Removed events are breaking changes
|
|
196
|
+
if (change.emits?.removed) {
|
|
197
|
+
for (const eventName of change.emits.removed) {
|
|
198
|
+
violations.push({
|
|
199
|
+
type: 'breaking_change_event_removed',
|
|
200
|
+
severity: 'error',
|
|
201
|
+
entryId,
|
|
202
|
+
message: `Breaking change: event '${eventName}' removed from ${entryId}`,
|
|
203
|
+
details: { name: eventName },
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
// Removed state is a breaking change (warning severity)
|
|
208
|
+
if (change.state?.removed) {
|
|
209
|
+
for (const stateName of change.state.removed) {
|
|
210
|
+
violations.push({
|
|
211
|
+
type: 'breaking_change_state_removed',
|
|
212
|
+
severity: 'warning',
|
|
213
|
+
entryId,
|
|
214
|
+
message: `State '${stateName}' removed from ${entryId}`,
|
|
215
|
+
details: { name: stateName },
|
|
216
|
+
});
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// Removed functions are breaking changes
|
|
220
|
+
if (change.functions?.removed) {
|
|
221
|
+
for (const funcName of change.functions.removed) {
|
|
222
|
+
violations.push({
|
|
223
|
+
type: 'breaking_change_function_removed',
|
|
224
|
+
severity: 'error',
|
|
225
|
+
entryId,
|
|
226
|
+
message: `Breaking change: function '${funcName}' removed from ${entryId}`,
|
|
227
|
+
details: { name: funcName },
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
// Removed variables are breaking changes (warning severity)
|
|
232
|
+
if (change.variables?.removed) {
|
|
233
|
+
for (const varName of change.variables.removed) {
|
|
234
|
+
violations.push({
|
|
235
|
+
type: 'breaking_change_variable_removed',
|
|
236
|
+
severity: 'warning',
|
|
237
|
+
entryId,
|
|
238
|
+
message: `Variable '${varName}' removed from ${entryId}`,
|
|
239
|
+
details: { name: varName },
|
|
240
|
+
});
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return violations;
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Detect violations from either watch mode or compare mode input
|
|
248
|
+
*/
|
|
249
|
+
export function detectViolations(input) {
|
|
250
|
+
const normalized = input.type === 'watch'
|
|
251
|
+
? normalizeFromWatch(input.changes)
|
|
252
|
+
: normalizeFromCompare(input.result, input.gitBaseline);
|
|
253
|
+
return detectFromNormalized(normalized);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a summary of violations
|
|
257
|
+
*/
|
|
258
|
+
export function summarizeViolations(violations) {
|
|
259
|
+
const errors = violations.filter(v => v.severity === 'error');
|
|
260
|
+
const warnings = violations.filter(v => v.severity === 'warning');
|
|
261
|
+
return {
|
|
262
|
+
timestamp: new Date().toISOString(),
|
|
263
|
+
totalViolations: violations.length,
|
|
264
|
+
errors: errors.length,
|
|
265
|
+
warnings: warnings.length,
|
|
266
|
+
violations,
|
|
267
|
+
changedFiles: [], // Caller should populate this if needed
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Display violations to console
|
|
272
|
+
*/
|
|
273
|
+
export function displayViolations(violations, options = {}) {
|
|
274
|
+
if (violations.length === 0)
|
|
275
|
+
return;
|
|
276
|
+
const errors = violations.filter(v => v.severity === 'error');
|
|
277
|
+
const warnings = violations.filter(v => v.severity === 'warning');
|
|
278
|
+
console.log(`\n ⚠️ Strict Mode: ${violations.length} violation(s) detected`);
|
|
279
|
+
if (errors.length > 0) {
|
|
280
|
+
console.log(`\n ❌ Errors (${errors.length}):`);
|
|
281
|
+
errors.forEach(v => {
|
|
282
|
+
console.log(` ${v.message}`);
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
if (warnings.length > 0) {
|
|
286
|
+
console.log(`\n ⚠️ Warnings (${warnings.length}):`);
|
|
287
|
+
warnings.forEach(v => {
|
|
288
|
+
console.log(` ${v.message}`);
|
|
289
|
+
});
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=violations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"violations.js","sourceRoot":"","sources":["../../src/core/violations.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propTypeNormalizer.d.ts","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,
|
|
1
|
+
{"version":3,"file":"propTypeNormalizer.d.ts","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAC;AAG3D;;;;;GAKG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,QAAQ,CA6DjF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"propTypeNormalizer.js","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,QAAQ;SACZ,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAO,8CAA8C;SACrF,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAAmB;IACrE,IAAI,CAAC;QACH,uFAAuF;QACvF,qGAAqG;QACrG,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAExD,wGAAwG;QACxG,gHAAgH;QAChH,8EAA8E;QAC9E,MAAM,mBAAmB,GAAG,+IAA+I,CAAC;QAC5K,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,SAAS;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,qCAAqC;gBACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAClD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"propTypeNormalizer.js","sourceRoot":"","sources":["../../../src/extractors/shared/propTypeNormalizer.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD;;;;;GAKG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAgB;IAC1D,OAAO,QAAQ;SACZ,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAE,uBAAuB;SAC9D,OAAO,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAO,8CAA8C;SACrF,IAAI,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAgB,EAAE,UAAmB;IACrE,IAAI,CAAC;QACH,uFAAuF;QACvF,qGAAqG;QACrG,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC;QAExD,wGAAwG;QACxG,gHAAgH;QAChH,8EAA8E;QAC9E,MAAM,mBAAmB,GAAG,+IAA+I,CAAC;QAC5K,MAAM,iBAAiB,GAAG,SAAS,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC/D,IAAI,iBAAiB,EAAE,CAAC;YACtB,MAAM,QAAQ,GAAG,SAAS;iBACvB,KAAK,CAAC,GAAG,CAAC;iBACV,GAAG,CAAC,CAAC,CAAC,EAAE;gBACP,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACzB,qCAAqC;gBACrC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;oBAClD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACvD,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC9B,CAAC;gBACD,OAAO,OAAO,CAAC;YACjB,CAAC,CAAC;iBACD,IAAI,EAAE,CAAC,CAAC,gCAAgC;YAE3C,OAAO;gBACL,IAAI,EAAE,eAAe;gBACrB,QAAQ;gBACR,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,yDAAyD;QACzD,oFAAoF;QACpF,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,IAAI,EAAE,UAAU;gBAChB,SAAS,EAAE,SAAS;gBACpB,GAAG,CAAC,UAAU,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;aACtC,CAAC;QACJ,CAAC;QAED,+BAA+B;QAC/B,IAAI,UAAU,EAAE,CAAC;YACf,gGAAgG;YAChG,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,QAAQ,EAAE,IAAI;aACf,CAAC;QACJ,CAAC;QAED,0DAA0D;QAC1D,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0CAA0C;QAC1C,UAAU,CAAC,oBAAoB,EAAE,mBAAmB,EAAE;YACpD,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YAC7D,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;AACH,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -31,8 +31,8 @@ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
|
|
|
31
31
|
export { buildLogicSignature } from './core/signature.js';
|
|
32
32
|
export { contextCommand } from './cli/commands/context.js';
|
|
33
33
|
export type { ContextOptions } from './cli/commands/context.js';
|
|
34
|
-
export { compareCommand, multiFileCompare } from './cli/commands/compare.js';
|
|
35
|
-
export type { CompareOptions, CompareResult, FolderCompareResult, MultiFileCompareResult, MultiFileCompareOptions } from './cli/commands/compare.js';
|
|
34
|
+
export { compareCommand, multiFileCompare } from './cli/commands/compare/index.js';
|
|
35
|
+
export type { CompareOptions, CompareResult, FolderCompareResult, MultiFileCompareResult, MultiFileCompareOptions } from './cli/commands/compare/index.js';
|
|
36
36
|
export { validateCommand, validateBundles, multiFileValidate } from './cli/commands/validate.js';
|
|
37
37
|
export type { ValidationResult, FolderValidationResult, MultiFileValidationResult } from './cli/commands/validate.js';
|
|
38
38
|
export { init } from './cli/commands/init.js';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAGH,YAAY,EAAE,WAAW,EAAE,cAAc,EAAE,cAAc,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAC7H,YAAY,EAAE,gBAAgB,EAAE,UAAU,EAAE,WAAW,EAAE,iBAAiB,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjK,YAAY,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACzE,YAAY,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,YAAY,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAC1F,YAAY,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3D,YAAY,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnF,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,iCAAiC,CAAC;AAC3J,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AACjG,YAAY,EAAE,gBAAgB,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGvD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC5J,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAG/E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -26,7 +26,7 @@ export { pack, computeBundleHash, validateHashLock } from './core/pack.js';
|
|
|
26
26
|
export { buildLogicSignature } from './core/signature.js';
|
|
27
27
|
// CLI commands (for programmatic use)
|
|
28
28
|
export { contextCommand } from './cli/commands/context.js';
|
|
29
|
-
export { compareCommand, multiFileCompare } from './cli/commands/compare.js';
|
|
29
|
+
export { compareCommand, multiFileCompare } from './cli/commands/compare/index.js';
|
|
30
30
|
export { validateCommand, validateBundles, multiFileValidate } from './cli/commands/validate.js';
|
|
31
31
|
export { init } from './cli/commands/init.js';
|
|
32
32
|
export { cleanCommand } from './cli/commands/clean.js';
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAUH,iBAAiB;AACjB,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,sCAAsC;AACtC,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3D,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEnF,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAEjG,OAAO,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,iDAAiD;AACjD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAG5J,gDAAgD;AAChD,OAAO,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC"}
|
|
@@ -1 +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,
|
|
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,CAsI7B;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"}
|
package/dist/utils/fileLock.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Lightweight file locking utility for preventing TOCTOU race conditions
|
|
3
3
|
* Uses exclusive file creation with PID tracking for stale lock detection
|
|
4
4
|
*/
|
|
5
|
-
import { open, unlink, readFile } from 'node:fs/promises';
|
|
5
|
+
import { open, unlink, readFile, access } from 'node:fs/promises';
|
|
6
6
|
import { constants } from 'node:fs';
|
|
7
7
|
/**
|
|
8
8
|
* Check if a process is still running
|
|
@@ -115,6 +115,44 @@ export async function acquireLock(filePath, options = {}) {
|
|
|
115
115
|
pid: process.pid,
|
|
116
116
|
timestamp: Date.now(),
|
|
117
117
|
};
|
|
118
|
+
// Helper function to try acquiring lock immediately with retries (for Windows race condition)
|
|
119
|
+
const tryAcquireImmediately = async () => {
|
|
120
|
+
for (let retry = 0; retry < 5; retry++) {
|
|
121
|
+
// Check timeout before each retry
|
|
122
|
+
if (Date.now() - startTime >= timeout) {
|
|
123
|
+
return null;
|
|
124
|
+
}
|
|
125
|
+
await new Promise(resolve => setTimeout(resolve, 10 + retry * 5)); // 10, 15, 20, 25, 30ms
|
|
126
|
+
try {
|
|
127
|
+
const handle = await open(lockPath, constants.O_CREAT | constants.O_EXCL | constants.O_WRONLY);
|
|
128
|
+
await handle.writeFile(JSON.stringify(lockContent));
|
|
129
|
+
await handle.close();
|
|
130
|
+
// Successfully acquired lock!
|
|
131
|
+
return {
|
|
132
|
+
release: async () => {
|
|
133
|
+
if (released)
|
|
134
|
+
return;
|
|
135
|
+
released = true;
|
|
136
|
+
try {
|
|
137
|
+
await unlink(lockPath);
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
// Ignore errors during release
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
catch (retryErr) {
|
|
146
|
+
const retryError = retryErr;
|
|
147
|
+
if (retryError.code !== 'EEXIST') {
|
|
148
|
+
// Not a file-exists error, something else went wrong - abort retry loop
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
// Still exists, continue retrying
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null; // Retry loop exhausted
|
|
155
|
+
};
|
|
118
156
|
while (Date.now() - startTime < timeout) {
|
|
119
157
|
try {
|
|
120
158
|
// Try to create lock file exclusively (fails if exists)
|
|
@@ -140,17 +178,53 @@ export async function acquireLock(filePath, options = {}) {
|
|
|
140
178
|
const err = error;
|
|
141
179
|
if (err.code === 'EEXIST') {
|
|
142
180
|
// Lock file exists - check if it's stale
|
|
143
|
-
|
|
181
|
+
const stale = await isLockStale(lockPath, staleThreshold);
|
|
182
|
+
if (stale) {
|
|
144
183
|
await removeStale(lockPath);
|
|
145
|
-
//
|
|
184
|
+
// Delay after removing stale lock to let filesystem catch up
|
|
146
185
|
// Especially important on Windows where file deletion can be asynchronous
|
|
147
|
-
|
|
186
|
+
// Use longer delay under load (when tests run in parallel)
|
|
187
|
+
await new Promise(resolve => setTimeout(resolve, 20));
|
|
148
188
|
// Retry immediately after removing stale lock
|
|
149
189
|
continue;
|
|
150
190
|
}
|
|
151
191
|
// Lock is held by another active process - wait and retry
|
|
192
|
+
// On Windows, file deletion can be asynchronous, so we need to be more careful.
|
|
193
|
+
// Check if file still exists before waiting - if it's already gone, try to acquire immediately.
|
|
194
|
+
try {
|
|
195
|
+
await access(lockPath);
|
|
196
|
+
}
|
|
197
|
+
catch {
|
|
198
|
+
// File no longer exists - try to acquire immediately with retries
|
|
199
|
+
// On Windows, there's a race where access() says file is gone but open() still sees it.
|
|
200
|
+
// Retry a few times with small delays to handle Windows filesystem propagation delays.
|
|
201
|
+
const immediateResult = await tryAcquireImmediately();
|
|
202
|
+
if (immediateResult) {
|
|
203
|
+
return immediateResult;
|
|
204
|
+
}
|
|
205
|
+
// Retry loop exhausted, continue to normal wait logic
|
|
206
|
+
continue;
|
|
207
|
+
}
|
|
208
|
+
// File exists, wait before retrying
|
|
152
209
|
await new Promise(resolve => setTimeout(resolve, retryInterval));
|
|
153
|
-
|
|
210
|
+
// After waiting, check again if file still exists
|
|
211
|
+
// On Windows, the file might have been deleted while we waited, but the
|
|
212
|
+
// filesystem hasn't fully propagated the deletion yet. Try to acquire immediately.
|
|
213
|
+
try {
|
|
214
|
+
await access(lockPath);
|
|
215
|
+
// File still exists, continue to next iteration (will check stale again)
|
|
216
|
+
continue;
|
|
217
|
+
}
|
|
218
|
+
catch {
|
|
219
|
+
// File no longer exists - try to acquire immediately with retries
|
|
220
|
+
// Same retry logic as above to handle Windows race condition
|
|
221
|
+
const immediateResult = await tryAcquireImmediately();
|
|
222
|
+
if (immediateResult) {
|
|
223
|
+
return immediateResult;
|
|
224
|
+
}
|
|
225
|
+
// Retry loop exhausted, continue to normal wait/retry cycle
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
154
228
|
}
|
|
155
229
|
// Other error (e.g., permission denied, directory doesn't exist)
|
|
156
230
|
// Don't retry for these errors
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"fileLock.js","sourceRoot":"","sources":["../../src/utils/fileLock.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAqBpC;;;GAGG;AACH,SAAS,cAAc,CAAC,GAAW;IACjC,8DAA8D;IAC9D,+EAA+E;IAC/E,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,GAAG,OAAO,EAAE,CAAC;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC;QACH,gEAAgE;QAChE,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,4CAA4C;QAC5C,kFAAkF;QAClF,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACzB,OAAO,SAAS,CAAC,CAAC,6DAA6D;QACjF,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,yCAAyC;IACzD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,QAAgB,EAAE,cAAsB;IACjE,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAElD,+EAA+E;QAC/E,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,IAAI,QAAyB,CAAC;QAC9B,IAAI,CAAC;YACH,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,oEAAoE;YACpE,OAAO,KAAK,CAAC;QACf,CAAC;QAED,4DAA4D;QAC5D,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,0FAA0F;YAC1F,yDAAyD;YACzD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;YAC5C,OAAO,GAAG,GAAG,cAAc,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,IAAI,KAAK,KAAK,KAAK,EAAE,CAAC;YACpB,OAAO,IAAI,CAAC,CAAC,6BAA6B;QAC5C,CAAC;QAED,kFAAkF;QAClF,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,SAAS,CAAC;QAC5C,IAAI,GAAG,GAAG,cAAc,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,GAAG,GAAG,KAA8B,CAAC;QAC3C,+DAA+D;QAC/D,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC1B,OAAO,IAAI,CAAC;QACd,CAAC;QACD,wDAAwD;QACxD,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,WAAW,CAAC,QAAgB;IACzC,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;IACzB,CAAC;IAAC,MAAM,CAAC;QACP,sDAAsD;IACxD,CAAC;AACH,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,QAAgB,EAChB,UAAuB,EAAE;IAEzB,MAAM,EACJ,OAAO,GAAG,IAAI,EACd,aAAa,GAAG,EAAE,EAClB,cAAc,GAAG,KAAK,GACvB,GAAG,OAAO,CAAC;IAEZ,MAAM,QAAQ,GAAG,GAAG,QAAQ,OAAO,CAAC;IACpC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,MAAM,WAAW,GAAoB;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;KACtB,CAAC;IAEF,8FAA8F;IAC9F,MAAM,qBAAqB,GAAG,KAAK,IAAiC,EAAE;QACpE,KAAK,IAAI,KAAK,GAAG,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC;YACvC,kCAAkC;YAClC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,IAAI,OAAO,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACd,CAAC;YACD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,uBAAuB;YAC1F,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC/F,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;gBACpD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;gBACrB,8BAA8B;gBAC9B,OAAO;oBACL,OAAO,EAAE,KAAK,IAAI,EAAE;wBAClB,IAAI,QAAQ;4BAAE,OAAO;wBACrB,QAAQ,GAAG,IAAI,CAAC;wBAChB,IAAI,CAAC;4BACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;wBACzB,CAAC;wBAAC,MAAM,CAAC;4BACP,+BAA+B;wBACjC,CAAC;oBACH,CAAC;iBACF,CAAC;YACJ,CAAC;YAAC,OAAO,QAAQ,EAAE,CAAC;gBAClB,MAAM,UAAU,GAAG,QAAiC,CAAC;gBACrD,IAAI,UAAU,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACjC,wEAAwE;oBACxE,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,kCAAkC;YACpC,CAAC;QACH,CAAC;QACD,OAAO,IAAI,CAAC,CAAC,uBAAuB;IACtC,CAAC,CAAC;IAEF,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,GAAG,OAAO,EAAE,CAAC;QACxC,IAAI,CAAC;YACH,wDAAwD;YACxD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,SAAS,CAAC,OAAO,GAAG,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC/F,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;YACpD,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YAErB,gBAAgB;YAChB,OAAO;gBACL,OAAO,EAAE,KAAK,IAAI,EAAE;oBAClB,IAAI,QAAQ;wBAAE,OAAO;oBACrB,QAAQ,GAAG,IAAI,CAAC;oBAChB,IAAI,CAAC;wBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC;oBAAC,MAAM,CAAC;wBACP,+BAA+B;oBACjC,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,GAAG,GAAG,KAA8B,CAAC;YAE3C,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC1B,yCAAyC;gBACzC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;gBAC1D,IAAI,KAAK,EAAE,CAAC;oBACV,MAAM,WAAW,CAAC,QAAQ,CAAC,CAAC;oBAC5B,6DAA6D;oBAC7D,0EAA0E;oBAC1E,2DAA2D;oBAC3D,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;oBACtD,8CAA8C;oBAC9C,SAAS;gBACX,CAAC;gBAED,0DAA0D;gBAC1D,gFAAgF;gBAChF,gGAAgG;gBAChG,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;gBACzB,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;oBAClE,wFAAwF;oBACxF,uFAAuF;oBACvF,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAC;oBACtD,IAAI,eAAe,EAAE,CAAC;wBACpB,OAAO,eAAe,CAAC;oBACzB,CAAC;oBACD,sDAAsD;oBACtD,SAAS;gBACX,CAAC;gBAED,oCAAoC;gBACpC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC;gBAEjE,kDAAkD;gBAClD,wEAAwE;gBACxE,mFAAmF;gBACnF,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;oBACvB,yEAAyE;oBACzE,SAAS;gBACX,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;oBAClE,6DAA6D;oBAC7D,MAAM,eAAe,GAAG,MAAM,qBAAqB,EAAE,CAAC;oBACtD,IAAI,eAAe,EAAE,CAAC;wBACpB,OAAO,eAAe,CAAC;oBACzB,CAAC;oBACD,4DAA4D;oBAC5D,SAAS;gBACX,CAAC;YACH,CAAC;YAED,iEAAiE;YACjE,+BAA+B;YAC/B,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,QAAgB,EAChB,EAAoB,EACpB,UAAuB,EAAE;IAEzB,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAElD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,kBAAkB,CAAC,CAAC;IAC7E,CAAC;IAED,IAAI,CAAC;QACH,OAAO,MAAM,EAAE,EAAE,CAAC;IACpB,CAAC;YAAS,CAAC;QACT,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;IACvB,CAAC;AACH,CAAC"}
|