@memberjunction/global 6.2.0-edge.3 → 6.2.0-edge.4
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/dist/__tests__/UUIDCollections.test.d.ts +2 -0
- package/dist/__tests__/UUIDCollections.test.d.ts.map +1 -0
- package/dist/__tests__/UUIDCollections.test.js +173 -0
- package/dist/__tests__/UUIDCollections.test.js.map +1 -0
- package/dist/__tests__/UUIDCompliance.test.d.ts +2 -1
- package/dist/__tests__/UUIDCompliance.test.d.ts.map +1 -1
- package/dist/__tests__/UUIDCompliance.test.js +290 -8
- package/dist/__tests__/UUIDCompliance.test.js.map +1 -1
- package/dist/__tests__/UUIDUtils.test.js +55 -0
- package/dist/__tests__/UUIDUtils.test.js.map +1 -1
- package/dist/__tests__/util.trimTrailingSlashes.test.d.ts +2 -0
- package/dist/__tests__/util.trimTrailingSlashes.test.d.ts.map +1 -0
- package/dist/__tests__/util.trimTrailingSlashes.test.js +23 -0
- package/dist/__tests__/util.trimTrailingSlashes.test.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/util/UUIDCollections.d.ts +111 -0
- package/dist/util/UUIDCollections.d.ts.map +1 -0
- package/dist/util/UUIDCollections.js +163 -0
- package/dist/util/UUIDCollections.js.map +1 -0
- package/dist/util/UUIDUtils.d.ts.map +1 -1
- package/dist/util/UUIDUtils.js +58 -3
- package/dist/util/UUIDUtils.js.map +1 -1
- package/dist/util.d.ts +14 -0
- package/dist/util.d.ts.map +1 -1
- package/dist/util.js +20 -0
- package/dist/util.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UUIDCollections.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/UUIDCollections.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { UUIDSet, UUIDMap, FilterByUUIDs, ExcludeByUUIDs, CountByUUID, IndexByUUID, GroupByUUID, } from '../util/UUIDCollections.js';
|
|
3
|
+
import { NormalizeUUID } from '../util/UUIDUtils.js';
|
|
4
|
+
// SQL Server returns UUIDs upper-case, PostgreSQL lower-case: every collection must treat the
|
|
5
|
+
// two spellings of one ID as the same ID.
|
|
6
|
+
const A_LOWER = 'aaaaaaaa-0000-0000-0000-000000000001';
|
|
7
|
+
const A_UPPER = A_LOWER.toUpperCase();
|
|
8
|
+
const B_LOWER = 'bbbbbbbb-0000-0000-0000-000000000002';
|
|
9
|
+
const B_UPPER = B_LOWER.toUpperCase();
|
|
10
|
+
const C_LOWER = 'cccccccc-0000-0000-0000-000000000003';
|
|
11
|
+
describe('UUIDSet', () => {
|
|
12
|
+
it('finds an ID regardless of case or surrounding whitespace', () => {
|
|
13
|
+
const set = new UUIDSet([A_LOWER]);
|
|
14
|
+
expect(set.Has(A_UPPER)).toBe(true);
|
|
15
|
+
expect(set.Has(` ${A_UPPER}\t`)).toBe(true);
|
|
16
|
+
expect(set.Has(B_LOWER)).toBe(false);
|
|
17
|
+
});
|
|
18
|
+
it('stores case variants of one ID once', () => {
|
|
19
|
+
const set = new UUIDSet([A_LOWER, A_UPPER, ` ${A_LOWER} `]);
|
|
20
|
+
expect(set.Size).toBe(1);
|
|
21
|
+
});
|
|
22
|
+
it('iterates normalized (lower-case, trimmed) IDs', () => {
|
|
23
|
+
expect([...new UUIDSet([A_UPPER, ` ${B_UPPER} `])]).toEqual([A_LOWER, B_LOWER]);
|
|
24
|
+
});
|
|
25
|
+
it('adds, deletes and clears across case variants', () => {
|
|
26
|
+
const set = new UUIDSet().Add(A_UPPER).Add(B_LOWER);
|
|
27
|
+
expect(set.Delete(A_LOWER)).toBe(true);
|
|
28
|
+
expect(set.Delete(A_LOWER)).toBe(false);
|
|
29
|
+
expect(set.Has(A_UPPER)).toBe(false);
|
|
30
|
+
expect(set.Size).toBe(1);
|
|
31
|
+
set.Clear();
|
|
32
|
+
expect(set.Size).toBe(0);
|
|
33
|
+
});
|
|
34
|
+
it('follows NormalizeUUID for null and undefined (both normalize to the empty string)', () => {
|
|
35
|
+
const set = new UUIDSet([null]);
|
|
36
|
+
expect(set.Has(undefined)).toBe(true);
|
|
37
|
+
expect(set.Has('')).toBe(true);
|
|
38
|
+
expect(new UUIDSet([A_LOWER]).Has(null)).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
it('starts empty with no argument', () => {
|
|
41
|
+
expect(new UUIDSet().Size).toBe(0);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('UUIDMap', () => {
|
|
45
|
+
it('gets a value stored under a different case of the same ID', () => {
|
|
46
|
+
const map = new UUIDMap([[A_LOWER, 'Admin']]);
|
|
47
|
+
expect(map.Get(A_UPPER)).toBe('Admin');
|
|
48
|
+
expect(map.Get(` ${A_UPPER} `)).toBe('Admin');
|
|
49
|
+
expect(map.Get(B_LOWER)).toBeUndefined();
|
|
50
|
+
});
|
|
51
|
+
it('overwrites the value when a case variant is set', () => {
|
|
52
|
+
const map = new UUIDMap().Set(A_LOWER, 'first').Set(A_UPPER, 'second');
|
|
53
|
+
expect(map.Size).toBe(1);
|
|
54
|
+
expect(map.Get(A_LOWER)).toBe('second');
|
|
55
|
+
});
|
|
56
|
+
it('reports membership and deletes across case variants', () => {
|
|
57
|
+
const map = new UUIDMap([[A_UPPER, 1], [B_UPPER, 2]]);
|
|
58
|
+
expect(map.Has(A_LOWER)).toBe(true);
|
|
59
|
+
expect(map.Delete(A_LOWER)).toBe(true);
|
|
60
|
+
expect(map.Has(A_UPPER)).toBe(false);
|
|
61
|
+
expect(map.Size).toBe(1);
|
|
62
|
+
map.Clear();
|
|
63
|
+
expect(map.Size).toBe(0);
|
|
64
|
+
});
|
|
65
|
+
it('iterates normalized keys with their values, in insertion order', () => {
|
|
66
|
+
const map = new UUIDMap([[B_UPPER, 2], [A_UPPER, 1]]);
|
|
67
|
+
expect([...map]).toEqual([[B_LOWER, 2], [A_LOWER, 1]]);
|
|
68
|
+
expect([...map.Keys()]).toEqual([B_LOWER, A_LOWER]);
|
|
69
|
+
expect([...map.Values()]).toEqual([2, 1]);
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
const rows = [
|
|
73
|
+
{ ID: A_UPPER, Name: 'a' },
|
|
74
|
+
{ ID: B_UPPER, Name: 'b' },
|
|
75
|
+
{ ID: C_LOWER, Name: 'c' },
|
|
76
|
+
];
|
|
77
|
+
const pending = [
|
|
78
|
+
{ artifactId: B_LOWER, label: 'report' },
|
|
79
|
+
{ artifactId: A_LOWER, label: 'image' },
|
|
80
|
+
];
|
|
81
|
+
describe('FilterByUUIDs', () => {
|
|
82
|
+
it('keeps the items whose ID is listed, in the items’ own order, matching case-insensitively', () => {
|
|
83
|
+
expect(FilterByUUIDs(rows, [C_LOWER.toUpperCase(), A_LOWER]).map((r) => r.Name)).toEqual(['a', 'c']);
|
|
84
|
+
});
|
|
85
|
+
it('reads a custom ID field through getId', () => {
|
|
86
|
+
expect(FilterByUUIDs(pending, [A_UPPER], (p) => p.artifactId).map((p) => p.label)).toEqual(['image']);
|
|
87
|
+
});
|
|
88
|
+
it('accepts an existing UUIDSet', () => {
|
|
89
|
+
expect(FilterByUUIDs(rows, new UUIDSet([B_LOWER])).map((r) => r.Name)).toEqual(['b']);
|
|
90
|
+
});
|
|
91
|
+
it('returns nothing for no IDs, and does not mutate the input', () => {
|
|
92
|
+
const copy = [...rows];
|
|
93
|
+
expect(FilterByUUIDs(rows, [])).toEqual([]);
|
|
94
|
+
expect(rows).toEqual(copy);
|
|
95
|
+
});
|
|
96
|
+
});
|
|
97
|
+
describe('ExcludeByUUIDs', () => {
|
|
98
|
+
it('drops the items whose ID is listed, keeping the rest in order', () => {
|
|
99
|
+
expect(ExcludeByUUIDs(rows, [B_LOWER]).map((r) => r.Name)).toEqual(['a', 'c']);
|
|
100
|
+
});
|
|
101
|
+
it('is the exact complement of FilterByUUIDs', () => {
|
|
102
|
+
const ids = [A_LOWER, C_LOWER.toUpperCase()];
|
|
103
|
+
const kept = FilterByUUIDs(rows, ids);
|
|
104
|
+
const dropped = ExcludeByUUIDs(rows, ids);
|
|
105
|
+
expect(kept.length + dropped.length).toBe(rows.length);
|
|
106
|
+
expect(kept.some((r) => dropped.includes(r))).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
it('reads a custom ID field through getId', () => {
|
|
109
|
+
expect(ExcludeByUUIDs(pending, [B_UPPER], (p) => p.artifactId).map((p) => p.label)).toEqual(['image']);
|
|
110
|
+
});
|
|
111
|
+
it('keeps everything for no IDs', () => {
|
|
112
|
+
expect(ExcludeByUUIDs(rows, []).map((r) => r.Name)).toEqual(['a', 'b', 'c']);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
115
|
+
describe('CountByUUID', () => {
|
|
116
|
+
it('counts case variants of one ID together', () => {
|
|
117
|
+
const counts = CountByUUID([A_LOWER, A_UPPER, B_UPPER], (id) => id);
|
|
118
|
+
expect(counts.Get(A_UPPER)).toBe(2);
|
|
119
|
+
expect(counts.Get(B_LOWER)).toBe(1);
|
|
120
|
+
expect(counts.Get(C_LOWER)).toBeUndefined();
|
|
121
|
+
});
|
|
122
|
+
it('uses the item ID by default', () => {
|
|
123
|
+
expect(CountByUUID([...rows, { ID: A_LOWER, Name: 'a2' }]).Get(A_LOWER)).toBe(2);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('GroupByUUID', () => {
|
|
127
|
+
const roles = [
|
|
128
|
+
{ ID: 'r1', UserID: A_UPPER },
|
|
129
|
+
{ ID: 'r2', UserID: B_LOWER },
|
|
130
|
+
{ ID: 'r3', UserID: A_LOWER },
|
|
131
|
+
{ ID: 'r4', UserID: null },
|
|
132
|
+
];
|
|
133
|
+
it('groups items by ID in any case, keeping each group in items order', () => {
|
|
134
|
+
const byUser = GroupByUUID(roles, r => r.UserID);
|
|
135
|
+
expect(byUser.Get(A_LOWER)?.map(r => r.ID)).toEqual(['r1', 'r3']);
|
|
136
|
+
expect(byUser.Get(B_UPPER)?.map(r => r.ID)).toEqual(['r2']);
|
|
137
|
+
expect(byUser.Get(C_LOWER)).toBeUndefined();
|
|
138
|
+
expect(byUser.Size).toBe(3);
|
|
139
|
+
});
|
|
140
|
+
it('puts null and undefined IDs in one group, as NormalizeUUID does', () => {
|
|
141
|
+
expect(GroupByUUID(roles, r => r.UserID).Get(undefined)?.map(r => r.ID)).toEqual(['r4']);
|
|
142
|
+
});
|
|
143
|
+
it('matches the nested filter it replaces', () => {
|
|
144
|
+
const byUser = GroupByUUID(roles, r => r.UserID);
|
|
145
|
+
for (const id of [A_LOWER, B_UPPER, C_LOWER]) {
|
|
146
|
+
const nested = roles.filter(r => NormalizeUUID(r.UserID) === NormalizeUUID(id));
|
|
147
|
+
expect(byUser.Get(id) ?? []).toEqual(nested);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
});
|
|
151
|
+
describe('IndexByUUID', () => {
|
|
152
|
+
it('looks items up by ID in any case', () => {
|
|
153
|
+
const index = IndexByUUID(rows);
|
|
154
|
+
expect(index.Get(B_LOWER)?.Name).toBe('b');
|
|
155
|
+
expect(index.Get(C_LOWER.toUpperCase())?.Name).toBe('c');
|
|
156
|
+
});
|
|
157
|
+
it('keeps the FIRST item for a duplicated ID, as find() would', () => {
|
|
158
|
+
const index = IndexByUUID([{ ID: A_UPPER, Name: 'first' }, { ID: A_LOWER, Name: 'second' }]);
|
|
159
|
+
expect(index.Get(A_LOWER)?.Name).toBe('first');
|
|
160
|
+
expect(index.Size).toBe(1);
|
|
161
|
+
});
|
|
162
|
+
it('reads a custom ID field through getId', () => {
|
|
163
|
+
expect(IndexByUUID(pending, (p) => p.artifactId).Get(B_UPPER)?.label).toBe('report');
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe('default ID selector', () => {
|
|
167
|
+
it('treats an item whose ID is not a string as having no ID', () => {
|
|
168
|
+
const odd = [{ ID: 42, Name: 'numeric' }];
|
|
169
|
+
expect(FilterByUUIDs(odd, [A_LOWER])).toEqual([]);
|
|
170
|
+
expect(FilterByUUIDs(odd, [null]).map((r) => r.Name)).toEqual(['numeric']);
|
|
171
|
+
});
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=UUIDCollections.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UUIDCollections.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCollections.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UUIDCompliance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"UUIDCompliance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"AA2PA,mEAAmE;AACnE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAuB5E"}
|
|
@@ -9,10 +9,13 @@
|
|
|
9
9
|
*
|
|
10
10
|
* If this test fails, it means new code introduced a direct UUID comparison.
|
|
11
11
|
* Fix by replacing `x.ID === y` with `UUIDsEqual(x.ID, y)`.
|
|
12
|
+
*
|
|
13
|
+
* A second test fails when a KNOWN_EXCEPTIONS entry no longer excepts anything.
|
|
12
14
|
*/
|
|
13
15
|
import { describe, it, expect } from 'vitest';
|
|
14
16
|
import * as fs from 'fs';
|
|
15
17
|
import * as path from 'path';
|
|
18
|
+
import ts from 'typescript';
|
|
16
19
|
/** Directories that should never contain UUID comparison anti-patterns */
|
|
17
20
|
const SCAN_ROOT = path.resolve(__dirname, '..', '..', '..'); // packages/
|
|
18
21
|
/** Patterns that indicate direct UUID comparison (anti-patterns) */
|
|
@@ -48,15 +51,15 @@ const EXCLUDE_PATTERNS = [
|
|
|
48
51
|
];
|
|
49
52
|
/** Known exceptions — files where .ID === is comparing non-UUID values (e.g., numeric IDs, string enum values).
|
|
50
53
|
* Keys MUST use forward slashes; the test normalizes scanned paths to forward slashes before lookup so
|
|
51
|
-
* the same exception list works on Windows and Unix.
|
|
54
|
+
* the same exception list works on Windows and Unix.
|
|
55
|
+
* An entry takes its whole file out of the scan, so a UUID comparison added there later would pass unnoticed.
|
|
56
|
+
* Each entry must therefore still be needed: the second test fails when an entry's file is gone or no longer
|
|
57
|
+
* holds a line the scan flags. Remove the entry when the comparison it was for goes. */
|
|
52
58
|
const KNOWN_EXCEPTIONS = {
|
|
53
59
|
'TestingFramework/integration-test-suite/src/checks/entity-writes.checks.ts': ['EW6 deliberately compares UUID CASE (flips it, then asserts the flip differs) to prove the case-insensitive FK round-trip — using UUIDsEqual there would defeat the check'],
|
|
54
60
|
// Add file paths (relative to packages/) and the reason they're excepted
|
|
55
61
|
// Example: 'SomePackage/src/file.ts': ['Uses numeric IDs, not UUIDs'],
|
|
56
62
|
'Angular/Explorer/dashboards/src/Integration/components/mapping-workspace/mapping-workspace.component.ts': ['LocalID is a local string identifier (e.g. "pending-1"), not a UUID'],
|
|
57
|
-
'Angular/Explorer/explorer-core/src/lib/resource-wrappers/livekit-room-resource.component.ts': ['Voice .ID is a provider-native voice slug (e.g. "echo"), not a UUID — RealtimeVoiceOption.ID'],
|
|
58
|
-
'Angular/Generic/mj-livekit-room/src/lib/mj-livekit-room.component.ts': ['Voice .ID is a provider-native voice slug (e.g. "echo"), not a UUID — RealtimeVoiceOption.ID'],
|
|
59
|
-
'AI/Agents/src/realtime/bridge-realtime-session-factory.ts': ['Voice .ID is a provider voice API name slug (e.g. "alloy", "echo"), not a UUID — RealtimeVoiceOption.ID'],
|
|
60
63
|
};
|
|
61
64
|
/** Normalize a path to forward slashes so EXCLUDE_PATTERNS and KNOWN_EXCEPTIONS lookups
|
|
62
65
|
* work identically on Windows and Unix. Without this, `\generated\` on Windows
|
|
@@ -91,9 +94,6 @@ function findTsFiles(dir) {
|
|
|
91
94
|
return results;
|
|
92
95
|
}
|
|
93
96
|
function scanFileForViolations(filePath) {
|
|
94
|
-
const violations = [];
|
|
95
|
-
const content = fs.readFileSync(filePath, 'utf-8');
|
|
96
|
-
const lines = content.split('\n');
|
|
97
97
|
// Check if file is in known exceptions. Normalize to forward slashes —
|
|
98
98
|
// path.relative produces backslash-separated paths on Windows, but
|
|
99
99
|
// KNOWN_EXCEPTIONS keys are intentionally written with forward slashes
|
|
@@ -102,6 +102,14 @@ function scanFileForViolations(filePath) {
|
|
|
102
102
|
if (KNOWN_EXCEPTIONS[relativePath]) {
|
|
103
103
|
return [];
|
|
104
104
|
}
|
|
105
|
+
return findFlaggedLines(filePath, relativePath);
|
|
106
|
+
}
|
|
107
|
+
/** Every line in one file that the scan flags, without consulting KNOWN_EXCEPTIONS. The stale-exception
|
|
108
|
+
* test uses it to confirm that each excepted file still holds a line its exception is for. */
|
|
109
|
+
function findFlaggedLines(filePath, relativePath) {
|
|
110
|
+
const violations = [];
|
|
111
|
+
const content = fs.readFileSync(filePath, 'utf-8');
|
|
112
|
+
const lines = content.split('\n');
|
|
105
113
|
for (let i = 0; i < lines.length; i++) {
|
|
106
114
|
const line = lines[i];
|
|
107
115
|
const trimmed = line.trim();
|
|
@@ -155,10 +163,284 @@ describe('UUID Comparison Compliance', () => {
|
|
|
155
163
|
`Fix by replacing:\n` +
|
|
156
164
|
` - 'x.ID === y' with 'UUIDsEqual(x.ID, y)'\n` +
|
|
157
165
|
` - 'x.ID !== y' with '!UUIDsEqual(x.ID, y)'\n` +
|
|
158
|
-
` - 'arr.includes(x.ID)' with 'arr.
|
|
166
|
+
` - 'arr.includes(x.ID)' with 'new UUIDSet(arr).Has(x.ID)' (or UUIDsEqual for a single check)\n` +
|
|
159
167
|
`Import UUIDsEqual from '@memberjunction/global'.\n` +
|
|
160
168
|
`If a comparison is NOT a UUID (e.g., numeric ID), add it to KNOWN_EXCEPTIONS in this test file.`);
|
|
161
169
|
}
|
|
162
170
|
});
|
|
171
|
+
it('should not keep KNOWN_EXCEPTIONS entries whose file no longer has a comparison the scan flags', () => {
|
|
172
|
+
const staleEntries = [];
|
|
173
|
+
for (const relativePath of Object.keys(KNOWN_EXCEPTIONS)) {
|
|
174
|
+
const filePath = path.join(SCAN_ROOT, relativePath);
|
|
175
|
+
if (!fs.existsSync(filePath) || !shouldScanFile(filePath)) {
|
|
176
|
+
staleEntries.push(` ${relativePath}: the scan reads no file at this path`);
|
|
177
|
+
}
|
|
178
|
+
else if (findFlaggedLines(filePath, relativePath).length === 0) {
|
|
179
|
+
staleEntries.push(` ${relativePath}: the scan flags no line in it`);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
if (staleEntries.length > 0) {
|
|
183
|
+
expect.fail(`Found ${staleEntries.length} KNOWN_EXCEPTIONS entry(ies) that no longer except anything:\n` +
|
|
184
|
+
`${staleEntries.join('\n')}\n\n` +
|
|
185
|
+
`An entry takes its whole file out of the scan, so a UUID comparison added there later would pass unnoticed.\n` +
|
|
186
|
+
`Remove these entries from KNOWN_EXCEPTIONS in this test file.`);
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
});
|
|
190
|
+
/**
|
|
191
|
+
* Nested UUID scans
|
|
192
|
+
*
|
|
193
|
+
* `outer.filter(x => inner.some(y => UUIDsEqual(x.ID, y)))` compares every item of one list with
|
|
194
|
+
* every item of another: O(n x m), and each mismatch lowercases both strings. Inside a per-render
|
|
195
|
+
* path (a getter, a template-bound method) that cost repeats on every change-detection pass — this
|
|
196
|
+
* pegged a CPU core on a generated form (#4715). The set-based helpers do the same work in O(n + m).
|
|
197
|
+
*
|
|
198
|
+
* Detection walks the TypeScript AST (a regex cannot tell nesting from chaining): it flags a
|
|
199
|
+
* `.some` / `.every` / `.find` / `.findIndex` / `.findLast` / `.filter` whose arguments call
|
|
200
|
+
* `UUIDsEqual`, when that call sits inside the callback of an outer array iteration or inside a
|
|
201
|
+
* loop body. A single `.find(x => UUIDsEqual(x.ID, id))` at the top level is fine and not flagged.
|
|
202
|
+
*
|
|
203
|
+
* KNOWN LIMITATION: only a DIRECT `UUIDsEqual` call is seen. A scan hidden one call away — a
|
|
204
|
+
* helper such as `const isChild = (r) => childIds.some(id => UUIDsEqual(id, r.ID))` invoked from
|
|
205
|
+
* inside `.filter(...)` — is not flagged, because the walker does not follow calls into other
|
|
206
|
+
* functions. Treat a passing check as "no direct nested scans", not "no quadratic matching".
|
|
207
|
+
*
|
|
208
|
+
* NESTED_SCAN_BASELINE records the sites that predate this check, per file. It is a ratchet: a file
|
|
209
|
+
* may not gain sites, and when a file's count drops the baseline must be lowered to match, so fixed
|
|
210
|
+
* sites cannot quietly come back. Burn it down; don't grow it.
|
|
211
|
+
*/
|
|
212
|
+
const OUTER_ITERATIONS = new Set(['filter', 'map', 'flatMap', 'some', 'every', 'find', 'findIndex', 'findLast', 'forEach', 'reduce']);
|
|
213
|
+
const INNER_SCANS = new Set(['some', 'every', 'find', 'findIndex', 'findLast', 'filter']);
|
|
214
|
+
function methodName(call) {
|
|
215
|
+
return ts.isPropertyAccessExpression(call.expression) ? call.expression.name.text : undefined;
|
|
216
|
+
}
|
|
217
|
+
function callsUUIDsEqual(node) {
|
|
218
|
+
if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === 'UUIDsEqual')
|
|
219
|
+
return true;
|
|
220
|
+
return ts.forEachChild(node, callsUUIDsEqual) ?? false;
|
|
221
|
+
}
|
|
222
|
+
function isLoop(node) {
|
|
223
|
+
return ts.isForOfStatement(node) || ts.isForInStatement(node) || ts.isForStatement(node) || ts.isWhileStatement(node) || ts.isDoStatement(node);
|
|
224
|
+
}
|
|
225
|
+
/** 1-based lines of nested UUIDsEqual scans in one source file. */
|
|
226
|
+
export function FindNestedUUIDScans(fileName, text) {
|
|
227
|
+
const source = ts.createSourceFile(fileName, text, ts.ScriptTarget.Latest, true);
|
|
228
|
+
const lines = [];
|
|
229
|
+
const visit = (node, insideIteration) => {
|
|
230
|
+
if (ts.isCallExpression(node)) {
|
|
231
|
+
const name = methodName(node);
|
|
232
|
+
if (insideIteration && name && INNER_SCANS.has(name) && node.arguments.some(callsUUIDsEqual)) {
|
|
233
|
+
lines.push(source.getLineAndCharacterOfPosition(node.getStart(source)).line + 1);
|
|
234
|
+
}
|
|
235
|
+
if (name && OUTER_ITERATIONS.has(name)) {
|
|
236
|
+
visit(node.expression, insideIteration);
|
|
237
|
+
for (const arg of node.arguments)
|
|
238
|
+
visit(arg, insideIteration || ts.isArrowFunction(arg) || ts.isFunctionExpression(arg));
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
if (isLoop(node)) {
|
|
243
|
+
ts.forEachChild(node, (child) => visit(child, insideIteration || child === node.statement));
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
ts.forEachChild(node, (child) => visit(child, insideIteration));
|
|
247
|
+
};
|
|
248
|
+
visit(source, false);
|
|
249
|
+
return lines;
|
|
250
|
+
}
|
|
251
|
+
/** Nested-scan sites per file (relative to packages/) that predate the check. Lower these as sites are fixed. */
|
|
252
|
+
const NESTED_SCAN_BASELINE = {
|
|
253
|
+
'AI/AgentManager/core/src/agent-spec-sync.ts': 6,
|
|
254
|
+
'AI/Agents/src/ArtifactToolManager.ts': 1,
|
|
255
|
+
'AI/Agents/src/SkillImportExportService.ts': 1,
|
|
256
|
+
'AI/Agents/src/base-agent.ts': 29,
|
|
257
|
+
'AI/Agents/src/decision-discovery.ts': 1,
|
|
258
|
+
'AI/Agents/src/memory-note-gate.ts': 1,
|
|
259
|
+
'AI/Agents/src/realtime/realtime-client-session-service.ts': 2,
|
|
260
|
+
'AI/BaseAIEngine/src/AIAgentPermissionHelper.ts': 1,
|
|
261
|
+
'AI/BaseAIEngine/src/AISkillPermissionHelper.ts': 1,
|
|
262
|
+
'AI/BaseAIEngine/src/BaseAIEngine.ts': 10,
|
|
263
|
+
'AI/CorePlus/src/conversation-routing-decision.ts': 1,
|
|
264
|
+
'AI/CorePlus/src/task-graph/flow-graph-compiler.ts': 1,
|
|
265
|
+
'AI/Knowledge/TagEngine/src/TagEngine.ts': 1,
|
|
266
|
+
'AI/PredictiveStudio/Engine/src/experiment/experiment-orchestrator.ts': 1,
|
|
267
|
+
'AI/Prompts/src/BaseModelRunner.ts': 2,
|
|
268
|
+
'AI/Prompts/src/ExecutionPlanner.ts': 4,
|
|
269
|
+
'Actions/ContentAutotag/src/generic/content-autotag-and-vectorize.action.ts': 3,
|
|
270
|
+
'Actions/CoreActions/src/custom/ai/base-find-agents.action.ts': 1,
|
|
271
|
+
'Actions/CoreActions/src/custom/ai/generate-image.action.ts': 1,
|
|
272
|
+
'Actions/CoreActions/src/custom/interactive-forms/get-form-composition-for-entity.action.ts': 1,
|
|
273
|
+
'Actions/CoreActions/src/custom/user-management/assign-user-roles.action.ts': 2,
|
|
274
|
+
'Actions/Engine/src/entity-actions/EntityActionInvocationTypes.ts': 2,
|
|
275
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/AIAgentSessions/ai-agent-session-form.component.ts': 1,
|
|
276
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/AIAgents/add-action-dialog.component.ts': 1,
|
|
277
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/AIAgents/ai-agent-form.component.ts': 5,
|
|
278
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/AIAgents/create-sub-agent-dialog.component.ts': 2,
|
|
279
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/AIPrompts/ai-prompt-form.component.ts': 1,
|
|
280
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/Rubrics/rubric-form.component.ts': 1,
|
|
281
|
+
'Angular/Explorer/core-entity-forms/src/lib/custom/ai-agent-run/ai-agent-run-analytics.component.ts': 1,
|
|
282
|
+
'Angular/Explorer/dashboards/src/AI/components/agents/agent-configuration.component.ts': 1,
|
|
283
|
+
'Angular/Explorer/dashboards/src/AI/components/agents/agent-editor.component.ts': 1,
|
|
284
|
+
'Angular/Explorer/dashboards/src/AI/components/autotagging/tabs/health-tab.component.ts': 1,
|
|
285
|
+
'Angular/Explorer/dashboards/src/AI/components/system/system-configuration.component.ts': 3,
|
|
286
|
+
'Angular/Explorer/dashboards/src/AI/components/vectors/vector-management-resource.component.ts': 2,
|
|
287
|
+
'Angular/Explorer/dashboards/src/Actions/components/explorer/new-action-panel.component.ts': 1,
|
|
288
|
+
'Angular/Explorer/dashboards/src/Actions/components/explorer/new-category-panel.component.ts': 1,
|
|
289
|
+
'Angular/Explorer/dashboards/src/Credentials/components/credentials-overview-resource.component.ts': 2,
|
|
290
|
+
'Angular/Explorer/dashboards/src/DashboardBrowser/dashboard-library-filter.ts': 1,
|
|
291
|
+
'Angular/Explorer/dashboards/src/DataExplorer/services/explorer-state.service.ts': 5,
|
|
292
|
+
'Angular/Explorer/dashboards/src/Integration/components/pipelines/pipelines.component.ts': 1,
|
|
293
|
+
'Angular/Explorer/dashboards/src/Lists/components/lists-operations-resource.component.ts': 1,
|
|
294
|
+
'Angular/Explorer/dashboards/src/MCP/mcp-dashboard.component.ts': 6,
|
|
295
|
+
'Angular/Explorer/dashboards/src/PredictiveStudio/engine/predictive-studio.engine.ts': 1,
|
|
296
|
+
'Angular/Explorer/dashboards/src/QueryBrowser/query-browser-resource.component.ts': 1,
|
|
297
|
+
'Angular/Explorer/dashboards/src/Scheduling/services/scheduling-instrumentation.service.ts': 1,
|
|
298
|
+
'Angular/Explorer/dashboards/src/Testing/components/testing-explorer.component.ts': 1,
|
|
299
|
+
'Angular/Explorer/dashboards/src/shared/dashboard-recents.ts': 1,
|
|
300
|
+
'Angular/Explorer/explorer-core/src/lib/dashboard-preferences-dialog/dashboard-preferences-dialog.component.ts': 1,
|
|
301
|
+
'Angular/Explorer/explorer-core/src/lib/profile/profile-dialog.component.ts': 1,
|
|
302
|
+
'Angular/Explorer/explorer-core/src/lib/resource-wrappers/compose-email-fallback.ts': 1,
|
|
303
|
+
'Angular/Explorer/explorer-core/src/lib/resource-wrappers/dashboard-studio-tools.ts': 1,
|
|
304
|
+
'Angular/Explorer/explorer-core/src/lib/resource-wrappers/dashboard-tab-agent.ts': 1,
|
|
305
|
+
'Angular/Explorer/explorer-core/src/lib/user-profile/user-profile.component.ts': 1,
|
|
306
|
+
'Angular/Explorer/explorer-settings/src/lib/application-settings/application-settings.component.ts': 1,
|
|
307
|
+
'Angular/Explorer/explorer-settings/src/lib/entity-permissions/permission-dialog/permission-dialog.component.ts': 1,
|
|
308
|
+
'Angular/Explorer/explorer-settings/src/lib/notification-preferences/notification-preferences.component.ts': 1,
|
|
309
|
+
'Angular/Explorer/explorer-settings/src/lib/user-app-config/user-app-config-content.component.ts': 1,
|
|
310
|
+
'Angular/Explorer/shared/src/lib/dashboard-favorites.ts': 1,
|
|
311
|
+
'Angular/Generic/Testing/src/lib/components/test-run-dialog.component.ts': 1,
|
|
312
|
+
'Angular/Generic/action-gallery/src/lib/action-gallery.component.ts': 1,
|
|
313
|
+
'Angular/Generic/agents/src/lib/components/agent-rubrics.component.ts': 1,
|
|
314
|
+
'Angular/Generic/ai-test-harness/src/lib/ai-test-harness.component.ts': 3,
|
|
315
|
+
'Angular/Generic/conversations/src/lib/components/agent/agent-process-panel.component.ts': 1,
|
|
316
|
+
'Angular/Generic/conversations/src/lib/services/conversation-agent.service.ts': 2,
|
|
317
|
+
'Angular/Generic/conversations/src/lib/services/user-authorization.ts': 1,
|
|
318
|
+
'Angular/Generic/credentials/src/lib/panels/credential-category-edit-panel/credential-category-edit-panel.component.ts': 1,
|
|
319
|
+
'Angular/Generic/dashboard-viewer/src/lib/breadcrumb/dashboard-breadcrumb.component.ts': 1,
|
|
320
|
+
'Angular/Generic/dashboard-viewer/src/lib/dashboard-browser/dashboard-browser.component.ts': 1,
|
|
321
|
+
'Angular/Generic/dashboard-viewer/src/lib/dashboard-card/dashboard-card.helpers.ts': 1,
|
|
322
|
+
'Angular/Generic/entity-communication/src/lib/preview.component.ts': 1,
|
|
323
|
+
'Angular/Generic/entity-viewer/src/lib/entity-data-grid/entity-data-grid.component.ts': 2,
|
|
324
|
+
'Angular/Generic/file-storage/src/lib/admin/storage-admin-dialog.component.ts': 1,
|
|
325
|
+
'Angular/Generic/file-storage/src/lib/record-attachments/record-attachments.component.ts': 3,
|
|
326
|
+
'Angular/Generic/flow-editor/src/lib/agent-editor/flow-agent-editor.component.ts': 2,
|
|
327
|
+
'Angular/Generic/flow-editor/src/lib/agent-editor/flow-run-check.ts': 1,
|
|
328
|
+
'Angular/Generic/list-management/src/lib/components/list-management-dialog/list-management-dialog.component.ts': 3,
|
|
329
|
+
'Angular/Generic/resource-permissions/src/lib/resource-share-dialog.component.ts': 1,
|
|
330
|
+
'Angular/Generic/rubrics/src/lib/model.ts': 2,
|
|
331
|
+
'Angular/Generic/search/src/lib/search-scope-child-grid.component.ts': 1,
|
|
332
|
+
'Angular/Generic/search/src/lib/search-scope-selector.component.ts': 1,
|
|
333
|
+
'Angular/Generic/versions/src/lib/record-micro-view/record-micro-view.component.ts': 1,
|
|
334
|
+
'CodeGenLib/src/Angular/angular-codegen.ts': 1,
|
|
335
|
+
'CodeGenLib/src/Database/manage-metadata.ts': 6,
|
|
336
|
+
'CodeGenLib/src/Database/sql_codegen.ts': 8,
|
|
337
|
+
'CodeGenLib/src/Misc/action_subclasses_codegen.ts': 2,
|
|
338
|
+
'Communication/base-types/src/BaseEngine.ts': 1,
|
|
339
|
+
'Communication/entity-comm-base/src/base.ts': 1,
|
|
340
|
+
'ContentAutotagging/src/Entity/generic/AutotagEntity.ts': 1,
|
|
341
|
+
'ConversationsRuntime/src/agent-runner/ConversationAgentRunner.ts': 1,
|
|
342
|
+
'ConversationsRuntime/src/mentions/MentionAutocomplete.ts': 1,
|
|
343
|
+
'DocUtils/src/Engine.ts': 1,
|
|
344
|
+
'GenericDatabaseProvider/src/GenericDatabaseProvider.ts': 2,
|
|
345
|
+
'GenericDatabaseProvider/src/queryCompositionEngine.ts': 1,
|
|
346
|
+
'MJCore/src/generic/baseEngine.ts': 1,
|
|
347
|
+
'MJCore/src/generic/entityInfo.ts': 6,
|
|
348
|
+
'MJCore/src/generic/providerBase.ts': 3,
|
|
349
|
+
'MJCore/src/generic/securityInfo.ts': 1,
|
|
350
|
+
'MJCoreEntities/src/custom/MJQueryEntityExtended.ts': 3,
|
|
351
|
+
'MJCoreEntities/src/custom/PermissionProviders/AIAgentPermissionProvider.ts': 1,
|
|
352
|
+
'MJCoreEntities/src/custom/PermissionProviders/AISkillPermissionProvider.ts': 1,
|
|
353
|
+
'MJCoreEntities/src/custom/PermissionProviders/EntityPermissionProvider.ts': 1,
|
|
354
|
+
'MJCoreEntities/src/custom/PermissionProviders/QueryPermissionProvider.ts': 3,
|
|
355
|
+
'MJCoreEntities/src/custom/PermissionProviders/ResourcePermissionProvider.ts': 4,
|
|
356
|
+
'MJCoreEntities/src/custom/ResourcePermissions/ResourcePermissionEngine.ts': 2,
|
|
357
|
+
'MJCoreEntities/src/engines/FileStorageEngine.ts': 1,
|
|
358
|
+
'MJCoreEntities/src/engines/UserInfoEngine.ts': 2,
|
|
359
|
+
'MJCoreEntities/src/engines/conversations.ts': 2,
|
|
360
|
+
'MJCoreEntities/src/engines/interactive-forms.ts': 2,
|
|
361
|
+
'MJCoreEntitiesServer/src/custom/MJApplicationEntityServer.server.ts': 1,
|
|
362
|
+
'MJCoreEntitiesServer/src/custom/MJEntityFieldPermissionEntityServer.server.ts': 1,
|
|
363
|
+
'MJCoreEntitiesServer/src/custom/MJUserRoleEntityServer.server.ts': 2,
|
|
364
|
+
'MJCoreEntitiesServer/src/custom/query-extraction/sync.ts': 7,
|
|
365
|
+
'MJCoreEntitiesServer/src/custom/rubrics/evaluationSubmit.ts': 2,
|
|
366
|
+
'MJCoreEntitiesServer/src/custom/rubrics/versionPublish.ts': 1,
|
|
367
|
+
'MJServer/src/resolvers/IntegrationDiscoveryResolver.ts': 1,
|
|
368
|
+
'MJServer/src/resolvers/SyncRolesUsersResolver.ts': 1,
|
|
369
|
+
'MJServer/src/resolvers/meetings/meetingMutations.ts': 1,
|
|
370
|
+
'Rubrics/Base/src/authoring.ts': 2,
|
|
371
|
+
'Rubrics/Engine/src/rubricCli.ts': 2,
|
|
372
|
+
'Scheduling/engine/src/drivers/ActionScheduledJobDriver.ts': 1,
|
|
373
|
+
'SearchEngine/src/generic/SearchEngine.ts': 4,
|
|
374
|
+
'SearchEngine/src/generic/StorageSearchProvider.ts': 4,
|
|
375
|
+
'SearchEngine/src/generic/VectorSearchProvider.ts': 2,
|
|
376
|
+
'SearchEngine/src/permissions/SearchScopePermissionResolver.ts': 1,
|
|
377
|
+
'TaskGraph/src/TaskGraphDispatcher.ts': 2,
|
|
378
|
+
'TestingFramework/CLI/src/commands/list.ts': 2,
|
|
379
|
+
'TestingFramework/CLI/src/lib/mj-provider.ts': 1,
|
|
380
|
+
'TestingFramework/Engine/src/drivers/RubricCalibrationTestDriver.ts': 1,
|
|
381
|
+
'TestingFramework/integration-test-suite/src/checks/actions-pipeline.checks.ts': 2,
|
|
382
|
+
'TestingFramework/integration-test-suite/src/checks/ai-cost.checks.ts': 6,
|
|
383
|
+
'TestingFramework/integration-test-suite/src/checks/ai-embeddings.checks.ts': 1,
|
|
384
|
+
'TestingFramework/integration-test-suite/src/checks/ai-skills.checks.ts': 1,
|
|
385
|
+
'TestingFramework/integration-test-suite/src/checks/entity-graph-client.checks.ts': 1,
|
|
386
|
+
'TestingFramework/integration-test-suite/src/checks/entity-graph.checks.ts': 2,
|
|
387
|
+
'TestingFramework/integration-test-suite/src/checks/metadata-sync-push.checks.ts': 2,
|
|
388
|
+
'TestingFramework/integration-test-suite/src/checks/realtime-deterministic.checks.ts': 1,
|
|
389
|
+
'TestingFramework/integration-test-suite/src/checks/record-cloning.checks.ts': 3,
|
|
390
|
+
'TestingFramework/integration-test-suite/src/checks/runquery-catalog.checks.ts': 1,
|
|
391
|
+
'TestingFramework/integration-test-suite/src/checks/runquery-rendering.checks.ts': 1,
|
|
392
|
+
'TestingFramework/integration-test-suite/src/checks/trailing-runtime-state.checks.ts': 3,
|
|
393
|
+
'TestingFramework/integration-test-suite/src/checks/transaction-groups-batched.checks.ts': 1,
|
|
394
|
+
'TestingFramework/integration-test-suite/src/discovery-corpus/generator.ts': 1,
|
|
395
|
+
'TestingFramework/testing-integration/src/rls-fixture.ts': 1,
|
|
396
|
+
'WorkQueue/base/src/topology/manifest.ts': 1,
|
|
397
|
+
'WorkQueue/engine/src/operations/WorkQueueOperatorService.ts': 1,
|
|
398
|
+
};
|
|
399
|
+
describe('Nested UUID scan compliance', () => {
|
|
400
|
+
it('flags only scans nested inside another iteration or a loop', () => {
|
|
401
|
+
const flagged = (code) => FindNestedUUIDScans('sample.ts', code);
|
|
402
|
+
expect(flagged('const x = rows.filter(r => ids.some(id => UUIDsEqual(id, r.ID)));')).toEqual([1]);
|
|
403
|
+
expect(flagged('for (const r of rows) {\n const m = others.find(o => UUIDsEqual(o.ID, r.ID));\n}')).toEqual([2]);
|
|
404
|
+
expect(flagged('rows.forEach(function (r) { ids.findIndex(id => UUIDsEqual(id, r.ID)); });')).toEqual([1]);
|
|
405
|
+
// Top-level lookups and chains are linear and must not be flagged.
|
|
406
|
+
expect(flagged('const m = rows.find(r => UUIDsEqual(r.ID, id));')).toEqual([]);
|
|
407
|
+
expect(flagged('const m = rows.filter(r => r.Active).find(r => UUIDsEqual(r.ID, id));')).toEqual([]);
|
|
408
|
+
expect(flagged('const m = rows.filter(r => wanted.Has(r.ID));')).toEqual([]);
|
|
409
|
+
});
|
|
410
|
+
it('does not add nested UUIDsEqual scans beyond the recorded baseline', () => {
|
|
411
|
+
const counts = new Map();
|
|
412
|
+
for (const file of findTsFiles(SCAN_ROOT)) {
|
|
413
|
+
const text = fs.readFileSync(file, 'utf-8');
|
|
414
|
+
if (!text.includes('UUIDsEqual'))
|
|
415
|
+
continue;
|
|
416
|
+
const sites = FindNestedUUIDScans(file, text);
|
|
417
|
+
if (sites.length > 0)
|
|
418
|
+
counts.set(normalizePath(path.relative(SCAN_ROOT, file)), sites.length);
|
|
419
|
+
}
|
|
420
|
+
const grown = [];
|
|
421
|
+
const stale = [];
|
|
422
|
+
for (const [file, count] of counts) {
|
|
423
|
+
const allowed = NESTED_SCAN_BASELINE[file] ?? 0;
|
|
424
|
+
if (count > allowed)
|
|
425
|
+
grown.push(` ${file}: ${count} nested scan(s), baseline allows ${allowed}`);
|
|
426
|
+
}
|
|
427
|
+
for (const [file, allowed] of Object.entries(NESTED_SCAN_BASELINE)) {
|
|
428
|
+
const count = counts.get(file) ?? 0;
|
|
429
|
+
if (count < allowed)
|
|
430
|
+
stale.push(` ${file}: baseline ${allowed}, now ${count} — lower it to ${count}${count === 0 ? ' (remove the entry)' : ''}`);
|
|
431
|
+
}
|
|
432
|
+
if (grown.length > 0 || stale.length > 0) {
|
|
433
|
+
expect.fail((grown.length > 0
|
|
434
|
+
? `New nested UUIDsEqual scan(s) — O(n x m), and each miss allocates two strings:\n${grown.join('\n')}\n\n` +
|
|
435
|
+
`Match against a set instead (@memberjunction/global):\n` +
|
|
436
|
+
` - keep matches: FilterByUUIDs(items, ids[, item => item.OtherID])\n` +
|
|
437
|
+
` - drop matches: ExcludeByUUIDs(items, ids[, getId])\n` +
|
|
438
|
+
` - count per ID: CountByUUID(items[, getId]).Get(id)\n` +
|
|
439
|
+
` - look up by ID: IndexByUUID(items[, getId]).Get(id) / new UUIDMap(...), new UUIDSet(...)\n` +
|
|
440
|
+
`See guides/UUID_COMPARISON_GUIDE.md, Pattern 8.\n\n`
|
|
441
|
+
: '') +
|
|
442
|
+
(stale.length > 0 ? `Nested-scan baseline is stale (sites were fixed — ratchet it down in UUIDCompliance.test.ts):\n${stale.join('\n')}\n` : ''));
|
|
443
|
+
}
|
|
444
|
+
});
|
|
163
445
|
});
|
|
164
446
|
//# sourceMappingURL=UUIDCompliance.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UUIDCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/UUIDCompliance.test.ts"],"names":[],"mappings":"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"}
|