@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.
Files changed (32) hide show
  1. package/node_modules/@zuplo/core/package.json +1 -1
  2. package/node_modules/@zuplo/core/zeno.js +5 -4
  3. package/node_modules/@zuplo/graphql/package.json +1 -1
  4. package/node_modules/@zuplo/openapi-tools/package.json +1 -1
  5. package/node_modules/@zuplo/otel/package.json +1 -1
  6. package/node_modules/@zuplo/runtime/out/esm/{chunk-5SHD5VGF.js → chunk-7WJVPTYD.js} +3 -3
  7. package/node_modules/@zuplo/runtime/out/esm/chunk-7WJVPTYD.js.map +1 -0
  8. package/node_modules/@zuplo/runtime/out/esm/index.js +1 -1
  9. package/node_modules/@zuplo/runtime/out/esm/mcp-gateway/index.js +1 -1
  10. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js +1 -1
  11. package/node_modules/@zuplo/runtime/out/esm/mocks/index.js.map +1 -1
  12. package/node_modules/@zuplo/runtime/out/types/index.d.ts +18 -43
  13. package/node_modules/@zuplo/runtime/out/types/internal/index.d.ts +17 -42
  14. package/node_modules/@zuplo/runtime/out/types/mcp/messages/index.d.ts +17 -42
  15. package/node_modules/@zuplo/runtime/out/types/mcp-gateway/index.d.ts +17 -42
  16. package/node_modules/@zuplo/runtime/out/types/mocks/index.d.ts +17 -42
  17. package/node_modules/@zuplo/runtime/out/types/sdks/aws/index.d.ts +17 -42
  18. package/node_modules/@zuplo/runtime/package.json +1 -1
  19. package/node_modules/qs/.github/THREAT_MODEL.md +4 -2
  20. package/node_modules/qs/CHANGELOG.md +38 -14
  21. package/node_modules/qs/README.md +31 -3
  22. package/node_modules/qs/dist/qs.js +20 -20
  23. package/node_modules/qs/lib/parse.js +94 -4
  24. package/node_modules/qs/lib/stringify.js +4 -4
  25. package/node_modules/qs/lib/utils.js +130 -6
  26. package/node_modules/qs/package.json +4 -4
  27. package/node_modules/qs/test/parse.js +174 -0
  28. package/node_modules/qs/test/stringify.js +263 -33
  29. package/node_modules/qs/test/utils.js +184 -0
  30. package/package.json +11 -11
  31. package/node_modules/@zuplo/runtime/out/esm/chunk-5SHD5VGF.js.map +0 -1
  32. /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-5SHD5VGF.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"),setRequestProperties:o(()=>{},"setRequestProperties")},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};
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":"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","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"]}
1
+ {"version":3,"sources":["@zuplo/runtime/mocks/context.ts"],"mappings":"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","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 that will be included in all subsequent log entries for this request.
8641
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
8642
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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.setRequestProperties`.
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 that will be included in all subsequent log entries for this request.
1041
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
1042
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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 that will be included in all subsequent log entries for this request.
969
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
970
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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 that will be included in all subsequent log entries for this request.
1097
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
1098
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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 that will be included in all subsequent log entries for this request.
876
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
877
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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 that will be included in all subsequent log entries for this request.
1253
- * Properties are merged with existing properties and any static fields configured in the logging plugin.
1254
- * Per-request properties take precedence over static fields with the same name.
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
- * @param properties - Key-value pairs to include in log entries. Values must be string, number, or boolean.
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;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@zuplo/runtime",
3
3
  "type": "module",
4
- "version": "7.11.6",
4
+ "version": "7.11.8",
5
5
  "repository": "https://github.com/zuplo/zuplo",
6
6
  "author": "Zuplo, Inc.",
7
7
  "exports": {
@@ -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 a hard cap that rejects oversized untrusted input, opt in to `throwOnLimitExceeded: true` (default `false`), and always bound input size at the transport layer[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
+ | 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
- - [New] `stringify`: add a `depth` option to bound recursion depth (default `Infinity`)
3
- - [Fix] stringify: serialize Date values when a filter is provided
4
- - [Fix] `parse`: enforce `arrayLimit` on comma groups under `[]=` when `throwOnLimitExceeded` is set
5
- - [Fix] `parse`: flatten a collection appended to an overflowed array (#571)
6
- - [Fix] `utils`: `isBuffer`: do not invoke a non-callable `constructor.isBuffer`
7
- - [Fix] `stringify`: do not let `allowEmptyArrays` skip cycle detection (or drop own keys) on an empty array with own properties
8
- - [Fix] `stringify`: encode dots in a top-level key with a primitive value when encodeDotInKeys is set (#562)
9
- - [Docs] threat model: clarify `stringify` deep-nesting DoS is caller-bounded
10
- - [Docs] clarify `arrayLimit` is a representation threshold, not an element-count cap
11
- - [Tests] `parse`: remove a test that pinned `[]=` comma groups escaping `arrayLimit`
12
- - [Tests] `stringify`: pin current `encodeDotInKeys` separator-dot behavior
13
- - [Dev Deps] update `@ljharb/eslint-config`, `eslint`
14
- - [Dev Deps] update `eslint`, `evalmd`
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