Update npm packages (73 packages including @jqhtml 2.3.36)
Update npm registry domain from privatenpm.hanson.xyz to npm.internal.hanson.xyz 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
198
node_modules/qs/test/parse.js
generated
vendored
198
node_modules/qs/test/parse.js
generated
vendored
@@ -261,11 +261,11 @@ test('parse()', function (t) {
|
||||
});
|
||||
|
||||
t.test('limits specific array indices to arrayLimit', function (st) {
|
||||
st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: ['a'] });
|
||||
st.deepEqual(qs.parse('a[21]=a', { arrayLimit: 20 }), { a: { 21: 'a' } });
|
||||
st.deepEqual(qs.parse('a[19]=a', { arrayLimit: 20 }), { a: ['a'] });
|
||||
st.deepEqual(qs.parse('a[20]=a', { arrayLimit: 20 }), { a: { 20: 'a' } });
|
||||
|
||||
st.deepEqual(qs.parse('a[20]=a'), { a: ['a'] });
|
||||
st.deepEqual(qs.parse('a[21]=a'), { a: { 21: 'a' } });
|
||||
st.deepEqual(qs.parse('a[19]=a'), { a: ['a'] });
|
||||
st.deepEqual(qs.parse('a[20]=a'), { a: { 20: 'a' } });
|
||||
st.end();
|
||||
});
|
||||
|
||||
@@ -483,7 +483,7 @@ test('parse()', function (t) {
|
||||
|
||||
t.test('allows overriding array limit', function (st) {
|
||||
st.deepEqual(qs.parse('a[0]=b', { arrayLimit: -1 }), { a: { 0: 'b' } });
|
||||
st.deepEqual(qs.parse('a[0]=b', { arrayLimit: 0 }), { a: ['b'] });
|
||||
st.deepEqual(qs.parse('a[0]=b', { arrayLimit: 0 }), { a: { 0: 'b' } });
|
||||
|
||||
st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: -1 }), { a: { '-1': 'b' } });
|
||||
st.deepEqual(qs.parse('a[-1]=b', { arrayLimit: 0 }), { a: { '-1': 'b' } });
|
||||
@@ -784,25 +784,25 @@ test('parse()', function (t) {
|
||||
|
||||
t.test('add keys to objects', function (st) {
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=d'),
|
||||
qs.parse('a[b]=c&a=d', { strictMerge: false }),
|
||||
{ a: { b: 'c', d: true } },
|
||||
'can add keys to objects'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=toString'),
|
||||
qs.parse('a[b]=c&a=toString', { strictMerge: false }),
|
||||
{ a: { b: 'c' } },
|
||||
'can not overwrite prototype'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=toString', { allowPrototypes: true }),
|
||||
qs.parse('a[b]=c&a=toString', { strictMerge: false, allowPrototypes: true }),
|
||||
{ a: { b: 'c', toString: true } },
|
||||
'can overwrite prototype with allowPrototypes true'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=toString', { plainObjects: true }),
|
||||
qs.parse('a[b]=c&a=toString', { strictMerge: false, plainObjects: true }),
|
||||
{ __proto__: null, a: { __proto__: null, b: 'c', toString: true } },
|
||||
'can overwrite prototype with plainObjects true'
|
||||
);
|
||||
@@ -810,6 +810,34 @@ test('parse()', function (t) {
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('strictMerge wraps object and primitive into an array', function (st) {
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=d'),
|
||||
{ a: [{ b: 'c' }, 'd'] },
|
||||
'object then primitive produces array'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a=d&a[b]=c'),
|
||||
{ a: ['d', { b: 'c' }] },
|
||||
'primitive then object produces array'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=toString'),
|
||||
{ a: [{ b: 'c' }, 'toString'] },
|
||||
'prototype-colliding value is preserved in array'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[b]=c&a=toString', { plainObjects: true }),
|
||||
{ __proto__: null, a: [{ __proto__: null, b: 'c' }, 'toString'] },
|
||||
'plainObjects preserved in array wrapping'
|
||||
);
|
||||
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('dunder proto is ignored', function (st) {
|
||||
var payload = 'categories[__proto__]=login&categories[__proto__]&categories[length]=42';
|
||||
var result = qs.parse(payload, { allowPrototypes: true });
|
||||
@@ -1118,6 +1146,7 @@ test('parse()', function (t) {
|
||||
});
|
||||
|
||||
st.test('throws error when array limit exceeded', function (sst) {
|
||||
// 4 elements exceeds limit of 3
|
||||
sst['throws'](
|
||||
function () {
|
||||
qs.parse('a[]=1&a[]=2&a[]=3&a[]=4', { arrayLimit: 3, throwOnLimitExceeded: true });
|
||||
@@ -1128,6 +1157,14 @@ test('parse()', function (t) {
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.test('does not throw when at limit', function (sst) {
|
||||
// 3 elements = limit of 3, should not throw
|
||||
var result = qs.parse('a[]=1&a[]=2&a[]=3', { arrayLimit: 3, throwOnLimitExceeded: true });
|
||||
sst.ok(Array.isArray(result.a), 'result is an array');
|
||||
sst.deepEqual(result.a, ['1', '2', '3'], 'all values present');
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.test('converts array to object if length is greater than limit', function (sst) {
|
||||
var result = qs.parse('a[1]=1&a[2]=2&a[3]=3&a[4]=4&a[5]=5&a[6]=6', { arrayLimit: 5 });
|
||||
|
||||
@@ -1135,6 +1172,40 @@ test('parse()', function (t) {
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.test('throws error when indexed notation exceeds arrayLimit with throwOnLimitExceeded', function (sst) {
|
||||
sst['throws'](
|
||||
function () {
|
||||
qs.parse('a[1001]=b', { arrayLimit: 1000, throwOnLimitExceeded: true });
|
||||
},
|
||||
new RangeError('Array limit exceeded. Only 1000 elements allowed in an array.'),
|
||||
'throws error for a single index exceeding arrayLimit'
|
||||
);
|
||||
|
||||
sst['throws'](
|
||||
function () {
|
||||
qs.parse('a[0]=1&a[1]=2&a[2]=3&a[10]=4', { arrayLimit: 6, throwOnLimitExceeded: true, allowSparse: true });
|
||||
},
|
||||
new RangeError('Array limit exceeded. Only 6 elements allowed in an array.'),
|
||||
'throws error when a sparse index exceeds arrayLimit'
|
||||
);
|
||||
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.test('does not throw for indexed notation within arrayLimit with throwOnLimitExceeded', function (sst) {
|
||||
var result = qs.parse('a[4]=b', { arrayLimit: 5, throwOnLimitExceeded: true, allowSparse: true });
|
||||
sst.ok(Array.isArray(result.a), 'result is an array');
|
||||
sst.equal(result.a.length, 5, 'array has correct length');
|
||||
sst.equal(result.a[4], 'b', 'value at index 4 is correct');
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.test('silently converts to object for indexed notation exceeding arrayLimit without throwOnLimitExceeded', function (sst) {
|
||||
var result = qs.parse('a[1001]=b', { arrayLimit: 1000 });
|
||||
sst.deepEqual(result, { a: { 1001: 'b' } }, 'converts to object without throwing');
|
||||
sst.end();
|
||||
});
|
||||
|
||||
st.end();
|
||||
});
|
||||
|
||||
@@ -1186,6 +1257,34 @@ test('`duplicates` option', function (t) {
|
||||
'duplicates: last'
|
||||
);
|
||||
|
||||
t.test('bracket notation always combines regardless of duplicates', function (st) {
|
||||
st.deepEqual(
|
||||
qs.parse('a=1&a=2&b[]=1&b[]=2', { duplicates: 'last' }),
|
||||
{ a: '2', b: ['1', '2'] },
|
||||
'duplicates last: unbracketed takes last, bracketed combines'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('b[]=1&b[]=2', { duplicates: 'last' }),
|
||||
{ b: ['1', '2'] },
|
||||
'duplicates last: bracketed always combines'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('b[]=1&b[]=2', { duplicates: 'first' }),
|
||||
{ b: ['1', '2'] },
|
||||
'duplicates first: bracketed always combines'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a=1&a=2&b[]=1&b[]=2', { duplicates: 'first' }),
|
||||
{ a: '1', b: ['1', '2'] },
|
||||
'duplicates first: unbracketed takes first, bracketed combines'
|
||||
);
|
||||
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
@@ -1304,24 +1403,72 @@ test('DOS', function (t) {
|
||||
});
|
||||
|
||||
test('arrayLimit boundary conditions', function (t) {
|
||||
// arrayLimit is the max number of elements allowed in an array
|
||||
t.test('exactly at the limit stays as array', function (st) {
|
||||
// 3 elements = limit of 3
|
||||
var result = qs.parse('a[]=1&a[]=2&a[]=3', { arrayLimit: 3 });
|
||||
st.ok(Array.isArray(result.a), 'result is an array when exactly at limit');
|
||||
st.ok(Array.isArray(result.a), 'result is an array when count equals limit');
|
||||
st.deepEqual(result.a, ['1', '2', '3'], 'all values present');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('one over the limit converts to object', function (st) {
|
||||
// 4 elements exceeds limit of 3
|
||||
var result = qs.parse('a[]=1&a[]=2&a[]=3&a[]=4', { arrayLimit: 3 });
|
||||
st.notOk(Array.isArray(result.a), 'result is not an array when over limit');
|
||||
st.deepEqual(result.a, { 0: '1', 1: '2', 2: '3', 3: '4' }, 'all values preserved as object');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('arrayLimit 1 with two values', function (st) {
|
||||
t.test('arrayLimit 1 with one value', function (st) {
|
||||
// 1 element = limit of 1
|
||||
var result = qs.parse('a[]=1', { arrayLimit: 1 });
|
||||
st.ok(Array.isArray(result.a), 'result is an array when count equals limit');
|
||||
st.deepEqual(result.a, ['1'], 'value preserved as array');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('arrayLimit 1 with two values converts to object', function (st) {
|
||||
// 2 elements exceeds limit of 1
|
||||
var result = qs.parse('a[]=1&a[]=2', { arrayLimit: 1 });
|
||||
st.notOk(Array.isArray(result.a), 'result is not an array');
|
||||
st.deepEqual(result.a, { 0: '1', 1: '2' }, 'both values preserved');
|
||||
st.deepEqual(result.a, { 0: '1', 1: '2' }, 'all values preserved as object');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
test('comma + arrayLimit', function (t) {
|
||||
t.test('comma-separated values within arrayLimit stay as array', function (st) {
|
||||
var result = qs.parse('a=1,2,3', { comma: true, arrayLimit: 5 });
|
||||
st.ok(Array.isArray(result.a), 'result is an array');
|
||||
st.deepEqual(result.a, ['1', '2', '3'], 'all values present');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('comma-separated values exceeding arrayLimit convert to object', function (st) {
|
||||
var result = qs.parse('a=1,2,3,4', { comma: true, arrayLimit: 3 });
|
||||
st.notOk(Array.isArray(result.a), 'result is not an array when over limit');
|
||||
st.deepEqual(result.a, { 0: '1', 1: '2', 2: '3', 3: '4' }, 'all values preserved as object');
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('comma-separated values exceeding arrayLimit with throwOnLimitExceeded throws', function (st) {
|
||||
st['throws'](
|
||||
function () {
|
||||
qs.parse('a=1,2,3,4', { comma: true, arrayLimit: 3, throwOnLimitExceeded: true });
|
||||
},
|
||||
new RangeError('Array limit exceeded. Only 3 elements allowed in an array.'),
|
||||
'throws error when comma-split exceeds array limit'
|
||||
);
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('comma-separated values at exactly arrayLimit stay as array', function (st) {
|
||||
var result = qs.parse('a=1,2,3', { comma: true, arrayLimit: 3 });
|
||||
st.ok(Array.isArray(result.a), 'result is an array when exactly at limit');
|
||||
st.deepEqual(result.a, ['1', '2', '3'], 'all values present');
|
||||
st.end();
|
||||
});
|
||||
|
||||
@@ -1384,13 +1531,38 @@ test('mixed array and object notation', function (t) {
|
||||
});
|
||||
|
||||
t.test('multiple plain values exceeding limit', function (st) {
|
||||
// 3 elements (indices 0-2), max index 2 > limit 1
|
||||
st.deepEqual(
|
||||
qs.parse('a=b&a=c&a=d', { arrayLimit: 2 }),
|
||||
qs.parse('a=b&a=c&a=d', { arrayLimit: 1 }),
|
||||
{ a: { 0: 'b', 1: 'c', 2: 'd' } },
|
||||
'duplicate plain keys convert to object when exceeding limit'
|
||||
);
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.test('mixed notation produces consistent results when arrayLimit is exceeded', function (st) {
|
||||
var expected = { a: { 0: 'b', 1: 'c', 2: 'd' } };
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[]=b&a[1]=c&a=d', { arrayLimit: -1 }),
|
||||
expected,
|
||||
'arrayLimit -1'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[]=b&a[1]=c&a=d', { arrayLimit: 0 }),
|
||||
expected,
|
||||
'arrayLimit 0'
|
||||
);
|
||||
|
||||
st.deepEqual(
|
||||
qs.parse('a[]=b&a[1]=c&a=d', { arrayLimit: 1 }),
|
||||
expected,
|
||||
'arrayLimit 1'
|
||||
);
|
||||
|
||||
st.end();
|
||||
});
|
||||
|
||||
t.end();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user