step-node-agent 3.29.1 → 3.29.2

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.
Files changed (54) hide show
  1. package/node_modules/qs/.github/SECURITY.md +11 -0
  2. package/node_modules/qs/.github/THREAT_MODEL.md +78 -0
  3. package/node_modules/qs/CHANGELOG.md +9 -0
  4. package/node_modules/qs/dist/qs.js +14 -14
  5. package/node_modules/qs/eslint.config.mjs +56 -0
  6. package/node_modules/qs/lib/parse.js +69 -37
  7. package/node_modules/qs/lib/utils.js +55 -3
  8. package/node_modules/qs/package.json +9 -8
  9. package/node_modules/qs/test/parse.js +124 -4
  10. package/node_modules/qs/test/stringify.js +7 -3
  11. package/node_modules/qs/test/utils.js +119 -0
  12. package/node_modules/send/HISTORY.md +7 -0
  13. package/node_modules/send/package.json +5 -5
  14. package/node_modules/serve-static/HISTORY.md +6 -0
  15. package/node_modules/serve-static/package.json +2 -2
  16. package/package.json +1 -1
  17. package/node_modules/qs/.eslintrc +0 -39
  18. package/node_modules/send/node_modules/http-errors/HISTORY.md +0 -180
  19. package/node_modules/send/node_modules/http-errors/LICENSE +0 -23
  20. package/node_modules/send/node_modules/http-errors/README.md +0 -169
  21. package/node_modules/send/node_modules/http-errors/index.js +0 -289
  22. package/node_modules/send/node_modules/http-errors/package.json +0 -50
  23. package/node_modules/send/node_modules/statuses/HISTORY.md +0 -82
  24. package/node_modules/send/node_modules/statuses/LICENSE +0 -23
  25. package/node_modules/send/node_modules/statuses/README.md +0 -136
  26. package/node_modules/send/node_modules/statuses/codes.json +0 -65
  27. package/node_modules/send/node_modules/statuses/index.js +0 -146
  28. package/node_modules/send/node_modules/statuses/package.json +0 -49
  29. package/node_modules/serve-static/node_modules/http-errors/HISTORY.md +0 -180
  30. package/node_modules/serve-static/node_modules/http-errors/LICENSE +0 -23
  31. package/node_modules/serve-static/node_modules/http-errors/README.md +0 -169
  32. package/node_modules/serve-static/node_modules/http-errors/index.js +0 -289
  33. package/node_modules/serve-static/node_modules/http-errors/package.json +0 -50
  34. package/node_modules/serve-static/node_modules/ms/index.js +0 -162
  35. package/node_modules/serve-static/node_modules/ms/license.md +0 -21
  36. package/node_modules/serve-static/node_modules/ms/package.json +0 -38
  37. package/node_modules/serve-static/node_modules/ms/readme.md +0 -59
  38. package/node_modules/serve-static/node_modules/send/HISTORY.md +0 -526
  39. package/node_modules/serve-static/node_modules/send/LICENSE +0 -23
  40. package/node_modules/serve-static/node_modules/send/README.md +0 -327
  41. package/node_modules/serve-static/node_modules/send/SECURITY.md +0 -24
  42. package/node_modules/serve-static/node_modules/send/index.js +0 -1142
  43. package/node_modules/serve-static/node_modules/send/node_modules/encodeurl/HISTORY.md +0 -14
  44. package/node_modules/serve-static/node_modules/send/node_modules/encodeurl/LICENSE +0 -22
  45. package/node_modules/serve-static/node_modules/send/node_modules/encodeurl/README.md +0 -128
  46. package/node_modules/serve-static/node_modules/send/node_modules/encodeurl/index.js +0 -60
  47. package/node_modules/serve-static/node_modules/send/node_modules/encodeurl/package.json +0 -40
  48. package/node_modules/serve-static/node_modules/send/package.json +0 -62
  49. package/node_modules/serve-static/node_modules/statuses/HISTORY.md +0 -82
  50. package/node_modules/serve-static/node_modules/statuses/LICENSE +0 -23
  51. package/node_modules/serve-static/node_modules/statuses/README.md +0 -136
  52. package/node_modules/serve-static/node_modules/statuses/codes.json +0 -65
  53. package/node_modules/serve-static/node_modules/statuses/index.js +0 -146
  54. package/node_modules/serve-static/node_modules/statuses/package.json +0 -49
@@ -1,10 +1,32 @@
1
1
  'use strict';
2
2
 
3
3
  var formats = require('./formats');
4
+ var getSideChannel = require('side-channel');
4
5
 
5
6
  var has = Object.prototype.hasOwnProperty;
6
7
  var isArray = Array.isArray;
7
8
 
9
+ // Track objects created from arrayLimit overflow using side-channel
10
+ // Stores the current max numeric index for O(1) lookup
11
+ var overflowChannel = getSideChannel();
12
+
13
+ var markOverflow = function markOverflow(obj, maxIndex) {
14
+ overflowChannel.set(obj, maxIndex);
15
+ return obj;
16
+ };
17
+
18
+ var isOverflow = function isOverflow(obj) {
19
+ return overflowChannel.has(obj);
20
+ };
21
+
22
+ var getMaxIndex = function getMaxIndex(obj) {
23
+ return overflowChannel.get(obj);
24
+ };
25
+
26
+ var setMaxIndex = function setMaxIndex(obj, maxIndex) {
27
+ overflowChannel.set(obj, maxIndex);
28
+ };
29
+
8
30
  var hexTable = (function () {
9
31
  var array = [];
10
32
  for (var i = 0; i < 256; ++i) {
@@ -54,7 +76,12 @@ var merge = function merge(target, source, options) {
54
76
  if (isArray(target)) {
55
77
  target.push(source);
56
78
  } else if (target && typeof target === 'object') {
57
- if (
79
+ if (isOverflow(target)) {
80
+ // Add at next numeric index for overflow objects
81
+ var newIndex = getMaxIndex(target) + 1;
82
+ target[newIndex] = source;
83
+ setMaxIndex(target, newIndex);
84
+ } else if (
58
85
  (options && (options.plainObjects || options.allowPrototypes))
59
86
  || !has.call(Object.prototype, source)
60
87
  ) {
@@ -68,6 +95,18 @@ var merge = function merge(target, source, options) {
68
95
  }
69
96
 
70
97
  if (!target || typeof target !== 'object') {
98
+ if (isOverflow(source)) {
99
+ // Create new object with target at 0, source values shifted by 1
100
+ var sourceKeys = Object.keys(source);
101
+ var result = options && options.plainObjects
102
+ ? { __proto__: null, 0: target }
103
+ : { 0: target };
104
+ for (var m = 0; m < sourceKeys.length; m++) {
105
+ var oldKey = parseInt(sourceKeys[m], 10);
106
+ result[oldKey + 1] = source[sourceKeys[m]];
107
+ }
108
+ return markOverflow(result, getMaxIndex(source) + 1);
109
+ }
71
110
  return [target].concat(source);
72
111
  }
73
112
 
@@ -239,8 +278,20 @@ var isBuffer = function isBuffer(obj) {
239
278
  return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));
240
279
  };
241
280
 
242
- var combine = function combine(a, b) {
243
- return [].concat(a, b);
281
+ var combine = function combine(a, b, arrayLimit, plainObjects) {
282
+ // If 'a' is already an overflow object, add to it
283
+ if (isOverflow(a)) {
284
+ var newIndex = getMaxIndex(a) + 1;
285
+ a[newIndex] = b;
286
+ setMaxIndex(a, newIndex);
287
+ return a;
288
+ }
289
+
290
+ var result = [].concat(a, b);
291
+ if (result.length > arrayLimit) {
292
+ return markOverflow(arrayToObject(result, { plainObjects: plainObjects }), result.length - 1);
293
+ }
294
+ return result;
244
295
  };
245
296
 
246
297
  var maybeMap = function maybeMap(val, fn) {
@@ -262,6 +313,7 @@ module.exports = {
262
313
  decode: decode,
263
314
  encode: encode,
264
315
  isBuffer: isBuffer,
316
+ isOverflow: isOverflow,
265
317
  isRegExp: isRegExp,
266
318
  maybeMap: maybeMap,
267
319
  merge: merge
@@ -2,7 +2,7 @@
2
2
  "name": "qs",
3
3
  "description": "A querystring parser that supports nesting and arrays, with a depth limit",
4
4
  "homepage": "https://github.com/ljharb/qs",
5
- "version": "6.14.0",
5
+ "version": "6.14.1",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/ljharb/qs.git"
@@ -36,15 +36,15 @@
36
36
  "devDependencies": {
37
37
  "@browserify/envify": "^6.0.0",
38
38
  "@browserify/uglifyify": "^6.0.0",
39
- "@ljharb/eslint-config": "^21.1.1",
39
+ "@ljharb/eslint-config": "^22.1.3",
40
40
  "browserify": "^16.5.2",
41
41
  "bundle-collapser": "^1.4.0",
42
42
  "common-shakeify": "~1.0.0",
43
43
  "eclint": "^2.8.1",
44
- "es-value-fixtures": "^1.7.0",
45
- "eslint": "=8.8.0",
44
+ "es-value-fixtures": "^1.7.1",
45
+ "eslint": "^9.39.2",
46
46
  "evalmd": "^0.0.19",
47
- "for-each": "^0.3.3",
47
+ "for-each": "^0.3.5",
48
48
  "glob": "=10.3.7",
49
49
  "has-bigints": "^1.1.0",
50
50
  "has-override-mistake": "^1.0.1",
@@ -54,12 +54,13 @@
54
54
  "iconv-lite": "^0.5.1",
55
55
  "in-publish": "^2.0.1",
56
56
  "jackspeak": "=2.1.1",
57
+ "jiti": "^0.0.0",
57
58
  "mkdirp": "^0.5.5",
58
59
  "mock-property": "^1.1.0",
59
60
  "module-deps": "^6.2.3",
60
- "npmignore": "^0.3.1",
61
+ "npmignore": "^0.3.5",
61
62
  "nyc": "^10.3.2",
62
- "object-inspect": "^1.13.3",
63
+ "object-inspect": "^1.13.4",
63
64
  "qs-iconv": "^1.0.4",
64
65
  "safe-publish-latest": "^2.0.0",
65
66
  "safer-buffer": "^2.1.2",
@@ -76,7 +77,7 @@
76
77
  "posttest": "npx npm@'>=10.2' audit --production",
77
78
  "readme": "evalmd README.md",
78
79
  "postlint": "eclint check $(git ls-files | xargs find 2> /dev/null | grep -vE 'node_modules|\\.git' | grep -v dist/)",
79
- "lint": "eslint --ext=js,mjs .",
80
+ "lint": "eslint .",
80
81
  "dist": "mkdirp dist && browserify --standalone Qs -g unassertify -g @browserify/envify -g [@browserify/uglifyify --mangle.keep_fnames --compress.keep_fnames --format.indent_level=1 --compress.arrows=false --compress.passes=4 --compress.typeofs=false] -p common-shakeify -p bundle-collapser/plugin lib/index.js > dist/qs.js"
81
82
  },
82
83
  "license": "BSD-3-Clause",
@@ -235,11 +235,11 @@ test('parse()', function (t) {
235
235
  st.deepEqual(qs.parse('a=b&a[0]=c'), { a: ['b', 'c'] });
236
236
 
237
237
  st.deepEqual(qs.parse('a[1]=b&a=c', { arrayLimit: 20 }), { a: ['b', 'c'] });
238
- st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: ['b', 'c'] });
238
+ st.deepEqual(qs.parse('a[]=b&a=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } });
239
239
  st.deepEqual(qs.parse('a[]=b&a=c'), { a: ['b', 'c'] });
240
240
 
241
241
  st.deepEqual(qs.parse('a=b&a[1]=c', { arrayLimit: 20 }), { a: ['b', 'c'] });
242
- st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: ['b', 'c'] });
242
+ st.deepEqual(qs.parse('a=b&a[]=c', { arrayLimit: 0 }), { a: { 0: 'b', 1: 'c' } });
243
243
  st.deepEqual(qs.parse('a=b&a[]=c'), { a: ['b', 'c'] });
244
244
 
245
245
  st.end();
@@ -364,7 +364,7 @@ test('parse()', function (t) {
364
364
  );
365
365
  st.deepEqual(
366
366
  qs.parse('a[]=b&a[]&a[]=c&a[]=', { strictNullHandling: true, arrayLimit: 0 }),
367
- { a: ['b', null, 'c', ''] },
367
+ { a: { 0: 'b', 1: null, 2: 'c', 3: '' } },
368
368
  'with arrayLimit 0 + array brackets: null then empty string works'
369
369
  );
370
370
 
@@ -375,7 +375,7 @@ test('parse()', function (t) {
375
375
  );
376
376
  st.deepEqual(
377
377
  qs.parse('a[]=b&a[]=&a[]=c&a[]', { strictNullHandling: true, arrayLimit: 0 }),
378
- { a: ['b', '', 'c', null] },
378
+ { a: { 0: 'b', 1: '', 2: 'c', 3: null } },
379
379
  'with arrayLimit 0 + array brackets: empty string then null works'
380
380
  );
381
381
 
@@ -996,6 +996,20 @@ test('parse()', function (t) {
996
996
  st.end();
997
997
  });
998
998
 
999
+ t.test('handles a custom decoder returning `null`, with a string key of `null`', function (st) {
1000
+ st.deepEqual(
1001
+ qs.parse('null=1&ToNull=2', {
1002
+ decoder: function (str, defaultDecoder, charset) {
1003
+ return str === 'ToNull' ? null : defaultDecoder(str, defaultDecoder, charset);
1004
+ }
1005
+ }),
1006
+ { 'null': '1' },
1007
+ '"null" key is not overridden by `null` decoder result'
1008
+ );
1009
+
1010
+ st.end();
1011
+ });
1012
+
999
1013
  t.test('does not interpret numeric entities in iso-8859-1 when `interpretNumericEntities` is absent', function (st) {
1000
1014
  st.deepEqual(qs.parse('foo=' + urlEncodedNumSmiley, { charset: 'iso-8859-1' }), { foo: '&#9786;' });
1001
1015
  st.end();
@@ -1274,3 +1288,109 @@ test('qs strictDepth option - non-throw cases', function (t) {
1274
1288
  st.end();
1275
1289
  });
1276
1290
  });
1291
+
1292
+ test('DOS', function (t) {
1293
+ var arr = [];
1294
+ for (var i = 0; i < 105; i++) {
1295
+ arr[arr.length] = 'x';
1296
+ }
1297
+ var attack = 'a[]=' + arr.join('&a[]=');
1298
+ var result = qs.parse(attack, { arrayLimit: 100 });
1299
+
1300
+ t.notOk(Array.isArray(result.a), 'arrayLimit is respected: result is an object, not an array');
1301
+ t.equal(Object.keys(result.a).length, 105, 'all values are preserved');
1302
+
1303
+ t.end();
1304
+ });
1305
+
1306
+ test('arrayLimit boundary conditions', function (t) {
1307
+ t.test('exactly at the limit stays as array', function (st) {
1308
+ var result = qs.parse('a[]=1&a[]=2&a[]=3', { arrayLimit: 3 });
1309
+ st.ok(Array.isArray(result.a), 'result is an array when exactly at limit');
1310
+ st.deepEqual(result.a, ['1', '2', '3'], 'all values present');
1311
+ st.end();
1312
+ });
1313
+
1314
+ t.test('one over the limit converts to object', function (st) {
1315
+ var result = qs.parse('a[]=1&a[]=2&a[]=3&a[]=4', { arrayLimit: 3 });
1316
+ st.notOk(Array.isArray(result.a), 'result is not an array when over limit');
1317
+ st.deepEqual(result.a, { 0: '1', 1: '2', 2: '3', 3: '4' }, 'all values preserved as object');
1318
+ st.end();
1319
+ });
1320
+
1321
+ t.test('arrayLimit 1 with two values', function (st) {
1322
+ var result = qs.parse('a[]=1&a[]=2', { arrayLimit: 1 });
1323
+ st.notOk(Array.isArray(result.a), 'result is not an array');
1324
+ st.deepEqual(result.a, { 0: '1', 1: '2' }, 'both values preserved');
1325
+ st.end();
1326
+ });
1327
+
1328
+ t.end();
1329
+ });
1330
+
1331
+ test('mixed array and object notation', function (t) {
1332
+ t.test('array brackets with object key - under limit', function (st) {
1333
+ st.deepEqual(
1334
+ qs.parse('a[]=b&a[c]=d'),
1335
+ { a: { 0: 'b', c: 'd' } },
1336
+ 'mixing [] and [key] converts to object'
1337
+ );
1338
+ st.end();
1339
+ });
1340
+
1341
+ t.test('array index with object key - under limit', function (st) {
1342
+ st.deepEqual(
1343
+ qs.parse('a[0]=b&a[c]=d'),
1344
+ { a: { 0: 'b', c: 'd' } },
1345
+ 'mixing [0] and [key] produces object'
1346
+ );
1347
+ st.end();
1348
+ });
1349
+
1350
+ t.test('plain value with array brackets - under limit', function (st) {
1351
+ st.deepEqual(
1352
+ qs.parse('a=b&a[]=c', { arrayLimit: 20 }),
1353
+ { a: ['b', 'c'] },
1354
+ 'plain value combined with [] stays as array under limit'
1355
+ );
1356
+ st.end();
1357
+ });
1358
+
1359
+ t.test('array brackets with plain value - under limit', function (st) {
1360
+ st.deepEqual(
1361
+ qs.parse('a[]=b&a=c', { arrayLimit: 20 }),
1362
+ { a: ['b', 'c'] },
1363
+ '[] combined with plain value stays as array under limit'
1364
+ );
1365
+ st.end();
1366
+ });
1367
+
1368
+ t.test('plain value with array index - under limit', function (st) {
1369
+ st.deepEqual(
1370
+ qs.parse('a=b&a[0]=c', { arrayLimit: 20 }),
1371
+ { a: ['b', 'c'] },
1372
+ 'plain value combined with [0] stays as array under limit'
1373
+ );
1374
+ st.end();
1375
+ });
1376
+
1377
+ t.test('multiple plain values with duplicates combine', function (st) {
1378
+ st.deepEqual(
1379
+ qs.parse('a=b&a=c&a=d', { arrayLimit: 20 }),
1380
+ { a: ['b', 'c', 'd'] },
1381
+ 'duplicate plain keys combine into array'
1382
+ );
1383
+ st.end();
1384
+ });
1385
+
1386
+ t.test('multiple plain values exceeding limit', function (st) {
1387
+ st.deepEqual(
1388
+ qs.parse('a=b&a=c&a=d', { arrayLimit: 2 }),
1389
+ { a: { 0: 'b', 1: 'c', 2: 'd' } },
1390
+ 'duplicate plain keys convert to object when exceeding limit'
1391
+ );
1392
+ st.end();
1393
+ });
1394
+
1395
+ t.end();
1396
+ });
@@ -1293,13 +1293,17 @@ test('stringifies empty keys', function (t) {
1293
1293
  });
1294
1294
 
1295
1295
  t.test('stringifies non-string keys', function (st) {
1296
- var actual = qs.stringify({ a: 'b', 'false': {} }, {
1297
- filter: ['a', false, null],
1296
+ var S = Object('abc');
1297
+ S.toString = function () {
1298
+ return 'd';
1299
+ };
1300
+ var actual = qs.stringify({ a: 'b', 'false': {}, 1e+22: 'c', d: 'e' }, {
1301
+ filter: ['a', false, null, 10000000000000000000000, S],
1298
1302
  allowDots: true,
1299
1303
  encodeDotInKeys: true
1300
1304
  });
1301
1305
 
1302
- st.equal(actual, 'a=b', 'stringifies correctly');
1306
+ st.equal(actual, 'a=b&1e%2B22=c&d=e', 'stringifies correctly');
1303
1307
 
1304
1308
  st.end();
1305
1309
  });
@@ -68,6 +68,60 @@ test('merge()', function (t) {
68
68
  }
69
69
  );
70
70
 
71
+ t.test('with overflow objects (from arrayLimit)', function (st) {
72
+ st.test('merges primitive into overflow object at next index', function (s2t) {
73
+ // Create an overflow object via combine
74
+ var overflow = utils.combine(['a'], 'b', 1, false);
75
+ s2t.ok(utils.isOverflow(overflow), 'overflow object is marked');
76
+ var merged = utils.merge(overflow, 'c');
77
+ s2t.deepEqual(merged, { 0: 'a', 1: 'b', 2: 'c' }, 'adds primitive at next numeric index');
78
+ s2t.end();
79
+ });
80
+
81
+ st.test('merges primitive into regular object with numeric keys normally', function (s2t) {
82
+ var obj = { 0: 'a', 1: 'b' };
83
+ s2t.notOk(utils.isOverflow(obj), 'plain object is not marked as overflow');
84
+ var merged = utils.merge(obj, 'c');
85
+ s2t.deepEqual(merged, { 0: 'a', 1: 'b', c: true }, 'adds primitive as key (not at next index)');
86
+ s2t.end();
87
+ });
88
+
89
+ st.test('merges primitive into object with non-numeric keys normally', function (s2t) {
90
+ var obj = { foo: 'bar' };
91
+ var merged = utils.merge(obj, 'baz');
92
+ s2t.deepEqual(merged, { foo: 'bar', baz: true }, 'adds primitive as key with value true');
93
+ s2t.end();
94
+ });
95
+
96
+ st.test('merges overflow object into primitive', function (s2t) {
97
+ // Create an overflow object via combine
98
+ var overflow = utils.combine([], 'b', 0, false);
99
+ s2t.ok(utils.isOverflow(overflow), 'overflow object is marked');
100
+ var merged = utils.merge('a', overflow);
101
+ s2t.ok(utils.isOverflow(merged), 'result is also marked as overflow');
102
+ s2t.deepEqual(merged, { 0: 'a', 1: 'b' }, 'creates object with primitive at 0, source values shifted');
103
+ s2t.end();
104
+ });
105
+
106
+ st.test('merges overflow object with multiple values into primitive', function (s2t) {
107
+ // Create an overflow object via combine
108
+ var overflow = utils.combine(['b'], 'c', 1, false);
109
+ s2t.ok(utils.isOverflow(overflow), 'overflow object is marked');
110
+ var merged = utils.merge('a', overflow);
111
+ s2t.deepEqual(merged, { 0: 'a', 1: 'b', 2: 'c' }, 'shifts all source indices by 1');
112
+ s2t.end();
113
+ });
114
+
115
+ st.test('merges regular object into primitive as array', function (s2t) {
116
+ var obj = { foo: 'bar' };
117
+ var merged = utils.merge('a', obj);
118
+ s2t.deepEqual(merged, ['a', { foo: 'bar' }], 'creates array with primitive and object');
119
+ s2t.end();
120
+ });
121
+
122
+ st.end();
123
+ });
124
+
71
125
  t.end();
72
126
  });
73
127
 
@@ -132,6 +186,71 @@ test('combine()', function (t) {
132
186
  st.end();
133
187
  });
134
188
 
189
+ t.test('with arrayLimit', function (st) {
190
+ st.test('under the limit', function (s2t) {
191
+ var combined = utils.combine(['a', 'b'], 'c', 10, false);
192
+ s2t.deepEqual(combined, ['a', 'b', 'c'], 'returns array when under limit');
193
+ s2t.ok(Array.isArray(combined), 'result is an array');
194
+ s2t.end();
195
+ });
196
+
197
+ st.test('exactly at the limit stays as array', function (s2t) {
198
+ var combined = utils.combine(['a', 'b'], 'c', 3, false);
199
+ s2t.deepEqual(combined, ['a', 'b', 'c'], 'stays as array when exactly at limit');
200
+ s2t.ok(Array.isArray(combined), 'result is an array');
201
+ s2t.end();
202
+ });
203
+
204
+ st.test('over the limit', function (s2t) {
205
+ var combined = utils.combine(['a', 'b', 'c'], 'd', 3, false);
206
+ s2t.deepEqual(combined, { 0: 'a', 1: 'b', 2: 'c', 3: 'd' }, 'converts to object when over limit');
207
+ s2t.notOk(Array.isArray(combined), 'result is not an array');
208
+ s2t.end();
209
+ });
210
+
211
+ st.test('with arrayLimit 0', function (s2t) {
212
+ var combined = utils.combine([], 'a', 0, false);
213
+ s2t.deepEqual(combined, { 0: 'a' }, 'converts single element to object with arrayLimit 0');
214
+ s2t.notOk(Array.isArray(combined), 'result is not an array');
215
+ s2t.end();
216
+ });
217
+
218
+ st.test('with plainObjects option', function (s2t) {
219
+ var combined = utils.combine(['a'], 'b', 1, true);
220
+ var expected = { __proto__: null, 0: 'a', 1: 'b' };
221
+ s2t.deepEqual(combined, expected, 'converts to object with null prototype');
222
+ s2t.equal(Object.getPrototypeOf(combined), null, 'result has null prototype when plainObjects is true');
223
+ s2t.end();
224
+ });
225
+
226
+ st.end();
227
+ });
228
+
229
+ t.test('with existing overflow object', function (st) {
230
+ st.test('adds to existing overflow object at next index', function (s2t) {
231
+ // Create overflow object first via combine
232
+ var overflow = utils.combine(['a'], 'b', 1, false);
233
+ s2t.ok(utils.isOverflow(overflow), 'initial object is marked as overflow');
234
+
235
+ var combined = utils.combine(overflow, 'c', 10, false);
236
+ s2t.equal(combined, overflow, 'returns the same object (mutated)');
237
+ s2t.deepEqual(combined, { 0: 'a', 1: 'b', 2: 'c' }, 'adds value at next numeric index');
238
+ s2t.end();
239
+ });
240
+
241
+ st.test('does not treat plain object with numeric keys as overflow', function (s2t) {
242
+ var plainObj = { 0: 'a', 1: 'b' };
243
+ s2t.notOk(utils.isOverflow(plainObj), 'plain object is not marked as overflow');
244
+
245
+ // combine treats this as a regular value, not an overflow object to append to
246
+ var combined = utils.combine(plainObj, 'c', 10, false);
247
+ s2t.deepEqual(combined, [{ 0: 'a', 1: 'b' }, 'c'], 'concatenates as regular values');
248
+ s2t.end();
249
+ });
250
+
251
+ st.end();
252
+ });
253
+
135
254
  t.end();
136
255
  });
137
256
 
@@ -1,3 +1,10 @@
1
+ 0.19.2 / 2025-12-15
2
+ ===================
3
+
4
+ * deps: use tilde notation for dependencies
5
+ * deps: http-errors@~2.0.1
6
+ * deps: statuses@~2.0.2
7
+
1
8
  0.19.1 / 2024-10-09
2
9
  ===================
3
10
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "send",
3
3
  "description": "Better streaming static file server with Range and conditional-GET support",
4
- "version": "0.19.1",
4
+ "version": "0.19.2",
5
5
  "author": "TJ Holowaychuk <tj@vision-media.ca>",
6
6
  "contributors": [
7
7
  "Douglas Christopher Wilson <doug@somethingdoug.com>",
@@ -22,13 +22,13 @@
22
22
  "encodeurl": "~2.0.0",
23
23
  "escape-html": "~1.0.3",
24
24
  "etag": "~1.8.1",
25
- "fresh": "0.5.2",
26
- "http-errors": "2.0.0",
25
+ "fresh": "~0.5.2",
26
+ "http-errors": "~2.0.1",
27
27
  "mime": "1.6.0",
28
28
  "ms": "2.1.3",
29
- "on-finished": "2.4.1",
29
+ "on-finished": "~2.4.1",
30
30
  "range-parser": "~1.2.1",
31
- "statuses": "2.0.1"
31
+ "statuses": "~2.0.2"
32
32
  },
33
33
  "devDependencies": {
34
34
  "after": "0.8.2",
@@ -1,3 +1,9 @@
1
+ 1.16.3 / 2024-12-15
2
+ ===================
3
+
4
+ * deps: send@~0.19.1
5
+ - deps: encodeurl@~2.0.0
6
+
1
7
  1.16.2 / 2024-09-11
2
8
  ===================
3
9
 
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "serve-static",
3
3
  "description": "Serve static files",
4
- "version": "1.16.2",
4
+ "version": "1.16.3",
5
5
  "author": "Douglas Christopher Wilson <doug@somethingdoug.com>",
6
6
  "license": "MIT",
7
7
  "repository": "expressjs/serve-static",
@@ -9,7 +9,7 @@
9
9
  "encodeurl": "~2.0.0",
10
10
  "escape-html": "~1.0.3",
11
11
  "parseurl": "~1.3.3",
12
- "send": "0.19.0"
12
+ "send": "~0.19.1"
13
13
  },
14
14
  "devDependencies": {
15
15
  "eslint": "7.32.0",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "step-node-agent",
3
- "version": "3.29.1",
3
+ "version": "3.29.2",
4
4
  "description": "The official STEP Agent implementation for Node.js",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -1,39 +0,0 @@
1
- {
2
- "root": true,
3
-
4
- "extends": "@ljharb",
5
-
6
- "ignorePatterns": [
7
- "dist/",
8
- ],
9
-
10
- "rules": {
11
- "complexity": 0,
12
- "consistent-return": 1,
13
- "func-name-matching": 0,
14
- "id-length": [2, { "min": 1, "max": 25, "properties": "never" }],
15
- "indent": [2, 4],
16
- "max-lines": 0,
17
- "max-lines-per-function": [2, { "max": 150 }],
18
- "max-params": [2, 18],
19
- "max-statements": [2, 100],
20
- "multiline-comment-style": 0,
21
- "no-continue": 1,
22
- "no-magic-numbers": 0,
23
- "no-restricted-syntax": [2, "BreakStatement", "DebuggerStatement", "ForInStatement", "LabeledStatement", "WithStatement"],
24
- },
25
-
26
- "overrides": [
27
- {
28
- "files": "test/**",
29
- "rules": {
30
- "function-paren-newline": 0,
31
- "max-lines-per-function": 0,
32
- "max-statements": 0,
33
- "no-buffer-constructor": 0,
34
- "no-extend-native": 0,
35
- "no-throw-literal": 0,
36
- },
37
- },
38
- ],
39
- }