@zuplo/cli 7.11.6 → 7.11.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/node_modules/@zuplo/core/package.json +1 -1
- package/node_modules/@zuplo/core/zeno.js +5 -4
- package/node_modules/@zuplo/graphql/package.json +1 -1
- package/node_modules/@zuplo/openapi-tools/package.json +1 -1
- package/node_modules/@zuplo/otel/package.json +1 -1
- package/node_modules/@zuplo/runtime/out/esm/{chunk-5SHD5VGF.js → chunk-7WJVPTYD.js} +3 -3
- package/node_modules/@zuplo/runtime/out/esm/chunk-7WJVPTYD.js.map +1 -0
- package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
- package/node_modules/@zuplo/runtime/out/esm/mocks/index.js.map +1 -1
- package/node_modules/@zuplo/runtime/out/types/index.d.ts +18 -43
- package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +17 -42
- package/node_modules/@zuplo/runtime/out/types/mcp/messages/index.d.ts +17 -42
- package/node_modules/@zuplo/runtime/out/types/mcp-gateway/index.d.ts +17 -42
- package/node_modules/@zuplo/runtime/out/types/mocks/index.d.ts +17 -42
- package/node_modules/@zuplo/runtime/out/types/sdks/aws/index.d.ts +17 -42
- package/node_modules/@zuplo/runtime/package.json +1 -1
- package/node_modules/qs/.github/THREAT_MODEL.md +4 -2
- package/node_modules/qs/CHANGELOG.md +38 -14
- package/node_modules/qs/README.md +31 -3
- package/node_modules/qs/dist/qs.js +20 -20
- package/node_modules/qs/lib/parse.js +94 -4
- package/node_modules/qs/lib/stringify.js +4 -4
- package/node_modules/qs/lib/utils.js +130 -6
- package/node_modules/qs/package.json +4 -4
- package/node_modules/qs/test/parse.js +174 -0
- package/node_modules/qs/test/stringify.js +263 -33
- package/node_modules/qs/test/utils.js +184 -0
- package/package.json +11 -11
- package/node_modules/@zuplo/runtime/out/esm/chunk-5SHD5VGF.js.map +0 -1
- /package/node_modules/@zuplo/runtime/out/esm/{chunk-5SHD5VGF.js.LEGAL.txt → chunk-7WJVPTYD.js.LEGAL.txt} +0 -0
|
@@ -22,5 +22,5 @@
|
|
|
22
22
|
* DEALINGS IN THE SOFTWARE.
|
|
23
23
|
*--------------------------------------------------------------------------------------------*/
|
|
24
24
|
|
|
25
|
-
import{E as p,J as c,M as u}from"../chunk-
|
|
25
|
+
import{E as p,J as c,M as u}from"../chunk-7WJVPTYD.js";import"../chunk-NUVXDVLJ.js";import{a as d}from"../chunk-QGAJTUPE.js";import"../chunk-A3QGJZO7.js";import"../chunk-CDEAY3VY.js";import{aa as i}from"../chunk-LVSZ3WTO.js";import{a as o}from"../chunk-TYV53J3B.js";function w(l={request:new Request("https://api.example.com")}){let e=[];function t(s){e.push(Promise.resolve(s))}return o(t,"waitUntil"),{context:new a({event:{waitUntil:t},route:l.route,originalRequest:l.request}),invokeResponse:o(async()=>{await Promise.all(e)},"invokeResponse")}}o(w,"createMockContext");var g={path:"/",methods:["GET"],handler:{module:{},export:"default"},raw:o(()=>({}),"raw")},a=class extends EventTarget{static{o(this,"MockZuploContext")}#e;#t;contextId;requestId;log;route;custom;incomingRequestProperties;parentContext;analyticsContext;constructor({event:e,route:t=g,parentContext:n,originalRequest:r}){super(),this.requestId=crypto.randomUUID(),this.contextId=crypto.randomUUID(),this.log={info:i.console.info,log:i.console.log,debug:i.console.debug,warn:i.console.warn,error:i.console.error,setLogProperties:o(()=>{},"setLogProperties")},this.custom={},this.route=t,this.incomingRequestProperties={ip:"203.0.113.7",asn:1234,asOrganization:"ORGANIZATION",city:"Seattle",region:"Washington",regionCode:"WA",colo:"SEA",continent:"NA",country:"US",postalCode:"98004",metroCode:"SEA",latitude:void 0,longitude:void 0,timezone:void 0,httpProtocol:void 0,clientCert:void 0,clientMtlsVerificationStatus:void 0,clientMtlsVerificationReason:void 0,clientCertFingerprintSha256:void 0,clientCertNotBefore:void 0,clientCertNotAfter:void 0,clientCertIssuerDn:void 0,clientCertSubjectDn:void 0},this.parentContext=n,this.#e=e,this.#t=r,this.analyticsContext=new c(this.requestId)}waitUntil(e){this.#e.waitUntil(e)}invokeInboundPolicy(e,t){throw new Error("Not implemented")}invokeOutboundPolicy(e,t,n){throw new Error("Not implemented")}invokeRoute(e,t){throw new Error("Not implemented")}addResponseSendingHook(e){throw new Error("Not implemented")}addResponseSendingFinalHook(e){throw new Error("Not implemented")}addPreRequestHandler(e,t){let n;try{n=u.getContextExtensions(this)}catch{n=u.initialize(this,new d(this.#t??new Request("https://api.example.com")))}n.preRequestPhase??="active",p(this,n,e,t)}get preRequestHandlers(){let e;try{e=u.getContextExtensions(this)}catch{return[]}return(e.preRequestState?.entries??[]).map(t=>({policyName:t.policyName,name:t.name}))}addEventListener(e,t,n){let r=o(s=>{try{typeof t=="function"?t(s):t.handleEvent(s)}catch(m){throw this.log.error(`Error invoking event ${e}. See following logs for details.`),m}},"wrapped");super.addEventListener(e,r,n)}};export{a as MockZuploContext,w as createMockContext};
|
|
26
26
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["@zuplo/runtime/mocks/context.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;0QAkCO,SAASA,EACdC,EAA6D,CAC3D,QAAS,IAAI,QAAQ,yBAAyB,CAChD,EACA,CACA,IAAMC,EAAwC,CAAC,EAG/C,SAASC,EAAUC,EAA6B,CAC9CF,EAAkB,KAAK,QAAQ,QAAQE,CAAO,CAAC,CACjD,CAFS,OAAAC,EAAAF,EAAA,aAcF,CAAE,QAVO,IAAIG,EAAiB,CACnC,MAAO,CAAE,UAAAH,CAAU,EACnB,MAAOF,EAAQ,MACf,gBAAiBA,EAAQ,OAC3B,CAAC,EAMiB,eAJKI,EAAA,SAAY,CACjC,MAAM,QAAQ,IAAIH,CAAiB,CACrC,EAFuB,iBAIU,CACnC,CAvBgBG,EAAAL,EAAA,qBAyBhB,IAAMO,EAA2C,CAC/C,KAAM,IACN,QAAS,CAAC,KAAK,EACf,QAAS,CACP,OAAQ,CAAC,EACT,OAAQ,SACV,EACA,IAAKF,EAAA,KAAU,CAAC,GAAX,MACP,EAMaC,EAAN,cAA+B,WAAoC,CAzE1E,MAyE0E,CAAAD,EAAA,yBAC/DG,GACAC,GACA,UACA,UACA,IACA,MAEA,OACA,0BACA,cACA,iBAET,YAAY,CACV,MAAAC,EACA,MAAAC,EAAQJ,EACR,cAAAK,EACA,gBAAAC,CACF,EAUG,CACD,MAAM,EACN,KAAK,UAAY,OAAO,WAAW,EACnC,KAAK,UAAY,OAAO,WAAW,EAEnC,KAAK,IAAM,CACT,KAAMC,EAAU,QAAQ,KACxB,IAAKA,EAAU,QAAQ,IACvB,MAAOA,EAAU,QAAQ,MACzB,KAAMA,EAAU,QAAQ,KACxB,MAAOA,EAAU,QAAQ,MACzB,iBAAkBT,EAAA,IAAM,CAAC,EAAP,
|
|
1
|
+
{"version":3,"sources":["@zuplo/runtime/mocks/context.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;0QAkCO,SAASA,EACdC,EAA6D,CAC3D,QAAS,IAAI,QAAQ,yBAAyB,CAChD,EACA,CACA,IAAMC,EAAwC,CAAC,EAG/C,SAASC,EAAUC,EAA6B,CAC9CF,EAAkB,KAAK,QAAQ,QAAQE,CAAO,CAAC,CACjD,CAFS,OAAAC,EAAAF,EAAA,aAcF,CAAE,QAVO,IAAIG,EAAiB,CACnC,MAAO,CAAE,UAAAH,CAAU,EACnB,MAAOF,EAAQ,MACf,gBAAiBA,EAAQ,OAC3B,CAAC,EAMiB,eAJKI,EAAA,SAAY,CACjC,MAAM,QAAQ,IAAIH,CAAiB,CACrC,EAFuB,iBAIU,CACnC,CAvBgBG,EAAAL,EAAA,qBAyBhB,IAAMO,EAA2C,CAC/C,KAAM,IACN,QAAS,CAAC,KAAK,EACf,QAAS,CACP,OAAQ,CAAC,EACT,OAAQ,SACV,EACA,IAAKF,EAAA,KAAU,CAAC,GAAX,MACP,EAMaC,EAAN,cAA+B,WAAoC,CAzE1E,MAyE0E,CAAAD,EAAA,yBAC/DG,GACAC,GACA,UACA,UACA,IACA,MAEA,OACA,0BACA,cACA,iBAET,YAAY,CACV,MAAAC,EACA,MAAAC,EAAQJ,EACR,cAAAK,EACA,gBAAAC,CACF,EAUG,CACD,MAAM,EACN,KAAK,UAAY,OAAO,WAAW,EACnC,KAAK,UAAY,OAAO,WAAW,EAEnC,KAAK,IAAM,CACT,KAAMC,EAAU,QAAQ,KACxB,IAAKA,EAAU,QAAQ,IACvB,MAAOA,EAAU,QAAQ,MACzB,KAAMA,EAAU,QAAQ,KACxB,MAAOA,EAAU,QAAQ,MACzB,iBAAkBT,EAAA,IAAM,CAAC,EAAP,mBACpB,EACA,KAAK,OAAS,CAAC,EACf,KAAK,MAAQM,EACb,KAAK,0BAA4B,CAC/B,GAAI,cACJ,IAAK,KACL,eAAgB,eAChB,KAAM,UACN,OAAQ,aACR,WAAY,KACZ,KAAM,MACN,UAAW,KACX,QAAS,KACT,WAAY,QACZ,UAAW,MACX,SAAU,OACV,UAAW,OACX,SAAU,OACV,aAAc,OACd,WAAY,OACZ,6BAA8B,OAC9B,6BAA8B,OAC9B,4BAA6B,OAC7B,oBAAqB,OACrB,mBAAoB,OACpB,mBAAoB,OACpB,oBAAqB,MACvB,EACA,KAAK,cAAgBC,EACrB,KAAKJ,GAASE,EACd,KAAKD,GAAmBI,EACxB,KAAK,iBAAmB,IAAIE,EAA6B,KAAK,SAAS,CACzE,CAGA,UAAUX,EAAuB,CAC/B,KAAKI,GAAO,UAAUJ,CAAO,CAC/B,CAEA,oBACEY,EACAC,EACkC,CAClC,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,qBACED,EACAE,EACAD,EACmB,CACnB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAEA,YACEE,EACAC,EACmB,CACnB,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAKA,uBAAuBC,EAAmC,CACxD,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAKA,4BAA4BA,EAAwC,CAClE,MAAM,IAAI,MAAM,iBAAiB,CACnC,CAQA,qBACEC,EACArB,EACM,CAIN,IAAIsB,EACJ,GAAI,CACFA,EAAMC,EAAuB,qBAAqB,IAAI,CACxD,MAAQ,CACND,EAAMC,EAAuB,WAC3B,KACA,IAAIC,EACF,KAAKhB,IAAoB,IAAI,QAAQ,yBAAyB,CAChE,CACF,CACF,CAKAc,EAAI,kBAAoB,SACxBG,EAA0B,KAAMH,EAAKD,EAASrB,CAAO,CACvD,CAgBA,IAAI,oBAAyE,CAC3E,IAAIsB,EACJ,GAAI,CACFA,EAAMC,EAAuB,qBAAqB,IAAI,CACxD,MAAQ,CACN,MAAO,CAAC,CACV,CACA,OAAQD,EAAI,iBAAiB,SAAW,CAAC,GAAG,IAAKI,IAAW,CAC1D,WAAYA,EAAM,WAClB,KAAMA,EAAM,IACd,EAAE,CACJ,CAES,iBACPC,EACAN,EACArB,EACM,CACN,IAAM4B,EAA8CxB,EAACyB,GAAM,CACzD,GAAI,CACF,OAAOR,GAAY,WAAaA,EAAQQ,CAAC,EAAIR,EAAQ,YAAYQ,CAAC,CACpE,OAASC,EAAK,CACZ,WAAK,IAAI,MACP,wBAAwBH,CAAI,mCAC9B,EACMG,CACR,CACF,EAToD,WAUpD,MAAM,iBAAiBH,EAAMC,EAAS5B,CAAO,CAC/C,CACF","names":["createMockContext","options","waitUntilPromises","waitUntil","promise","__name","MockZuploContext","DEFAULT_ROUTE_CONFIG","#event","#originalRequest","event","route","parentContext","originalRequest","internals_default","ZuploGatewayAnalyticsContext","policyName","request","response","input","init","hook","handler","ext","ZuploContextExtensions","ZuploRequest","registerPreRequestHandler","entry","type","wrapped","e","err"]}
|
|
@@ -8637,11 +8637,24 @@ declare type LogFormat = "pretty" | "json" | "gcp" | "cloudflare";
|
|
|
8637
8637
|
*/
|
|
8638
8638
|
export declare interface Logger extends SystemLogger {
|
|
8639
8639
|
/**
|
|
8640
|
-
* Set properties
|
|
8641
|
-
*
|
|
8642
|
-
*
|
|
8640
|
+
* Set properties for this request. They are added to every later log entry
|
|
8641
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
8642
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
8643
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
8643
8644
|
*
|
|
8644
|
-
*
|
|
8645
|
+
* Properties apply only to the current request. Each call merges into the
|
|
8646
|
+
* properties already set, and a later value for the same key overwrites an
|
|
8647
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
8648
|
+
* a static field with the same name configured in the logging plugin. A
|
|
8649
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
8650
|
+
* own row.
|
|
8651
|
+
*
|
|
8652
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
8653
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
8654
|
+
* value is truncated on the row, and a property over the other limits is
|
|
8655
|
+
* left off the row. Log entries are not limited this way.
|
|
8656
|
+
*
|
|
8657
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
8645
8658
|
*
|
|
8646
8659
|
* @example
|
|
8647
8660
|
* ```ts
|
|
@@ -8658,44 +8671,6 @@ export declare interface Logger extends SystemLogger {
|
|
|
8658
8671
|
setLogProperties?(
|
|
8659
8672
|
properties: Record<string, string | number | boolean>
|
|
8660
8673
|
): void;
|
|
8661
|
-
/**
|
|
8662
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
8663
|
-
* row per request that analytics and the request details view read.
|
|
8664
|
-
*
|
|
8665
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
8666
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
8667
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
8668
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
8669
|
-
*
|
|
8670
|
-
* Each call merges into the properties already set for this request, and a
|
|
8671
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
8672
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
8673
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
8674
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
8675
|
-
*
|
|
8676
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
8677
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
8678
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
8679
|
-
* method never throws.
|
|
8680
|
-
*
|
|
8681
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
8682
|
-
*
|
|
8683
|
-
* @example
|
|
8684
|
-
* ```ts
|
|
8685
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
8686
|
-
* context.log.setRequestProperties({
|
|
8687
|
-
* tenantId: request.user?.data.tenantId,
|
|
8688
|
-
* pricingExperiment: "variant-b",
|
|
8689
|
-
* cached: false,
|
|
8690
|
-
* });
|
|
8691
|
-
*
|
|
8692
|
-
* return new Response("ok");
|
|
8693
|
-
* }
|
|
8694
|
-
* ```
|
|
8695
|
-
*/
|
|
8696
|
-
setRequestProperties(
|
|
8697
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
8698
|
-
): void;
|
|
8699
8674
|
}
|
|
8700
8675
|
|
|
8701
8676
|
/* Excluded from this release type: LoggingContext */
|
|
@@ -10791,7 +10766,7 @@ declare interface MetricsData {
|
|
|
10791
10766
|
*/
|
|
10792
10767
|
url?: string;
|
|
10793
10768
|
/**
|
|
10794
|
-
* Free-form properties attached with `context.log.
|
|
10769
|
+
* Free-form properties attached with `context.log.setLogProperties`.
|
|
10795
10770
|
* Omitted when none were set.
|
|
10796
10771
|
*/
|
|
10797
10772
|
properties?: Record<string, string>;
|
|
@@ -1037,11 +1037,24 @@ declare type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
|
1037
1037
|
*/
|
|
1038
1038
|
declare interface Logger extends BaseLogger {
|
|
1039
1039
|
/**
|
|
1040
|
-
* Set properties
|
|
1041
|
-
*
|
|
1042
|
-
*
|
|
1040
|
+
* Set properties for this request. They are added to every later log entry
|
|
1041
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
1042
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
1043
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
1043
1044
|
*
|
|
1044
|
-
*
|
|
1045
|
+
* Properties apply only to the current request. Each call merges into the
|
|
1046
|
+
* properties already set, and a later value for the same key overwrites an
|
|
1047
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
1048
|
+
* a static field with the same name configured in the logging plugin. A
|
|
1049
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
1050
|
+
* own row.
|
|
1051
|
+
*
|
|
1052
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
1053
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
1054
|
+
* value is truncated on the row, and a property over the other limits is
|
|
1055
|
+
* left off the row. Log entries are not limited this way.
|
|
1056
|
+
*
|
|
1057
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
1045
1058
|
*
|
|
1046
1059
|
* @example
|
|
1047
1060
|
* ```ts
|
|
@@ -1058,44 +1071,6 @@ declare interface Logger extends BaseLogger {
|
|
|
1058
1071
|
setLogProperties?(
|
|
1059
1072
|
properties: Record<string, string | number | boolean>
|
|
1060
1073
|
): void;
|
|
1061
|
-
/**
|
|
1062
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
1063
|
-
* row per request that analytics and the request details view read.
|
|
1064
|
-
*
|
|
1065
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
1066
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
1067
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
1068
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
1069
|
-
*
|
|
1070
|
-
* Each call merges into the properties already set for this request, and a
|
|
1071
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
1072
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
1073
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
1074
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
1075
|
-
*
|
|
1076
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
1077
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
1078
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
1079
|
-
* method never throws.
|
|
1080
|
-
*
|
|
1081
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
1082
|
-
*
|
|
1083
|
-
* @example
|
|
1084
|
-
* ```ts
|
|
1085
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
1086
|
-
* context.log.setRequestProperties({
|
|
1087
|
-
* tenantId: request.user?.data.tenantId,
|
|
1088
|
-
* pricingExperiment: "variant-b",
|
|
1089
|
-
* cached: false,
|
|
1090
|
-
* });
|
|
1091
|
-
*
|
|
1092
|
-
* return new Response("ok");
|
|
1093
|
-
* }
|
|
1094
|
-
* ```
|
|
1095
|
-
*/
|
|
1096
|
-
setRequestProperties(
|
|
1097
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
1098
|
-
): void;
|
|
1099
1074
|
}
|
|
1100
1075
|
|
|
1101
1076
|
declare type Modify<T, R> = Omit<T, keyof R> & R;
|
|
@@ -965,11 +965,24 @@ declare type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
|
965
965
|
*/
|
|
966
966
|
declare interface Logger extends BaseLogger {
|
|
967
967
|
/**
|
|
968
|
-
* Set properties
|
|
969
|
-
*
|
|
970
|
-
*
|
|
968
|
+
* Set properties for this request. They are added to every later log entry
|
|
969
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
970
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
971
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
971
972
|
*
|
|
972
|
-
*
|
|
973
|
+
* Properties apply only to the current request. Each call merges into the
|
|
974
|
+
* properties already set, and a later value for the same key overwrites an
|
|
975
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
976
|
+
* a static field with the same name configured in the logging plugin. A
|
|
977
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
978
|
+
* own row.
|
|
979
|
+
*
|
|
980
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
981
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
982
|
+
* value is truncated on the row, and a property over the other limits is
|
|
983
|
+
* left off the row. Log entries are not limited this way.
|
|
984
|
+
*
|
|
985
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
973
986
|
*
|
|
974
987
|
* @example
|
|
975
988
|
* ```ts
|
|
@@ -986,44 +999,6 @@ declare interface Logger extends BaseLogger {
|
|
|
986
999
|
setLogProperties?(
|
|
987
1000
|
properties: Record<string, string | number | boolean>
|
|
988
1001
|
): void;
|
|
989
|
-
/**
|
|
990
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
991
|
-
* row per request that analytics and the request details view read.
|
|
992
|
-
*
|
|
993
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
994
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
995
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
996
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
997
|
-
*
|
|
998
|
-
* Each call merges into the properties already set for this request, and a
|
|
999
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
1000
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
1001
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
1002
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
1003
|
-
*
|
|
1004
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
1005
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
1006
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
1007
|
-
* method never throws.
|
|
1008
|
-
*
|
|
1009
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
1010
|
-
*
|
|
1011
|
-
* @example
|
|
1012
|
-
* ```ts
|
|
1013
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
1014
|
-
* context.log.setRequestProperties({
|
|
1015
|
-
* tenantId: request.user?.data.tenantId,
|
|
1016
|
-
* pricingExperiment: "variant-b",
|
|
1017
|
-
* cached: false,
|
|
1018
|
-
* });
|
|
1019
|
-
*
|
|
1020
|
-
* return new Response("ok");
|
|
1021
|
-
* }
|
|
1022
|
-
* ```
|
|
1023
|
-
*/
|
|
1024
|
-
setRequestProperties(
|
|
1025
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
1026
|
-
): void;
|
|
1027
1002
|
}
|
|
1028
1003
|
|
|
1029
1004
|
/**
|
|
@@ -1093,11 +1093,24 @@ declare type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
|
1093
1093
|
*/
|
|
1094
1094
|
declare interface Logger extends BaseLogger {
|
|
1095
1095
|
/**
|
|
1096
|
-
* Set properties
|
|
1097
|
-
*
|
|
1098
|
-
*
|
|
1096
|
+
* Set properties for this request. They are added to every later log entry
|
|
1097
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
1098
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
1099
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
1099
1100
|
*
|
|
1100
|
-
*
|
|
1101
|
+
* Properties apply only to the current request. Each call merges into the
|
|
1102
|
+
* properties already set, and a later value for the same key overwrites an
|
|
1103
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
1104
|
+
* a static field with the same name configured in the logging plugin. A
|
|
1105
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
1106
|
+
* own row.
|
|
1107
|
+
*
|
|
1108
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
1109
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
1110
|
+
* value is truncated on the row, and a property over the other limits is
|
|
1111
|
+
* left off the row. Log entries are not limited this way.
|
|
1112
|
+
*
|
|
1113
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
1101
1114
|
*
|
|
1102
1115
|
* @example
|
|
1103
1116
|
* ```ts
|
|
@@ -1114,44 +1127,6 @@ declare interface Logger extends BaseLogger {
|
|
|
1114
1127
|
setLogProperties?(
|
|
1115
1128
|
properties: Record<string, string | number | boolean>
|
|
1116
1129
|
): void;
|
|
1117
|
-
/**
|
|
1118
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
1119
|
-
* row per request that analytics and the request details view read.
|
|
1120
|
-
*
|
|
1121
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
1122
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
1123
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
1124
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
1125
|
-
*
|
|
1126
|
-
* Each call merges into the properties already set for this request, and a
|
|
1127
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
1128
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
1129
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
1130
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
1131
|
-
*
|
|
1132
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
1133
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
1134
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
1135
|
-
* method never throws.
|
|
1136
|
-
*
|
|
1137
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
1138
|
-
*
|
|
1139
|
-
* @example
|
|
1140
|
-
* ```ts
|
|
1141
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
1142
|
-
* context.log.setRequestProperties({
|
|
1143
|
-
* tenantId: request.user?.data.tenantId,
|
|
1144
|
-
* pricingExperiment: "variant-b",
|
|
1145
|
-
* cached: false,
|
|
1146
|
-
* });
|
|
1147
|
-
*
|
|
1148
|
-
* return new Response("ok");
|
|
1149
|
-
* }
|
|
1150
|
-
* ```
|
|
1151
|
-
*/
|
|
1152
|
-
setRequestProperties(
|
|
1153
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
1154
|
-
): void;
|
|
1155
1130
|
}
|
|
1156
1131
|
|
|
1157
1132
|
/* Excluded from this release type: LookupResult */
|
|
@@ -872,11 +872,24 @@ declare type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
|
872
872
|
*/
|
|
873
873
|
declare interface Logger extends BaseLogger {
|
|
874
874
|
/**
|
|
875
|
-
* Set properties
|
|
876
|
-
*
|
|
877
|
-
*
|
|
875
|
+
* Set properties for this request. They are added to every later log entry
|
|
876
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
877
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
878
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
878
879
|
*
|
|
879
|
-
*
|
|
880
|
+
* Properties apply only to the current request. Each call merges into the
|
|
881
|
+
* properties already set, and a later value for the same key overwrites an
|
|
882
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
883
|
+
* a static field with the same name configured in the logging plugin. A
|
|
884
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
885
|
+
* own row.
|
|
886
|
+
*
|
|
887
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
888
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
889
|
+
* value is truncated on the row, and a property over the other limits is
|
|
890
|
+
* left off the row. Log entries are not limited this way.
|
|
891
|
+
*
|
|
892
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
880
893
|
*
|
|
881
894
|
* @example
|
|
882
895
|
* ```ts
|
|
@@ -893,44 +906,6 @@ declare interface Logger extends BaseLogger {
|
|
|
893
906
|
setLogProperties?(
|
|
894
907
|
properties: Record<string, string | number | boolean>
|
|
895
908
|
): void;
|
|
896
|
-
/**
|
|
897
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
898
|
-
* row per request that analytics and the request details view read.
|
|
899
|
-
*
|
|
900
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
901
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
902
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
903
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
904
|
-
*
|
|
905
|
-
* Each call merges into the properties already set for this request, and a
|
|
906
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
907
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
908
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
909
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
910
|
-
*
|
|
911
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
912
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
913
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
914
|
-
* method never throws.
|
|
915
|
-
*
|
|
916
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
917
|
-
*
|
|
918
|
-
* @example
|
|
919
|
-
* ```ts
|
|
920
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
921
|
-
* context.log.setRequestProperties({
|
|
922
|
-
* tenantId: request.user?.data.tenantId,
|
|
923
|
-
* pricingExperiment: "variant-b",
|
|
924
|
-
* cached: false,
|
|
925
|
-
* });
|
|
926
|
-
*
|
|
927
|
-
* return new Response("ok");
|
|
928
|
-
* }
|
|
929
|
-
* ```
|
|
930
|
-
*/
|
|
931
|
-
setRequestProperties(
|
|
932
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
933
|
-
): void;
|
|
934
909
|
}
|
|
935
910
|
|
|
936
911
|
/**
|
|
@@ -1249,11 +1249,24 @@ declare type JsonValue = JsonPrimitive | JsonObject | JsonArray;
|
|
|
1249
1249
|
*/
|
|
1250
1250
|
declare interface Logger extends BaseLogger {
|
|
1251
1251
|
/**
|
|
1252
|
-
* Set properties
|
|
1253
|
-
*
|
|
1254
|
-
*
|
|
1252
|
+
* Set properties for this request. They are added to every later log entry
|
|
1253
|
+
* for this request that a log plugin ships (Datadog, Splunk, Loki and the
|
|
1254
|
+
* others), and to the request's row in Zuplo's request log, which the log
|
|
1255
|
+
* viewer in the Zuplo Portal shows in the request's details.
|
|
1255
1256
|
*
|
|
1256
|
-
*
|
|
1257
|
+
* Properties apply only to the current request. Each call merges into the
|
|
1258
|
+
* properties already set, and a later value for the same key overwrites an
|
|
1259
|
+
* earlier one. In log entries, a per-request property takes precedence over
|
|
1260
|
+
* a static field with the same name configured in the logging plugin. A
|
|
1261
|
+
* request made with `context.invokeRoute` has its own properties and its
|
|
1262
|
+
* own row.
|
|
1263
|
+
*
|
|
1264
|
+
* To keep request rows small, a row holds at most 64 properties, a key can
|
|
1265
|
+
* be at most 128 characters, and a value at most 2048 characters. A longer
|
|
1266
|
+
* value is truncated on the row, and a property over the other limits is
|
|
1267
|
+
* left off the row. Log entries are not limited this way.
|
|
1268
|
+
*
|
|
1269
|
+
* @param properties - Key-value pairs for this request. Values must be string, number, or boolean.
|
|
1257
1270
|
*
|
|
1258
1271
|
* @example
|
|
1259
1272
|
* ```ts
|
|
@@ -1270,44 +1283,6 @@ declare interface Logger extends BaseLogger {
|
|
|
1270
1283
|
setLogProperties?(
|
|
1271
1284
|
properties: Record<string, string | number | boolean>
|
|
1272
1285
|
): void;
|
|
1273
|
-
/**
|
|
1274
|
-
* Attach properties to this request's row in Zuplo's request log, the one
|
|
1275
|
-
* row per request that analytics and the request details view read.
|
|
1276
|
-
*
|
|
1277
|
-
* This differs from `setLogProperties`, which adds fields to every log
|
|
1278
|
-
* entry (each `context.log.info(...)` line) that log plugins ship. Use
|
|
1279
|
-
* `setRequestProperties` to label the request itself, for example with a
|
|
1280
|
-
* tenant ID, a feature flag or an experiment variant.
|
|
1281
|
-
*
|
|
1282
|
-
* Each call merges into the properties already set for this request, and a
|
|
1283
|
-
* later value for the same key overwrites an earlier one. Numbers and
|
|
1284
|
-
* booleans are stored as strings, and `null` or `undefined` values are
|
|
1285
|
-
* skipped. A request made with `context.invokeRoute` has a row of its own,
|
|
1286
|
-
* so properties set while it runs land on that row, not on the caller's.
|
|
1287
|
-
*
|
|
1288
|
-
* To keep rows small, a request holds at most 64 properties, a key can be
|
|
1289
|
-
* at most 128 characters, and a value at most 2048 characters. A longer
|
|
1290
|
-
* value is truncated, and a property over the other limits is dropped. The
|
|
1291
|
-
* method never throws.
|
|
1292
|
-
*
|
|
1293
|
-
* @param properties - Key-value pairs to attach to the request's log row.
|
|
1294
|
-
*
|
|
1295
|
-
* @example
|
|
1296
|
-
* ```ts
|
|
1297
|
-
* export default async function (request: ZuploRequest, context: ZuploContext) {
|
|
1298
|
-
* context.log.setRequestProperties({
|
|
1299
|
-
* tenantId: request.user?.data.tenantId,
|
|
1300
|
-
* pricingExperiment: "variant-b",
|
|
1301
|
-
* cached: false,
|
|
1302
|
-
* });
|
|
1303
|
-
*
|
|
1304
|
-
* return new Response("ok");
|
|
1305
|
-
* }
|
|
1306
|
-
* ```
|
|
1307
|
-
*/
|
|
1308
|
-
setRequestProperties(
|
|
1309
|
-
properties: Record<string, string | number | boolean | undefined | null>
|
|
1310
|
-
): void;
|
|
1311
1286
|
}
|
|
1312
1287
|
|
|
1313
1288
|
declare type Modify<T, R> = Omit<T, keyof R> & R;
|
|
@@ -24,7 +24,7 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
**Trust Boundaries:**
|
|
27
|
-
- **Input string (parse):** May come from untrusted sources (e.g., user input, network requests)
|
|
27
|
+
- **Input string (parse):** May come from untrusted sources (e.g., user input, network requests). `qs` defines its own key grammar, where bracket groups denote nesting, so the parameter names it derives are deliberately not the flat names produced by `URLSearchParams`, `node:querystring`, or a WHATWG-conformant parser. The parsed object, not the raw string, is the only thing a caller should make trust decisions about; see "Interpretation conflict" below.
|
|
28
28
|
- **Input object (stringify):** The calling application's own data, not a direct untrusted channel. May contain cycles (handled by the cycle detector). Deeply-nested non-cyclic input surfaces as a catchable synchronous `RangeError` (stack overflow), not unbounded resource consumption; callers that serialize externally-influenced objects should bound their depth/size beforehand.
|
|
29
29
|
- **Options:** Provided by the caller
|
|
30
30
|
- **Cycle Tracking:** Used only during stringification to detect and handle circular references
|
|
@@ -51,6 +51,7 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
51
51
|
- **Information Disclosure:** Error messages may expose internal details or sensitive data.
|
|
52
52
|
- **Denial of Service:** Large or malformed input can exhaust memory or CPU.
|
|
53
53
|
- **Elevation of Privilege:** Prototype pollution can lead to unintended privilege escalation in the host application[3][4][8].
|
|
54
|
+
- **Interpretation conflict (out of scope):** An application that parses the same query string with two different parsers, and makes a trust decision on one result while consuming the other, can be attacked by any input the two parsers read differently. `qs`'s bracket grammar guarantees such inputs exist, so this is a property of the deployment, not a defect `qs` can remove. It is the calling application's responsibility to parse once and validate the parsed object.
|
|
54
55
|
|
|
55
56
|
### 6. Mitigation/Countermeasures
|
|
56
57
|
|
|
@@ -58,8 +59,9 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
58
59
|
|---------------------------------------------------|---------------------|
|
|
59
60
|
| Tampering (malicious input, prototype pollution) | Strict input validation; keep `allowPrototypes: false` by default; use `plainObjects` for output; ensure builtins/globals are never modified by parse[4][8]. |
|
|
60
61
|
| Information Disclosure (error messages) | Generic error messages without stack traces or internal paths. |
|
|
61
|
-
| Denial of Service (memory/CPU exhaustion) | `arrayLimit`, `parameterLimit`, and depth limiting apply with safe defaults. Note that `arrayLimit` is a representation threshold (array vs. object), and `parameterLimit` bounds only the number of `&`-delimited parameters - neither caps the elements produced by `comma: true` splitting. For
|
|
62
|
+
| Denial of Service (memory/CPU exhaustion) | `arrayLimit`, `parameterLimit`, and depth limiting apply with safe defaults. Note that `arrayLimit` is a representation threshold (array vs. object), and `parameterLimit` bounds only the number of `&`-delimited parameters - neither caps the elements produced by `comma: true` splitting. For hard caps on the number of parameters and on each array's length, opt in to `throwOnLimitExceeded: true` (default `false`), which rejects a query string with more than `parameterLimit` parameters, or one that would produce any array longer than `arrayLimit`. `arrayLimit` applies to each array separately, including each parameter's comma-split value, so the total number of values can still reach `parameterLimit` times `arrayLimit`; always bound input size at the transport layer as well[7]. On the `stringify` side, the input is the caller's own object rather than an untrusted string, so unbounded nesting manifests as a catchable `RangeError` (stack overflow) rather than exhaustion; callers serializing externally-influenced objects should bound depth/size beforehand, and may opt into `stringify`'s `depth` option (default `Infinity`) for a deterministic, catchable error. |
|
|
62
63
|
| Elevation of Privilege (prototype pollution) | Keep `allowPrototypes: false`; validate options against allowlist; use `plainObjects` to avoid prototype pollution[4][8]. |
|
|
64
|
+
| Interpretation conflict (validate-then-use across two parsers) | None available inside `qs`, by construction: `qs` and a flat parser disagree about parameter names for well-formed input, so no hardening can make the two views equal. Parse untrusted input once, with `qs`, and apply deny lists, authorization, and signature checks to the parsed object rather than to raw key text. Text that `qs` cannot place in its grammar is currently dropped, so distinct raw names can share one parsed path ([#619](https://github.com/ljharb/qs/issues/619)). |
|
|
63
65
|
|
|
64
66
|
### 7. Risk Ranking
|
|
65
67
|
|
|
@@ -1,17 +1,41 @@
|
|
|
1
|
+
## **6.16.1**
|
|
2
|
+
- [Fix] `parse`: do not mutate an object input
|
|
3
|
+
- [Fix] `stringify`: stop re-encoding structural separator dots when `encodeDotInKeys` is set (#564)
|
|
4
|
+
- [Fix] `stringify`: `arrayFormat: 'comma'`: pass the full encoder arguments with `encodeValuesOnly`
|
|
5
|
+
- [Fix] `utils`: encode `+` as `%2B` in iso-8859-1 mode so values round-trip (#565)
|
|
6
|
+
- [Fix] parse: only convert top-level dots to brackets when allowDots is on (#621)
|
|
7
|
+
- [Fix] `stringify`: ignore inherited array format names (#622)
|
|
8
|
+
- [Fix] `stringify`: `arrayFormat: 'comma'`: do not throw on elements with no callable `toString`
|
|
9
|
+
- [Fix] `utils`: `merge`: seed an overflow container's index from its own keys, not just the source
|
|
10
|
+
- [Fix] `utils`: `merge`: keep a `strictMerge` conflict container's index and `arrayLimit` correct
|
|
11
|
+
- [Fix] `parse`: only treat `[]` as array syntax when it ends the key
|
|
12
|
+
- [Perf] `decode`: skip decoders when there is no percent sign (#583)
|
|
13
|
+
- [Robustness] `utils`: `merge`: apply `arrayLimit` to the two-element array built for colliding values
|
|
14
|
+
- [Robustness] `parse`: bound the nesting added by repeated `strictMerge` conflicts
|
|
15
|
+
- [Docs] document that `qs` and flat parsers disagree about parameter names
|
|
16
|
+
- [Docs] clarify that `throwOnLimitExceeded` limits each array, not the total number of values
|
|
17
|
+
- [Docs] clarify 6.14.1/6.15.2 parse bracket behavior change (#567, #568)
|
|
18
|
+
- [meta] fix changelog indents
|
|
19
|
+
- [actions] set least-privilege `cache-mode`
|
|
20
|
+
- [Tests] `utils`: `decode`: add missing cases
|
|
21
|
+
- [Tests] `parse`: characterize the `]=` split when an `=` precedes any bracket group (#620)
|
|
22
|
+
- [Tests] `parse`: `allowDots`: cover stray close brackets before a dot
|
|
23
|
+
- [Dev Deps] update `@ljharb/eslint-config`, `eslint`, `tape`
|
|
24
|
+
|
|
1
25
|
## **6.16.0**
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
26
|
+
- [New] `stringify`: add a `depth` option to bound recursion depth (default `Infinity`)
|
|
27
|
+
- [Fix] stringify: serialize Date values when a filter is provided
|
|
28
|
+
- [Fix] `parse`: enforce `arrayLimit` on comma groups under `[]=` when `throwOnLimitExceeded` is set
|
|
29
|
+
- [Fix] `parse`: flatten a collection appended to an overflowed array (#571)
|
|
30
|
+
- [Fix] `utils`: `isBuffer`: do not invoke a non-callable `constructor.isBuffer`
|
|
31
|
+
- [Fix] `stringify`: do not let `allowEmptyArrays` skip cycle detection (or drop own keys) on an empty array with own properties
|
|
32
|
+
- [Fix] `stringify`: encode dots in a top-level key with a primitive value when encodeDotInKeys is set (#562)
|
|
33
|
+
- [Docs] threat model: clarify `stringify` deep-nesting DoS is caller-bounded
|
|
34
|
+
- [Docs] clarify `arrayLimit` is a representation threshold, not an element-count cap
|
|
35
|
+
- [Tests] `parse`: remove a test that pinned `[]=` comma groups escaping `arrayLimit`
|
|
36
|
+
- [Tests] `stringify`: pin current `encodeDotInKeys` separator-dot behavior
|
|
37
|
+
- [Dev Deps] update `@ljharb/eslint-config`, `eslint`
|
|
38
|
+
- [Dev Deps] update `eslint`, `evalmd`
|
|
15
39
|
|
|
16
40
|
## **6.15.3**
|
|
17
41
|
- [Fix] `parse`: enforce `throwOnLimitExceeded` for cumulative array growth via `combine`/`merge`
|
|
@@ -29,7 +53,7 @@
|
|
|
29
53
|
- [Fix] `stringify`: use configured `delimiter` after `charsetSentinel` (#555)
|
|
30
54
|
- [Fix] `stringify`: apply `formatter` to encoded key under `strictNullHandling` (#554)
|
|
31
55
|
- [Fix] `stringify`: skip null/undefined filter-array entries instead of crashing in `encoder` (#551)
|
|
32
|
-
- [Fix] `parse`: handle nested bracket groups and add regression tests (#530)
|
|
56
|
+
- [Fix] `parse`: handle nested bracket groups and add regression tests (#530); changes output for some unbalanced bracket keys (see #558)
|
|
33
57
|
- [readme] fix grammar (#550)
|
|
34
58
|
- [Dev Deps] update `@ljharb/eslint-config`
|
|
35
59
|
- [Tests] add regression tests for keys containing percent-encoded bracket text
|