@datadog/pprof 5.13.5 → 5.14.1
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 +6 -2
- package/out/src/heap-profiler-bindings.d.ts +2 -2
- package/out/src/heap-profiler-bindings.js +3 -3
- package/out/src/heap-profiler-bindings.js.map +1 -1
- package/out/src/heap-profiler.d.ts +16 -4
- package/out/src/heap-profiler.js +29 -17
- package/out/src/heap-profiler.js.map +1 -1
- package/out/src/index.d.ts +1 -0
- package/out/src/index.js +1 -0
- package/out/src/index.js.map +1 -1
- package/out/src/profile-serializer.d.ts +2 -1
- package/out/src/profile-serializer.js +17 -9
- package/out/src/profile-serializer.js.map +1 -1
- package/out/src/sourcemapper/sourcemapper.d.ts +38 -7
- package/out/src/sourcemapper/sourcemapper.js +250 -72
- package/out/src/sourcemapper/sourcemapper.js.map +1 -1
- package/out/src/time-profiler.d.ts +7 -2
- package/out/src/time-profiler.js +46 -18
- package/out/src/time-profiler.js.map +1 -1
- package/out/src/v8-types.d.ts +3 -0
- package/package.json +5 -5
- package/prebuilds/darwin-arm64/node-108.node +0 -0
- package/prebuilds/darwin-arm64/node-111.node +0 -0
- package/prebuilds/darwin-arm64/node-115.node +0 -0
- package/prebuilds/darwin-arm64/node-120.node +0 -0
- package/prebuilds/darwin-arm64/node-127.node +0 -0
- package/prebuilds/darwin-arm64/node-131.node +0 -0
- package/prebuilds/darwin-arm64/node-137.node +0 -0
- package/prebuilds/darwin-arm64/node-141.node +0 -0
- package/prebuilds/darwin-x64/node-108.node +0 -0
- package/prebuilds/darwin-x64/node-111.node +0 -0
- package/prebuilds/darwin-x64/node-115.node +0 -0
- package/prebuilds/darwin-x64/node-120.node +0 -0
- package/prebuilds/darwin-x64/node-127.node +0 -0
- package/prebuilds/darwin-x64/node-131.node +0 -0
- package/prebuilds/darwin-x64/node-137.node +0 -0
- package/prebuilds/darwin-x64/node-141.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-108.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-111.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-115.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-120.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-127.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-131.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-137.node +0 -0
- package/prebuilds/linuxglibc-arm64/node-141.node +0 -0
- package/prebuilds/linuxglibc-x64/node-108.node +0 -0
- package/prebuilds/linuxglibc-x64/node-111.node +0 -0
- package/prebuilds/linuxglibc-x64/node-115.node +0 -0
- package/prebuilds/linuxglibc-x64/node-120.node +0 -0
- package/prebuilds/linuxglibc-x64/node-127.node +0 -0
- package/prebuilds/linuxglibc-x64/node-131.node +0 -0
- package/prebuilds/linuxglibc-x64/node-137.node +0 -0
- package/prebuilds/linuxglibc-x64/node-141.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-108.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-111.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-115.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-120.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-127.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-131.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-137.node +0 -0
- package/prebuilds/linuxmusl-arm64/node-141.node +0 -0
- package/prebuilds/linuxmusl-x64/node-108.node +0 -0
- package/prebuilds/linuxmusl-x64/node-111.node +0 -0
- package/prebuilds/linuxmusl-x64/node-115.node +0 -0
- package/prebuilds/linuxmusl-x64/node-120.node +0 -0
- package/prebuilds/linuxmusl-x64/node-127.node +0 -0
- package/prebuilds/linuxmusl-x64/node-131.node +0 -0
- package/prebuilds/linuxmusl-x64/node-137.node +0 -0
- package/prebuilds/linuxmusl-x64/node-141.node +0 -0
- package/prebuilds/win32-x64/node-108.node +0 -0
- package/prebuilds/win32-x64/node-111.node +0 -0
- package/prebuilds/win32-x64/node-115.node +0 -0
- package/prebuilds/win32-x64/node-120.node +0 -0
- package/prebuilds/win32-x64/node-127.node +0 -0
- package/prebuilds/win32-x64/node-131.node +0 -0
- package/prebuilds/win32-x64/node-137.node +0 -0
- package/prebuilds/win32-x64/node-141.node +0 -0
|
@@ -48,7 +48,9 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
48
48
|
};
|
|
49
49
|
})();
|
|
50
50
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
-
exports.SourceMapper = void 0;
|
|
51
|
+
exports.SourceMapper = exports.ANNOTATION_TAIL_BYTES = void 0;
|
|
52
|
+
exports.extractSourceMappingURL = extractSourceMappingURL;
|
|
53
|
+
exports.readSourceMappingURL = readSourceMappingURL;
|
|
52
54
|
// Originally copied from cloud-debug-nodejs's sourcemapper.ts from
|
|
53
55
|
// https://github.com/googleapis/cloud-debug-nodejs/blob/7bdc2f1f62a3b45b7b53ea79f9444c8ed50e138b/src/agent/io/sourcemapper.ts
|
|
54
56
|
// Modified to map from generated code to source code, rather than from source
|
|
@@ -82,6 +84,90 @@ function createLimiter(concurrency) {
|
|
|
82
84
|
};
|
|
83
85
|
}
|
|
84
86
|
const MAP_EXT = '.map';
|
|
87
|
+
// Per TC39 ECMA-426 §11.1.2.1 JavaScriptExtractSourceMapURL (without parsing):
|
|
88
|
+
// https://tc39.es/ecma426/#sec-linking-inline
|
|
89
|
+
//
|
|
90
|
+
// Split on these line terminators (ECMA-262 LineTerminatorSequence):
|
|
91
|
+
const LINE_SPLIT_RE = /\r\n|\n|\r|\u2028|\u2029/;
|
|
92
|
+
// Bytes to read from the end of a JS file when scanning for the annotation.
|
|
93
|
+
// The annotation must be on the last non-empty line, which is always short
|
|
94
|
+
// for external URLs. If no line terminator appears in the tail we fall back
|
|
95
|
+
// to a full file read (handles very large inline data: maps).
|
|
96
|
+
exports.ANNOTATION_TAIL_BYTES = 4 * 1024;
|
|
97
|
+
// Quote code points that invalidate the annotation (U+0022, U+0027, U+0060):
|
|
98
|
+
const QUOTE_CHARS_RE = /["'`]/;
|
|
99
|
+
// MatchSourceMapURL pattern applied to the comment text that follows "//":
|
|
100
|
+
const MATCH_SOURCE_MAP_URL_RE = /^[@#]\s*sourceMappingURL=(\S*?)\s*$/;
|
|
101
|
+
/**
|
|
102
|
+
* Extracts a sourceMappingURL from JS source per ECMA-426 §11.1.2.1
|
|
103
|
+
* (without-parsing variant).
|
|
104
|
+
*
|
|
105
|
+
* Scans lines from the end, skipping empty/whitespace-only lines.
|
|
106
|
+
* Returns null as soon as the first non-empty line is found that does not
|
|
107
|
+
* carry a valid annotation — the URL must be on the last non-empty line.
|
|
108
|
+
*/
|
|
109
|
+
function extractSourceMappingURL(content) {
|
|
110
|
+
const lines = content.split(LINE_SPLIT_RE);
|
|
111
|
+
for (let i = lines.length - 1; i >= 0; i--) {
|
|
112
|
+
const line = lines[i];
|
|
113
|
+
if (line.trim() === '')
|
|
114
|
+
continue; // skip empty / whitespace-only lines
|
|
115
|
+
// This is the last non-empty line; it must carry the annotation or we stop.
|
|
116
|
+
const commentStart = line.indexOf('//');
|
|
117
|
+
if (commentStart === -1)
|
|
118
|
+
return undefined;
|
|
119
|
+
const comment = line.slice(commentStart + 2);
|
|
120
|
+
if (QUOTE_CHARS_RE.test(comment))
|
|
121
|
+
return undefined;
|
|
122
|
+
const match = MATCH_SOURCE_MAP_URL_RE.exec(comment);
|
|
123
|
+
return match ? match[1] || undefined : undefined;
|
|
124
|
+
}
|
|
125
|
+
return undefined;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Reads the sourceMappingURL from a JS file efficiently by only reading a
|
|
129
|
+
* small tail of the file.
|
|
130
|
+
*
|
|
131
|
+
* The annotation must be on the last non-empty line (ECMA-426), so as long as
|
|
132
|
+
* the tail contains at least one line terminator the last line is fully
|
|
133
|
+
* captured. If no line terminator appears in the tail the entire tail is part
|
|
134
|
+
* of one very long inline data: line; we fall back to a full file read in
|
|
135
|
+
* that case.
|
|
136
|
+
*/
|
|
137
|
+
async function readSourceMappingURL(filePath) {
|
|
138
|
+
const fd = await fs.promises.open(filePath, 'r');
|
|
139
|
+
try {
|
|
140
|
+
const { size } = await fd.stat();
|
|
141
|
+
if (size === 0)
|
|
142
|
+
return undefined;
|
|
143
|
+
const tailSize = Math.min(exports.ANNOTATION_TAIL_BYTES, size);
|
|
144
|
+
const buf = Buffer.allocUnsafe(tailSize);
|
|
145
|
+
await fd.read(buf, 0, tailSize, size - tailSize);
|
|
146
|
+
const tail = buf.toString('utf8');
|
|
147
|
+
// The last non-empty line is fully captured in the tail if and only if a
|
|
148
|
+
// line terminator that precedes it also falls within the tail — i.e. the
|
|
149
|
+
// last non-empty segment is not the very first element of the split result.
|
|
150
|
+
//
|
|
151
|
+
// Counter-example: a large inline map followed by trailing empty lines.
|
|
152
|
+
// The tail might be "<end of base64>\n\n", which contains line terminators
|
|
153
|
+
// but whose last non-empty content ("<end of base64>") is the first
|
|
154
|
+
// segment — it extends before the window. Checking LINE_TERM_RE alone
|
|
155
|
+
// would incorrectly accept this tail.
|
|
156
|
+
const lines = tail.split(LINE_SPLIT_RE);
|
|
157
|
+
let lastNonEmptyIdx = lines.length - 1;
|
|
158
|
+
while (lastNonEmptyIdx > 0 && lines[lastNonEmptyIdx].trim() === '') {
|
|
159
|
+
lastNonEmptyIdx--;
|
|
160
|
+
}
|
|
161
|
+
if (tailSize === size || lastNonEmptyIdx > 0) {
|
|
162
|
+
return extractSourceMappingURL(tail);
|
|
163
|
+
}
|
|
164
|
+
const fullContent = await readFile(filePath, 'utf8');
|
|
165
|
+
return extractSourceMappingURL(fullContent);
|
|
166
|
+
}
|
|
167
|
+
finally {
|
|
168
|
+
await fd.close();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
85
171
|
function error(msg) {
|
|
86
172
|
logger_1.logger.debug(`Error: ${msg}`);
|
|
87
173
|
return new Error(msg);
|
|
@@ -107,23 +193,6 @@ async function processSourceMap(infoMap, mapPath, debug) {
|
|
|
107
193
|
catch (e) {
|
|
108
194
|
throw error('Could not read source map file ' + mapPath + ': ' + e);
|
|
109
195
|
}
|
|
110
|
-
let consumer;
|
|
111
|
-
try {
|
|
112
|
-
// TODO: Determine how to reconsile the type conflict where `consumer`
|
|
113
|
-
// is constructed as a SourceMapConsumer but is used as a
|
|
114
|
-
// RawSourceMap.
|
|
115
|
-
// TODO: Resolve the cast of `contents as any` (This is needed because the
|
|
116
|
-
// type is expected to be of `RawSourceMap` but the existing
|
|
117
|
-
// working code uses a string.)
|
|
118
|
-
consumer = (await new sourceMap.SourceMapConsumer(contents));
|
|
119
|
-
}
|
|
120
|
-
catch (e) {
|
|
121
|
-
throw error('An error occurred while reading the ' +
|
|
122
|
-
'sourceMap file ' +
|
|
123
|
-
mapPath +
|
|
124
|
-
': ' +
|
|
125
|
-
e);
|
|
126
|
-
}
|
|
127
196
|
/* If the source map file defines a "file" attribute, use it as
|
|
128
197
|
* the output file where the path is relative to the directory
|
|
129
198
|
* containing the map file. Otherwise, use the name of the output
|
|
@@ -141,67 +210,186 @@ async function processSourceMap(infoMap, mapPath, debug) {
|
|
|
141
210
|
* source map file.
|
|
142
211
|
*/
|
|
143
212
|
const dir = path.dirname(mapPath);
|
|
213
|
+
// Parse JSON once: extract the `file` property for early-exit checks and
|
|
214
|
+
// reuse the parsed object when constructing SourceMapConsumer (avoids a
|
|
215
|
+
// second parse inside the library).
|
|
216
|
+
let parsedMap;
|
|
217
|
+
let rawFile;
|
|
218
|
+
try {
|
|
219
|
+
parsedMap = JSON.parse(contents);
|
|
220
|
+
rawFile = parsedMap.file;
|
|
221
|
+
}
|
|
222
|
+
catch {
|
|
223
|
+
// Will fail again below when creating SourceMapConsumer; let that throw.
|
|
224
|
+
}
|
|
144
225
|
const generatedPathCandidates = [];
|
|
145
|
-
if (
|
|
146
|
-
generatedPathCandidates.push(path.resolve(dir,
|
|
226
|
+
if (rawFile) {
|
|
227
|
+
generatedPathCandidates.push(path.resolve(dir, rawFile));
|
|
147
228
|
}
|
|
148
229
|
const samePath = path.resolve(dir, path.basename(mapPath, MAP_EXT));
|
|
149
230
|
if (generatedPathCandidates.length === 0 ||
|
|
150
231
|
generatedPathCandidates[0] !== samePath) {
|
|
151
232
|
generatedPathCandidates.push(samePath);
|
|
152
233
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
234
|
+
// Find the first candidate that exists and hasn't been loaded already.
|
|
235
|
+
let targetPath;
|
|
236
|
+
for (const candidate of generatedPathCandidates) {
|
|
237
|
+
if (infoMap.has(candidate)) {
|
|
238
|
+
// Already loaded via sourceMappingURL annotation; skip this map file.
|
|
157
239
|
if (debug) {
|
|
158
|
-
logger_1.logger.debug(`
|
|
240
|
+
logger_1.logger.debug(`Skipping ${mapPath}: ${candidate} already loaded via sourceMappingURL`);
|
|
159
241
|
}
|
|
160
242
|
return;
|
|
161
243
|
}
|
|
162
|
-
|
|
244
|
+
try {
|
|
245
|
+
await fs.promises.access(candidate, fs.constants.F_OK);
|
|
246
|
+
targetPath = candidate;
|
|
247
|
+
break;
|
|
248
|
+
}
|
|
249
|
+
catch {
|
|
163
250
|
if (debug) {
|
|
164
|
-
logger_1.logger.debug(`Generated path ${
|
|
251
|
+
logger_1.logger.debug(`Generated path ${candidate} does not exist`);
|
|
165
252
|
}
|
|
166
253
|
}
|
|
167
254
|
}
|
|
255
|
+
if (!targetPath) {
|
|
256
|
+
if (debug) {
|
|
257
|
+
logger_1.logger.debug(`Unable to find generated file for ${mapPath}`);
|
|
258
|
+
}
|
|
259
|
+
return;
|
|
260
|
+
}
|
|
261
|
+
let consumer;
|
|
262
|
+
try {
|
|
263
|
+
// TODO: Determine how to reconsile the type conflict where `consumer`
|
|
264
|
+
// is constructed as a SourceMapConsumer but is used as a
|
|
265
|
+
// RawSourceMap.
|
|
266
|
+
consumer = (await new sourceMap.SourceMapConsumer((parsedMap ?? contents)));
|
|
267
|
+
}
|
|
268
|
+
catch (e) {
|
|
269
|
+
throw error('An error occurred while reading the ' +
|
|
270
|
+
'sourceMap file ' +
|
|
271
|
+
mapPath +
|
|
272
|
+
': ' +
|
|
273
|
+
e);
|
|
274
|
+
}
|
|
275
|
+
infoMap.set(targetPath, { mapFileDir: dir, mapConsumer: consumer });
|
|
168
276
|
if (debug) {
|
|
169
|
-
logger_1.logger.debug(`
|
|
277
|
+
logger_1.logger.debug(`Loaded source map for ${targetPath} => ${mapPath}`);
|
|
170
278
|
}
|
|
171
279
|
}
|
|
172
280
|
class SourceMapper {
|
|
173
281
|
static async create(searchDirs, debug = false) {
|
|
174
|
-
|
|
175
|
-
|
|
282
|
+
const mapper = new SourceMapper(debug);
|
|
283
|
+
for (const dir of searchDirs) {
|
|
284
|
+
await mapper.loadDirectory(dir);
|
|
285
|
+
}
|
|
286
|
+
return mapper;
|
|
287
|
+
}
|
|
288
|
+
constructor(debug = false) {
|
|
289
|
+
/** JS files that declared a sourceMappingURL but no map was ultimately found. */
|
|
290
|
+
this.declaredMissingMap = new Set();
|
|
291
|
+
this.infoMap = new Map();
|
|
292
|
+
this.debug = debug;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Scans `searchDir` recursively for JS files and source map files, loading
|
|
296
|
+
* source maps for all JS files found.
|
|
297
|
+
*
|
|
298
|
+
* Priority for each JS file:
|
|
299
|
+
* 1. A map pointed to by a `sourceMappingURL` annotation in the JS file
|
|
300
|
+
* (inline `data:` URL or external file path, only if the file exists).
|
|
301
|
+
* 2. A `.map` file found in the directory scan that claims to belong to
|
|
302
|
+
* that JS file (via its `file` property or naming convention).
|
|
303
|
+
*
|
|
304
|
+
* Safe to call multiple times; already-loaded files are skipped.
|
|
305
|
+
*/
|
|
306
|
+
async loadDirectory(searchDir) {
|
|
307
|
+
// Resolve to absolute so all paths in infoMap are consistent regardless of
|
|
308
|
+
// whether the caller passed a relative or absolute directory.
|
|
309
|
+
searchDir = path.resolve(searchDir);
|
|
310
|
+
if (this.debug) {
|
|
311
|
+
logger_1.logger.debug(`Loading source maps from directory: ${searchDir}`);
|
|
176
312
|
}
|
|
313
|
+
const jsFiles = [];
|
|
177
314
|
const mapFiles = [];
|
|
178
|
-
for (const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
mf.forEach(mapFile => {
|
|
182
|
-
mapFiles.push(path.resolve(dir, mapFile));
|
|
183
|
-
});
|
|
315
|
+
for await (const entry of walk(searchDir, filename => /\.[cm]?js$/.test(filename) || /\.[cm]?js\.map$/.test(filename), (root, dirname) => root !== '/proc' && dirname !== '.git' && dirname !== 'node_modules')) {
|
|
316
|
+
if (entry.endsWith(MAP_EXT)) {
|
|
317
|
+
mapFiles.push(entry);
|
|
184
318
|
}
|
|
185
|
-
|
|
186
|
-
|
|
319
|
+
else {
|
|
320
|
+
jsFiles.push(entry);
|
|
187
321
|
}
|
|
188
322
|
}
|
|
189
|
-
if (debug) {
|
|
190
|
-
logger_1.logger.debug(`Found
|
|
323
|
+
if (this.debug) {
|
|
324
|
+
logger_1.logger.debug(`Found ${jsFiles.length} JS files and ${mapFiles.length} map files in ${searchDir}`);
|
|
325
|
+
}
|
|
326
|
+
const limit = createLimiter(CONCURRENCY);
|
|
327
|
+
// JS files that declared a sourceMappingURL but Phase 1 couldn't load the map.
|
|
328
|
+
const annotatedNotLoaded = new Set();
|
|
329
|
+
// Phase 1: Check sourceMappingURL annotations in JS files (higher priority).
|
|
330
|
+
await Promise.all(jsFiles.map(jsPath => limit(async () => {
|
|
331
|
+
if (this.infoMap.has(jsPath))
|
|
332
|
+
return;
|
|
333
|
+
let url;
|
|
334
|
+
try {
|
|
335
|
+
url = await readSourceMappingURL(jsPath);
|
|
336
|
+
}
|
|
337
|
+
catch {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (!url)
|
|
341
|
+
return;
|
|
342
|
+
if (url.startsWith('data:')) {
|
|
343
|
+
// Inline source map data URL. Handles both:
|
|
344
|
+
// data:application/json;base64,<b64>
|
|
345
|
+
// data:application/json;charset=utf-8;base64,<b64>
|
|
346
|
+
// data:application/json,<urlencoded> (and other non-base64 forms)
|
|
347
|
+
const commaIdx = url.indexOf(',');
|
|
348
|
+
if (commaIdx !== -1) {
|
|
349
|
+
const meta = url.slice(0, commaIdx);
|
|
350
|
+
const data = url.slice(commaIdx + 1);
|
|
351
|
+
const mapContent = meta.endsWith(';base64')
|
|
352
|
+
? Buffer.from(data, 'base64').toString()
|
|
353
|
+
: decodeURIComponent(data);
|
|
354
|
+
await this.loadMapContent(jsPath, mapContent, path.dirname(jsPath));
|
|
355
|
+
}
|
|
356
|
+
// If the data URL is malformed (no comma), skip silently — not a
|
|
357
|
+
// missing map file, just an unreadable inline annotation.
|
|
358
|
+
}
|
|
359
|
+
else {
|
|
360
|
+
const mapPath = path.resolve(path.dirname(jsPath), url);
|
|
361
|
+
try {
|
|
362
|
+
const mapContent = await readFile(mapPath, 'utf8');
|
|
363
|
+
await this.loadMapContent(jsPath, mapContent, path.dirname(mapPath));
|
|
364
|
+
}
|
|
365
|
+
catch {
|
|
366
|
+
// Map file doesn't exist or is unreadable; fall through to Phase 2.
|
|
367
|
+
annotatedNotLoaded.add(jsPath);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
})));
|
|
371
|
+
// Phase 2: Process .map files for any JS files not yet resolved.
|
|
372
|
+
await Promise.all(mapFiles.map(mapPath => limit(() => processSourceMap(this.infoMap, mapPath, this.debug))));
|
|
373
|
+
// Any file whose annotation pointed to a missing map and that still has no
|
|
374
|
+
// entry after Phase 2 is tracked as "declared but missing".
|
|
375
|
+
for (const jsPath of annotatedNotLoaded) {
|
|
376
|
+
if (!this.infoMap.has(jsPath)) {
|
|
377
|
+
this.declaredMissingMap.add(jsPath);
|
|
378
|
+
}
|
|
191
379
|
}
|
|
192
|
-
return createFromMapFiles(mapFiles, debug);
|
|
193
380
|
}
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
381
|
+
async loadMapContent(jsPath, mapContent, mapDir) {
|
|
382
|
+
try {
|
|
383
|
+
const parsedMap = JSON.parse(mapContent);
|
|
384
|
+
const consumer = (await new sourceMap.SourceMapConsumer(parsedMap));
|
|
385
|
+
this.infoMap.set(jsPath, { mapFileDir: mapDir, mapConsumer: consumer });
|
|
386
|
+
if (this.debug) {
|
|
387
|
+
logger_1.logger.debug(`Loaded source map for ${jsPath} via sourceMappingURL`);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
catch (e) {
|
|
391
|
+
logger_1.logger.debug(`Failed to parse source map for ${jsPath}: ${e}`);
|
|
392
|
+
}
|
|
205
393
|
}
|
|
206
394
|
/**
|
|
207
395
|
* Used to get the information about the transpiled file from a given input
|
|
@@ -263,6 +451,9 @@ class SourceMapper {
|
|
|
263
451
|
if (this.debug) {
|
|
264
452
|
logger_1.logger.debug(`Source map lookup failed: no map found for ${location.file} (normalized: ${inputPath})`);
|
|
265
453
|
}
|
|
454
|
+
if (this.declaredMissingMap.has(inputPath)) {
|
|
455
|
+
return { ...location, missingMapFile: true };
|
|
456
|
+
}
|
|
266
457
|
return location;
|
|
267
458
|
}
|
|
268
459
|
const generatedPos = {
|
|
@@ -271,7 +462,13 @@ class SourceMapper {
|
|
|
271
462
|
};
|
|
272
463
|
// TODO: Determine how to remove the explicit cast here.
|
|
273
464
|
const consumer = entry.mapConsumer;
|
|
274
|
-
|
|
465
|
+
// When column is 0, we don't have real column info (e.g., from V8's LineTick
|
|
466
|
+
// which only provides line numbers). Use LEAST_UPPER_BOUND to find the first
|
|
467
|
+
// mapping on this line instead of failing because there's nothing at column 0.
|
|
468
|
+
const bias = generatedPos.column === 0
|
|
469
|
+
? sourceMap.SourceMapConsumer.LEAST_UPPER_BOUND
|
|
470
|
+
: sourceMap.SourceMapConsumer.GREATEST_LOWER_BOUND;
|
|
471
|
+
const pos = consumer.originalPositionFor({ ...generatedPos, bias });
|
|
275
472
|
if (pos.source === null) {
|
|
276
473
|
if (this.debug) {
|
|
277
474
|
logger_1.logger.debug(`Source map lookup failed for ${location.name}(${location.file}:${location.line}:${location.column})`);
|
|
@@ -291,18 +488,6 @@ class SourceMapper {
|
|
|
291
488
|
}
|
|
292
489
|
}
|
|
293
490
|
exports.SourceMapper = SourceMapper;
|
|
294
|
-
async function createFromMapFiles(mapFiles, debug) {
|
|
295
|
-
const limit = createLimiter(CONCURRENCY);
|
|
296
|
-
const mapper = new SourceMapper(debug);
|
|
297
|
-
const promises = mapFiles.map(mapPath => limit(() => processSourceMap(mapper.infoMap, mapPath, debug)));
|
|
298
|
-
try {
|
|
299
|
-
await Promise.all(promises);
|
|
300
|
-
}
|
|
301
|
-
catch (err) {
|
|
302
|
-
throw error('An error occurred while processing the source map files' + err);
|
|
303
|
-
}
|
|
304
|
-
return mapper;
|
|
305
|
-
}
|
|
306
491
|
function isErrnoException(e) {
|
|
307
492
|
return e instanceof Error && 'code' in e;
|
|
308
493
|
}
|
|
@@ -340,11 +525,4 @@ directoryFilter = (root, dirname) => true) {
|
|
|
340
525
|
}
|
|
341
526
|
yield* walkRecursive(dir);
|
|
342
527
|
}
|
|
343
|
-
async function getMapFiles(baseDir) {
|
|
344
|
-
const mapFiles = [];
|
|
345
|
-
for await (const entry of walk(baseDir, filename => /\.[cm]?js\.map$/.test(filename), (root, dirname) => root !== '/proc' && dirname !== '.git' && dirname !== 'node_modules')) {
|
|
346
|
-
mapFiles.push(path.relative(baseDir, entry));
|
|
347
|
-
}
|
|
348
|
-
return mapFiles;
|
|
349
|
-
}
|
|
350
528
|
//# sourceMappingURL=sourcemapper.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sourcemapper.js","sourceRoot":"","sources":["../../../ts/src/sourcemapper/sourcemapper.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sourcemapper.js","sourceRoot":"","sources":["../../../ts/src/sourcemapper/sourcemapper.ts"],"names":[],"mappings":"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"}
|
|
@@ -37,11 +37,16 @@ export interface TimeProfilerOptions {
|
|
|
37
37
|
collectAsyncId?: boolean;
|
|
38
38
|
useCPED?: boolean;
|
|
39
39
|
}
|
|
40
|
-
export declare function profile(options?: TimeProfilerOptions): Promise<
|
|
40
|
+
export declare function profile(options?: TimeProfilerOptions): Promise<any>;
|
|
41
41
|
export declare function start(options?: TimeProfilerOptions): void;
|
|
42
|
-
|
|
42
|
+
/**
|
|
43
|
+
* Serializes the profile inside a native callback while the V8 profile is
|
|
44
|
+
* still alive. This reduces memory overhead.
|
|
45
|
+
*/
|
|
46
|
+
export declare function stop(restart?: boolean, generateLabels?: GenerateTimeLabelsFunction, lowCardinalityLabels?: string[]): any;
|
|
43
47
|
export declare function getState(): any;
|
|
44
48
|
export declare function setContext(context?: object): void;
|
|
49
|
+
export declare function runWithContext<R, TArgs extends unknown[]>(context: object, f: (...args: TArgs) => R, ...args: TArgs): R;
|
|
45
50
|
export declare function getContext(): any;
|
|
46
51
|
export declare function getMetrics(): TimeProfilerMetrics;
|
|
47
52
|
export declare function isStarted(): boolean;
|
package/out/src/time-profiler.js
CHANGED
|
@@ -21,6 +21,7 @@ exports.start = start;
|
|
|
21
21
|
exports.stop = stop;
|
|
22
22
|
exports.getState = getState;
|
|
23
23
|
exports.setContext = setContext;
|
|
24
|
+
exports.runWithContext = runWithContext;
|
|
24
25
|
exports.getContext = getContext;
|
|
25
26
|
exports.getMetrics = getMetrics;
|
|
26
27
|
exports.isStarted = isStarted;
|
|
@@ -30,13 +31,39 @@ const profile_serializer_1 = require("./profile-serializer");
|
|
|
30
31
|
const time_profiler_bindings_1 = require("./time-profiler-bindings");
|
|
31
32
|
Object.defineProperty(exports, "getNativeThreadId", { enumerable: true, get: function () { return time_profiler_bindings_1.getNativeThreadId; } });
|
|
32
33
|
const worker_threads_1 = require("worker_threads");
|
|
34
|
+
const async_hooks_1 = require("async_hooks");
|
|
33
35
|
const { kSampleCount } = time_profiler_bindings_1.constants;
|
|
34
36
|
const DEFAULT_INTERVAL_MICROS = 1000;
|
|
35
37
|
const DEFAULT_DURATION_MILLIS = 60000;
|
|
36
38
|
let gProfiler;
|
|
39
|
+
let gStore;
|
|
37
40
|
let gSourceMapper;
|
|
38
41
|
let gIntervalMicros;
|
|
39
42
|
let gV8ProfilerStuckEventLoopDetected = 0;
|
|
43
|
+
function handleStopRestart() {
|
|
44
|
+
if (!gProfiler) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
gV8ProfilerStuckEventLoopDetected =
|
|
48
|
+
gProfiler.v8ProfilerStuckEventLoopDetected();
|
|
49
|
+
// Workaround for v8 bug, where profiler event processor thread is stuck in
|
|
50
|
+
// a loop eating 100% CPU, leading to empty profiles.
|
|
51
|
+
// Fully stop and restart the profiler to reset the profile to a valid state.
|
|
52
|
+
if (gV8ProfilerStuckEventLoopDetected > 0) {
|
|
53
|
+
gProfiler.stopAndCollect(false, () => undefined);
|
|
54
|
+
gProfiler.start();
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function handleStopNoRestart() {
|
|
58
|
+
gV8ProfilerStuckEventLoopDetected = 0;
|
|
59
|
+
gProfiler?.dispose();
|
|
60
|
+
gProfiler = undefined;
|
|
61
|
+
gSourceMapper = undefined;
|
|
62
|
+
if (gStore !== undefined) {
|
|
63
|
+
gStore.disable();
|
|
64
|
+
gStore = undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
40
67
|
/** Make sure to stop profiler before node shuts down, otherwise profiling
|
|
41
68
|
* signal might cause a crash if it occurs during shutdown */
|
|
42
69
|
process.once('exit', () => {
|
|
@@ -65,40 +92,32 @@ function start(options = {}) {
|
|
|
65
92
|
if (gProfiler) {
|
|
66
93
|
throw new Error('Wall profiler is already started');
|
|
67
94
|
}
|
|
68
|
-
|
|
95
|
+
const store = options.useCPED === true ? new async_hooks_1.AsyncLocalStorage() : undefined;
|
|
96
|
+
gProfiler = new time_profiler_bindings_1.TimeProfiler({ ...options, CPEDKey: store, isMainThread: worker_threads_1.isMainThread });
|
|
69
97
|
gSourceMapper = options.sourceMapper;
|
|
70
98
|
gIntervalMicros = options.intervalMicros;
|
|
71
99
|
gV8ProfilerStuckEventLoopDetected = 0;
|
|
72
100
|
gProfiler.start();
|
|
101
|
+
gStore = store;
|
|
73
102
|
// If contexts are enabled without using CPED, set an initial empty context
|
|
74
103
|
if (options.withContexts && !options.useCPED) {
|
|
75
104
|
setContext({});
|
|
76
105
|
}
|
|
77
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Serializes the profile inside a native callback while the V8 profile is
|
|
109
|
+
* still alive. This reduces memory overhead.
|
|
110
|
+
*/
|
|
78
111
|
function stop(restart = false, generateLabels, lowCardinalityLabels) {
|
|
79
112
|
if (!gProfiler) {
|
|
80
113
|
throw new Error('Wall profiler is not started');
|
|
81
114
|
}
|
|
82
|
-
const
|
|
115
|
+
const serializedProfile = gProfiler.stopAndCollect(restart, (profile) => (0, profile_serializer_1.serializeTimeProfile)(profile, gIntervalMicros, gSourceMapper, true, generateLabels, lowCardinalityLabels));
|
|
83
116
|
if (restart) {
|
|
84
|
-
|
|
85
|
-
gProfiler.v8ProfilerStuckEventLoopDetected();
|
|
86
|
-
// Workaround for v8 bug, where profiler event processor thread is stuck in
|
|
87
|
-
// a loop eating 100% CPU, leading to empty profiles.
|
|
88
|
-
// Fully stop and restart the profiler to reset the profile to a valid state.
|
|
89
|
-
if (gV8ProfilerStuckEventLoopDetected > 0) {
|
|
90
|
-
gProfiler.stop(false);
|
|
91
|
-
gProfiler.start();
|
|
92
|
-
}
|
|
117
|
+
handleStopRestart();
|
|
93
118
|
}
|
|
94
119
|
else {
|
|
95
|
-
|
|
96
|
-
}
|
|
97
|
-
const serializedProfile = (0, profile_serializer_1.serializeTimeProfile)(profile, gIntervalMicros, gSourceMapper, true, generateLabels, lowCardinalityLabels);
|
|
98
|
-
if (!restart) {
|
|
99
|
-
gProfiler.dispose();
|
|
100
|
-
gProfiler = undefined;
|
|
101
|
-
gSourceMapper = undefined;
|
|
120
|
+
handleStopNoRestart();
|
|
102
121
|
}
|
|
103
122
|
return serializedProfile;
|
|
104
123
|
}
|
|
@@ -114,6 +133,15 @@ function setContext(context) {
|
|
|
114
133
|
}
|
|
115
134
|
gProfiler.context = context;
|
|
116
135
|
}
|
|
136
|
+
function runWithContext(context, f, ...args) {
|
|
137
|
+
if (!gProfiler) {
|
|
138
|
+
throw new Error('Wall profiler is not started');
|
|
139
|
+
}
|
|
140
|
+
else if (!gStore) {
|
|
141
|
+
throw new Error('Can only use runWithContext with AsyncContextFrame');
|
|
142
|
+
}
|
|
143
|
+
return gStore.run(gProfiler.createContextHolder(context), f, ...args);
|
|
144
|
+
}
|
|
117
145
|
function getContext() {
|
|
118
146
|
if (!gProfiler) {
|
|
119
147
|
throw new Error('Wall profiler is not started');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"time-profiler.js","sourceRoot":"","sources":["../../ts/src/time-profiler.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;
|
|
1
|
+
{"version":3,"file":"time-profiler.js","sourceRoot":"","sources":["../../ts/src/time-profiler.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AA2GH,0BAKC;AAGD,sBAmBC;AAMD,oBA2BC;AAED,4BAKC;AAED,gCAKC;AAED,wCAWC;AAED,gCAKC;AAED,gCAKC;AAED,8BAEC;AAGD,4EAEC;AAvND,8CAA2C;AAE3C,6DAI8B;AAE9B,qEAIkC;AAkN1B,kGApNN,0CAAiB,OAoNM;AA5MzB,mDAA4C;AAC5C,6CAA8C;AAC9C,MAAM,EAAC,YAAY,EAAC,GAAG,kCAAiB,CAAC;AAEzC,MAAM,uBAAuB,GAAiB,IAAI,CAAC;AACnD,MAAM,uBAAuB,GAAiB,KAAK,CAAC;AAYpD,IAAI,SAAyC,CAAC;AAC9C,IAAI,MAA8C,CAAC;AACnD,IAAI,aAAuC,CAAC;AAC5C,IAAI,eAA6B,CAAC;AAClC,IAAI,iCAAiC,GAAG,CAAC,CAAC;AAE1C,SAAS,iBAAiB;IACxB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO;IACT,CAAC;IACD,iCAAiC;QAC/B,SAAS,CAAC,gCAAgC,EAAE,CAAC;IAC/C,2EAA2E;IAC3E,qDAAqD;IACrD,6EAA6E;IAC7E,IAAI,iCAAiC,GAAG,CAAC,EAAE,CAAC;QAC1C,SAAS,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;QACjD,SAAS,CAAC,KAAK,EAAE,CAAC;IACpB,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,iCAAiC,GAAG,CAAC,CAAC;IACtC,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,SAAS,GAAG,SAAS,CAAC;IACtB,aAAa,GAAG,SAAS,CAAC;IAC1B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,MAAM,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,GAAG,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;6DAC6D;AAC7D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE;IACxB,IAAI,SAAS,EAAE;QAAE,IAAI,EAAE,CAAC;AAC1B,CAAC,CAAC,CAAC;AAuBH,MAAM,eAAe,GAAwB;IAC3C,cAAc,EAAE,uBAAuB;IACvC,cAAc,EAAE,uBAAuB;IACvC,WAAW,EAAE,KAAK;IAClB,YAAY,EAAE,KAAK;IACnB,eAAe,EAAE,IAAI;IACrB,cAAc,EAAE,KAAK;IACrB,cAAc,EAAE,KAAK;IACrB,OAAO,EAAE,KAAK;CACf,CAAC;AAEK,KAAK,UAAU,OAAO,CAAC,UAA+B,EAAE;IAC7D,OAAO,GAAG,EAAC,GAAG,eAAe,EAAE,GAAG,OAAO,EAAC,CAAC;IAC3C,KAAK,CAAC,OAAO,CAAC,CAAC;IACf,MAAM,IAAA,qBAAU,EAAC,OAAO,CAAC,cAAe,CAAC,CAAC;IAC1C,OAAO,IAAI,EAAE,CAAC;AAChB,CAAC;AAED,qEAAqE;AACrE,SAAgB,KAAK,CAAC,UAA+B,EAAE;IACrD,OAAO,GAAG,EAAC,GAAG,eAAe,EAAE,GAAG,OAAO,EAAC,CAAC;IAC3C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,+BAAiB,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7E,SAAS,GAAG,IAAI,qCAAY,CAAC,EAAC,GAAG,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAZ,6BAAY,EAAC,CAAC,CAAC;IACzE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;IACrC,eAAe,GAAG,OAAO,CAAC,cAAe,CAAC;IAC1C,iCAAiC,GAAG,CAAC,CAAC;IAEtC,SAAS,CAAC,KAAK,EAAE,CAAC;IAClB,MAAM,GAAG,KAAK,CAAC;IAEf,2EAA2E;IAC3E,IAAI,OAAO,CAAC,YAAY,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QAC7C,UAAU,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,SAAgB,IAAI,CAClB,OAAO,GAAG,KAAK,EACf,cAA2C,EAC3C,oBAA+B;IAE/B,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IAED,MAAM,iBAAiB,GAAG,SAAS,CAAC,cAAc,CAChD,OAAO,EACP,CAAC,OAAoB,EAAE,EAAE,CACvB,IAAA,yCAAoB,EAClB,OAAO,EACP,eAAe,EACf,aAAa,EACb,IAAI,EACJ,cAAc,EACd,oBAAoB,CACrB,CACJ,CAAC;IACF,IAAI,OAAO,EAAE,CAAC;QACZ,iBAAiB,EAAE,CAAC;IACtB,CAAC;SAAM,CAAC;QACN,mBAAmB,EAAE,CAAC;IACxB,CAAC;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,SAAgB,QAAQ;IACtB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC,KAAK,CAAC;AACzB,CAAC;AAED,SAAgB,UAAU,CAAC,OAAgB;IACzC,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC;AAC9B,CAAC;AAED,SAAgB,cAAc,CAC5B,OAAe,EACf,CAAwB,EACxB,GAAG,IAAW;IAEd,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,mBAAmB,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC,OAAO,CAAC;AAC3B,CAAC;AAED,SAAgB,UAAU;IACxB,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,8BAA8B,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,SAAS,CAAC,OAA8B,CAAC;AAClD,CAAC;AAED,SAAgB,SAAS;IACvB,OAAO,CAAC,CAAC,SAAS,CAAC;AACrB,CAAC;AAED,sFAAsF;AACtF,SAAgB,gCAAgC;IAC9C,OAAO,iCAAiC,CAAC;AAC3C,CAAC;AAEY,QAAA,SAAS,GAAG;IACvB,YAAY;IACZ,gCAAgC,EAAhC,qDAAgC;IAChC,4BAA4B,EAA5B,iDAA4B;CAC7B,CAAC"}
|
package/out/src/v8-types.d.ts
CHANGED
|
@@ -22,6 +22,8 @@ export interface TimeProfile {
|
|
|
22
22
|
hasCpuTime?: boolean;
|
|
23
23
|
/** CPU time of non-JS threads, only reported for the main worker thread */
|
|
24
24
|
nonJSThreadsCpuTime?: number;
|
|
25
|
+
/** Computed in C++ to avoid a full JS tree traversal. */
|
|
26
|
+
totalHitCount?: number;
|
|
25
27
|
}
|
|
26
28
|
export interface ProfileNode {
|
|
27
29
|
name?: string;
|
|
@@ -43,6 +45,7 @@ export interface TimeProfileNode extends ProfileNode {
|
|
|
43
45
|
}
|
|
44
46
|
export interface AllocationProfileNode extends ProfileNode {
|
|
45
47
|
allocations: Allocation[];
|
|
48
|
+
children: AllocationProfileNode[];
|
|
46
49
|
}
|
|
47
50
|
export interface Allocation {
|
|
48
51
|
sizeBytes: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@datadog/pprof",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.14.1",
|
|
4
4
|
"description": "pprof support for Node.js",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/mocha": "^10.0.1",
|
|
45
|
-
"@types/node": "25.
|
|
45
|
+
"@types/node": "25.5.0",
|
|
46
46
|
"@types/semver": "^7.5.8",
|
|
47
47
|
"@types/sinon": "^21.0.0",
|
|
48
48
|
"@types/tmp": "^0.2.3",
|
|
@@ -50,13 +50,13 @@
|
|
|
50
50
|
"codecov": "^3.8.3",
|
|
51
51
|
"deep-copy": "^1.4.2",
|
|
52
52
|
"eslint-plugin-n": "^17.24.0",
|
|
53
|
-
"gts": "^
|
|
53
|
+
"gts": "^7.0.0",
|
|
54
54
|
"js-green-licenses": "^4.0.0",
|
|
55
55
|
"mocha": "^11.7.5",
|
|
56
|
-
"nan": "^2.
|
|
56
|
+
"nan": "^2.26.2",
|
|
57
57
|
"nyc": "^18.0.0",
|
|
58
58
|
"semver": "^7.7.4",
|
|
59
|
-
"sinon": "^21.0.
|
|
59
|
+
"sinon": "^21.0.3",
|
|
60
60
|
"source-map-support": "^0.5.21",
|
|
61
61
|
"tmp": "0.2.5",
|
|
62
62
|
"typescript": "^5.9.3"
|