ima2-gen 2.0.1 → 2.0.3

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 (100) hide show
  1. package/CHANGELOG.md +151 -0
  2. package/README.md +10 -1
  3. package/bin/commands/backfillThumbs.js +6 -0
  4. package/bin/commands/gen.js +13 -5
  5. package/bin/commands/multimode.js +7 -5
  6. package/bin/commands/node.js +2 -1
  7. package/bin/ima2.js +14 -10
  8. package/config.js +8 -1
  9. package/docs/API.md +133 -9
  10. package/docs/CLI.md +6 -5
  11. package/docs/FAQ.ko.md +16 -0
  12. package/docs/FAQ.md +30 -0
  13. package/docs/README.ko.md +7 -3
  14. package/docs/migration/runtime-test-inventory.md +25 -1
  15. package/lib/agentCommandParser.js +10 -6
  16. package/lib/agentGenerationPlanner.js +96 -19
  17. package/lib/agentImageVideoGen.js +281 -0
  18. package/lib/agentPlannerModel.js +172 -0
  19. package/lib/agentQuestionResponder.js +9 -3
  20. package/lib/agentQueueStore.js +42 -0
  21. package/lib/agentQueueWorker.js +57 -7
  22. package/lib/agentRuntime.js +103 -274
  23. package/lib/agentSettings.js +9 -6
  24. package/lib/agentToolManifest.js +90 -0
  25. package/lib/agentTypes.js +1 -0
  26. package/lib/agyCli.js +31 -0
  27. package/lib/agyImageAdapter.js +104 -12
  28. package/lib/capabilities.js +7 -5
  29. package/lib/configKeys.js +6 -0
  30. package/lib/errorClassify.js +8 -7
  31. package/lib/eventBus.js +71 -0
  32. package/lib/geminiApiImageAdapter.js +24 -21
  33. package/lib/generationErrors.js +3 -1
  34. package/lib/generationRequestLog.js +25 -0
  35. package/lib/grokImageAdapter.js +76 -144
  36. package/lib/grokImageCore.js +153 -0
  37. package/lib/grokMultimodeAdapter.js +7 -4
  38. package/lib/grokVideoAdapter.js +3 -2
  39. package/lib/grokVideoCanvas.js +13 -0
  40. package/lib/grokVideoPlannerPrompt.js +52 -12
  41. package/lib/historyList.js +1 -0
  42. package/lib/inflight.js +54 -17
  43. package/lib/multimodeHelpers.js +11 -0
  44. package/lib/nodeHelpers.js +59 -0
  45. package/lib/oauthProxy/generators.js +6 -5
  46. package/lib/oauthProxy/prompts.js +60 -41
  47. package/lib/oauthProxy/streams.js +1 -1
  48. package/lib/promptBuilder/systemPrompt.js +2 -5
  49. package/lib/promptSafetyPolicy.js +1 -5
  50. package/lib/responsesDoctor.js +3 -3
  51. package/lib/responsesFallback.js +29 -15
  52. package/lib/responsesImageAdapter.js +11 -7
  53. package/lib/routeHelpers.js +44 -0
  54. package/lib/ssePublish.js +12 -0
  55. package/lib/storyboardPrefix.js +28 -0
  56. package/lib/thumbBackfill.js +16 -5
  57. package/node_modules/qs/CHANGELOG.md +10 -0
  58. package/node_modules/qs/README.md +1 -1
  59. package/node_modules/qs/dist/qs.js +15 -15
  60. package/node_modules/qs/eslint.config.mjs +1 -0
  61. package/node_modules/qs/lib/parse.js +52 -22
  62. package/node_modules/qs/lib/stringify.js +11 -4
  63. package/node_modules/qs/package.json +2 -2
  64. package/node_modules/qs/test/parse.js +49 -0
  65. package/node_modules/qs/test/stringify.js +129 -0
  66. package/package.json +4 -1
  67. package/routes/agent.js +19 -2
  68. package/routes/agy.js +48 -0
  69. package/routes/auth.js +6 -2
  70. package/routes/edit.js +7 -1
  71. package/routes/events.js +78 -0
  72. package/routes/generate.js +111 -128
  73. package/routes/generationRequestLog.js +16 -0
  74. package/routes/index.js +6 -0
  75. package/routes/keys.js +22 -2
  76. package/routes/multimode.js +100 -57
  77. package/routes/nodes.js +64 -108
  78. package/routes/video.js +100 -17
  79. package/skills/ima2/SKILL.md +98 -21
  80. package/ui/dist/.vite/manifest.json +22 -12
  81. package/ui/dist/assets/AgentWorkspace-qEMrATBP.js +3 -0
  82. package/ui/dist/assets/{CardNewsWorkspace-Dqyc1WZ1.js → CardNewsWorkspace-DoJnVHmn.js} +1 -1
  83. package/ui/dist/assets/GenerationRequestLogPanel-BDWRRLNV.js +1 -0
  84. package/ui/dist/assets/{NodeCanvas-ChEXzQbb.js → NodeCanvas-DIMo45sp.js} +3 -3
  85. package/ui/dist/assets/{PromptBuilderPanel-B95ZufnR.js → PromptBuilderPanel-BF3lcSJD.js} +2 -2
  86. package/ui/dist/assets/{PromptImportDialog-DGOwFQET.js → PromptImportDialog-Cy6ZymKG.js} +2 -2
  87. package/ui/dist/assets/{PromptImportDiscoverySection-CgvdnR49.js → PromptImportDiscoverySection-CzuW-8P2.js} +1 -1
  88. package/ui/dist/assets/PromptImportFolderSection-DP5ywnsv.js +1 -0
  89. package/ui/dist/assets/{PromptLibraryPanel-B9kndPw1.js → PromptLibraryPanel-CAsKr7CV.js} +2 -2
  90. package/ui/dist/assets/SettingsWorkspace-_PdPVsxi.js +1 -0
  91. package/ui/dist/assets/index-BUinlX2n.js +4 -0
  92. package/ui/dist/assets/index-CX3fge8X.css +1 -0
  93. package/ui/dist/assets/index-ygo6nfqx.js +23 -0
  94. package/ui/dist/index.html +2 -2
  95. package/ui/dist/assets/AgentWorkspace-CYv84Rus.js +0 -3
  96. package/ui/dist/assets/PromptImportFolderSection-CfUye9J8.js +0 -1
  97. package/ui/dist/assets/SettingsWorkspace-B3tgLrmF.js +0 -1
  98. package/ui/dist/assets/index-BhcvL0g-.js +0 -1
  99. package/ui/dist/assets/index-BtK3YhJc.js +0 -39
  100. package/ui/dist/assets/index-ClOLOjnA.css +0 -1
@@ -6,21 +6,34 @@ const MAX_RETRIES = 2;
6
6
  export async function retryPromptOnlyJsonImage({ postResponses, ctx, provider, prompt, mode, model, quality, size, moderation, requestId, signal, initial, referencesDroppedOnRetry, webSearchDroppedOnRetry, reasoningEffort, }) {
7
7
  if (provider === "api")
8
8
  return null;
9
- const retryKind = "prompt_only_with_developer";
10
- const retryMeta = {
11
- retryKind,
9
+ const developerPrompt = webSearchDroppedOnRetry
10
+ ? GENERATE_NO_SEARCH_DEVELOPER_PROMPT
11
+ : GENERATE_DEVELOPER_PROMPT;
12
+ // Retry chain: keep the developer prompt for the first MAX_RETRIES attempts
13
+ // (censorship relief), then make one final attempt with the user prompt only
14
+ // so a clean, instruction-free generation gets the last word.
15
+ const attemptPlans = [
16
+ ...Array.from({ length: MAX_RETRIES }, () => ({
17
+ retryKind: "prompt_only_with_developer",
18
+ developerPromptDroppedOnRetry: false,
19
+ })),
20
+ {
21
+ retryKind: "prompt_only_json_image_tool",
22
+ developerPromptDroppedOnRetry: true,
23
+ },
24
+ ];
25
+ const baseMeta = {
12
26
  initialEventCount: initial.eventCount,
13
27
  initialEventTypes: initial.eventTypes,
14
28
  referencesDroppedOnRetry,
15
- developerPromptDroppedOnRetry: false,
16
29
  webSearchDroppedOnRetry,
17
30
  };
18
- const developerPrompt = webSearchDroppedOnRetry
19
- ? GENERATE_NO_SEARCH_DEVELOPER_PROMPT
20
- : GENERATE_DEVELOPER_PROMPT;
31
+ let retryMeta = { ...baseMeta, ...attemptPlans[attemptPlans.length - 1] };
21
32
  let lastRetry = null;
22
- for (let attempt = 1; attempt <= MAX_RETRIES; attempt++) {
23
- logEvent("oauth", "retry_attempt", { requestId, attempt, maxRetries: MAX_RETRIES, ...retryMeta });
33
+ for (let attempt = 1; attempt <= attemptPlans.length; attempt++) {
34
+ const plan = attemptPlans[attempt - 1];
35
+ retryMeta = { ...baseMeta, ...plan };
36
+ logEvent("oauth", "retry_attempt", { requestId, attempt, maxRetries: attemptPlans.length, ...retryMeta });
24
37
  try {
25
38
  lastRetry = await postResponses({
26
39
  ctx,
@@ -32,18 +45,19 @@ export async function retryPromptOnlyJsonImage({ postResponses, ctx, provider, p
32
45
  payload: {
33
46
  model,
34
47
  input: [
35
- { role: "developer", content: developerPrompt },
36
- { role: "user", content: buildUserTextPrompt(prompt, mode, { webSearchEnabled: false }) },
48
+ ...(plan.developerPromptDroppedOnRetry ? [] : [{ role: "developer", content: developerPrompt }]),
49
+ { role: "user", content: buildUserTextPrompt(prompt, mode, { webSearchEnabled: false, size }) },
37
50
  ],
38
51
  tools: tools(false, { quality, size, moderation }),
39
52
  tool_choice: imageToolChoice(true),
40
53
  reasoning: { effort: reasoningEffort || "low" },
41
- stream: false,
54
+ // OAuth/Codex proxy returns empty output[] for non-stream image requests; SSE required.
55
+ stream: true,
42
56
  },
43
57
  });
44
58
  }
45
59
  catch (e) {
46
- if (attempt === MAX_RETRIES) {
60
+ if (attempt === attemptPlans.length) {
47
61
  if (e && typeof e === "object")
48
62
  Object.assign(e, retryMeta);
49
63
  throw e;
@@ -53,10 +67,10 @@ export async function retryPromptOnlyJsonImage({ postResponses, ctx, provider, p
53
67
  }
54
68
  const image = lastRetry.images[0];
55
69
  if (image?.b64) {
56
- logEvent("oauth", "retry_image", { requestId, retryKind, attempt, imageChars: image.b64.length });
70
+ logEvent("oauth", "retry_image", { requestId, retryKind: plan.retryKind, attempt, imageChars: image.b64.length });
57
71
  return { b64: image.b64, usage: lastRetry.usage, webSearchCalls: initial.webSearchCalls, revisedPrompt: image.revisedPrompt, text: lastRetry.text, ...retryMeta };
58
72
  }
59
- logEvent("oauth", "retry_no_image", { requestId, retryKind, attempt, fallbackEventCount: lastRetry.eventCount });
73
+ logEvent("oauth", "retry_no_image", { requestId, retryKind: plan.retryKind, attempt, fallbackEventCount: lastRetry.eventCount });
60
74
  }
61
75
  const diagSource = lastRetry ?? initial;
62
76
  throw emptyResponseError("No image data received after retries", diagSource, {
@@ -52,8 +52,11 @@ function safeUpstreamClientMessage(upstream, status) {
52
52
  return "API key is invalid or unavailable.";
53
53
  if (code === "MODERATION_REFUSED")
54
54
  return "OpenAI refused the image request for safety reasons.";
55
- if (code === "INVALID_REQUEST")
56
- return "OpenAI rejected the image request parameters.";
55
+ if (code === "INVALID_REQUEST") {
56
+ return upstream?.param
57
+ ? "OpenAI rejected the image request parameters."
58
+ : "OpenAI rejected the image request.";
59
+ }
57
60
  if (status === 401 || status === 403)
58
61
  return "OpenAI authentication failed.";
59
62
  if (status === 429)
@@ -212,8 +215,8 @@ export async function generateViaResponses(provider, prompt, quality, size, mode
212
215
  const toolChoiceKind = imageToolChoiceKind(toolChoice);
213
216
  const referenceInputs = references.map(normalizeRef);
214
217
  const userContent = referenceInputs.length
215
- ? [...referenceInputs, { type: "input_text", text: buildUserTextPrompt(prompt, mode, { webSearchEnabled }) }]
216
- : buildUserTextPrompt(prompt, mode, { webSearchEnabled });
218
+ ? [...referenceInputs, { type: "input_text", text: buildUserTextPrompt(prompt, mode, { webSearchEnabled, size }) }]
219
+ : buildUserTextPrompt(prompt, mode, { webSearchEnabled, size });
217
220
  const result = await postResponses({
218
221
  ctx,
219
222
  provider,
@@ -276,13 +279,14 @@ export async function generateViaResponses(provider, prompt, quality, size, mode
276
279
  }
277
280
  export async function generateMultimodeViaResponses(provider, prompt, quality, size, moderation = "low", references = [], requestId = null, mode = "auto", ctxRaw = {}, options = {}) {
278
281
  const ctx = requireRuntimeContext(ctxRaw);
279
- const maxImages = Math.min(8, Math.max(1, Math.trunc(Number(options.maxImages) || 1)));
282
+ const maxGeneratedImages = Math.max(1, Math.trunc(Number(ctx.config.limits.maxGeneratedImages) || 24));
283
+ const maxImages = Math.min(maxGeneratedImages, Math.max(1, Math.trunc(Number(options.maxImages) || 1)));
280
284
  const model = options.model || ctx.config?.imageModels?.default || "gpt-5.4-mini";
281
285
  const webSearchEnabled = options.webSearchEnabled !== false && options.searchMode !== "off";
282
286
  const requestTools = tools(webSearchEnabled, { quality, size, moderation, ...(options.partialImages ? { partial_images: options.partialImages } : {}) });
283
287
  const userText = buildMultimodeSequencePrompt(mode === "direct"
284
288
  ? `${prompt}${DIRECT_PROMPT_FIDELITY_SUFFIX}`
285
- : `${prompt}${webSearchEnabled ? "" : ""}${AUTO_PROMPT_FIDELITY_SUFFIX}`, maxImages, { webSearchEnabled });
289
+ : `${prompt}${webSearchEnabled ? "" : ""}${AUTO_PROMPT_FIDELITY_SUFFIX}`, maxImages, { webSearchEnabled, size });
286
290
  const referenceInputs = references.map(normalizeRef);
287
291
  const userContent = referenceInputs.length
288
292
  ? [...referenceInputs, { type: "input_text", text: userText }]
@@ -334,7 +338,7 @@ export async function editViaResponses(provider, prompt, imageB64, quality, size
334
338
  { type: "input_image", image_url: `data:image/jpeg;base64,${imageForRequest.b64}` },
335
339
  ...referenceImages.map(({ b64 }) => ({ type: "input_image", image_url: `data:image/jpeg;base64,${b64}` })),
336
340
  ...maskContent,
337
- { type: "input_text", text: buildEditTextPrompt(prompt, mode, { webSearchEnabled }) },
341
+ { type: "input_text", text: buildEditTextPrompt(prompt, mode, { webSearchEnabled, size }) },
338
342
  ];
339
343
  const result = await postResponses({
340
344
  ctx,
@@ -0,0 +1,44 @@
1
+ export function validateModeration(ctx, moderation) {
2
+ if (typeof moderation !== "string" || !ctx.config.oauth.validModeration.has(moderation)) {
3
+ return { error: "moderation must be one of: auto, low" };
4
+ }
5
+ return { moderation };
6
+ }
7
+ export function imageFormatFromMime(mime) {
8
+ if (mime === "image/jpeg")
9
+ return "jpeg";
10
+ if (mime === "image/webp")
11
+ return "webp";
12
+ return "png";
13
+ }
14
+ export function writeSse(res, event, data) {
15
+ res.write(`event: ${event}\n`);
16
+ res.write(`data: ${JSON.stringify(data)}\n\n`);
17
+ }
18
+ export function dataUrlFromB64(format, b64) {
19
+ return `data:image/${format === "jpeg" ? "jpeg" : format};base64,${b64}`;
20
+ }
21
+ export function upstreamErrorFields(src) {
22
+ return {
23
+ upstreamCode: src.upstreamCode || null,
24
+ upstreamType: src.upstreamType || null,
25
+ upstreamParam: src.upstreamParam || null,
26
+ diagnosticReason: src.diagnosticReason || null,
27
+ retryKind: src.retryKind || null,
28
+ initialEventCount: src.initialEventCount ?? null,
29
+ initialEventTypes: src.initialEventTypes || null,
30
+ referencesDroppedOnRetry: src.referencesDroppedOnRetry ?? null,
31
+ developerPromptDroppedOnRetry: src.developerPromptDroppedOnRetry ?? null,
32
+ webSearchDroppedOnRetry: src.webSearchDroppedOnRetry ?? null,
33
+ fallbackEventCount: src.fallbackEventCount ?? null,
34
+ fallbackEventTypes: src.fallbackEventTypes || null,
35
+ fallbackImageCallSeen: src.fallbackImageCallSeen ?? null,
36
+ fallbackImageResultCount: src.fallbackImageResultCount ?? null,
37
+ errorEventCount: src.eventCount ?? null,
38
+ eventTypes: src.eventTypes || null,
39
+ webSearchCalls: src.webSearchCalls ?? null,
40
+ responseDiagnostics: src.responseDiagnostics || null,
41
+ toolTypes: src.toolTypes || null,
42
+ toolChoiceKind: src.toolChoiceKind || null,
43
+ };
44
+ }
@@ -0,0 +1,12 @@
1
+ import { publish } from "./eventBus.js";
2
+ import { isJobCanceled } from "./inflight.js";
3
+ /**
4
+ * Publish a multiplexed job event. Suppresses terminal `done` after cancel so
5
+ * clients never resolve success when abortJob already emitted `error`.
6
+ */
7
+ export function publishJobEvent(requestId, event, data) {
8
+ if (event === "done" && isJobCanceled(requestId))
9
+ return false;
10
+ publish(requestId, event, data);
11
+ return true;
12
+ }
@@ -0,0 +1,28 @@
1
+ export const STORYBOARD_PREFIX = [
2
+ "[STORYBOARD MODE — Video Production Keyframe / Storyboard Grid]",
3
+ "This image will be used for video production. It may be a single keyframe OR a 3x3 storyboard grid.",
4
+ "The prompt and all injected instructions MUST be in English.",
5
+ "",
6
+ "IF GENERATING A 3x3 STORYBOARD GRID:",
7
+ "- Panel 1 (top-left) MUST be COMPLETELY SOLID BLACK — no image, no text, just pure black.",
8
+ "- Panels 2-9 contain the action sequence (8 key moments).",
9
+ "- Do NOT add timestamp labels or text overlays to any panel — they burn into the video.",
10
+ "- Maintain identical character designs across all panels.",
11
+ "- Each panel should look like a cinematic film still, not a sketch.",
12
+ "",
13
+ "CHARACTER LOCK:",
14
+ "- Identify each character by 2-3 VISUAL identifiers (clothing color + physique + position/props). Never by name alone.",
15
+ "- Copy character descriptions VERBATIM from the reference/prior frame. Do NOT rephrase or drift.",
16
+ "",
17
+ "SCENE CONTINUITY:",
18
+ "- Lock lighting direction, color palette, environment, and art style to prior frames.",
19
+ "- Change ONLY: action, shot scale, camera angle, or expression.",
20
+ "- Reference image = canonical anchor. Preserve it faithfully.",
21
+ "",
22
+ "VIDEO-READY COMPOSITION:",
23
+ "- Frame for animation: leave space for motion, avoid static-only poses.",
24
+ "- Use descriptive caption format: shot type + subject action + environment + technical (lens, lighting) + mood.",
25
+ "- Specify intended camera movement for the video phase (e.g. 'slow dolly-in', 'static wide').",
26
+ "- End pose must be stable and suitable for video continuation.",
27
+ "",
28
+ ].join("\n") + "\n";
@@ -2,6 +2,10 @@ import { readdir } from "node:fs/promises";
2
2
  import { join } from "node:path";
3
3
  import { ensureVideoThumbnail, videoThumbExists } from "./videoThumb.js";
4
4
  import { generateImageThumbnail, imageThumbExists } from "./imageThumb.js";
5
+ const FAILURE_DETAIL_LIMIT = 20;
6
+ function errorReason(error) {
7
+ return error instanceof Error ? error.message : String(error);
8
+ }
5
9
  /**
6
10
  * Recursively scan `dir` (up to `maxDepth` levels, matching historyList's walk
7
11
  * depth) and generate missing `.thumb.jpg` thumbnails for every image and video.
@@ -11,7 +15,13 @@ import { generateImageThumbnail, imageThumbExists } from "./imageThumb.js";
11
15
  * shows a thumbless media tile.
12
16
  */
13
17
  export async function backfillThumbnails(dir, maxDepth = 2) {
14
- const result = { total: 0, created: 0, skipped: 0, failed: 0 };
18
+ const result = { total: 0, created: 0, skipped: 0, failed: 0, failures: [] };
19
+ function recordFailure(file, kind, reason) {
20
+ result.failed++;
21
+ if (result.failures.length >= FAILURE_DETAIL_LIMIT)
22
+ return;
23
+ result.failures.push({ file, kind, reason });
24
+ }
15
25
  async function walk(current, depth) {
16
26
  const entries = await readdir(current, { withFileTypes: true }).catch(() => []);
17
27
  for (const entry of entries) {
@@ -28,8 +38,9 @@ export async function backfillThumbnails(dir, maxDepth = 2) {
28
38
  if (!/\.(png|jpe?g|webp|mp4)$/i.test(entry.name))
29
39
  continue;
30
40
  result.total++;
41
+ const kind = /\.mp4$/i.test(entry.name) ? "video" : "image";
31
42
  try {
32
- if (/\.mp4$/i.test(entry.name)) {
43
+ if (kind === "video") {
33
44
  if (await videoThumbExists(full)) {
34
45
  result.skipped++;
35
46
  continue;
@@ -38,7 +49,7 @@ export async function backfillThumbnails(dir, maxDepth = 2) {
38
49
  if (ok)
39
50
  result.created++;
40
51
  else
41
- result.failed++;
52
+ recordFailure(full, kind, "thumbnail generation returned false");
42
53
  }
43
54
  else {
44
55
  if (await imageThumbExists(full)) {
@@ -49,8 +60,8 @@ export async function backfillThumbnails(dir, maxDepth = 2) {
49
60
  result.created++;
50
61
  }
51
62
  }
52
- catch {
53
- result.failed++;
63
+ catch (error) {
64
+ recordFailure(full, kind, errorReason(error));
54
65
  }
55
66
  }
56
67
  }
@@ -1,3 +1,13 @@
1
+ ## **6.15.2**
2
+ - [Fix] `stringify`: skip null/undefined entries in `arrayFormat: 'comma'` + `encodeValuesOnly` instead of crashing in `encoder`
3
+ - [Fix] `stringify`: use configured `delimiter` after `charsetSentinel` (#555)
4
+ - [Fix] `stringify`: apply `formatter` to encoded key under `strictNullHandling` (#554)
5
+ - [Fix] `stringify`: skip null/undefined filter-array entries instead of crashing in `encoder` (#551)
6
+ - [Fix] `parse`: handle nested bracket groups and add regression tests (#530)
7
+ - [readme] fix grammar (#550)
8
+ - [Dev Deps] update `@ljharb/eslint-config`
9
+ - [Tests] add regression tests for keys containing percent-encoded bracket text
10
+
1
11
  ## **6.15.1**
2
12
  - [Fix] `parse`: `parameterLimit: Infinity` with `throwOnLimitExceeded: true` silently drops all parameters
3
13
  - [Deps] update `@ljharb/eslint-config`
@@ -183,7 +183,7 @@ var withDots = qs.parse('name%252Eobj.first=John&name%252Eobj.last=Doe', { decod
183
183
  assert.deepEqual(withDots, { 'name.obj': { first: 'John', last: 'Doe' }});
184
184
  ```
185
185
 
186
- Option `allowEmptyArrays` can be used to allowing empty array values in object
186
+ Option `allowEmptyArrays` can be used to allow empty array values in an object
187
187
  ```javascript
188
188
  var withEmptyArrays = qs.parse('foo[]&bar=baz', { allowEmptyArrays: true });
189
189
  assert.deepEqual(withEmptyArrays, { foo: [], bar: 'baz' });
@@ -5,10 +5,10 @@
5
5
  "use strict";var stringify=require(4),parse=require(3),formats=require(1);module.exports={formats:formats,parse:parse,stringify:stringify};
6
6
 
7
7
  },{"1":1,"3":3,"4":4}],3:[function(require,module,exports){
8
- "use strict";var utils=require(5),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,defaults={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:utils.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictMerge:!0,strictNullHandling:!1,throwOnLimitExceeded:!1},interpretNumericEntities=function(e){return e.replace(/&#(\d+);/g,function(e,t){return String.fromCharCode(parseInt(t,10))})},parseArrayValue=function(e,t,r){if(e&&"string"==typeof e&&t.comma&&e.indexOf(",")>-1)return e.split(",");if(t.throwOnLimitExceeded&&r>=t.arrayLimit)throw new RangeError("Array limit exceeded. Only "+t.arrayLimit+" element"+(1===t.arrayLimit?"":"s")+" allowed in an array.");return e},isoSentinel="utf8=%26%2310003%3B",charsetSentinel="utf8=%E2%9C%93",parseValues=function parseQueryStringValues(e,t){var r={__proto__:null},i=t.ignoreQueryPrefix?e.replace(/^\?/,""):e;i=i.replace(/%5B/gi,"[").replace(/%5D/gi,"]");var a=t.parameterLimit===1/0?void 0:t.parameterLimit,o=i.split(t.delimiter,t.throwOnLimitExceeded&&void 0!==a?a+1:a);if(t.throwOnLimitExceeded&&void 0!==a&&o.length>a)throw new RangeError("Parameter limit exceeded. Only "+a+" parameter"+(1===a?"":"s")+" allowed.");var l,n=-1,s=t.charset;if(t.charsetSentinel)for(l=0;l<o.length;++l)0===o[l].indexOf("utf8=")&&(o[l]===charsetSentinel?s="utf-8":o[l]===isoSentinel&&(s="iso-8859-1"),n=l,l=o.length);for(l=0;l<o.length;++l)if(l!==n){var d,c,p=o[l],u=p.indexOf("]="),y=-1===u?p.indexOf("="):u+1;if(-1===y?(d=t.decoder(p,defaults.decoder,s,"key"),c=t.strictNullHandling?null:""):null!==(d=t.decoder(p.slice(0,y),defaults.decoder,s,"key"))&&(c=utils.maybeMap(parseArrayValue(p.slice(y+1),t,isArray(r[d])?r[d].length:0),function(e){return t.decoder(e,defaults.decoder,s,"value")})),c&&t.interpretNumericEntities&&"iso-8859-1"===s&&(c=interpretNumericEntities(String(c))),p.indexOf("[]=")>-1&&(c=isArray(c)?[c]:c),t.comma&&isArray(c)&&c.length>t.arrayLimit){if(t.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+t.arrayLimit+" element"+(1===t.arrayLimit?"":"s")+" allowed in an array.");c=utils.combine([],c,t.arrayLimit,t.plainObjects)}if(null!==d){var f=has.call(r,d);f&&("combine"===t.duplicates||p.indexOf("[]=")>-1)?r[d]=utils.combine(r[d],c,t.arrayLimit,t.plainObjects):f&&"last"!==t.duplicates||(r[d]=c)}}return r},parseObject=function(e,t,r,i){var a=0;if(e.length>0&&"[]"===e[e.length-1]){var o=e.slice(0,-1).join("");a=Array.isArray(t)&&t[o]?t[o].length:0}for(var l=i?t:parseArrayValue(t,r,a),n=e.length-1;n>=0;--n){var s,d=e[n];if("[]"===d&&r.parseArrays)s=utils.isOverflow(l)?l:r.allowEmptyArrays&&(""===l||r.strictNullHandling&&null===l)?[]:utils.combine([],l,r.arrayLimit,r.plainObjects);else{s=r.plainObjects?{__proto__:null}:{};var c="["===d.charAt(0)&&"]"===d.charAt(d.length-1)?d.slice(1,-1):d,p=r.decodeDotInKeys?c.replace(/%2E/g,"."):c,u=parseInt(p,10),y=!isNaN(u)&&d!==p&&String(u)===p&&u>=0&&r.parseArrays;if(r.parseArrays||""!==p)if(y&&u<r.arrayLimit)(s=[])[u]=l;else{if(y&&r.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+r.arrayLimit+" element"+(1===r.arrayLimit?"":"s")+" allowed in an array.");y?(s[u]=l,utils.markOverflow(s,u)):"__proto__"!==p&&(s[p]=l)}else s={0:l}}l=s}return l},splitKeyIntoSegments=function splitKeyIntoSegments(e,t){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e;if(t.depth<=0){if(!t.plainObjects&&has.call(Object.prototype,r)&&!t.allowPrototypes)return;return[r]}var i=/(\[[^[\]]*])/g,a=/(\[[^[\]]*])/.exec(r),o=a?r.slice(0,a.index):r,l=[];if(o){if(!t.plainObjects&&has.call(Object.prototype,o)&&!t.allowPrototypes)return;l[l.length]=o}for(var n=0;null!==(a=i.exec(r))&&n<t.depth;){n+=1;var s=a[1].slice(1,-1);if(!t.plainObjects&&has.call(Object.prototype,s)&&!t.allowPrototypes)return;l[l.length]=a[1]}if(a){if(!0===t.strictDepth)throw new RangeError("Input depth exceeded depth option of "+t.depth+" and strictDepth is true");l[l.length]="["+r.slice(a.index)+"]"}return l},parseKeys=function parseQueryStringKeys(e,t,r,i){if(e){var a=splitKeyIntoSegments(e,r);if(a)return parseObject(a,t,r,i)}},normalizeParseOptions=function normalizeParseOptions(e){if(!e)return defaults;if(void 0!==e.allowEmptyArrays&&"boolean"!=typeof e.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==e.decodeDotInKeys&&"boolean"!=typeof e.decodeDotInKeys)throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");if(void 0!==e.throwOnLimitExceeded&&"boolean"!=typeof e.throwOnLimitExceeded)throw new TypeError("`throwOnLimitExceeded` option must be a boolean");var t=void 0===e.charset?defaults.charset:e.charset,r=void 0===e.duplicates?defaults.duplicates:e.duplicates;if("combine"!==r&&"first"!==r&&"last"!==r)throw new TypeError("The duplicates option must be either combine, first, or last");return{allowDots:void 0===e.allowDots?!0===e.decodeDotInKeys||defaults.allowDots:!!e.allowDots,allowEmptyArrays:"boolean"==typeof e.allowEmptyArrays?!!e.allowEmptyArrays:defaults.allowEmptyArrays,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:defaults.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:defaults.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:defaults.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:defaults.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:defaults.comma,decodeDotInKeys:"boolean"==typeof e.decodeDotInKeys?e.decodeDotInKeys:defaults.decodeDotInKeys,decoder:"function"==typeof e.decoder?e.decoder:defaults.decoder,delimiter:"string"==typeof e.delimiter||utils.isRegExp(e.delimiter)?e.delimiter:defaults.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:defaults.depth,duplicates:r,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:defaults.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:defaults.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:defaults.plainObjects,strictDepth:"boolean"==typeof e.strictDepth?!!e.strictDepth:defaults.strictDepth,strictMerge:"boolean"==typeof e.strictMerge?!!e.strictMerge:defaults.strictMerge,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:defaults.strictNullHandling,throwOnLimitExceeded:"boolean"==typeof e.throwOnLimitExceeded&&e.throwOnLimitExceeded}};module.exports=function(e,t){var r=normalizeParseOptions(t);if(""===e||null==e)return r.plainObjects?{__proto__:null}:{};for(var i="string"==typeof e?parseValues(e,r):e,a=r.plainObjects?{__proto__:null}:{},o=Object.keys(i),l=0;l<o.length;++l){var n=o[l],s=parseKeys(n,i[n],r,"string"==typeof e);a=utils.merge(a,s,r)}return!0===r.allowSparse?a:utils.compact(a)};
8
+ "use strict";var utils=require(5),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,defaults={allowDots:!1,allowEmptyArrays:!1,allowPrototypes:!1,allowSparse:!1,arrayLimit:20,charset:"utf-8",charsetSentinel:!1,comma:!1,decodeDotInKeys:!1,decoder:utils.decode,delimiter:"&",depth:5,duplicates:"combine",ignoreQueryPrefix:!1,interpretNumericEntities:!1,parameterLimit:1e3,parseArrays:!0,plainObjects:!1,strictDepth:!1,strictMerge:!0,strictNullHandling:!1,throwOnLimitExceeded:!1},interpretNumericEntities=function(e){return e.replace(/&#(\d+);/g,function(e,t){return String.fromCharCode(parseInt(t,10))})},parseArrayValue=function(e,t,r){if(e&&"string"==typeof e&&t.comma&&e.indexOf(",")>-1)return e.split(",");if(t.throwOnLimitExceeded&&r>=t.arrayLimit)throw new RangeError("Array limit exceeded. Only "+t.arrayLimit+" element"+(1===t.arrayLimit?"":"s")+" allowed in an array.");return e},isoSentinel="utf8=%26%2310003%3B",charsetSentinel="utf8=%E2%9C%93",parseValues=function parseQueryStringValues(e,t){var r={__proto__:null},i=t.ignoreQueryPrefix?e.replace(/^\?/,""):e;i=i.replace(/%5B/gi,"[").replace(/%5D/gi,"]");var a=t.parameterLimit===1/0?void 0:t.parameterLimit,o=i.split(t.delimiter,t.throwOnLimitExceeded&&void 0!==a?a+1:a);if(t.throwOnLimitExceeded&&void 0!==a&&o.length>a)throw new RangeError("Parameter limit exceeded. Only "+a+" parameter"+(1===a?"":"s")+" allowed.");var l,n=-1,s=t.charset;if(t.charsetSentinel)for(l=0;l<o.length;++l)0===o[l].indexOf("utf8=")&&(o[l]===charsetSentinel?s="utf-8":o[l]===isoSentinel&&(s="iso-8859-1"),n=l,l=o.length);for(l=0;l<o.length;++l)if(l!==n){var d,c,p=o[l],u=p.indexOf("]="),y=-1===u?p.indexOf("="):u+1;if(-1===y?(d=t.decoder(p,defaults.decoder,s,"key"),c=t.strictNullHandling?null:""):null!==(d=t.decoder(p.slice(0,y),defaults.decoder,s,"key"))&&(c=utils.maybeMap(parseArrayValue(p.slice(y+1),t,isArray(r[d])?r[d].length:0),function(e){return t.decoder(e,defaults.decoder,s,"value")})),c&&t.interpretNumericEntities&&"iso-8859-1"===s&&(c=interpretNumericEntities(String(c))),p.indexOf("[]=")>-1&&(c=isArray(c)?[c]:c),t.comma&&isArray(c)&&c.length>t.arrayLimit){if(t.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+t.arrayLimit+" element"+(1===t.arrayLimit?"":"s")+" allowed in an array.");c=utils.combine([],c,t.arrayLimit,t.plainObjects)}if(null!==d){var f=has.call(r,d);f&&("combine"===t.duplicates||p.indexOf("[]=")>-1)?r[d]=utils.combine(r[d],c,t.arrayLimit,t.plainObjects):f&&"last"!==t.duplicates||(r[d]=c)}}return r},parseObject=function(e,t,r,i){var a=0;if(e.length>0&&"[]"===e[e.length-1]){var o=e.slice(0,-1).join("");a=Array.isArray(t)&&t[o]?t[o].length:0}for(var l=i?t:parseArrayValue(t,r,a),n=e.length-1;n>=0;--n){var s,d=e[n];if("[]"===d&&r.parseArrays)s=utils.isOverflow(l)?l:r.allowEmptyArrays&&(""===l||r.strictNullHandling&&null===l)?[]:utils.combine([],l,r.arrayLimit,r.plainObjects);else{s=r.plainObjects?{__proto__:null}:{};var c="["===d.charAt(0)&&"]"===d.charAt(d.length-1)?d.slice(1,-1):d,p=r.decodeDotInKeys?c.replace(/%2E/g,"."):c,u=parseInt(p,10),y=!isNaN(u)&&d!==p&&String(u)===p&&u>=0&&r.parseArrays;if(r.parseArrays||""!==p)if(y&&u<r.arrayLimit)(s=[])[u]=l;else{if(y&&r.throwOnLimitExceeded)throw new RangeError("Array limit exceeded. Only "+r.arrayLimit+" element"+(1===r.arrayLimit?"":"s")+" allowed in an array.");y?(s[u]=l,utils.markOverflow(s,u)):"__proto__"!==p&&(s[p]=l)}else s={0:l}}l=s}return l},splitKeyIntoSegments=function splitKeyIntoSegments(e,t){var r=t.allowDots?e.replace(/\.([^.[]+)/g,"[$1]"):e;if(t.depth<=0){if(!t.plainObjects&&has.call(Object.prototype,r)&&!t.allowPrototypes)return;return[r]}var i=[],a=r.indexOf("["),o=a>=0?r.slice(0,a):r;if(o){if(!t.plainObjects&&has.call(Object.prototype,o)&&!t.allowPrototypes)return;i[i.length]=o}for(var l=r.length,n=a,s=0;n>=0&&s<t.depth;){for(var d=1,c=n+1,p=-1;c<l&&p<0;){var u=r.charCodeAt(c);91===u?d+=1:93===u&&0==(d-=1)&&(p=c),c+=1}if(p<0)return i[i.length]="["+r.slice(n)+"]",i;var y=r.slice(n,p+1),f=y.slice(1,-1);if(!t.plainObjects&&has.call(Object.prototype,f)&&!t.allowPrototypes)return;i[i.length]=y,s+=1,n=r.indexOf("[",p+1)}if(n>=0){if(!0===t.strictDepth)throw new RangeError("Input depth exceeded depth option of "+t.depth+" and strictDepth is true");i[i.length]="["+r.slice(n)+"]"}return i},parseKeys=function parseQueryStringKeys(e,t,r,i){if(e){var a=splitKeyIntoSegments(e,r);if(a)return parseObject(a,t,r,i)}},normalizeParseOptions=function normalizeParseOptions(e){if(!e)return defaults;if(void 0!==e.allowEmptyArrays&&"boolean"!=typeof e.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==e.decodeDotInKeys&&"boolean"!=typeof e.decodeDotInKeys)throw new TypeError("`decodeDotInKeys` option can only be `true` or `false`, when provided");if(null!==e.decoder&&void 0!==e.decoder&&"function"!=typeof e.decoder)throw new TypeError("Decoder has to be a function.");if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");if(void 0!==e.throwOnLimitExceeded&&"boolean"!=typeof e.throwOnLimitExceeded)throw new TypeError("`throwOnLimitExceeded` option must be a boolean");var t=void 0===e.charset?defaults.charset:e.charset,r=void 0===e.duplicates?defaults.duplicates:e.duplicates;if("combine"!==r&&"first"!==r&&"last"!==r)throw new TypeError("The duplicates option must be either combine, first, or last");return{allowDots:void 0===e.allowDots?!0===e.decodeDotInKeys||defaults.allowDots:!!e.allowDots,allowEmptyArrays:"boolean"==typeof e.allowEmptyArrays?!!e.allowEmptyArrays:defaults.allowEmptyArrays,allowPrototypes:"boolean"==typeof e.allowPrototypes?e.allowPrototypes:defaults.allowPrototypes,allowSparse:"boolean"==typeof e.allowSparse?e.allowSparse:defaults.allowSparse,arrayLimit:"number"==typeof e.arrayLimit?e.arrayLimit:defaults.arrayLimit,charset:t,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:defaults.charsetSentinel,comma:"boolean"==typeof e.comma?e.comma:defaults.comma,decodeDotInKeys:"boolean"==typeof e.decodeDotInKeys?e.decodeDotInKeys:defaults.decodeDotInKeys,decoder:"function"==typeof e.decoder?e.decoder:defaults.decoder,delimiter:"string"==typeof e.delimiter||utils.isRegExp(e.delimiter)?e.delimiter:defaults.delimiter,depth:"number"==typeof e.depth||!1===e.depth?+e.depth:defaults.depth,duplicates:r,ignoreQueryPrefix:!0===e.ignoreQueryPrefix,interpretNumericEntities:"boolean"==typeof e.interpretNumericEntities?e.interpretNumericEntities:defaults.interpretNumericEntities,parameterLimit:"number"==typeof e.parameterLimit?e.parameterLimit:defaults.parameterLimit,parseArrays:!1!==e.parseArrays,plainObjects:"boolean"==typeof e.plainObjects?e.plainObjects:defaults.plainObjects,strictDepth:"boolean"==typeof e.strictDepth?!!e.strictDepth:defaults.strictDepth,strictMerge:"boolean"==typeof e.strictMerge?!!e.strictMerge:defaults.strictMerge,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:defaults.strictNullHandling,throwOnLimitExceeded:"boolean"==typeof e.throwOnLimitExceeded&&e.throwOnLimitExceeded}};module.exports=function(e,t){var r=normalizeParseOptions(t);if(""===e||null==e)return r.plainObjects?{__proto__:null}:{};for(var i="string"==typeof e?parseValues(e,r):e,a=r.plainObjects?{__proto__:null}:{},o=Object.keys(i),l=0;l<o.length;++l){var n=o[l],s=parseKeys(n,i[n],r,"string"==typeof e);a=utils.merge(a,s,r)}return!0===r.allowSparse?a:utils.compact(a)};
9
9
 
10
10
  },{"5":5}],4:[function(require,module,exports){
11
- "use strict";var getSideChannel=require(46),utils=require(5),formats=require(1),has=Object.prototype.hasOwnProperty,arrayPrefixGenerators={brackets:function brackets(e){return e+"[]"},comma:"comma",indices:function indices(e,r){return e+"["+r+"]"},repeat:function repeat(e){return e}},isArray=Array.isArray,push=Array.prototype.push,pushToArray=function(e,r){push.apply(e,isArray(r)?r:[r])},toISO=Date.prototype.toISOString,defaultFormat=formats.default,defaults={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,commaRoundTrip:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:utils.encode,encodeValuesOnly:!1,filter:void 0,format:defaultFormat,formatter:formats.formatters[defaultFormat],indices:!1,serializeDate:function serializeDate(e){return toISO.call(e)},skipNulls:!1,strictNullHandling:!1},isNonNullishPrimitive=function isNonNullishPrimitive(e){return"string"==typeof e||"number"==typeof e||"boolean"==typeof e||"symbol"==typeof e||"bigint"==typeof e},sentinel={},stringify=function stringify(e,r,t,o,a,n,i,l,s,f,u,d,y,c,p,m,h,v){for(var g=e,w=v,b=0,A=!1;void 0!==(w=w.get(sentinel))&&!A;){var D=w.get(e);if(b+=1,void 0!==D){if(D===b)throw new RangeError("Cyclic object value");A=!0}void 0===w.get(sentinel)&&(b=0)}if("function"==typeof f?g=f(r,g):g instanceof Date?g=y(g):"comma"===t&&isArray(g)&&(g=utils.maybeMap(g,function(e){return e instanceof Date?y(e):e})),null===g){if(n)return s&&!m?s(r,defaults.encoder,h,"key",c):r;g=""}if(isNonNullishPrimitive(g)||utils.isBuffer(g))return s?[p(m?r:s(r,defaults.encoder,h,"key",c))+"="+p(s(g,defaults.encoder,h,"value",c))]:[p(r)+"="+p(String(g))];var S,E=[];if(void 0===g)return E;if("comma"===t&&isArray(g))m&&s&&(g=utils.maybeMap(g,s)),S=[{value:g.length>0?g.join(",")||null:void 0}];else if(isArray(f))S=f;else{var N=Object.keys(g);S=u?N.sort(u):N}var T=l?String(r).replace(/\./g,"%2E"):String(r),O=o&&isArray(g)&&1===g.length?T+"[]":T;if(a&&isArray(g)&&0===g.length)return O+"[]";for(var k=0;k<S.length;++k){var I=S[k],P="object"==typeof I&&I&&void 0!==I.value?I.value:g[I];if(!i||null!==P){var x=d&&l?String(I).replace(/\./g,"%2E"):String(I),z=isArray(g)?"function"==typeof t?t(O,x):O:O+(d?"."+x:"["+x+"]");v.set(e,b);var K=getSideChannel();K.set(sentinel,v),pushToArray(E,stringify(P,z,t,o,a,n,i,l,"comma"===t&&m&&isArray(g)?null:s,f,u,d,y,c,p,m,h,K))}}return E},normalizeStringifyOptions=function normalizeStringifyOptions(e){if(!e)return defaults;if(void 0!==e.allowEmptyArrays&&"boolean"!=typeof e.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==e.encodeDotInKeys&&"boolean"!=typeof e.encodeDotInKeys)throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(null!==e.encoder&&void 0!==e.encoder&&"function"!=typeof e.encoder)throw new TypeError("Encoder has to be a function.");var r=e.charset||defaults.charset;if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=formats.default;if(void 0!==e.format){if(!has.call(formats.formatters,e.format))throw new TypeError("Unknown format option provided.");t=e.format}var o,a=formats.formatters[t],n=defaults.filter;if(("function"==typeof e.filter||isArray(e.filter))&&(n=e.filter),o=e.arrayFormat in arrayPrefixGenerators?e.arrayFormat:"indices"in e?e.indices?"indices":"repeat":defaults.arrayFormat,"commaRoundTrip"in e&&"boolean"!=typeof e.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var i=void 0===e.allowDots?!0===e.encodeDotInKeys||defaults.allowDots:!!e.allowDots;return{addQueryPrefix:"boolean"==typeof e.addQueryPrefix?e.addQueryPrefix:defaults.addQueryPrefix,allowDots:i,allowEmptyArrays:"boolean"==typeof e.allowEmptyArrays?!!e.allowEmptyArrays:defaults.allowEmptyArrays,arrayFormat:o,charset:r,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:defaults.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:void 0===e.delimiter?defaults.delimiter:e.delimiter,encode:"boolean"==typeof e.encode?e.encode:defaults.encode,encodeDotInKeys:"boolean"==typeof e.encodeDotInKeys?e.encodeDotInKeys:defaults.encodeDotInKeys,encoder:"function"==typeof e.encoder?e.encoder:defaults.encoder,encodeValuesOnly:"boolean"==typeof e.encodeValuesOnly?e.encodeValuesOnly:defaults.encodeValuesOnly,filter:n,format:t,formatter:a,serializeDate:"function"==typeof e.serializeDate?e.serializeDate:defaults.serializeDate,skipNulls:"boolean"==typeof e.skipNulls?e.skipNulls:defaults.skipNulls,sort:"function"==typeof e.sort?e.sort:null,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:defaults.strictNullHandling}};module.exports=function(e,r){var t,o=e,a=normalizeStringifyOptions(r);"function"==typeof a.filter?o=(0,a.filter)("",o):isArray(a.filter)&&(t=a.filter);var n=[];if("object"!=typeof o||null===o)return"";var i=arrayPrefixGenerators[a.arrayFormat],l="comma"===i&&a.commaRoundTrip;t||(t=Object.keys(o)),a.sort&&t.sort(a.sort);for(var s=getSideChannel(),f=0;f<t.length;++f){var u=t[f],d=o[u];a.skipNulls&&null===d||pushToArray(n,stringify(d,u,i,l,a.allowEmptyArrays,a.strictNullHandling,a.skipNulls,a.encodeDotInKeys,a.encode?a.encoder:null,a.filter,a.sort,a.allowDots,a.serializeDate,a.format,a.formatter,a.encodeValuesOnly,a.charset,s))}var y=n.join(a.delimiter),c=!0===a.addQueryPrefix?"?":"";return a.charsetSentinel&&("iso-8859-1"===a.charset?c+="utf8=%26%2310003%3B&":c+="utf8=%E2%9C%93&"),y.length>0?c+y:""};
11
+ "use strict";var getSideChannel=require(46),utils=require(5),formats=require(1),has=Object.prototype.hasOwnProperty,arrayPrefixGenerators={brackets:function brackets(e){return e+"[]"},comma:"comma",indices:function indices(e,r){return e+"["+r+"]"},repeat:function repeat(e){return e}},isArray=Array.isArray,push=Array.prototype.push,pushToArray=function(e,r){push.apply(e,isArray(r)?r:[r])},toISO=Date.prototype.toISOString,defaultFormat=formats.default,defaults={addQueryPrefix:!1,allowDots:!1,allowEmptyArrays:!1,arrayFormat:"indices",charset:"utf-8",charsetSentinel:!1,commaRoundTrip:!1,delimiter:"&",encode:!0,encodeDotInKeys:!1,encoder:utils.encode,encodeValuesOnly:!1,filter:void 0,format:defaultFormat,formatter:formats.formatters[defaultFormat],indices:!1,serializeDate:function serializeDate(e){return toISO.call(e)},skipNulls:!1,strictNullHandling:!1},isNonNullishPrimitive=function isNonNullishPrimitive(e){return"string"==typeof e||"number"==typeof e||"boolean"==typeof e||"symbol"==typeof e||"bigint"==typeof e},sentinel={},stringify=function stringify(e,r,t,o,a,n,i,l,s,f,u,d,y,c,p,m,h,v){for(var g=e,w=v,b=0,A=!1;void 0!==(w=w.get(sentinel))&&!A;){var D=w.get(e);if(b+=1,void 0!==D){if(D===b)throw new RangeError("Cyclic object value");A=!0}void 0===w.get(sentinel)&&(b=0)}if("function"==typeof f?g=f(r,g):g instanceof Date?g=y(g):"comma"===t&&isArray(g)&&(g=utils.maybeMap(g,function(e){return e instanceof Date?y(e):e})),null===g){if(n)return p(s&&!m?s(r,defaults.encoder,h,"key",c):r);g=""}if(isNonNullishPrimitive(g)||utils.isBuffer(g))return s?[p(m?r:s(r,defaults.encoder,h,"key",c))+"="+p(s(g,defaults.encoder,h,"value",c))]:[p(r)+"="+p(String(g))];var S,E=[];if(void 0===g)return E;if("comma"===t&&isArray(g))m&&s&&(g=utils.maybeMap(g,function(e){return null==e?e:s(e)})),S=[{value:g.length>0?g.join(",")||null:void 0}];else if(isArray(f))S=f;else{var N=Object.keys(g);S=u?N.sort(u):N}var T=l?String(r).replace(/\./g,"%2E"):String(r),O=o&&isArray(g)&&1===g.length?T+"[]":T;if(a&&isArray(g)&&0===g.length)return O+"[]";for(var k=0;k<S.length;++k){var I=S[k],P="object"==typeof I&&I&&void 0!==I.value?I.value:g[I];if(!i||null!==P){var x=d&&l?String(I).replace(/\./g,"%2E"):String(I),z=isArray(g)?"function"==typeof t?t(O,x):O:O+(d?"."+x:"["+x+"]");v.set(e,b);var K=getSideChannel();K.set(sentinel,v),pushToArray(E,stringify(P,z,t,o,a,n,i,l,"comma"===t&&m&&isArray(g)?null:s,f,u,d,y,c,p,m,h,K))}}return E},normalizeStringifyOptions=function normalizeStringifyOptions(e){if(!e)return defaults;if(void 0!==e.allowEmptyArrays&&"boolean"!=typeof e.allowEmptyArrays)throw new TypeError("`allowEmptyArrays` option can only be `true` or `false`, when provided");if(void 0!==e.encodeDotInKeys&&"boolean"!=typeof e.encodeDotInKeys)throw new TypeError("`encodeDotInKeys` option can only be `true` or `false`, when provided");if(null!==e.encoder&&void 0!==e.encoder&&"function"!=typeof e.encoder)throw new TypeError("Encoder has to be a function.");var r=e.charset||defaults.charset;if(void 0!==e.charset&&"utf-8"!==e.charset&&"iso-8859-1"!==e.charset)throw new TypeError("The charset option must be either utf-8, iso-8859-1, or undefined");var t=formats.default;if(void 0!==e.format){if(!has.call(formats.formatters,e.format))throw new TypeError("Unknown format option provided.");t=e.format}var o,a=formats.formatters[t],n=defaults.filter;if(("function"==typeof e.filter||isArray(e.filter))&&(n=e.filter),o=e.arrayFormat in arrayPrefixGenerators?e.arrayFormat:"indices"in e?e.indices?"indices":"repeat":defaults.arrayFormat,"commaRoundTrip"in e&&"boolean"!=typeof e.commaRoundTrip)throw new TypeError("`commaRoundTrip` must be a boolean, or absent");var i=void 0===e.allowDots?!0===e.encodeDotInKeys||defaults.allowDots:!!e.allowDots;return{addQueryPrefix:"boolean"==typeof e.addQueryPrefix?e.addQueryPrefix:defaults.addQueryPrefix,allowDots:i,allowEmptyArrays:"boolean"==typeof e.allowEmptyArrays?!!e.allowEmptyArrays:defaults.allowEmptyArrays,arrayFormat:o,charset:r,charsetSentinel:"boolean"==typeof e.charsetSentinel?e.charsetSentinel:defaults.charsetSentinel,commaRoundTrip:!!e.commaRoundTrip,delimiter:void 0===e.delimiter?defaults.delimiter:e.delimiter,encode:"boolean"==typeof e.encode?e.encode:defaults.encode,encodeDotInKeys:"boolean"==typeof e.encodeDotInKeys?e.encodeDotInKeys:defaults.encodeDotInKeys,encoder:"function"==typeof e.encoder?e.encoder:defaults.encoder,encodeValuesOnly:"boolean"==typeof e.encodeValuesOnly?e.encodeValuesOnly:defaults.encodeValuesOnly,filter:n,format:t,formatter:a,serializeDate:"function"==typeof e.serializeDate?e.serializeDate:defaults.serializeDate,skipNulls:"boolean"==typeof e.skipNulls?e.skipNulls:defaults.skipNulls,sort:"function"==typeof e.sort?e.sort:null,strictNullHandling:"boolean"==typeof e.strictNullHandling?e.strictNullHandling:defaults.strictNullHandling}};module.exports=function(e,r){var t,o=e,a=normalizeStringifyOptions(r);"function"==typeof a.filter?o=(0,a.filter)("",o):isArray(a.filter)&&(t=a.filter);var n=[];if("object"!=typeof o||null===o)return"";var i=arrayPrefixGenerators[a.arrayFormat],l="comma"===i&&a.commaRoundTrip;t||(t=Object.keys(o)),a.sort&&t.sort(a.sort);for(var s=getSideChannel(),f=0;f<t.length;++f){var u=t[f];if(null!=u){var d=o[u];a.skipNulls&&null===d||pushToArray(n,stringify(d,u,i,l,a.allowEmptyArrays,a.strictNullHandling,a.skipNulls,a.encodeDotInKeys,a.encode?a.encoder:null,a.filter,a.sort,a.allowDots,a.serializeDate,a.format,a.formatter,a.encodeValuesOnly,a.charset,s))}}var y=n.join(a.delimiter),c=!0===a.addQueryPrefix?"?":"";return a.charsetSentinel&&("iso-8859-1"===a.charset?c+="utf8=%26%2310003%3B"+a.delimiter:c+="utf8=%E2%9C%93"+a.delimiter),y.length>0?c+y:""};
12
12
 
13
13
  },{"1":1,"46":46,"5":5}],5:[function(require,module,exports){
14
14
  "use strict";var formats=require(1),getSideChannel=require(46),has=Object.prototype.hasOwnProperty,isArray=Array.isArray,overflowChannel=getSideChannel(),markOverflow=function markOverflow(e,r){return overflowChannel.set(e,r),e},isOverflow=function isOverflow(e){return overflowChannel.has(e)},getMaxIndex=function getMaxIndex(e){return overflowChannel.get(e)},setMaxIndex=function setMaxIndex(e,r){overflowChannel.set(e,r)},hexTable=function(){for(var e=[],r=0;r<256;++r)e[e.length]="%"+((r<16?"0":"")+r.toString(16)).toUpperCase();return e}(),compactQueue=function compactQueue(e){for(;e.length>1;){var r=e.pop(),t=r.obj[r.prop];if(isArray(t)){for(var n=[],o=0;o<t.length;++o)void 0!==t[o]&&(n[n.length]=t[o]);r.obj[r.prop]=n}}},arrayToObject=function arrayToObject(e,r){for(var t=r&&r.plainObjects?{__proto__:null}:{},n=0;n<e.length;++n)void 0!==e[n]&&(t[n]=e[n]);return t},merge=function merge(e,r,t){if(!r)return e;if("object"!=typeof r&&"function"!=typeof r){if(isArray(e)){var n=e.length;if(t&&"number"==typeof t.arrayLimit&&n>t.arrayLimit)return markOverflow(arrayToObject(e.concat(r),t),n);e[n]=r}else{if(!e||"object"!=typeof e)return[e,r];if(isOverflow(e)){var o=getMaxIndex(e)+1;e[o]=r,setMaxIndex(e,o)}else{if(t&&t.strictMerge)return[e,r];(t&&(t.plainObjects||t.allowPrototypes)||!has.call(Object.prototype,r))&&(e[r]=!0)}}return e}if(!e||"object"!=typeof e){if(isOverflow(r)){for(var a=Object.keys(r),i=t&&t.plainObjects?{__proto__:null,0:e}:{0:e},c=0;c<a.length;c++)i[parseInt(a[c],10)+1]=r[a[c]];return markOverflow(i,getMaxIndex(r)+1)}var l=[e].concat(r);return t&&"number"==typeof t.arrayLimit&&l.length>t.arrayLimit?markOverflow(arrayToObject(l,t),l.length-1):l}var f=e;return isArray(e)&&!isArray(r)&&(f=arrayToObject(e,t)),isArray(e)&&isArray(r)?(r.forEach(function(r,n){if(has.call(e,n)){var o=e[n];o&&"object"==typeof o&&r&&"object"==typeof r?e[n]=merge(o,r,t):e[e.length]=r}else e[n]=r}),e):Object.keys(r).reduce(function(e,n){var o=r[n];if(has.call(e,n)?e[n]=merge(e[n],o,t):e[n]=o,isOverflow(r)&&!isOverflow(e)&&markOverflow(e,getMaxIndex(r)),isOverflow(e)){var a=parseInt(n,10);String(a)===n&&a>=0&&a>getMaxIndex(e)&&setMaxIndex(e,a)}return e},f)},assign=function assignSingleSource(e,r){return Object.keys(r).reduce(function(e,t){return e[t]=r[t],e},e)},decode=function(e,r,t){var n=e.replace(/\+/g," ");if("iso-8859-1"===t)return n.replace(/%[0-9a-f]{2}/gi,unescape);try{return decodeURIComponent(n)}catch(e){return n}},limit=1024,encode=function encode(e,r,t,n,o){if(0===e.length)return e;var a=e;if("symbol"==typeof e?a=Symbol.prototype.toString.call(e):"string"!=typeof e&&(a=String(e)),"iso-8859-1"===t)return escape(a).replace(/%u[0-9a-f]{4}/gi,function(e){return"%26%23"+parseInt(e.slice(2),16)+"%3B"});for(var i="",c=0;c<a.length;c+=limit){for(var l=a.length>=limit?a.slice(c,c+limit):a,f=[],s=0;s<l.length;++s){var u=l.charCodeAt(s);45===u||46===u||95===u||126===u||u>=48&&u<=57||u>=65&&u<=90||u>=97&&u<=122||o===formats.RFC1738&&(40===u||41===u)?f[f.length]=l.charAt(s):u<128?f[f.length]=hexTable[u]:u<2048?f[f.length]=hexTable[192|u>>6]+hexTable[128|63&u]:u<55296||u>=57344?f[f.length]=hexTable[224|u>>12]+hexTable[128|u>>6&63]+hexTable[128|63&u]:(s+=1,u=65536+((1023&u)<<10|1023&l.charCodeAt(s)),f[f.length]=hexTable[240|u>>18]+hexTable[128|u>>12&63]+hexTable[128|u>>6&63]+hexTable[128|63&u])}i+=f.join("")}return i},compact=function compact(e){for(var r=[{obj:{o:e},prop:"o"}],t=[],n=0;n<r.length;++n)for(var o=r[n],a=o.obj[o.prop],i=Object.keys(a),c=0;c<i.length;++c){var l=i[c],f=a[l];"object"==typeof f&&null!==f&&-1===t.indexOf(f)&&(r[r.length]={obj:a,prop:l},t[t.length]=f)}return compactQueue(r),e},isRegExp=function isRegExp(e){return"[object RegExp]"===Object.prototype.toString.call(e)},isBuffer=function isBuffer(e){return!(!e||"object"!=typeof e||!(e.constructor&&e.constructor.isBuffer&&e.constructor.isBuffer(e)))},combine=function combine(e,r,t,n){if(isOverflow(e)){var o=getMaxIndex(e)+1;return e[o]=r,setMaxIndex(e,o),e}var a=[].concat(e,r);return a.length>t?markOverflow(arrayToObject(a,{plainObjects:n}),a.length-1):a},maybeMap=function maybeMap(e,r){if(isArray(e)){for(var t=[],n=0;n<e.length;n+=1)t[t.length]=r(e[n]);return t}return r(e)};module.exports={/* common-shake removed: arrayToObject:arrayToObject *//* common-shake removed: assign:assign */combine:combine,compact:compact,decode:decode,encode:encode,isBuffer:isBuffer,isOverflow:isOverflow,isRegExp:isRegExp,markOverflow:markOverflow,maybeMap:maybeMap,merge:merge};
@@ -81,34 +81,34 @@
81
81
  },{}],35:[function(require,module,exports){
82
82
  "use strict";module.exports=Math.floor;
83
83
 
84
- },{}],37:[function(require,module,exports){
85
- "use strict";module.exports=Math.max;
84
+ },{}],34:[function(require,module,exports){
85
+ "use strict";module.exports=Math.abs;
86
86
 
87
87
  },{}],38:[function(require,module,exports){
88
88
  "use strict";module.exports=Math.min;
89
89
 
90
- },{}],34:[function(require,module,exports){
91
- "use strict";module.exports=Math.abs;
90
+ },{}],40:[function(require,module,exports){
91
+ "use strict";module.exports=Math.round;
92
+
93
+ },{}],37:[function(require,module,exports){
94
+ "use strict";module.exports=Math.max;
92
95
 
93
96
  },{}],39:[function(require,module,exports){
94
97
  "use strict";module.exports=Math.pow;
95
98
 
96
- },{}],40:[function(require,module,exports){
97
- "use strict";module.exports=Math.round;
98
-
99
99
  },{}],27:[function(require,module,exports){
100
100
  "use strict";module.exports="undefined"!=typeof Reflect&&Reflect.getPrototypeOf||null;
101
101
 
102
102
  },{}],26:[function(require,module,exports){
103
103
  "use strict";var $Object=require(22);module.exports=$Object.getPrototypeOf||null;
104
104
 
105
- },{"22":22}],41:[function(require,module,exports){
106
- "use strict";var $isNaN=require(36);module.exports=function sign(i){return $isNaN(i)||0===i?i:i<0?-1:1};
107
-
108
- },{"36":36}],33:[function(require,module,exports){
105
+ },{"22":22}],33:[function(require,module,exports){
109
106
  "use strict";var call=Function.prototype.call,$hasOwn=Object.prototype.hasOwnProperty,bind=require(24);module.exports=bind.call(call,$hasOwn);
110
107
 
111
- },{"24":24}],31:[function(require,module,exports){
108
+ },{"24":24}],41:[function(require,module,exports){
109
+ "use strict";var $isNaN=require(36);module.exports=function sign(i){return $isNaN(i)||0===i?i:i<0?-1:1};
110
+
111
+ },{"36":36}],31:[function(require,module,exports){
112
112
  "use strict";var origSymbol="undefined"!=typeof Symbol&&Symbol,hasSymbolSham=require(32);module.exports=function hasNativeSymbols(){return"function"==typeof origSymbol&&"function"==typeof Symbol&&"symbol"==typeof origSymbol("foo")&&"symbol"==typeof Symbol("bar")&&hasSymbolSham()};
113
113
 
114
114
  },{"32":32}],28:[function(require,module,exports){
@@ -129,7 +129,7 @@ var hasMap="function"==typeof Map&&Map.prototype,mapSizeDescriptor=Object.getOwn
129
129
 
130
130
  }).call(this)}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
131
131
  },{"6":6}],43:[function(require,module,exports){
132
- "use strict";var inspect=require(42),$TypeError=require(20),listGetNode=function(e,t,n){for(var i,r=e;null!=(i=r.next);r=i)if(i.key===t)return r.next=i.next,n||(i.next=e.next,e.next=i),i},listGet=function(e,t){if(e){var n=listGetNode(e,t);return n&&n.value}},listSet=function(e,t,n){var i=listGetNode(e,t);i?i.value=n:e.next={key:t,next:e.next,value:n}},listHas=function(e,t){return!!e&&!!listGetNode(e,t)},listDelete=function(e,t){if(e)return listGetNode(e,t,!0)};module.exports=function getSideChannelList(){var e,t={assert:function(e){if(!t.has(e))throw new $TypeError("Side channel does not contain "+inspect(e))},delete:function(t){var n=e&&e.next,i=listDelete(e,t);return i&&n&&n===i&&(e=void 0),!!i},get:function(t){return listGet(e,t)},has:function(t){return listHas(e,t)},set:function(t,n){e||(e={next:void 0}),listSet(e,t,n)}};return t};
132
+ "use strict";var inspect=require(42),$TypeError=require(20),listGetNode=function(e,t,n){for(var i,r=e;null!=(i=r.next);r=i)if(i.key===t)return r.next=i.next,n||(i.next=e.next,e.next=i),i},listGet=function(e,t){if(e){var n=listGetNode(e,t);return n&&n.value}},listSet=function(e,t,n){var i=listGetNode(e,t);i?i.value=n:e.next={key:t,next:e.next,value:n}},listHas=function(e,t){return!!e&&!!listGetNode(e,t)},listDelete=function(e,t){if(e)return listGetNode(e,t,!0)};module.exports=function getSideChannelList(){var e,t={assert:function(e){if(!t.has(e))throw new $TypeError("Side channel does not contain "+inspect(e))},delete:function(t){var n=listDelete(e,t);return n&&e&&!e.next&&(e=void 0),!!n},get:function(t){return listGet(e,t)},has:function(t){return listHas(e,t)},set:function(t,n){e||(e={next:void 0}),listSet(e,t,n)}};return t};
133
133
 
134
134
  },{"20":20,"42":42}],44:[function(require,module,exports){
135
135
  "use strict";var GetIntrinsic=require(25),callBound=require(12),inspect=require(42),$TypeError=require(20),$Map=GetIntrinsic("%Map%",!0),$mapGet=callBound("Map.prototype.get",!0),$mapSet=callBound("Map.prototype.set",!0),$mapHas=callBound("Map.prototype.has",!0),$mapDelete=callBound("Map.prototype.delete",!0),$mapSize=callBound("Map.prototype.size",!0);module.exports=!!$Map&&function getSideChannelMap(){var e,t={assert:function(e){if(!t.has(e))throw new $TypeError("Side channel does not contain "+inspect(e))},delete:function(t){if(e){var n=$mapDelete(e,t);return 0===$mapSize(e)&&(e=void 0),n}return!1},get:function(t){if(e)return $mapGet(e,t)},has:function(t){return!!e&&$mapHas(e,t)},set:function(t,n){e||(e=new $Map),$mapSet(e,t,n)}};return t};
@@ -11,6 +11,7 @@ export default [
11
11
  rules: {
12
12
  complexity: 'off',
13
13
  'consistent-return': 'warn',
14
+ eqeqeq: ['error', 'allow-null'],
14
15
  'func-name-matching': 'off',
15
16
  'id-length': [
16
17
  'error',
@@ -214,9 +214,12 @@ var parseObject = function (chain, val, options, valuesParsed) {
214
214
  return leaf;
215
215
  };
216
216
 
217
- var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) {
218
- var key = options.allowDots ? givenKey.replace(/\.([^.[]+)/g, '[$1]') : givenKey;
217
+ // Split a key like "a[b][c[]]" into ['a', '[b]', '[c[]]'] while preserving
218
+ // qs parse semantics for depth/prototype guards.
219
+ var splitKeyIntoSegments = function splitKeyIntoSegments(originalKey, options) {
220
+ var key = options.allowDots ? originalKey.replace(/\.([^.[]+)/g, '[$1]') : originalKey;
219
221
 
222
+ // depth <= 0 keeps the whole key as one segment
220
223
  if (options.depth <= 0) {
221
224
  if (!options.plainObjects && has.call(Object.prototype, key)) {
222
225
  if (!options.allowPrototypes) {
@@ -227,14 +230,11 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) {
227
230
  return [key];
228
231
  }
229
232
 
230
- var brackets = /(\[[^[\]]*])/;
231
- var child = /(\[[^[\]]*])/g;
232
-
233
- var segment = brackets.exec(key);
234
- var parent = segment ? key.slice(0, segment.index) : key;
235
-
236
- var keys = [];
233
+ var segments = [];
237
234
 
235
+ // parent before the first '[' (may be empty if key starts with '[')
236
+ var first = key.indexOf('[');
237
+ var parent = first >= 0 ? key.slice(0, first) : key;
238
238
  if (parent) {
239
239
  if (!options.plainObjects && has.call(Object.prototype, parent)) {
240
240
  if (!options.allowPrototypes) {
@@ -242,32 +242,62 @@ var splitKeyIntoSegments = function splitKeyIntoSegments(givenKey, options) {
242
242
  }
243
243
  }
244
244
 
245
- keys[keys.length] = parent;
245
+ segments[segments.length] = parent;
246
246
  }
247
247
 
248
- var i = 0;
249
- while ((segment = child.exec(key)) !== null && i < options.depth) {
250
- i += 1;
251
-
252
- var segmentContent = segment[1].slice(1, -1);
253
- if (!options.plainObjects && has.call(Object.prototype, segmentContent)) {
254
- if (!options.allowPrototypes) {
255
- return;
248
+ var n = key.length;
249
+ var open = first;
250
+ var collected = 0;
251
+
252
+ while (open >= 0 && collected < options.depth) {
253
+ var level = 1;
254
+ var i = open + 1;
255
+ var close = -1;
256
+
257
+ // balance nested '[' and ']' inside this bracket group using a nesting level counter
258
+ while (i < n && close < 0) {
259
+ var cu = key.charCodeAt(i);
260
+ if (cu === 0x5B) { // '['
261
+ level += 1;
262
+ } else if (cu === 0x5D) { // ']'
263
+ level -= 1;
264
+ if (level === 0) {
265
+ close = i; // found matching close; loop will exit by condition
266
+ }
256
267
  }
268
+ i += 1;
257
269
  }
258
270
 
259
- keys[keys.length] = segment[1];
271
+ if (close < 0) {
272
+ // Unterminated group: wrap the raw remainder in one bracket pair so it stays
273
+ // a single literal segment (e.g. "[[]b" -> "[[]b]"); we do not infer missing ']'.
274
+ segments[segments.length] = '[' + key.slice(open) + ']';
275
+ return segments;
276
+ }
277
+
278
+ var seg = key.slice(open, close + 1);
279
+ // prototype guard for the content of this group
280
+ var content = seg.slice(1, -1);
281
+ if (!options.plainObjects && has.call(Object.prototype, content) && !options.allowPrototypes) {
282
+ return;
283
+ }
284
+
285
+ segments[segments.length] = seg;
286
+ collected += 1;
287
+
288
+ // find the next '[' after this balanced group
289
+ open = key.indexOf('[', close + 1);
260
290
  }
261
291
 
262
- if (segment) {
292
+ if (open >= 0) {
263
293
  if (options.strictDepth === true) {
264
294
  throw new RangeError('Input depth exceeded depth option of ' + options.depth + ' and strictDepth is true');
265
295
  }
266
296
 
267
- keys[keys.length] = '[' + key.slice(segment.index) + ']';
297
+ segments[segments.length] = '[' + key.slice(open) + ']';
268
298
  }
269
299
 
270
- return keys;
300
+ return segments;
271
301
  };
272
302
 
273
303
  var parseKeys = function parseQueryStringKeys(givenKey, val, options, valuesParsed) {
@@ -118,7 +118,7 @@ var stringify = function stringify(
118
118
 
119
119
  if (obj === null) {
120
120
  if (strictNullHandling) {
121
- return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix;
121
+ return formatter(encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset, 'key', format) : prefix);
122
122
  }
123
123
 
124
124
  obj = '';
@@ -142,7 +142,9 @@ var stringify = function stringify(
142
142
  if (generateArrayPrefix === 'comma' && isArray(obj)) {
143
143
  // we need to join elements in
144
144
  if (encodeValuesOnly && encoder) {
145
- obj = utils.maybeMap(obj, encoder);
145
+ obj = utils.maybeMap(obj, function (v) {
146
+ return v == null ? v : encoder(v);
147
+ });
146
148
  }
147
149
  objKeys = [{ value: obj.length > 0 ? obj.join(',') || null : void undefined }];
148
150
  } else if (isArray(filter)) {
@@ -312,6 +314,11 @@ module.exports = function (object, opts) {
312
314
  var sideChannel = getSideChannel();
313
315
  for (var i = 0; i < objKeys.length; ++i) {
314
316
  var key = objKeys[i];
317
+
318
+ if (typeof key === 'undefined' || key === null) {
319
+ continue;
320
+ }
321
+
315
322
  var value = obj[key];
316
323
 
317
324
  if (options.skipNulls && value === null) {
@@ -345,10 +352,10 @@ module.exports = function (object, opts) {
345
352
  if (options.charsetSentinel) {
346
353
  if (options.charset === 'iso-8859-1') {
347
354
  // encodeURIComponent('&#10003;'), the "numeric entity" representation of a checkmark
348
- prefix += 'utf8=%26%2310003%3B&';
355
+ prefix += 'utf8=%26%2310003%3B' + options.delimiter;
349
356
  } else {
350
357
  // encodeURIComponent('✓')
351
- prefix += 'utf8=%E2%9C%93&';
358
+ prefix += 'utf8=%E2%9C%93' + options.delimiter;
352
359
  }
353
360
  }
354
361
 
@@ -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.15.1",
5
+ "version": "6.15.2",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/ljharb/qs.git"
@@ -36,7 +36,7 @@
36
36
  "devDependencies": {
37
37
  "@browserify/envify": "^6.0.0",
38
38
  "@browserify/uglifyify": "^6.0.0",
39
- "@ljharb/eslint-config": "^22.2.2",
39
+ "@ljharb/eslint-config": "^22.2.3",
40
40
  "browserify": "^16.5.2",
41
41
  "bundle-collapser": "^1.4.0",
42
42
  "common-shakeify": "~1.0.0",