@memlab/core 2.0.3 → 2.0.5
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__/lib/HeapAnonymizer.test.d.ts +11 -0
- package/dist/__tests__/lib/HeapAnonymizer.test.d.ts.map +1 -0
- package/dist/__tests__/lib/HeapAnonymizer.test.js +377 -0
- package/dist/__tests__/trace-cluster/MLTraceSimilarityStrategy.test.d.ts +11 -0
- package/dist/__tests__/trace-cluster/MLTraceSimilarityStrategy.test.d.ts.map +1 -0
- package/dist/__tests__/trace-cluster/MLTraceSimilarityStrategy.test.js +50 -0
- package/dist/__tests__/utils/Utils.test.js +11 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -1
- package/dist/lib/HeapAnonymizer.d.ts +362 -0
- package/dist/lib/HeapAnonymizer.d.ts.map +1 -0
- package/dist/lib/HeapAnonymizer.js +670 -0
- package/dist/lib/HeapSerializer.d.ts +125 -0
- package/dist/lib/HeapSerializer.d.ts.map +1 -0
- package/dist/lib/HeapSerializer.js +315 -0
- package/dist/lib/Types.d.ts.map +1 -1
- package/dist/lib/Utils.d.ts.map +1 -1
- package/dist/lib/Utils.js +12 -0
- package/dist/lib/leak-filters/BaseLeakFilter.rule.d.ts.map +1 -1
- package/dist/lib/leak-filters/rules/FilterUserTaggedLeaks.rule.d.ts.map +1 -1
- package/dist/lib/leak-filters/rules/FilterUserTaggedLeaks.rule.js +17 -2
- package/dist/lib/trace-filters/rules/FilterAttachedDOMToDetachedDOMTrace.rule.d.ts.map +1 -1
- package/dist/lib/trace-filters/rules/FilterCppRootsToDetachedDOMTrace.rule.d.ts.map +1 -1
- package/dist/paths/TraceFinder.d.ts +1 -3
- package/dist/paths/TraceFinder.d.ts.map +1 -1
- package/dist/paths/TraceFinder.js +205 -254
- package/dist/trace-cluster/strategies/MLTraceSimilarityStrategy.d.ts.map +1 -1
- package/dist/trace-cluster/strategies/MLTraceSimilarityStrategy.js +7 -2
- package/package.json +3 -3
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
3
|
+
*
|
|
4
|
+
* This source code is licensed under the MIT license found in the
|
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
|
6
|
+
*
|
|
7
|
+
* @format
|
|
8
|
+
* @lightSyntaxTransform
|
|
9
|
+
* @oncall memory_lab
|
|
10
|
+
*/
|
|
11
|
+
import type { IHeapSnapshot, RawHeapSnapshot } from './Types';
|
|
12
|
+
/**
|
|
13
|
+
* Remove user data from a heap snapshot while leaving it analyzable.
|
|
14
|
+
*
|
|
15
|
+
* A heap snapshot is a verbatim dump of everything the page had in memory, so
|
|
16
|
+
* it carries message bodies, tokens, contact ids and serialized DOM. Sharing
|
|
17
|
+
* one — with a colleague, in a task, with a model — publishes all of it. The
|
|
18
|
+
* goal here is a capture that can be shared and still answers the questions
|
|
19
|
+
* snapshots are taken to answer.
|
|
20
|
+
*
|
|
21
|
+
* **What makes that possible is that the format separates values from labels.**
|
|
22
|
+
* Every entry in the shared `strings` table is reached in one of two ways:
|
|
23
|
+
*
|
|
24
|
+
* - as the `name` of a `string` / `concatenated string` / `sliced string` node
|
|
25
|
+
* — that is the CONTENT of a JS string living on the heap, i.e. data;
|
|
26
|
+
* - as an edge name, or the `name` of an object / closure / code / native node
|
|
27
|
+
* — that is a LABEL: a class name, a function name, a property key.
|
|
28
|
+
*
|
|
29
|
+
* A retainer trace is built entirely out of labels. So redacting exactly the
|
|
30
|
+
* first kind is a type test, not a heuristic, and it leaves every trace,
|
|
31
|
+
* histogram, dominator and shape analysis fully readable.
|
|
32
|
+
*
|
|
33
|
+
* Two things that clean split does NOT cover, both of which this module also
|
|
34
|
+
* handles, because a real capture leaks through both:
|
|
35
|
+
*
|
|
36
|
+
* 1. **A label can itself be data.** An object keyed by account id, order id or
|
|
37
|
+
* session id turns user identifiers into property names — structurally a
|
|
38
|
+
* label, semantically a payload. No node-type test can tell `.addListener`
|
|
39
|
+
* from a key a database row supplied, so those are matched by shape against
|
|
40
|
+
* internet-standard formats. For identifier schemes private to one
|
|
41
|
+
* application, which no pattern list can anticipate, the report names what
|
|
42
|
+
* it could not classify and {@link AnonymizeOptions.shouldRedact} is the
|
|
43
|
+
* seam for acting on it.
|
|
44
|
+
* 2. **`native` node names can hold serialized DOM.** Browser engines write
|
|
45
|
+
* element descriptions that on one measured capture reached 78 KB of
|
|
46
|
+
* `outerHTML`, base64-inlined images and user-visible text included.
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* How redacted text is generated.
|
|
52
|
+
*
|
|
53
|
+
* - `stable` — length-preserving, and derived from the value, so equal inputs
|
|
54
|
+
* stay equal and distinct inputs stay distinct. Duplication, interning and
|
|
55
|
+
* dedup analyses therefore keep reporting the truth.
|
|
56
|
+
* - `uniform` — length-preserving fill with a single repeated character. Leaks
|
|
57
|
+
* strictly less (not even equality), but it collapses every distinct value of
|
|
58
|
+
* the same length into one, which MANUFACTURES string duplication: on one
|
|
59
|
+
* measured capture 272,234 distinct values collapsed to 607, and duplication
|
|
60
|
+
* tools then reported tens of megabytes of savings that do not exist.
|
|
61
|
+
*/
|
|
62
|
+
export type AnonymizationMode = 'stable' | 'uniform';
|
|
63
|
+
/**
|
|
64
|
+
* Options accepted by {@link anonymizeHeapSnapshot}.
|
|
65
|
+
*/
|
|
66
|
+
export type AnonymizeOptions = {
|
|
67
|
+
/**
|
|
68
|
+
* how replacement text is generated, defaults to `stable`
|
|
69
|
+
* (see {@link AnonymizationMode})
|
|
70
|
+
*/
|
|
71
|
+
mode?: AnonymizationMode;
|
|
72
|
+
/**
|
|
73
|
+
* salt mixed into `stable` replacements. The default is the empty string,
|
|
74
|
+
* which is deterministic ACROSS FILES — the same value anonymizes to the
|
|
75
|
+
* same token in every capture, so a ladder of snapshots stays diffable. That
|
|
76
|
+
* also means a deterministic token is confirmable by anyone holding a
|
|
77
|
+
* candidate value; pass an explicit salt for anything leaving your trust
|
|
78
|
+
* boundary, and reuse that one salt across every file in the set.
|
|
79
|
+
*/
|
|
80
|
+
salt?: string;
|
|
81
|
+
/**
|
|
82
|
+
* also redact node names that look like serialized DOM, defaults to `true`
|
|
83
|
+
*/
|
|
84
|
+
redactDomText?: boolean;
|
|
85
|
+
/**
|
|
86
|
+
* also redact string table entries whose CONTENT looks like an identifier,
|
|
87
|
+
* wherever they are referenced — including as property names, defaults to
|
|
88
|
+
* `true`
|
|
89
|
+
*/
|
|
90
|
+
redactIdentifierKeys?: boolean;
|
|
91
|
+
/**
|
|
92
|
+
* how many consecutive digits make a string an identifier rather than an
|
|
93
|
+
* array index, defaults to `9`. Chosen from the data: V8 emits exhaustive
|
|
94
|
+
* runs of short numeric index names (10 one-digit, 90 two-digit, 900
|
|
95
|
+
* three-digit ... 138,432 six-digit on one capture) and then the count falls
|
|
96
|
+
* off a cliff, so a floor in that gap separates indices from ids.
|
|
97
|
+
*/
|
|
98
|
+
minDigitRunLength?: number;
|
|
99
|
+
/** extra patterns to redact, matched against the string table entry */
|
|
100
|
+
extraPatterns?: RegExp[];
|
|
101
|
+
/** patterns that must NEVER be redacted; these win over every built-in rule */
|
|
102
|
+
keepPatterns?: RegExp[];
|
|
103
|
+
/**
|
|
104
|
+
* the final say on any entry, consulted BEFORE every built-in rule.
|
|
105
|
+
*
|
|
106
|
+
* No fixed rule set can know an identifier scheme private to one application,
|
|
107
|
+
* and guessing at one inside memlab would mean shipping other people's
|
|
108
|
+
* formats to everybody. This is the seam for that instead: return `true` to
|
|
109
|
+
* redact, `false` to protect, or `undefined` to let the built-in rules
|
|
110
|
+
* decide. `AnonymizeReport.unclassifiedLabelFamilies` is the companion — it
|
|
111
|
+
* names the shapes still in the clear, which is where a caller finds out what
|
|
112
|
+
* their own scheme looks like.
|
|
113
|
+
*
|
|
114
|
+
* ```typescript
|
|
115
|
+
* anonymizeHeapSnapshot(heap, {
|
|
116
|
+
* // this app keys caches by order id: ORD-<digits>
|
|
117
|
+
* shouldRedact: (value, ctx) =>
|
|
118
|
+
* ctx.isLabel && value.startsWith('ORD-') ? true : undefined,
|
|
119
|
+
* });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
shouldRedact?: (value: string, context: RedactionContext) => boolean | undefined;
|
|
123
|
+
};
|
|
124
|
+
/**
|
|
125
|
+
* A family of labels left in the clear that share one machine-generated shape.
|
|
126
|
+
*
|
|
127
|
+
* This is how the tool generalizes past its own pattern list. No fixed set of
|
|
128
|
+
* formats can know an identifier scheme private to one application, so rather
|
|
129
|
+
* than guess, the report names what it could not classify and lets the caller
|
|
130
|
+
* decide. A family here is a prompt to look, not a finding: `d.d.d` is a
|
|
131
|
+
* version number in one app and an account id in another.
|
|
132
|
+
*/
|
|
133
|
+
export type UnclassifiedLabelFamily = {
|
|
134
|
+
/**
|
|
135
|
+
* character-class shape with runs collapsed, e.g. `d@a` for `4155551234@ex`
|
|
136
|
+
*/
|
|
137
|
+
shape: string;
|
|
138
|
+
/** how many distinct labels in the string table share it */
|
|
139
|
+
count: number;
|
|
140
|
+
/** up to three of them, verbatim, so the shape can be recognized */
|
|
141
|
+
examples: string[];
|
|
142
|
+
};
|
|
143
|
+
/**
|
|
144
|
+
* What is known about one string table entry when {@link AnonymizeOptions.shouldRedact}
|
|
145
|
+
* is asked to judge it.
|
|
146
|
+
*/
|
|
147
|
+
export type RedactionContext = {
|
|
148
|
+
/**
|
|
149
|
+
* true when this entry is the CONTENT of a string on the heap. Redacting one
|
|
150
|
+
* of these is what the node-type rule already does by default.
|
|
151
|
+
*/
|
|
152
|
+
isValue: boolean;
|
|
153
|
+
/**
|
|
154
|
+
* true when this entry is used as a class name, function name, property key,
|
|
155
|
+
* closure variable or context slot — i.e. as part of the vocabulary a
|
|
156
|
+
* retainer trace is written in. Redacting one of these costs debuggability,
|
|
157
|
+
* so it is the decision worth thinking about.
|
|
158
|
+
*/
|
|
159
|
+
isLabel: boolean;
|
|
160
|
+
/**
|
|
161
|
+
* how many edges in the whole snapshot use this entry as their name. A
|
|
162
|
+
* programmer-written property name is reused; an identifier minted per record
|
|
163
|
+
* is used once or twice. Useful for telling one from the other without
|
|
164
|
+
* knowing the format.
|
|
165
|
+
*/
|
|
166
|
+
labelUseCount: number;
|
|
167
|
+
/**
|
|
168
|
+
* character-class shape with runs collapsed, e.g. `d@a` for `4155551234@ex`
|
|
169
|
+
* or `dadada-ada-da` for a UUID prefix. Lets a caller match a scheme by shape
|
|
170
|
+
* instead of writing a precise regex.
|
|
171
|
+
*/
|
|
172
|
+
shape: string;
|
|
173
|
+
};
|
|
174
|
+
/** One rule's contribution, as reported by {@link AnonymizeReport}. */
|
|
175
|
+
export type AnonymizeRuleCount = {
|
|
176
|
+
/** the rule that matched, e.g. `dom-text` or `digit-run` */
|
|
177
|
+
rule: string;
|
|
178
|
+
/** how many distinct string table entries it matched */
|
|
179
|
+
count: number;
|
|
180
|
+
};
|
|
181
|
+
/**
|
|
182
|
+
* What {@link anonymizeHeapSnapshot} did, and — just as importantly — what it
|
|
183
|
+
* left behind.
|
|
184
|
+
*/
|
|
185
|
+
export type AnonymizeReport = {
|
|
186
|
+
/** the mode that was applied */
|
|
187
|
+
mode: AnonymizationMode;
|
|
188
|
+
/** whether a non-empty salt was used */
|
|
189
|
+
salted: boolean;
|
|
190
|
+
/** number of entries in the string table before anonymization */
|
|
191
|
+
stringTableSize: number;
|
|
192
|
+
/** string values redacted because they are the content of a string node */
|
|
193
|
+
valuesRedacted: number;
|
|
194
|
+
/**
|
|
195
|
+
* how many redacted values were written to an APPENDED table entry rather
|
|
196
|
+
* than over the original. The string table is deduplicated, so one entry can
|
|
197
|
+
* be both a string's value and a property name; splitting is what keeps
|
|
198
|
+
* redaction from destroying the label.
|
|
199
|
+
*/
|
|
200
|
+
entriesSplit: number;
|
|
201
|
+
/** entries redacted everywhere because their content looked sensitive */
|
|
202
|
+
contentRedacted: number;
|
|
203
|
+
/** the per-rule breakdown of `contentRedacted` */
|
|
204
|
+
contentRedactedByRule: AnonymizeRuleCount[];
|
|
205
|
+
/**
|
|
206
|
+
* machine-generated-looking labels still in the clear, most common first.
|
|
207
|
+
* Review these: anything here that is an identifier in YOUR application is a
|
|
208
|
+
* residual leak, and the fix is to pass it as an `extraPatterns` entry. See
|
|
209
|
+
* {@link UnclassifiedLabelFamily}.
|
|
210
|
+
*/
|
|
211
|
+
unclassifiedLabelFamilies: UnclassifiedLabelFamily[];
|
|
212
|
+
};
|
|
213
|
+
/**
|
|
214
|
+
* Rewrite a parsed heap snapshot in place so it no longer carries user data.
|
|
215
|
+
*
|
|
216
|
+
* Redacts the content of every string on the heap, plus any string table entry
|
|
217
|
+
* whose text looks like an identifier, a credential or serialized DOM. Class
|
|
218
|
+
* names, function names and ordinary property keys are left alone, so retainer
|
|
219
|
+
* traces, class histograms, dominator trees and shape analyses all still work
|
|
220
|
+
* on the result.
|
|
221
|
+
*
|
|
222
|
+
* The snapshot is modified in place and its parsed view updates with it — node
|
|
223
|
+
* names are read from the string table on each access rather than cached.
|
|
224
|
+
* Persist the result with {@link serializeHeapSnapshot}.
|
|
225
|
+
*
|
|
226
|
+
* This does not defeat a determined attacker who already knows what they are
|
|
227
|
+
* looking for: lengths are preserved exactly (they have to be, or `self_size`
|
|
228
|
+
* stops matching), and in `stable` mode equal values stay equal. It removes the
|
|
229
|
+
* content, not the shape of the content.
|
|
230
|
+
*
|
|
231
|
+
* @param snapshot the parsed heap snapshot to rewrite in place
|
|
232
|
+
* @param options see {@link AnonymizeOptions}
|
|
233
|
+
* @returns a summary of what was redacted, per rule; see
|
|
234
|
+
* {@link AnonymizeReport}
|
|
235
|
+
*
|
|
236
|
+
* * **Examples**:
|
|
237
|
+
* ```typescript
|
|
238
|
+
* import type {IHeapSnapshot} from '@memlab/core';
|
|
239
|
+
* import {
|
|
240
|
+
* dumpNodeHeapSnapshot,
|
|
241
|
+
* anonymizeHeapSnapshot,
|
|
242
|
+
* serializeHeapSnapshot,
|
|
243
|
+
* } from '@memlab/core';
|
|
244
|
+
* import {getFullHeapFromFile} from '@memlab/heap-analysis';
|
|
245
|
+
*
|
|
246
|
+
* (async function () {
|
|
247
|
+
* const file = dumpNodeHeapSnapshot();
|
|
248
|
+
* const heap: IHeapSnapshot = await getFullHeapFromFile(file);
|
|
249
|
+
*
|
|
250
|
+
* const report = anonymizeHeapSnapshot(heap);
|
|
251
|
+
* console.log(`redacted ${report.valuesRedacted} string values`);
|
|
252
|
+
*
|
|
253
|
+
* serializeHeapSnapshot(heap, '/tmp/shareable.heapsnapshot');
|
|
254
|
+
* })();
|
|
255
|
+
* ```
|
|
256
|
+
*/
|
|
257
|
+
export declare function anonymizeHeapSnapshot(snapshot: IHeapSnapshot, options?: AnonymizeOptions): AnonymizeReport;
|
|
258
|
+
/**
|
|
259
|
+
* The in-place rewrite, against the raw snapshot data.
|
|
260
|
+
*
|
|
261
|
+
* @param raw the raw snapshot data to rewrite
|
|
262
|
+
* @param options see {@link AnonymizeOptions}
|
|
263
|
+
* @returns a summary of what was redacted; see {@link AnonymizeReport}
|
|
264
|
+
*
|
|
265
|
+
* @internal
|
|
266
|
+
*/
|
|
267
|
+
export declare function anonymizeRawHeapSnapshot(raw: RawHeapSnapshot, options?: AnonymizeOptions): AnonymizeReport;
|
|
268
|
+
/**
|
|
269
|
+
* Read a snapshot file into its raw arrays, WITHOUT building the object graph.
|
|
270
|
+
*
|
|
271
|
+
* `HeapParser.parse` additionally computes referrers, dominators, detachedness
|
|
272
|
+
* and node indices — on a 7.1M-node capture that is the part that costs ~15
|
|
273
|
+
* seconds and several gigabytes. Anonymization needs none of it: it works off
|
|
274
|
+
* node types, edge names and the string table. Reading the arrays and stopping
|
|
275
|
+
* there is the difference between "shareable in a moment" and "load the whole
|
|
276
|
+
* heap first".
|
|
277
|
+
*
|
|
278
|
+
* @param file absolute path of the `.heapsnapshot` file to read
|
|
279
|
+
* @returns the snapshot's raw arrays
|
|
280
|
+
*
|
|
281
|
+
* @internal
|
|
282
|
+
*/
|
|
283
|
+
export declare function readRawHeapSnapshot(file: string): Promise<RawHeapSnapshot>;
|
|
284
|
+
/**
|
|
285
|
+
* Anonymize a `.heapsnapshot` file and write the result to another file.
|
|
286
|
+
*
|
|
287
|
+
* The file-to-file form of {@link anonymizeHeapSnapshot}, and the one to reach
|
|
288
|
+
* for when the capture is only being shared rather than analyzed here: it skips
|
|
289
|
+
* building the object graph on the way in, and streams on the way out, so
|
|
290
|
+
* neither the input nor the output is ever held as one string.
|
|
291
|
+
*
|
|
292
|
+
* @param inputFile absolute path of the capture to read
|
|
293
|
+
* @param outputFile absolute path to write the anonymized capture to; an
|
|
294
|
+
* existing file at that path is overwritten
|
|
295
|
+
* @param options see {@link AnonymizeOptions}
|
|
296
|
+
* @returns a summary of what was redacted, and what was left in the clear; see
|
|
297
|
+
* {@link AnonymizeReport}
|
|
298
|
+
*
|
|
299
|
+
* * **Examples**:
|
|
300
|
+
* ```typescript
|
|
301
|
+
* import {anonymizeHeapSnapshotFile} from '@memlab/core';
|
|
302
|
+
*
|
|
303
|
+
* (async function () {
|
|
304
|
+
* const report = await anonymizeHeapSnapshotFile(
|
|
305
|
+
* '/tmp/capture.heapsnapshot',
|
|
306
|
+
* '/tmp/shareable.heapsnapshot',
|
|
307
|
+
* );
|
|
308
|
+
* console.log(`redacted ${report.valuesRedacted} string values`);
|
|
309
|
+
* for (const family of report.unclassifiedLabelFamilies) {
|
|
310
|
+
* console.log(`still in the clear: ${family.count} x ${family.shape}`);
|
|
311
|
+
* }
|
|
312
|
+
* })();
|
|
313
|
+
* ```
|
|
314
|
+
*/
|
|
315
|
+
export declare function anonymizeHeapSnapshotFile(inputFile: string, outputFile: string, options?: AnonymizeOptions): Promise<AnonymizeReport>;
|
|
316
|
+
/**
|
|
317
|
+
* Report what anonymizing a capture WOULD remove, and what it would leave,
|
|
318
|
+
* without writing anything.
|
|
319
|
+
*
|
|
320
|
+
* Point it at a capture someone already anonymized to find out whether they
|
|
321
|
+
* missed something: `unclassifiedLabelFamilies` names the identifier-shaped
|
|
322
|
+
* text still in the clear. Run against one already-anonymized capture, this is
|
|
323
|
+
* what showed its author had removed every string VALUE and left 26,303 account
|
|
324
|
+
* handles behind as property names.
|
|
325
|
+
*
|
|
326
|
+
* @param inputFile absolute path of the capture to inspect
|
|
327
|
+
* @param options see {@link AnonymizeOptions}
|
|
328
|
+
* @returns the same summary {@link anonymizeHeapSnapshotFile} returns, for a
|
|
329
|
+
* run that was not written to disk
|
|
330
|
+
*
|
|
331
|
+
* * **Examples**:
|
|
332
|
+
* ```typescript
|
|
333
|
+
* import {auditHeapSnapshotFile} from '@memlab/core';
|
|
334
|
+
*
|
|
335
|
+
* (async function () {
|
|
336
|
+
* const report = await auditHeapSnapshotFile('/tmp/shared.heapsnapshot');
|
|
337
|
+
* console.log(report.unclassifiedLabelFamilies);
|
|
338
|
+
* })();
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
export declare function auditHeapSnapshotFile(inputFile: string, options?: AnonymizeOptions): Promise<AnonymizeReport>;
|
|
342
|
+
/**
|
|
343
|
+
* Canonical form of a path, for deciding whether two of them are the same file.
|
|
344
|
+
*
|
|
345
|
+
* A string comparison is not enough, and the cost of it being wrong here is the
|
|
346
|
+
* original capture: `a.heapsnapshot` and `./a.heapsnapshot`, an absolute and a
|
|
347
|
+
* relative spelling, or a symlink and its target are all distinct strings
|
|
348
|
+
* naming one file. `realpathSync` resolves all three.
|
|
349
|
+
*
|
|
350
|
+
* The output file usually does not exist yet, which makes `realpathSync` throw
|
|
351
|
+
* on it — so its DIRECTORY is canonicalized instead and the basename appended.
|
|
352
|
+
* That still catches a symlinked parent, which a plain `path.resolve` would
|
|
353
|
+
* miss. Falls back to `path.resolve` when even the directory is absent, since
|
|
354
|
+
* at that point the two cannot be the same existing file anyway.
|
|
355
|
+
*
|
|
356
|
+
* @param file the path to canonicalize
|
|
357
|
+
* @returns a path safe to compare against another canonicalized path
|
|
358
|
+
*
|
|
359
|
+
* @internal
|
|
360
|
+
*/
|
|
361
|
+
export declare function resolveForComparison(file: string): string;
|
|
362
|
+
//# sourceMappingURL=HeapAnonymizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HeapAnonymizer.d.ts","sourceRoot":"","sources":["../../src/lib/HeapAnonymizer.ts"],"names":[],"mappings":"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"}
|