@posthog/core 1.46.5 → 1.46.7
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/dist/featureFlagUtils.d.ts +1 -0
- package/dist/featureFlagUtils.d.ts.map +1 -1
- package/dist/featureFlagUtils.js +31 -0
- package/dist/featureFlagUtils.mjs +29 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -0
- package/dist/index.mjs +2 -2
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +45 -18
- package/dist/utils/index.mjs +1 -0
- package/dist/utils/json-utils.d.ts +6 -0
- package/dist/utils/json-utils.d.ts.map +1 -0
- package/dist/utils/json-utils.js +128 -0
- package/dist/utils/json-utils.mjs +94 -0
- package/package.json +2 -2
- package/src/featureFlagUtils.ts +35 -0
- package/src/index.ts +1 -0
- package/src/utils/index.ts +1 -0
- package/src/utils/json-utils.spec.ts +115 -0
- package/src/utils/json-utils.ts +148 -0
|
@@ -42,6 +42,7 @@ export declare const flagDetailsToResults: (flagDetails: Record<string, FeatureF
|
|
|
42
42
|
* The list is the union across client and server SDKs; entries are inert where an
|
|
43
43
|
* SDK never sets them.
|
|
44
44
|
*/
|
|
45
|
+
export declare const MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES: readonly ["utm_source", "utm_medium", "utm_campaign", "utm_content", "utm_term", "gad_source", "mc_cid", "gclid", "gclsrc", "dclid", "gbraid", "wbraid", "fbclid", "msclkid", "twclid", "li_fat_id", "igshid", "ttclid", "rdt_cid", "epik", "qclid", "sccid", "irclid", "_kx"];
|
|
45
46
|
export declare const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES: readonly string[];
|
|
46
47
|
/**
|
|
47
48
|
* Builds the minimal `$feature_flag_called` property set from fully assembled event
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlagUtils.d.ts","sourceRoot":"","sources":["../src/featureFlagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAEhB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAEtB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,sBAAsB,GACjC,eACI,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,GACpD,mBAAmB,CAAC,sBAAsB,EAAE,cAAc,GAAG,qBAAqB,CAAC,KACtF,2BAgCF,CAAA;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAG,oBAAoB,CAAC,cAAc,CAMhH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,KACnC,oBAAoB,CAAC,qBAAqB,CAa5C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,iBAAiB,GAAG,SAAS,KAAG,gBAAgB,GAAG,SAE9F,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,UAAU,GAAG,KAAG,GAU5C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uCAAuC,GAClD,cAAc,sBAAsB,CAAC,cAAc,CAAC,EACpD,qBAAqB,sBAAsB,CAAC,qBAAqB,CAAC,KACjE,2BAaF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,iBAAiB,EAAE,OAAO,gBAAgB,KAAG,iBAMlF,CAAA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED,eAAO,MAAM,oBAAoB,GAAI,aAAa,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAG,iBAAiB,EAWtG,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,oCAAoC,EAAE,SAAS,MAAM,
|
|
1
|
+
{"version":3,"file":"featureFlagUtils.d.ts","sourceRoot":"","sources":["../src/featureFlagUtils.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iBAAiB,EACjB,iBAAiB,EACjB,gBAAgB,EAEhB,oBAAoB,EACpB,sBAAsB,EACtB,sBAAsB,EAEtB,mBAAmB,EACnB,2BAA2B,EAC5B,MAAM,SAAS,CAAA;AAEhB,eAAO,MAAM,sBAAsB,GACjC,eACI,mBAAmB,CAAC,sBAAsB,EAAE,OAAO,CAAC,GACpD,mBAAmB,CAAC,sBAAsB,EAAE,cAAc,GAAG,qBAAqB,CAAC,KACtF,2BAgCF,CAAA;AAqBD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAI,OAAO,oBAAoB,CAAC,OAAO,CAAC,KAAG,oBAAoB,CAAC,cAAc,CAMhH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,GAC/B,OAAO,oBAAoB,CAAC,OAAO,CAAC,KACnC,oBAAoB,CAAC,qBAAqB,CAa5C,CAAA;AAED,eAAO,MAAM,mBAAmB,GAAI,QAAQ,iBAAiB,GAAG,SAAS,KAAG,gBAAgB,GAAG,SAE9F,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,UAAU,GAAG,KAAG,GAU5C,CAAA;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,uCAAuC,GAClD,cAAc,sBAAsB,CAAC,cAAc,CAAC,EACpD,qBAAqB,sBAAsB,CAAC,qBAAqB,CAAC,KACjE,2BAaF,CAAA;AAED,eAAO,MAAM,eAAe,GAAI,MAAM,iBAAiB,EAAE,OAAO,gBAAgB,KAAG,iBAMlF,CAAA;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAEpE;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,gBAAgB,GAAG,MAAM,GAAG,SAAS,CAE/E;AAED,eAAO,MAAM,oBAAoB,GAAI,aAAa,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,KAAG,iBAAiB,EAWtG,CAAA;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,6CAA6C,gRAyBhD,CAAA;AAEV,eAAO,MAAM,oCAAoC,EAAE,SAAS,MAAM,EAmCjE,CAAA;AAED;;;;;;GAMG;AACH,eAAO,MAAM,iCAAiC,GAC5C,YAAY,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC/B,gBAAe,SAAS,MAAM,EAAO,KACpC,MAAM,CAAC,MAAM,EAAE,GAAG,CAUpB,CAAA"}
|
package/dist/featureFlagUtils.js
CHANGED
|
@@ -24,6 +24,7 @@ var __webpack_require__ = {};
|
|
|
24
24
|
var __webpack_exports__ = {};
|
|
25
25
|
__webpack_require__.r(__webpack_exports__);
|
|
26
26
|
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES: ()=>MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
|
|
27
28
|
MINIMAL_FLAG_CALLED_EVENT_PROPERTIES: ()=>MINIMAL_FLAG_CALLED_EVENT_PROPERTIES,
|
|
28
29
|
createFlagsResponseFromFlagsAndPayloads: ()=>createFlagsResponseFromFlagsAndPayloads,
|
|
29
30
|
flagDetailsToResults: ()=>flagDetailsToResults,
|
|
@@ -140,6 +141,32 @@ const flagDetailsToResults = (flagDetails)=>Object.values(flagDetails).map((deta
|
|
|
140
141
|
payload: void 0 !== rawPayload ? parsePayload(rawPayload) : null
|
|
141
142
|
};
|
|
142
143
|
});
|
|
144
|
+
const MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES = [
|
|
145
|
+
'utm_source',
|
|
146
|
+
'utm_medium',
|
|
147
|
+
'utm_campaign',
|
|
148
|
+
'utm_content',
|
|
149
|
+
'utm_term',
|
|
150
|
+
'gad_source',
|
|
151
|
+
'mc_cid',
|
|
152
|
+
'gclid',
|
|
153
|
+
'gclsrc',
|
|
154
|
+
'dclid',
|
|
155
|
+
'gbraid',
|
|
156
|
+
'wbraid',
|
|
157
|
+
'fbclid',
|
|
158
|
+
'msclkid',
|
|
159
|
+
'twclid',
|
|
160
|
+
'li_fat_id',
|
|
161
|
+
'igshid',
|
|
162
|
+
'ttclid',
|
|
163
|
+
'rdt_cid',
|
|
164
|
+
'epik',
|
|
165
|
+
'qclid',
|
|
166
|
+
'sccid',
|
|
167
|
+
'irclid',
|
|
168
|
+
'_kx'
|
|
169
|
+
];
|
|
143
170
|
const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = [
|
|
144
171
|
'$feature_flag',
|
|
145
172
|
'$feature_flag_response',
|
|
@@ -156,6 +183,8 @@ const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = [
|
|
|
156
183
|
'$geoip_disable',
|
|
157
184
|
'$current_url',
|
|
158
185
|
'$pathname',
|
|
186
|
+
'$referring_domain',
|
|
187
|
+
...MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
|
|
159
188
|
'$session_id',
|
|
160
189
|
'$window_id',
|
|
161
190
|
'$lib',
|
|
@@ -172,6 +201,7 @@ const minimizeFlagCalledEventProperties = (properties, transportKeys = [])=>{
|
|
|
172
201
|
transportKeys.forEach(copyKey);
|
|
173
202
|
return minimal;
|
|
174
203
|
};
|
|
204
|
+
exports.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES = __webpack_exports__.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES;
|
|
175
205
|
exports.MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = __webpack_exports__.MINIMAL_FLAG_CALLED_EVENT_PROPERTIES;
|
|
176
206
|
exports.createFlagsResponseFromFlagsAndPayloads = __webpack_exports__.createFlagsResponseFromFlagsAndPayloads;
|
|
177
207
|
exports.flagDetailsToResults = __webpack_exports__.flagDetailsToResults;
|
|
@@ -185,6 +215,7 @@ exports.normalizeFlagsResponse = __webpack_exports__.normalizeFlagsResponse;
|
|
|
185
215
|
exports.parsePayload = __webpack_exports__.parsePayload;
|
|
186
216
|
exports.updateFlagValue = __webpack_exports__.updateFlagValue;
|
|
187
217
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
218
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
188
219
|
"MINIMAL_FLAG_CALLED_EVENT_PROPERTIES",
|
|
189
220
|
"createFlagsResponseFromFlagsAndPayloads",
|
|
190
221
|
"flagDetailsToResults",
|
|
@@ -101,6 +101,32 @@ const flagDetailsToResults = (flagDetails)=>Object.values(flagDetails).map((deta
|
|
|
101
101
|
payload: void 0 !== rawPayload ? parsePayload(rawPayload) : null
|
|
102
102
|
};
|
|
103
103
|
});
|
|
104
|
+
const MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES = [
|
|
105
|
+
'utm_source',
|
|
106
|
+
'utm_medium',
|
|
107
|
+
'utm_campaign',
|
|
108
|
+
'utm_content',
|
|
109
|
+
'utm_term',
|
|
110
|
+
'gad_source',
|
|
111
|
+
'mc_cid',
|
|
112
|
+
'gclid',
|
|
113
|
+
'gclsrc',
|
|
114
|
+
'dclid',
|
|
115
|
+
'gbraid',
|
|
116
|
+
'wbraid',
|
|
117
|
+
'fbclid',
|
|
118
|
+
'msclkid',
|
|
119
|
+
'twclid',
|
|
120
|
+
'li_fat_id',
|
|
121
|
+
'igshid',
|
|
122
|
+
'ttclid',
|
|
123
|
+
'rdt_cid',
|
|
124
|
+
'epik',
|
|
125
|
+
'qclid',
|
|
126
|
+
'sccid',
|
|
127
|
+
'irclid',
|
|
128
|
+
'_kx'
|
|
129
|
+
];
|
|
104
130
|
const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = [
|
|
105
131
|
'$feature_flag',
|
|
106
132
|
'$feature_flag_response',
|
|
@@ -117,6 +143,8 @@ const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES = [
|
|
|
117
143
|
'$geoip_disable',
|
|
118
144
|
'$current_url',
|
|
119
145
|
'$pathname',
|
|
146
|
+
'$referring_domain',
|
|
147
|
+
...MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
|
|
120
148
|
'$session_id',
|
|
121
149
|
'$window_id',
|
|
122
150
|
'$lib',
|
|
@@ -133,4 +161,4 @@ const minimizeFlagCalledEventProperties = (properties, transportKeys = [])=>{
|
|
|
133
161
|
transportKeys.forEach(copyKey);
|
|
134
162
|
return minimal;
|
|
135
163
|
};
|
|
136
|
-
export { MINIMAL_FLAG_CALLED_EVENT_PROPERTIES, createFlagsResponseFromFlagsAndPayloads, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, minimizeFlagCalledEventProperties, normalizeFlagsResponse, parsePayload, updateFlagValue };
|
|
164
|
+
export { MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, MINIMAL_FLAG_CALLED_EVENT_PROPERTIES, createFlagsResponseFromFlagsAndPayloads, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getFlagValuesFromFlags, getPayloadsFromFlags, getVariantFromValue, minimizeFlagCalledEventProperties, normalizeFlagsResponse, parsePayload, updateFlagValue };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { getFeatureFlagValue, getEnabledFromValue, getVariantFromValue, parsePayload, flagDetailsToResults, minimizeFlagCalledEventProperties, } from './featureFlagUtils';
|
|
1
|
+
export { getFeatureFlagValue, getEnabledFromValue, getVariantFromValue, parsePayload, flagDetailsToResults, MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, minimizeFlagCalledEventProperties, } from './featureFlagUtils';
|
|
2
2
|
export { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, } from './gzip';
|
|
3
3
|
export * from './utils';
|
|
4
4
|
export * as ErrorTracking from './error-tracking';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,EACZ,oBAAoB,EACpB,6CAA6C,EAC7C,iCAAiC,GAClC,MAAM,oBAAoB,CAAA;AAC3B,OAAO,EACL,YAAY,EACZ,UAAU,EACV,aAAa,EACb,eAAe,EACf,sBAAsB,EACtB,0BAA0B,GAC3B,MAAM,QAAQ,CAAA;AACf,cAAc,SAAS,CAAA;AACvB,OAAO,KAAK,aAAa,MAAM,kBAAkB,CAAA;AACjD,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,qBAAqB,EACrB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,GACnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAA;AACpC,YAAY,EACV,eAAe,EACf,gBAAgB,EAChB,aAAa,EACb,aAAa,EACb,iBAAiB,EACjB,yBAAyB,GAC1B,MAAM,cAAc,CAAA;AAIrB,YAAY,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAA;AAGzG,YAAY,EAAE,0BAA0B,EAAE,MAAM,gBAAgB,CAAA;AAGhE,YAAY,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAA;AAC1D,OAAO,EACL,cAAc,EACd,uBAAuB,EACvB,8BAA8B,EAC9B,wBAAwB,EACxB,oBAAoB,GACrB,MAAM,WAAW,CAAA;AAClB,YAAY,EACV,WAAW,EACX,oBAAoB,EACpB,4BAA4B,EAC5B,uBAAuB,GACxB,MAAM,WAAW,CAAA;AAElB,YAAY,EACV,oBAAoB,EACpB,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,EACZ,UAAU,EACV,OAAO,EACP,aAAa,GACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAA;AACxC,cAAc,UAAU,CAAA;AACxB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,0BAA0B,CAAA;AACxC,cAAc,mBAAmB,CAAA;AACjC,cAAc,SAAS,CAAA;AACvB,OAAO,EAAE,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA"}
|
package/dist/index.js
CHANGED
|
@@ -89,6 +89,7 @@ var __webpack_exports__ = {};
|
|
|
89
89
|
__webpack_require__.d(__webpack_exports__, {
|
|
90
90
|
DEFAULT_HISTOGRAM_BOUNDS: ()=>_metrics__WEBPACK_IMPORTED_MODULE_6__.DEFAULT_HISTOGRAM_BOUNDS,
|
|
91
91
|
ErrorTracking: ()=>_error_tracking__WEBPACK_IMPORTED_MODULE_3__,
|
|
92
|
+
MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES: ()=>_featureFlagUtils__WEBPACK_IMPORTED_MODULE_0__.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
|
|
92
93
|
PostHogLogs: ()=>_logs__WEBPACK_IMPORTED_MODULE_5__.PostHogLogs,
|
|
93
94
|
PostHogMetrics: ()=>_metrics__WEBPACK_IMPORTED_MODULE_6__.PostHogMetrics,
|
|
94
95
|
buildMetricsResourceAttributes: ()=>_metrics__WEBPACK_IMPORTED_MODULE_6__.buildMetricsResourceAttributes,
|
|
@@ -144,6 +145,7 @@ var __webpack_exports__ = {};
|
|
|
144
145
|
"isGzipRequest",
|
|
145
146
|
"getFeatureFlagValue",
|
|
146
147
|
"getValidationError",
|
|
148
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
147
149
|
"default",
|
|
148
150
|
"resolveMetricsConfig",
|
|
149
151
|
"getRequirementsHint",
|
|
@@ -187,6 +189,7 @@ var __webpack_exports__ = {};
|
|
|
187
189
|
"isGzipRequest",
|
|
188
190
|
"getFeatureFlagValue",
|
|
189
191
|
"getValidationError",
|
|
192
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
190
193
|
"default",
|
|
191
194
|
"resolveMetricsConfig",
|
|
192
195
|
"getRequirementsHint",
|
|
@@ -225,6 +228,7 @@ var __webpack_exports__ = {};
|
|
|
225
228
|
"isGzipRequest",
|
|
226
229
|
"getFeatureFlagValue",
|
|
227
230
|
"getValidationError",
|
|
231
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
228
232
|
"default",
|
|
229
233
|
"resolveMetricsConfig",
|
|
230
234
|
"getRequirementsHint",
|
|
@@ -263,6 +267,7 @@ var __webpack_exports__ = {};
|
|
|
263
267
|
"isGzipRequest",
|
|
264
268
|
"getFeatureFlagValue",
|
|
265
269
|
"getValidationError",
|
|
270
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
266
271
|
"default",
|
|
267
272
|
"resolveMetricsConfig",
|
|
268
273
|
"getRequirementsHint",
|
|
@@ -301,6 +306,7 @@ var __webpack_exports__ = {};
|
|
|
301
306
|
"isGzipRequest",
|
|
302
307
|
"getFeatureFlagValue",
|
|
303
308
|
"getValidationError",
|
|
309
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
304
310
|
"default",
|
|
305
311
|
"resolveMetricsConfig",
|
|
306
312
|
"getRequirementsHint",
|
|
@@ -339,6 +345,7 @@ var __webpack_exports__ = {};
|
|
|
339
345
|
"isGzipRequest",
|
|
340
346
|
"getFeatureFlagValue",
|
|
341
347
|
"getValidationError",
|
|
348
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
342
349
|
"default",
|
|
343
350
|
"resolveMetricsConfig",
|
|
344
351
|
"getRequirementsHint",
|
|
@@ -357,6 +364,7 @@ var __webpack_exports__ = {};
|
|
|
357
364
|
})();
|
|
358
365
|
exports.DEFAULT_HISTOGRAM_BOUNDS = __webpack_exports__.DEFAULT_HISTOGRAM_BOUNDS;
|
|
359
366
|
exports.ErrorTracking = __webpack_exports__.ErrorTracking;
|
|
367
|
+
exports.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES = __webpack_exports__.MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES;
|
|
360
368
|
exports.PostHogLogs = __webpack_exports__.PostHogLogs;
|
|
361
369
|
exports.PostHogMetrics = __webpack_exports__.PostHogMetrics;
|
|
362
370
|
exports.buildMetricsResourceAttributes = __webpack_exports__.buildMetricsResourceAttributes;
|
|
@@ -388,6 +396,7 @@ exports.uuidv7 = __webpack_exports__.uuidv7;
|
|
|
388
396
|
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
389
397
|
"DEFAULT_HISTOGRAM_BOUNDS",
|
|
390
398
|
"ErrorTracking",
|
|
399
|
+
"MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES",
|
|
391
400
|
"PostHogLogs",
|
|
392
401
|
"PostHogMetrics",
|
|
393
402
|
"buildMetricsResourceAttributes",
|
package/dist/index.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getVariantFromValue, minimizeFlagCalledEventProperties, parsePayload } from "./featureFlagUtils.mjs";
|
|
1
|
+
import { MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getVariantFromValue, minimizeFlagCalledEventProperties, parsePayload } from "./featureFlagUtils.mjs";
|
|
2
2
|
import { gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError } from "./gzip.mjs";
|
|
3
3
|
import { buildOtlpLogRecord, buildOtlpLogsPayload, buildResourceAttributes, getOtlpSeverityNumber, getOtlpSeverityText, toOtlpAnyValue, toOtlpKeyValueList } from "./logs/logs-utils.mjs";
|
|
4
4
|
import { PostHogLogs } from "./logs/index.mjs";
|
|
@@ -12,4 +12,4 @@ export * from "./posthog-core-stateless.mjs";
|
|
|
12
12
|
export * from "./tracing-headers.mjs";
|
|
13
13
|
export * from "./types.mjs";
|
|
14
14
|
import * as __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ from "./error-tracking/index.mjs";
|
|
15
|
-
export { DEFAULT_HISTOGRAM_BOUNDS, __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ as ErrorTracking, PostHogLogs, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpLogRecord, buildOtlpLogsPayload, buildOtlpMetricsPayload, buildResourceAttributes, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getLengthFromRules, getOtlpSeverityNumber, getOtlpSeverityText, getRequirementsHint, getValidationError, getVariantFromValue, gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, minimizeFlagCalledEventProperties, parsePayload, resolveMetricsConfig, toOtlpAnyValue, toOtlpKeyValueList, uuidv7 };
|
|
15
|
+
export { DEFAULT_HISTOGRAM_BOUNDS, __WEBPACK_EXTERNAL_MODULE__error_tracking_index_mjs_b3406d6f__ as ErrorTracking, MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES, PostHogLogs, PostHogMetrics, buildMetricsResourceAttributes, buildOtlpLogRecord, buildOtlpLogsPayload, buildOtlpMetricsPayload, buildResourceAttributes, flagDetailsToResults, getEnabledFromValue, getFeatureFlagValue, getLengthFromRules, getOtlpSeverityNumber, getOtlpSeverityText, getRequirementsHint, getValidationError, getVariantFromValue, gzipCompress, isGzipData, isGzipRequest, isGzipSupported, isNativeAsyncGzipError, isNativeAsyncGzipReadError, minimizeFlagCalledEventProperties, parsePayload, resolveMetricsConfig, toOtlpAnyValue, toOtlpKeyValueList, uuidv7 };
|
package/dist/utils/index.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { FetchLike } from '../types';
|
|
|
2
2
|
export * from './bot-detection';
|
|
3
3
|
export * from './browser-utils';
|
|
4
4
|
export * from './bucketed-rate-limiter';
|
|
5
|
+
export * from './json-utils';
|
|
5
6
|
export * from './number-utils';
|
|
6
7
|
export * from './string-utils';
|
|
7
8
|
export * from './type-utils';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,oBAAoB,CAAA;AAElC,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,eAAO,MAAM,UAAU,QAAoE,CAAA;AAE3F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI9D;AASD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxG;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;CACtC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAqB5F;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAOnE;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAoBnB;AAGD,eAAO,MAAM,SAAS,GAAI,KAAK,GAAG,KAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAEtD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,KAEzC,CAAA;AAED,wBAAgB,QAAQ,IAAI,SAAS,GAAG,SAAS,CAEhD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAC1C,OAAO,CAAC,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,EAAE,CAAC,CAStF"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAA;AAEpC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,yBAAyB,CAAA;AACvC,cAAc,cAAc,CAAA;AAC5B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,UAAU,CAAA;AACxB,cAAc,oBAAoB,CAAA;AAElC,eAAO,MAAM,aAAa,SAAS,CAAA;AAEnC,eAAO,MAAM,UAAU,QAAoE,CAAA;AAE3F,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAE3D;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,MAAM,GAAG,MAAM,CAE9E;AAED,wBAAgB,MAAM,CAAC,WAAW,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAI9D;AASD,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEvD;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,MAAM,GAAG,SAAS,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,MAAM,GAAG,MAAM,GAAG,SAAS,CAMxG;AAED,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,MAAM,CAAA;IAClB,UAAU,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,OAAO,CAAA;CACtC;AAED,wBAAsB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,gBAAgB,GAAG,OAAO,CAAC,CAAC,CAAC,CAqB5F;AAED,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,CAOnE;AAED,wBAAsB,eAAe,CAAC,CAAC,EACrC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EACnB,SAAS,EAAE,MAAM,EACjB,SAAS,CAAC,EAAE,MAAM,IAAI,GACrB,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,CAoBnB;AAGD,eAAO,MAAM,SAAS,GAAI,KAAK,GAAG,KAAG,GAAG,IAAI,OAAO,CAAC,GAAG,CAEtD,CAAA;AAED,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,KAEzC,CAAA;AAED,wBAAgB,QAAQ,IAAI,SAAS,GAAG,SAAS,CAEhD;AAED,wBAAgB,UAAU,CAAC,CAAC,EAC1B,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,EAAE,GAC1C,OAAO,CAAC,CAAC;IAAE,MAAM,EAAE,WAAW,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,GAAG,CAAA;CAAE,CAAC,EAAE,CAAC,CAStF"}
|
package/dist/utils/index.js
CHANGED
|
@@ -9,6 +9,9 @@ var __webpack_modules__ = {
|
|
|
9
9
|
"./bucketed-rate-limiter": function(module) {
|
|
10
10
|
module.exports = require("./bucketed-rate-limiter.js");
|
|
11
11
|
},
|
|
12
|
+
"./json-utils": function(module) {
|
|
13
|
+
module.exports = require("./json-utils.js");
|
|
14
|
+
},
|
|
12
15
|
"./logger": function(module) {
|
|
13
16
|
module.exports = require("./logger.js");
|
|
14
17
|
},
|
|
@@ -161,9 +164,33 @@ var __webpack_exports__ = {};
|
|
|
161
164
|
return _bucketed_rate_limiter__WEBPACK_IMPORTED_MODULE_2__[key];
|
|
162
165
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
163
166
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
164
|
-
var
|
|
167
|
+
var _json_utils__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__("./json-utils");
|
|
168
|
+
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
169
|
+
for(var __WEBPACK_IMPORT_KEY__ in _json_utils__WEBPACK_IMPORTED_MODULE_3__)if ([
|
|
170
|
+
"removeTrailingSlash",
|
|
171
|
+
"isValidUUID",
|
|
172
|
+
"currentISOTime",
|
|
173
|
+
"isError",
|
|
174
|
+
"safeSetTimeout",
|
|
175
|
+
"UUID_REGEX",
|
|
176
|
+
"assert",
|
|
177
|
+
"allSettled",
|
|
178
|
+
"retriable",
|
|
179
|
+
"default",
|
|
180
|
+
"stripUrlHash",
|
|
181
|
+
"STRING_FORMAT",
|
|
182
|
+
"currentTimestamp",
|
|
183
|
+
"raceWithTimeout",
|
|
184
|
+
"getFetch",
|
|
185
|
+
"getEventUuid",
|
|
186
|
+
"isPromise"
|
|
187
|
+
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
188
|
+
return _json_utils__WEBPACK_IMPORTED_MODULE_3__[key];
|
|
189
|
+
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
190
|
+
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
191
|
+
var _number_utils__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__("./number-utils");
|
|
165
192
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
166
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
193
|
+
for(var __WEBPACK_IMPORT_KEY__ in _number_utils__WEBPACK_IMPORTED_MODULE_4__)if ([
|
|
167
194
|
"removeTrailingSlash",
|
|
168
195
|
"isValidUUID",
|
|
169
196
|
"currentISOTime",
|
|
@@ -182,12 +209,12 @@ var __webpack_exports__ = {};
|
|
|
182
209
|
"getEventUuid",
|
|
183
210
|
"isPromise"
|
|
184
211
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
185
|
-
return
|
|
212
|
+
return _number_utils__WEBPACK_IMPORTED_MODULE_4__[key];
|
|
186
213
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
187
214
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
188
|
-
var
|
|
215
|
+
var _string_utils__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__("./string-utils");
|
|
189
216
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
190
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
217
|
+
for(var __WEBPACK_IMPORT_KEY__ in _string_utils__WEBPACK_IMPORTED_MODULE_5__)if ([
|
|
191
218
|
"removeTrailingSlash",
|
|
192
219
|
"isValidUUID",
|
|
193
220
|
"currentISOTime",
|
|
@@ -206,12 +233,12 @@ var __webpack_exports__ = {};
|
|
|
206
233
|
"getEventUuid",
|
|
207
234
|
"isPromise"
|
|
208
235
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
209
|
-
return
|
|
236
|
+
return _string_utils__WEBPACK_IMPORTED_MODULE_5__[key];
|
|
210
237
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
211
238
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
212
|
-
var
|
|
239
|
+
var _type_utils__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__("./type-utils");
|
|
213
240
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
214
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
241
|
+
for(var __WEBPACK_IMPORT_KEY__ in _type_utils__WEBPACK_IMPORTED_MODULE_6__)if ([
|
|
215
242
|
"removeTrailingSlash",
|
|
216
243
|
"isValidUUID",
|
|
217
244
|
"currentISOTime",
|
|
@@ -230,12 +257,12 @@ var __webpack_exports__ = {};
|
|
|
230
257
|
"getEventUuid",
|
|
231
258
|
"isPromise"
|
|
232
259
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
233
|
-
return
|
|
260
|
+
return _type_utils__WEBPACK_IMPORTED_MODULE_6__[key];
|
|
234
261
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
235
262
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
236
|
-
var
|
|
263
|
+
var _promise_queue__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__("./promise-queue");
|
|
237
264
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
238
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
265
|
+
for(var __WEBPACK_IMPORT_KEY__ in _promise_queue__WEBPACK_IMPORTED_MODULE_7__)if ([
|
|
239
266
|
"removeTrailingSlash",
|
|
240
267
|
"isValidUUID",
|
|
241
268
|
"currentISOTime",
|
|
@@ -254,12 +281,12 @@ var __webpack_exports__ = {};
|
|
|
254
281
|
"getEventUuid",
|
|
255
282
|
"isPromise"
|
|
256
283
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
257
|
-
return
|
|
284
|
+
return _promise_queue__WEBPACK_IMPORTED_MODULE_7__[key];
|
|
258
285
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
259
286
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
260
|
-
var
|
|
287
|
+
var _logger__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__("./logger");
|
|
261
288
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
262
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
289
|
+
for(var __WEBPACK_IMPORT_KEY__ in _logger__WEBPACK_IMPORTED_MODULE_8__)if ([
|
|
263
290
|
"removeTrailingSlash",
|
|
264
291
|
"isValidUUID",
|
|
265
292
|
"currentISOTime",
|
|
@@ -278,12 +305,12 @@ var __webpack_exports__ = {};
|
|
|
278
305
|
"getEventUuid",
|
|
279
306
|
"isPromise"
|
|
280
307
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
281
|
-
return
|
|
308
|
+
return _logger__WEBPACK_IMPORTED_MODULE_8__[key];
|
|
282
309
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
283
310
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
284
|
-
var
|
|
311
|
+
var _user_agent_utils__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__("./user-agent-utils");
|
|
285
312
|
var __WEBPACK_REEXPORT_OBJECT__ = {};
|
|
286
|
-
for(var __WEBPACK_IMPORT_KEY__ in
|
|
313
|
+
for(var __WEBPACK_IMPORT_KEY__ in _user_agent_utils__WEBPACK_IMPORTED_MODULE_9__)if ([
|
|
287
314
|
"removeTrailingSlash",
|
|
288
315
|
"isValidUUID",
|
|
289
316
|
"currentISOTime",
|
|
@@ -302,7 +329,7 @@ var __webpack_exports__ = {};
|
|
|
302
329
|
"getEventUuid",
|
|
303
330
|
"isPromise"
|
|
304
331
|
].indexOf(__WEBPACK_IMPORT_KEY__) < 0) __WEBPACK_REEXPORT_OBJECT__[__WEBPACK_IMPORT_KEY__] = (function(key) {
|
|
305
|
-
return
|
|
332
|
+
return _user_agent_utils__WEBPACK_IMPORTED_MODULE_9__[key];
|
|
306
333
|
}).bind(0, __WEBPACK_IMPORT_KEY__);
|
|
307
334
|
__webpack_require__.d(__webpack_exports__, __WEBPACK_REEXPORT_OBJECT__);
|
|
308
335
|
const STRING_FORMAT = 'utf8';
|
package/dist/utils/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export * from "./bot-detection.mjs";
|
|
2
2
|
export * from "./browser-utils.mjs";
|
|
3
3
|
export * from "./bucketed-rate-limiter.mjs";
|
|
4
|
+
export * from "./json-utils.mjs";
|
|
4
5
|
export * from "./number-utils.mjs";
|
|
5
6
|
export * from "./string-utils.mjs";
|
|
6
7
|
export * from "./type-utils.mjs";
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Converts an arbitrary value, sanitizing `toJSON` results when available.
|
|
3
|
+
* The limits keep pathological values from causing unbounded recursion or traversal.
|
|
4
|
+
*/
|
|
5
|
+
export declare function toJsonSafeValue(value: unknown): unknown;
|
|
6
|
+
//# sourceMappingURL=json-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-utils.d.ts","sourceRoot":"","sources":["../../src/utils/json-utils.ts"],"names":[],"mappings":"AAoCA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CA2GvD"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __webpack_require__ = {};
|
|
3
|
+
(()=>{
|
|
4
|
+
__webpack_require__.d = (exports1, definition)=>{
|
|
5
|
+
for(var key in definition)if (__webpack_require__.o(definition, key) && !__webpack_require__.o(exports1, key)) Object.defineProperty(exports1, key, {
|
|
6
|
+
enumerable: true,
|
|
7
|
+
get: definition[key]
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
})();
|
|
11
|
+
(()=>{
|
|
12
|
+
__webpack_require__.o = (obj, prop)=>Object.prototype.hasOwnProperty.call(obj, prop);
|
|
13
|
+
})();
|
|
14
|
+
(()=>{
|
|
15
|
+
__webpack_require__.r = (exports1)=>{
|
|
16
|
+
if ('undefined' != typeof Symbol && Symbol.toStringTag) Object.defineProperty(exports1, Symbol.toStringTag, {
|
|
17
|
+
value: 'Module'
|
|
18
|
+
});
|
|
19
|
+
Object.defineProperty(exports1, '__esModule', {
|
|
20
|
+
value: true
|
|
21
|
+
});
|
|
22
|
+
};
|
|
23
|
+
})();
|
|
24
|
+
var __webpack_exports__ = {};
|
|
25
|
+
__webpack_require__.r(__webpack_exports__);
|
|
26
|
+
__webpack_require__.d(__webpack_exports__, {
|
|
27
|
+
toJsonSafeValue: ()=>toJsonSafeValue
|
|
28
|
+
});
|
|
29
|
+
const MAX_JSON_SAFE_VALUE_DEPTH = 20;
|
|
30
|
+
const MAX_JSON_SAFE_VALUE_ITEMS = 1000;
|
|
31
|
+
const MAX_JSON_SAFE_VALUE_NODES = 10000;
|
|
32
|
+
const CIRCULAR_VALUE = '[Circular]';
|
|
33
|
+
const TRUNCATED_VALUE = '[Truncated]';
|
|
34
|
+
const UNSERIALIZABLE_VALUE = '[Unserializable]';
|
|
35
|
+
const FUNCTION_VALUE = '[Function]';
|
|
36
|
+
const dateGetTime = Date.prototype.getTime;
|
|
37
|
+
const dateToISOString = Date.prototype.toISOString;
|
|
38
|
+
const propertyIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
39
|
+
function sanitizeString(value) {
|
|
40
|
+
let output = '';
|
|
41
|
+
for(let index = 0; index < value.length; index++){
|
|
42
|
+
const codeUnit = value.charCodeAt(index);
|
|
43
|
+
if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
|
|
44
|
+
const nextCodeUnit = value.charCodeAt(index + 1);
|
|
45
|
+
if (nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff) {
|
|
46
|
+
output += value[index] + value[index + 1];
|
|
47
|
+
index++;
|
|
48
|
+
} else output += '\ufffd';
|
|
49
|
+
} else output += codeUnit >= 0xdc00 && codeUnit <= 0xdfff ? '\ufffd' : value[index];
|
|
50
|
+
}
|
|
51
|
+
return output;
|
|
52
|
+
}
|
|
53
|
+
function toJsonSafeValue(value) {
|
|
54
|
+
const state = {
|
|
55
|
+
ancestors: new WeakSet(),
|
|
56
|
+
remainingNodes: MAX_JSON_SAFE_VALUE_NODES
|
|
57
|
+
};
|
|
58
|
+
const convert = (current, depth)=>{
|
|
59
|
+
if (state.remainingNodes <= 0) return TRUNCATED_VALUE;
|
|
60
|
+
state.remainingNodes--;
|
|
61
|
+
try {
|
|
62
|
+
if (null == current || 'boolean' == typeof current) return current;
|
|
63
|
+
if ('string' == typeof current) return sanitizeString(current);
|
|
64
|
+
if ('number' == typeof current) return Number.isFinite(current) ? current : null;
|
|
65
|
+
if ('bigint' == typeof current) return current.toString();
|
|
66
|
+
if ('function' == typeof current) return FUNCTION_VALUE;
|
|
67
|
+
if ('symbol' == typeof current) return current.description ? `Symbol(${current.description})` : 'Symbol()';
|
|
68
|
+
if (depth >= MAX_JSON_SAFE_VALUE_DEPTH) return TRUNCATED_VALUE;
|
|
69
|
+
if (state.ancestors.has(current)) return CIRCULAR_VALUE;
|
|
70
|
+
state.ancestors.add(current);
|
|
71
|
+
try {
|
|
72
|
+
if (current instanceof Date) return Number.isFinite(dateGetTime.call(current)) ? dateToISOString.call(current) : null;
|
|
73
|
+
let hasToJSONResult = false;
|
|
74
|
+
let toJSONResult;
|
|
75
|
+
try {
|
|
76
|
+
const toJSON = current.toJSON;
|
|
77
|
+
if ('function' == typeof toJSON) {
|
|
78
|
+
toJSONResult = toJSON.call(current);
|
|
79
|
+
hasToJSONResult = true;
|
|
80
|
+
}
|
|
81
|
+
} catch {
|
|
82
|
+
hasToJSONResult = false;
|
|
83
|
+
}
|
|
84
|
+
if (hasToJSONResult) return convert(toJSONResult, depth + 1);
|
|
85
|
+
if (Array.isArray(current)) {
|
|
86
|
+
const itemCount = Math.min(current.length, MAX_JSON_SAFE_VALUE_ITEMS);
|
|
87
|
+
const output = [];
|
|
88
|
+
let index = 0;
|
|
89
|
+
for(; index < itemCount && state.remainingNodes > 0; index++)output.push(convert(current[index], depth + 1));
|
|
90
|
+
if (current.length > index) output.push(TRUNCATED_VALUE);
|
|
91
|
+
return output;
|
|
92
|
+
}
|
|
93
|
+
const output = {};
|
|
94
|
+
let itemCount = 0;
|
|
95
|
+
let truncated = false;
|
|
96
|
+
for(const key in current){
|
|
97
|
+
if (!propertyIsEnumerable.call(current, key)) break;
|
|
98
|
+
if (itemCount >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
|
|
99
|
+
truncated = true;
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
const converted = convert(current[key], depth + 1);
|
|
103
|
+
Object.defineProperty(output, key, {
|
|
104
|
+
value: converted,
|
|
105
|
+
enumerable: true,
|
|
106
|
+
configurable: true,
|
|
107
|
+
writable: true
|
|
108
|
+
});
|
|
109
|
+
itemCount++;
|
|
110
|
+
}
|
|
111
|
+
if (truncated) output[TRUNCATED_VALUE] = 'Additional properties omitted';
|
|
112
|
+
return output;
|
|
113
|
+
} finally{
|
|
114
|
+
state.ancestors.delete(current);
|
|
115
|
+
}
|
|
116
|
+
} catch {
|
|
117
|
+
return UNSERIALIZABLE_VALUE;
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
return convert(value, 0);
|
|
121
|
+
}
|
|
122
|
+
exports.toJsonSafeValue = __webpack_exports__.toJsonSafeValue;
|
|
123
|
+
for(var __webpack_i__ in __webpack_exports__)if (-1 === [
|
|
124
|
+
"toJsonSafeValue"
|
|
125
|
+
].indexOf(__webpack_i__)) exports[__webpack_i__] = __webpack_exports__[__webpack_i__];
|
|
126
|
+
Object.defineProperty(exports, '__esModule', {
|
|
127
|
+
value: true
|
|
128
|
+
});
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
const MAX_JSON_SAFE_VALUE_DEPTH = 20;
|
|
2
|
+
const MAX_JSON_SAFE_VALUE_ITEMS = 1000;
|
|
3
|
+
const MAX_JSON_SAFE_VALUE_NODES = 10000;
|
|
4
|
+
const CIRCULAR_VALUE = '[Circular]';
|
|
5
|
+
const TRUNCATED_VALUE = '[Truncated]';
|
|
6
|
+
const UNSERIALIZABLE_VALUE = '[Unserializable]';
|
|
7
|
+
const FUNCTION_VALUE = '[Function]';
|
|
8
|
+
const dateGetTime = Date.prototype.getTime;
|
|
9
|
+
const dateToISOString = Date.prototype.toISOString;
|
|
10
|
+
const propertyIsEnumerable = Object.prototype.propertyIsEnumerable;
|
|
11
|
+
function sanitizeString(value) {
|
|
12
|
+
let output = '';
|
|
13
|
+
for(let index = 0; index < value.length; index++){
|
|
14
|
+
const codeUnit = value.charCodeAt(index);
|
|
15
|
+
if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
|
|
16
|
+
const nextCodeUnit = value.charCodeAt(index + 1);
|
|
17
|
+
if (nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff) {
|
|
18
|
+
output += value[index] + value[index + 1];
|
|
19
|
+
index++;
|
|
20
|
+
} else output += '\ufffd';
|
|
21
|
+
} else output += codeUnit >= 0xdc00 && codeUnit <= 0xdfff ? '\ufffd' : value[index];
|
|
22
|
+
}
|
|
23
|
+
return output;
|
|
24
|
+
}
|
|
25
|
+
function toJsonSafeValue(value) {
|
|
26
|
+
const state = {
|
|
27
|
+
ancestors: new WeakSet(),
|
|
28
|
+
remainingNodes: MAX_JSON_SAFE_VALUE_NODES
|
|
29
|
+
};
|
|
30
|
+
const convert = (current, depth)=>{
|
|
31
|
+
if (state.remainingNodes <= 0) return TRUNCATED_VALUE;
|
|
32
|
+
state.remainingNodes--;
|
|
33
|
+
try {
|
|
34
|
+
if (null == current || 'boolean' == typeof current) return current;
|
|
35
|
+
if ('string' == typeof current) return sanitizeString(current);
|
|
36
|
+
if ('number' == typeof current) return Number.isFinite(current) ? current : null;
|
|
37
|
+
if ('bigint' == typeof current) return current.toString();
|
|
38
|
+
if ('function' == typeof current) return FUNCTION_VALUE;
|
|
39
|
+
if ('symbol' == typeof current) return current.description ? `Symbol(${current.description})` : 'Symbol()';
|
|
40
|
+
if (depth >= MAX_JSON_SAFE_VALUE_DEPTH) return TRUNCATED_VALUE;
|
|
41
|
+
if (state.ancestors.has(current)) return CIRCULAR_VALUE;
|
|
42
|
+
state.ancestors.add(current);
|
|
43
|
+
try {
|
|
44
|
+
if (current instanceof Date) return Number.isFinite(dateGetTime.call(current)) ? dateToISOString.call(current) : null;
|
|
45
|
+
let hasToJSONResult = false;
|
|
46
|
+
let toJSONResult;
|
|
47
|
+
try {
|
|
48
|
+
const toJSON = current.toJSON;
|
|
49
|
+
if ('function' == typeof toJSON) {
|
|
50
|
+
toJSONResult = toJSON.call(current);
|
|
51
|
+
hasToJSONResult = true;
|
|
52
|
+
}
|
|
53
|
+
} catch {
|
|
54
|
+
hasToJSONResult = false;
|
|
55
|
+
}
|
|
56
|
+
if (hasToJSONResult) return convert(toJSONResult, depth + 1);
|
|
57
|
+
if (Array.isArray(current)) {
|
|
58
|
+
const itemCount = Math.min(current.length, MAX_JSON_SAFE_VALUE_ITEMS);
|
|
59
|
+
const output = [];
|
|
60
|
+
let index = 0;
|
|
61
|
+
for(; index < itemCount && state.remainingNodes > 0; index++)output.push(convert(current[index], depth + 1));
|
|
62
|
+
if (current.length > index) output.push(TRUNCATED_VALUE);
|
|
63
|
+
return output;
|
|
64
|
+
}
|
|
65
|
+
const output = {};
|
|
66
|
+
let itemCount = 0;
|
|
67
|
+
let truncated = false;
|
|
68
|
+
for(const key in current){
|
|
69
|
+
if (!propertyIsEnumerable.call(current, key)) break;
|
|
70
|
+
if (itemCount >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
|
|
71
|
+
truncated = true;
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
const converted = convert(current[key], depth + 1);
|
|
75
|
+
Object.defineProperty(output, key, {
|
|
76
|
+
value: converted,
|
|
77
|
+
enumerable: true,
|
|
78
|
+
configurable: true,
|
|
79
|
+
writable: true
|
|
80
|
+
});
|
|
81
|
+
itemCount++;
|
|
82
|
+
}
|
|
83
|
+
if (truncated) output[TRUNCATED_VALUE] = 'Additional properties omitted';
|
|
84
|
+
return output;
|
|
85
|
+
} finally{
|
|
86
|
+
state.ancestors.delete(current);
|
|
87
|
+
}
|
|
88
|
+
} catch {
|
|
89
|
+
return UNSERIALIZABLE_VALUE;
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return convert(value, 0);
|
|
93
|
+
}
|
|
94
|
+
export { toJsonSafeValue };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@posthog/core",
|
|
3
|
-
"version": "1.46.
|
|
3
|
+
"version": "1.46.7",
|
|
4
4
|
"bugs": {
|
|
5
5
|
"url": "https://github.com/PostHog/posthog-js/issues"
|
|
6
6
|
},
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
}
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@posthog/types": "^1.
|
|
73
|
+
"@posthog/types": "^1.401.0"
|
|
74
74
|
},
|
|
75
75
|
"devDependencies": {
|
|
76
76
|
"@rslib/core": "0.10.6",
|
package/src/featureFlagUtils.ts
CHANGED
|
@@ -189,6 +189,33 @@ export const flagDetailsToResults = (flagDetails: Record<string, FeatureFlagDeta
|
|
|
189
189
|
* The list is the union across client and server SDKs; entries are inert where an
|
|
190
190
|
* SDK never sets them.
|
|
191
191
|
*/
|
|
192
|
+
export const MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES = [
|
|
193
|
+
'utm_source',
|
|
194
|
+
'utm_medium',
|
|
195
|
+
'utm_campaign',
|
|
196
|
+
'utm_content',
|
|
197
|
+
'utm_term',
|
|
198
|
+
'gad_source',
|
|
199
|
+
'mc_cid',
|
|
200
|
+
'gclid',
|
|
201
|
+
'gclsrc',
|
|
202
|
+
'dclid',
|
|
203
|
+
'gbraid',
|
|
204
|
+
'wbraid',
|
|
205
|
+
'fbclid',
|
|
206
|
+
'msclkid',
|
|
207
|
+
'twclid',
|
|
208
|
+
'li_fat_id',
|
|
209
|
+
'igshid',
|
|
210
|
+
'ttclid',
|
|
211
|
+
'rdt_cid',
|
|
212
|
+
'epik',
|
|
213
|
+
'qclid',
|
|
214
|
+
'sccid',
|
|
215
|
+
'irclid',
|
|
216
|
+
'_kx',
|
|
217
|
+
] as const
|
|
218
|
+
|
|
192
219
|
export const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES: readonly string[] = [
|
|
193
220
|
// Flag identity
|
|
194
221
|
'$feature_flag',
|
|
@@ -209,6 +236,14 @@ export const MINIMAL_FLAG_CALLED_EVENT_PROPERTIES: readonly string[] = [
|
|
|
209
236
|
// Debug location
|
|
210
237
|
'$current_url',
|
|
211
238
|
'$pathname',
|
|
239
|
+
// Session-level attribution. The server session table derives session-initial UTM
|
|
240
|
+
// and channel type from whichever event lands first in a session, so these keys must
|
|
241
|
+
// survive minimization. The full `$referrer` URL is intentionally excluded.
|
|
242
|
+
'$referring_domain',
|
|
243
|
+
// Campaign params are stored as super properties under their bare names (no `$`
|
|
244
|
+
// prefix). This list is kept in sync with the browser SDK's canonical `CAMPAIGN_PARAMS`
|
|
245
|
+
// by an exhaustive browser regression test. Entries are inert on SDKs that never set them.
|
|
246
|
+
...MINIMAL_FLAG_CALLED_EVENT_CAMPAIGN_PROPERTIES,
|
|
212
247
|
// Linkage / SDK identity
|
|
213
248
|
'$session_id',
|
|
214
249
|
'$window_id',
|
package/src/index.ts
CHANGED
package/src/utils/index.ts
CHANGED
|
@@ -3,6 +3,7 @@ import { FetchLike } from '../types'
|
|
|
3
3
|
export * from './bot-detection'
|
|
4
4
|
export * from './browser-utils'
|
|
5
5
|
export * from './bucketed-rate-limiter'
|
|
6
|
+
export * from './json-utils'
|
|
6
7
|
export * from './number-utils'
|
|
7
8
|
export * from './string-utils'
|
|
8
9
|
export * from './type-utils'
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import { toJsonSafeValue } from './json-utils'
|
|
2
|
+
|
|
3
|
+
describe('toJsonSafeValue', () => {
|
|
4
|
+
it('converts circular and unsupported values while preserving shared references', () => {
|
|
5
|
+
const shared = { id: 1 }
|
|
6
|
+
const value: Record<string, unknown> = {
|
|
7
|
+
count: BigInt(42),
|
|
8
|
+
callback: () => undefined,
|
|
9
|
+
symbol: Symbol('test'),
|
|
10
|
+
invalidNumber: Number.NaN,
|
|
11
|
+
loneSurrogate: '\ud800',
|
|
12
|
+
validSurrogatePair: '😀',
|
|
13
|
+
first: shared,
|
|
14
|
+
second: shared,
|
|
15
|
+
}
|
|
16
|
+
value.self = value
|
|
17
|
+
|
|
18
|
+
expect(toJsonSafeValue(value)).toEqual({
|
|
19
|
+
count: '42',
|
|
20
|
+
callback: '[Function]',
|
|
21
|
+
symbol: 'Symbol(test)',
|
|
22
|
+
invalidNumber: null,
|
|
23
|
+
loneSurrogate: '�',
|
|
24
|
+
validSurrogatePair: '😀',
|
|
25
|
+
first: { id: 1 },
|
|
26
|
+
second: { id: 1 },
|
|
27
|
+
self: '[Circular]',
|
|
28
|
+
})
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
it('sanitizes toJSON results and falls back when toJSON throws', () => {
|
|
32
|
+
const serializableToJSON = jest.fn(() => ({ count: BigInt(2) }))
|
|
33
|
+
const serializable = Object.create({ toJSON: serializableToJSON })
|
|
34
|
+
const throwingToJSON = jest.fn(() => {
|
|
35
|
+
throw new Error('cannot serialize')
|
|
36
|
+
})
|
|
37
|
+
const selfReturningValue: { toJSON: () => unknown } = {
|
|
38
|
+
toJSON: () => selfReturningValue,
|
|
39
|
+
}
|
|
40
|
+
const getTimeOverride = jest.fn(() => 0)
|
|
41
|
+
const toISOStringOverride = jest.fn(() => BigInt(2))
|
|
42
|
+
const date = new Date('2025-01-02T03:04:05.000Z')
|
|
43
|
+
Object.defineProperties(date, {
|
|
44
|
+
getTime: { value: getTimeOverride },
|
|
45
|
+
toISOString: { value: toISOStringOverride },
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
expect(
|
|
49
|
+
toJsonSafeValue({
|
|
50
|
+
serializable,
|
|
51
|
+
throwing: { value: 'kept', toJSON: throwingToJSON },
|
|
52
|
+
selfReturningValue,
|
|
53
|
+
date,
|
|
54
|
+
})
|
|
55
|
+
).toEqual({
|
|
56
|
+
serializable: { count: '2' },
|
|
57
|
+
throwing: { value: 'kept', toJSON: '[Function]' },
|
|
58
|
+
selfReturningValue: '[Circular]',
|
|
59
|
+
date: '2025-01-02T03:04:05.000Z',
|
|
60
|
+
})
|
|
61
|
+
expect(serializableToJSON).toHaveBeenCalledTimes(1)
|
|
62
|
+
expect(throwingToJSON).toHaveBeenCalledTimes(1)
|
|
63
|
+
expect(getTimeOverride).not.toHaveBeenCalled()
|
|
64
|
+
expect(toISOStringOverride).not.toHaveBeenCalled()
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('stops before traversing inherited enumerable properties', () => {
|
|
68
|
+
const prototype = Object.fromEntries(Array.from({ length: 2_000 }, (_, index) => [`key-${index}`, index]))
|
|
69
|
+
const target = Object.assign(Object.create(prototype), { own: 'kept' })
|
|
70
|
+
const getOwnPropertyDescriptor = jest.fn((object: object, key: string | symbol) =>
|
|
71
|
+
Object.getOwnPropertyDescriptor(object, key)
|
|
72
|
+
)
|
|
73
|
+
const value = new Proxy(target, { getOwnPropertyDescriptor })
|
|
74
|
+
|
|
75
|
+
expect(toJsonSafeValue(value)).toEqual({ own: 'kept' })
|
|
76
|
+
expect(getOwnPropertyDescriptor.mock.calls.length).toBeLessThan(10)
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('returns a fallback for values that throw during traversal', () => {
|
|
80
|
+
const value = new Proxy(
|
|
81
|
+
{},
|
|
82
|
+
{
|
|
83
|
+
ownKeys() {
|
|
84
|
+
throw new Error('cannot inspect')
|
|
85
|
+
},
|
|
86
|
+
}
|
|
87
|
+
)
|
|
88
|
+
|
|
89
|
+
expect(toJsonSafeValue(value)).toBe('[Unserializable]')
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it('bounds deeply nested, oversized, and node-heavy values', () => {
|
|
93
|
+
const deepValue: Record<string, unknown> = {}
|
|
94
|
+
let cursor = deepValue
|
|
95
|
+
for (let depth = 0; depth < 100; depth++) {
|
|
96
|
+
const child: Record<string, unknown> = {}
|
|
97
|
+
cursor.child = child
|
|
98
|
+
cursor = child
|
|
99
|
+
}
|
|
100
|
+
const oversizedArray = Array.from({ length: 2_000 }, (_, index) => index)
|
|
101
|
+
const oversizedObject = Object.fromEntries(Array.from({ length: 2_000 }, (_, index) => [`key-${index}`, index]))
|
|
102
|
+
const nodeHeavyValue = Array.from({ length: 1_000 }, () => Array.from({ length: 20 }, () => true))
|
|
103
|
+
|
|
104
|
+
expect(JSON.stringify(toJsonSafeValue(deepValue))).toContain('[Truncated]')
|
|
105
|
+
expect(toJsonSafeValue(oversizedArray)).toEqual([...oversizedArray.slice(0, 1_000), '[Truncated]'])
|
|
106
|
+
|
|
107
|
+
const safeObject = toJsonSafeValue(oversizedObject) as Record<string, unknown>
|
|
108
|
+
expect(Object.keys(safeObject)).toHaveLength(1_001)
|
|
109
|
+
expect(safeObject['[Truncated]']).toBe('Additional properties omitted')
|
|
110
|
+
|
|
111
|
+
const safeNodeHeavyValue = toJsonSafeValue(nodeHeavyValue) as unknown[]
|
|
112
|
+
expect(safeNodeHeavyValue).toHaveLength(478)
|
|
113
|
+
expect(safeNodeHeavyValue.at(-1)).toBe('[Truncated]')
|
|
114
|
+
})
|
|
115
|
+
})
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
const MAX_JSON_SAFE_VALUE_DEPTH = 20
|
|
2
|
+
const MAX_JSON_SAFE_VALUE_ITEMS = 1_000
|
|
3
|
+
const MAX_JSON_SAFE_VALUE_NODES = 10_000
|
|
4
|
+
const CIRCULAR_VALUE = '[Circular]'
|
|
5
|
+
const TRUNCATED_VALUE = '[Truncated]'
|
|
6
|
+
const UNSERIALIZABLE_VALUE = '[Unserializable]'
|
|
7
|
+
const FUNCTION_VALUE = '[Function]'
|
|
8
|
+
|
|
9
|
+
const dateGetTime = Date.prototype.getTime
|
|
10
|
+
const dateToISOString = Date.prototype.toISOString
|
|
11
|
+
const propertyIsEnumerable = Object.prototype.propertyIsEnumerable
|
|
12
|
+
|
|
13
|
+
interface JsonSafeValueConversionState {
|
|
14
|
+
ancestors: WeakSet<object>
|
|
15
|
+
remainingNodes: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function sanitizeString(value: string): string {
|
|
19
|
+
let output = ''
|
|
20
|
+
for (let index = 0; index < value.length; index++) {
|
|
21
|
+
const codeUnit = value.charCodeAt(index)
|
|
22
|
+
if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
|
|
23
|
+
const nextCodeUnit = value.charCodeAt(index + 1)
|
|
24
|
+
if (nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff) {
|
|
25
|
+
output += value[index] + value[index + 1]
|
|
26
|
+
index++
|
|
27
|
+
} else {
|
|
28
|
+
output += '\ufffd'
|
|
29
|
+
}
|
|
30
|
+
} else {
|
|
31
|
+
output += codeUnit >= 0xdc00 && codeUnit <= 0xdfff ? '\ufffd' : value[index]
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return output
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Converts an arbitrary value, sanitizing `toJSON` results when available.
|
|
39
|
+
* The limits keep pathological values from causing unbounded recursion or traversal.
|
|
40
|
+
*/
|
|
41
|
+
export function toJsonSafeValue(value: unknown): unknown {
|
|
42
|
+
const state: JsonSafeValueConversionState = {
|
|
43
|
+
ancestors: new WeakSet(),
|
|
44
|
+
remainingNodes: MAX_JSON_SAFE_VALUE_NODES,
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const convert = (current: unknown, depth: number): unknown => {
|
|
48
|
+
if (state.remainingNodes <= 0) {
|
|
49
|
+
return TRUNCATED_VALUE
|
|
50
|
+
}
|
|
51
|
+
state.remainingNodes--
|
|
52
|
+
|
|
53
|
+
try {
|
|
54
|
+
if (current === null || current === undefined || typeof current === 'boolean') {
|
|
55
|
+
return current
|
|
56
|
+
}
|
|
57
|
+
if (typeof current === 'string') {
|
|
58
|
+
return sanitizeString(current)
|
|
59
|
+
}
|
|
60
|
+
if (typeof current === 'number') {
|
|
61
|
+
return Number.isFinite(current) ? current : null
|
|
62
|
+
}
|
|
63
|
+
if (typeof current === 'bigint') {
|
|
64
|
+
return current.toString()
|
|
65
|
+
}
|
|
66
|
+
if (typeof current === 'function') {
|
|
67
|
+
return FUNCTION_VALUE
|
|
68
|
+
}
|
|
69
|
+
if (typeof current === 'symbol') {
|
|
70
|
+
return current.description ? `Symbol(${current.description})` : 'Symbol()'
|
|
71
|
+
}
|
|
72
|
+
if (depth >= MAX_JSON_SAFE_VALUE_DEPTH) {
|
|
73
|
+
return TRUNCATED_VALUE
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
if (state.ancestors.has(current)) {
|
|
77
|
+
return CIRCULAR_VALUE
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
state.ancestors.add(current)
|
|
81
|
+
try {
|
|
82
|
+
if (current instanceof Date) {
|
|
83
|
+
return Number.isFinite(dateGetTime.call(current)) ? dateToISOString.call(current) : null
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
let hasToJSONResult = false
|
|
87
|
+
let toJSONResult: unknown
|
|
88
|
+
try {
|
|
89
|
+
const toJSON = (current as { toJSON?: unknown }).toJSON
|
|
90
|
+
if (typeof toJSON === 'function') {
|
|
91
|
+
toJSONResult = toJSON.call(current)
|
|
92
|
+
hasToJSONResult = true
|
|
93
|
+
}
|
|
94
|
+
} catch {
|
|
95
|
+
hasToJSONResult = false
|
|
96
|
+
}
|
|
97
|
+
if (hasToJSONResult) {
|
|
98
|
+
return convert(toJSONResult, depth + 1)
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
if (Array.isArray(current)) {
|
|
102
|
+
const itemCount = Math.min(current.length, MAX_JSON_SAFE_VALUE_ITEMS)
|
|
103
|
+
const output: unknown[] = []
|
|
104
|
+
let index = 0
|
|
105
|
+
for (; index < itemCount && state.remainingNodes > 0; index++) {
|
|
106
|
+
output.push(convert(current[index], depth + 1))
|
|
107
|
+
}
|
|
108
|
+
if (current.length > index) {
|
|
109
|
+
output.push(TRUNCATED_VALUE)
|
|
110
|
+
}
|
|
111
|
+
return output
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
const output: Record<string, unknown> = {}
|
|
115
|
+
let itemCount = 0
|
|
116
|
+
let truncated = false
|
|
117
|
+
for (const key in current) {
|
|
118
|
+
// for...in visits own enumerable keys before walking the prototype chain.
|
|
119
|
+
if (!propertyIsEnumerable.call(current, key)) {
|
|
120
|
+
break
|
|
121
|
+
}
|
|
122
|
+
if (itemCount >= MAX_JSON_SAFE_VALUE_ITEMS || state.remainingNodes <= 0) {
|
|
123
|
+
truncated = true
|
|
124
|
+
break
|
|
125
|
+
}
|
|
126
|
+
const converted = convert((current as Record<string, unknown>)[key], depth + 1)
|
|
127
|
+
Object.defineProperty(output, key, {
|
|
128
|
+
value: converted,
|
|
129
|
+
enumerable: true,
|
|
130
|
+
configurable: true,
|
|
131
|
+
writable: true,
|
|
132
|
+
})
|
|
133
|
+
itemCount++
|
|
134
|
+
}
|
|
135
|
+
if (truncated) {
|
|
136
|
+
output[TRUNCATED_VALUE] = 'Additional properties omitted'
|
|
137
|
+
}
|
|
138
|
+
return output
|
|
139
|
+
} finally {
|
|
140
|
+
state.ancestors.delete(current)
|
|
141
|
+
}
|
|
142
|
+
} catch {
|
|
143
|
+
return UNSERIALIZABLE_VALUE
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
return convert(value, 0)
|
|
148
|
+
}
|