@rio-cloud/cdk-v2-constructs 9.0.0-alpha.8 → 9.0.0
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/.jsii +883 -183
- package/README.md +65 -0
- package/docs/AGENTS_DOCUMENTATION.md +20 -203
- package/lib/fargate/datadog.d.ts +4 -1
- package/lib/fargate/datadog.js +6 -3
- package/lib/fargate/rio-fargate-service-blue-green-alpha.js +6 -1
- package/lib/fargate/rio-fargate-service.d.ts +22 -1
- package/lib/fargate/rio-fargate-service.js +11 -2
- package/lib/fargate/trace-sampling.d.ts +87 -0
- package/lib/fargate/trace-sampling.js +123 -0
- package/lib/sbom-catalog/lambda/handler.cjs +38 -1
- package/node_modules/zod/package.json +1 -1
- package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
- package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
- package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
- package/node_modules/zod/src/v4/core/compile.ts +9 -0
- package/node_modules/zod/src/v4/core/schemas.ts +35 -1
- package/node_modules/zod/src/v4/core/util.ts +13 -0
- package/node_modules/zod/src/v4/core/versions.ts +1 -1
- package/node_modules/zod/v4/core/compile.cjs +8 -0
- package/node_modules/zod/v4/core/compile.js +8 -0
- package/node_modules/zod/v4/core/schemas.cjs +30 -0
- package/node_modules/zod/v4/core/schemas.d.cts +3 -1
- package/node_modules/zod/v4/core/schemas.d.ts +3 -1
- package/node_modules/zod/v4/core/schemas.js +30 -0
- package/node_modules/zod/v4/core/util.cjs +15 -0
- package/node_modules/zod/v4/core/util.d.cts +2 -0
- package/node_modules/zod/v4/core/util.d.ts +2 -0
- package/node_modules/zod/v4/core/util.js +14 -0
- package/node_modules/zod/v4/core/versions.cjs +1 -1
- package/node_modules/zod/v4/core/versions.js +1 -1
- package/package.json +1 -1
- package/version.json +1 -1
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type * as constructs from 'constructs';
|
|
2
|
+
/**
|
|
3
|
+
* The trace sampling strategy used by the Fargate Datadog integration.
|
|
4
|
+
*/
|
|
5
|
+
export declare enum TraceSamplingMode {
|
|
6
|
+
/**
|
|
7
|
+
* Use RIO's per-Agent head-sampling target of 5 traces/sec and an additional
|
|
8
|
+
* error-sampling budget of 10 local error trace chunks/sec.
|
|
9
|
+
* Target-per-second sampling is a practical default for both low- and
|
|
10
|
+
* high-traffic services.
|
|
11
|
+
*/
|
|
12
|
+
DEFAULT = 0,
|
|
13
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
14
|
+
DATADOG_DEFAULT = 1,
|
|
15
|
+
/** Set a fixed sampling rule on the application tracer. */
|
|
16
|
+
FIXED_RATE = 2,
|
|
17
|
+
/** Set a per-Agent target number of traces per second. */
|
|
18
|
+
TARGET_PER_SECOND = 3
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Use RIO's default Datadog Agent sampling targets.
|
|
22
|
+
*
|
|
23
|
+
* This is also the default when `traceSampling` is omitted.
|
|
24
|
+
*/
|
|
25
|
+
export interface RioDefaultTraceSamplingOptions {
|
|
26
|
+
/**
|
|
27
|
+
* The sampling strategy. May be omitted to use the default.
|
|
28
|
+
*
|
|
29
|
+
* @defaultValue - `TraceSamplingMode.DEFAULT`
|
|
30
|
+
*/
|
|
31
|
+
readonly mode?: TraceSamplingMode.DEFAULT;
|
|
32
|
+
}
|
|
33
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
34
|
+
export interface DatadogDefaultTraceSamplingOptions {
|
|
35
|
+
/** The sampling strategy. */
|
|
36
|
+
readonly mode: TraceSamplingMode.DATADOG_DEFAULT;
|
|
37
|
+
}
|
|
38
|
+
/** Configure a fixed application-tracer sampling rate. */
|
|
39
|
+
export interface FixedRateTraceSamplingOptions {
|
|
40
|
+
/** The sampling strategy. */
|
|
41
|
+
readonly mode: TraceSamplingMode.FIXED_RATE;
|
|
42
|
+
/**
|
|
43
|
+
* The global tracer sampling-rule rate, from 0.0 to 1.0 inclusive.
|
|
44
|
+
* Datadog tracers additionally apply their built-in 100-traces-per-second
|
|
45
|
+
* rate limit when sampling rules are configured. This construct does not
|
|
46
|
+
* expose or override that per-instance safeguard.
|
|
47
|
+
*/
|
|
48
|
+
readonly fixedRate: number;
|
|
49
|
+
}
|
|
50
|
+
/** Configure Datadog Agent target sampling. */
|
|
51
|
+
export interface TargetPerSecondTraceSamplingOptions {
|
|
52
|
+
/** The sampling strategy. */
|
|
53
|
+
readonly mode: TraceSamplingMode.TARGET_PER_SECOND;
|
|
54
|
+
/**
|
|
55
|
+
* The average head-sampling target in traces per second for each Agent
|
|
56
|
+
* sidecar (and therefore each Fargate service instance). Traffic spikes
|
|
57
|
+
* can exceed this target; it is not a hard cap on total ingestion.
|
|
58
|
+
*/
|
|
59
|
+
readonly targetTracesPerSecond: number;
|
|
60
|
+
/**
|
|
61
|
+
* The budget for additional local error trace chunks per second missed by
|
|
62
|
+
* head sampling, for each Agent sidecar (and therefore each Fargate service
|
|
63
|
+
* instance). This does not cap error traces already kept by head sampling.
|
|
64
|
+
*/
|
|
65
|
+
readonly errorTracesPerSecond?: number;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Options for configuring Datadog APM trace sampling.
|
|
69
|
+
*
|
|
70
|
+
* This discriminated union makes mode-specific settings invalid in TypeScript
|
|
71
|
+
* before synthesis. Numeric ranges are checked during synthesis.
|
|
72
|
+
*/
|
|
73
|
+
export type TraceSamplingOptions = RioDefaultTraceSamplingOptions | DatadogDefaultTraceSamplingOptions | FixedRateTraceSamplingOptions | TargetPerSecondTraceSamplingOptions;
|
|
74
|
+
export declare class TraceSamplingValidator implements constructs.IValidation {
|
|
75
|
+
private readonly traceSampling?;
|
|
76
|
+
constructor(traceSampling?: TraceSamplingOptions | undefined);
|
|
77
|
+
validate(): string[];
|
|
78
|
+
}
|
|
79
|
+
export declare function addTraceSamplingEnvironmentWarning(scope: constructs.Construct, environment: {
|
|
80
|
+
[key: string]: string;
|
|
81
|
+
} | undefined): void;
|
|
82
|
+
export declare function getApplicationTraceSamplingEnvironment(traceSampling?: TraceSamplingOptions): {
|
|
83
|
+
[key: string]: string;
|
|
84
|
+
};
|
|
85
|
+
export declare function getAgentTraceSamplingEnvironment(traceSampling?: TraceSamplingOptions): {
|
|
86
|
+
[key: string]: string;
|
|
87
|
+
};
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TraceSamplingValidator = exports.TraceSamplingMode = void 0;
|
|
5
|
+
exports.addTraceSamplingEnvironmentWarning = addTraceSamplingEnvironmentWarning;
|
|
6
|
+
exports.getApplicationTraceSamplingEnvironment = getApplicationTraceSamplingEnvironment;
|
|
7
|
+
exports.getAgentTraceSamplingEnvironment = getAgentTraceSamplingEnvironment;
|
|
8
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
9
|
+
const cdk = require("aws-cdk-lib");
|
|
10
|
+
/**
|
|
11
|
+
* The trace sampling strategy used by the Fargate Datadog integration.
|
|
12
|
+
*/
|
|
13
|
+
var TraceSamplingMode;
|
|
14
|
+
(function (TraceSamplingMode) {
|
|
15
|
+
/**
|
|
16
|
+
* Use RIO's per-Agent head-sampling target of 5 traces/sec and an additional
|
|
17
|
+
* error-sampling budget of 10 local error trace chunks/sec.
|
|
18
|
+
* Target-per-second sampling is a practical default for both low- and
|
|
19
|
+
* high-traffic services.
|
|
20
|
+
*/
|
|
21
|
+
TraceSamplingMode[TraceSamplingMode["DEFAULT"] = 0] = "DEFAULT";
|
|
22
|
+
/** Do not set sampling environment variables; retain Datadog's defaults. */
|
|
23
|
+
TraceSamplingMode[TraceSamplingMode["DATADOG_DEFAULT"] = 1] = "DATADOG_DEFAULT";
|
|
24
|
+
/** Set a fixed sampling rule on the application tracer. */
|
|
25
|
+
TraceSamplingMode[TraceSamplingMode["FIXED_RATE"] = 2] = "FIXED_RATE";
|
|
26
|
+
/** Set a per-Agent target number of traces per second. */
|
|
27
|
+
TraceSamplingMode[TraceSamplingMode["TARGET_PER_SECOND"] = 3] = "TARGET_PER_SECOND";
|
|
28
|
+
})(TraceSamplingMode || (exports.TraceSamplingMode = TraceSamplingMode = {}));
|
|
29
|
+
class TraceSamplingValidator {
|
|
30
|
+
constructor(traceSampling) {
|
|
31
|
+
this.traceSampling = traceSampling;
|
|
32
|
+
}
|
|
33
|
+
validate() {
|
|
34
|
+
const options = this.traceSampling;
|
|
35
|
+
if (!options) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
// Keep validating the runtime shape: JavaScript consumers and TypeScript
|
|
39
|
+
// callers using a cast can bypass the discriminated union.
|
|
40
|
+
const values = options;
|
|
41
|
+
const mode = values.mode ?? TraceSamplingMode.DEFAULT;
|
|
42
|
+
const hasFixedRate = values.fixedRate !== undefined;
|
|
43
|
+
const hasTargetTps = values.targetTracesPerSecond !== undefined;
|
|
44
|
+
const hasErrorTps = values.errorTracesPerSecond !== undefined;
|
|
45
|
+
const errors = [];
|
|
46
|
+
const isNonNegativeInteger = (value) => value !== undefined && Number.isInteger(value) && value >= 0;
|
|
47
|
+
if (mode === TraceSamplingMode.DEFAULT || mode === TraceSamplingMode.DATADOG_DEFAULT) {
|
|
48
|
+
if (hasFixedRate || hasTargetTps || hasErrorTps) {
|
|
49
|
+
errors.push(`${TraceSamplingMode[mode]} does not accept fixedRate, targetTracesPerSecond, or errorTracesPerSecond.`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
else if (mode === TraceSamplingMode.FIXED_RATE) {
|
|
53
|
+
const fixedRate = values.fixedRate;
|
|
54
|
+
if (!hasFixedRate ||
|
|
55
|
+
fixedRate === undefined ||
|
|
56
|
+
!Number.isFinite(fixedRate) ||
|
|
57
|
+
fixedRate < 0.0 ||
|
|
58
|
+
fixedRate > 1.0) {
|
|
59
|
+
errors.push('FIXED_RATE requires fixedRate to be a number between 0 and 1 inclusive.');
|
|
60
|
+
}
|
|
61
|
+
if (hasTargetTps) {
|
|
62
|
+
errors.push('FIXED_RATE does not accept targetTracesPerSecond.');
|
|
63
|
+
}
|
|
64
|
+
if (hasErrorTps) {
|
|
65
|
+
errors.push('FIXED_RATE does not accept errorTracesPerSecond.');
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (mode === TraceSamplingMode.TARGET_PER_SECOND) {
|
|
69
|
+
if (!isNonNegativeInteger(values.targetTracesPerSecond)) {
|
|
70
|
+
errors.push('TARGET_PER_SECOND requires targetTracesPerSecond to be a non-negative integer.');
|
|
71
|
+
}
|
|
72
|
+
if (hasFixedRate) {
|
|
73
|
+
errors.push('TARGET_PER_SECOND does not accept fixedRate.');
|
|
74
|
+
}
|
|
75
|
+
if (hasErrorTps && !isNonNegativeInteger(values.errorTracesPerSecond)) {
|
|
76
|
+
errors.push('TARGET_PER_SECOND errorTracesPerSecond must be a non-negative integer.');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
errors.push('traceSampling.mode must be a TraceSamplingMode value.');
|
|
81
|
+
}
|
|
82
|
+
return errors;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
exports.TraceSamplingValidator = TraceSamplingValidator;
|
|
86
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
87
|
+
TraceSamplingValidator[_a] = { fqn: "@rio-cloud-internal/cdk-v2-constructs.TraceSamplingValidator", version: "0.0.0" };
|
|
88
|
+
function addTraceSamplingEnvironmentWarning(scope, environment) {
|
|
89
|
+
const samplingKeys = ['DD_TRACE_SAMPLING_RULES', 'DD_TRACE_SAMPLE_RATE', 'DD_APM_TARGET_TPS', 'DD_APM_ERROR_TPS'];
|
|
90
|
+
const configuredKeys = samplingKeys.filter(key => environment && key in environment);
|
|
91
|
+
if (configuredKeys.length > 0) {
|
|
92
|
+
cdk.Validations.of(scope).addWarning('@rio-cloud/cdk-v2-constructs:directTraceSamplingEnvironment', [
|
|
93
|
+
`Direct trace-sampling environment variable(s) detected: ${configuredKeys.join(', ')}.`,
|
|
94
|
+
'Recommended action: remove these variables to use the DEFAULT sampling policy.',
|
|
95
|
+
'To select a different policy, configure datadogOptions.traceSampling explicitly.',
|
|
96
|
+
'Direct sampling environment variables remain supported only for backwards compatibility. Users who choose them are responsible for their compatibility and maintenance.',
|
|
97
|
+
].join('\n'));
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function getApplicationTraceSamplingEnvironment(traceSampling) {
|
|
101
|
+
if (traceSampling?.mode === TraceSamplingMode.FIXED_RATE) {
|
|
102
|
+
const rules = [{ sample_rate: traceSampling.fixedRate }];
|
|
103
|
+
return { DD_TRACE_SAMPLING_RULES: JSON.stringify(rules) };
|
|
104
|
+
}
|
|
105
|
+
return {};
|
|
106
|
+
}
|
|
107
|
+
function getAgentTraceSamplingEnvironment(traceSampling) {
|
|
108
|
+
if (traceSampling?.mode === undefined || traceSampling.mode === TraceSamplingMode.DEFAULT) {
|
|
109
|
+
return { DD_APM_TARGET_TPS: '5', DD_APM_ERROR_TPS: '10' };
|
|
110
|
+
}
|
|
111
|
+
if (traceSampling?.mode === TraceSamplingMode.TARGET_PER_SECOND) {
|
|
112
|
+
const environment = {};
|
|
113
|
+
if (traceSampling.targetTracesPerSecond !== undefined) {
|
|
114
|
+
environment.DD_APM_TARGET_TPS = String(traceSampling.targetTracesPerSecond);
|
|
115
|
+
}
|
|
116
|
+
if (traceSampling.errorTracesPerSecond !== undefined) {
|
|
117
|
+
environment.DD_APM_ERROR_TPS = String(traceSampling.errorTracesPerSecond);
|
|
118
|
+
}
|
|
119
|
+
return environment;
|
|
120
|
+
}
|
|
121
|
+
return {};
|
|
122
|
+
}
|
|
123
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhY2Utc2FtcGxpbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZmFyZ2F0ZS90cmFjZS1zYW1wbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBZ0tBLGdGQWlCQztBQUVELHdGQVFDO0FBRUQsNEVBZUM7O0FBNU1ELG1DQUFtQztBQUduQzs7R0FFRztBQUNILElBQVksaUJBaUJYO0FBakJELFdBQVksaUJBQWlCO0lBQzNCOzs7OztPQUtHO0lBQ0gsK0RBQU8sQ0FBQTtJQUVQLDRFQUE0RTtJQUM1RSwrRUFBZSxDQUFBO0lBRWYsMkRBQTJEO0lBQzNELHFFQUFVLENBQUE7SUFFViwwREFBMEQ7SUFDMUQsbUZBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQWpCVyxpQkFBaUIsaUNBQWpCLGlCQUFpQixRQWlCNUI7QUE0RUQsTUFBYSxzQkFBc0I7SUFDakMsWUFBNkIsYUFBb0M7UUFBcEMsa0JBQWEsR0FBYixhQUFhLENBQXVCO0lBQUcsQ0FBQztJQUVyRSxRQUFRO1FBQ04sTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQztRQUNuQyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFFRCx5RUFBeUU7UUFDekUsMkRBQTJEO1FBQzNELE1BQU0sTUFBTSxHQUFHLE9BQThCLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxPQUFPLENBQUM7UUFDdEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsS0FBSyxTQUFTLENBQUM7UUFDcEQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLHFCQUFxQixLQUFLLFNBQVMsQ0FBQztRQUNoRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsb0JBQW9CLEtBQUssU0FBUyxDQUFDO1FBQzlELE1BQU0sTUFBTSxHQUFhLEVBQUUsQ0FBQztRQUM1QixNQUFNLG9C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RSxJQUFJLEtBQUssaUJBQWlCLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDekQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUN6RCxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO0lBQzVELENBQUM7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxTQUFnQixnQ0FBZ0MsQ0FBQyxhQUFvQztJQUNuRixJQUFJLGFBQWEsRUFBRSxJQUFJLEtBQUssU0FBUyxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssaUJBQWlCLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUYsT0FBTyxFQUFFLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsQ0FBQztJQUM1RCxDQUFDO0lBQ0QsSUFBSSxhQUFhLEVBQUUsSUFBSSxLQUFLLGlCQUFpQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDaEUsTUFBTSxXQUFXLEdBQThCLEVBQUUsQ0FBQztRQUNsRCxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN0RCxXQUFXLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQzlFLENBQUM7UUFDRCxJQUFJLGFBQWEsQ0FBQyxvQkFBb0IsS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUNyRCxXQUFXLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFDRCxPQUFPLFdBQVcsQ0FBQztJQUNyQixDQUFDO0lBQ0QsT0FBTyxFQUFFLENBQUM7QUFDWixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgY2RrIGZyb20gJ2F3cy1jZGstbGliJztcbmltcG9ydCB0eXBlICogYXMgY29uc3RydWN0cyBmcm9tICdjb25zdHJ1Y3RzJztcblxuLyoqXG4gKiBUaGUgdHJhY2Ugc2FtcGxpbmcgc3RyYXRlZ3kgdXNlZCBieSB0aGUgRmFyZ2F0ZSBEYXRhZG9nIGludGVncmF0aW9uLlxuICovXG5leHBvcnQgZW51bSBUcmFjZVNhbXBsaW5nTW9kZSB7XG4gIC8qKlxuICAgKiBVc2UgUklPJ3MgcGVyLUFnZW50IGhlYWQtc2FtcGxpbmcgdGFyZ2V0IG9mIDUgdHJhY2VzL3NlYyBhbmQgYW4gYWRkaXRpb25hbFxuICAgKiBlcnJvci1zYW1wbGluZyBidWRnZXQgb2YgMTAgbG9jYWwgZXJyb3IgdHJhY2UgY2h1bmtzL3NlYy5cbiAgICogVGFyZ2V0LXBlci1zZWNvbmQgc2FtcGxpbmcgaXMgYSBwcmFjdGljYWwgZGVmYXVsdCBmb3IgYm90aCBsb3ctIGFuZFxuICAgKiBoaWdoLXRyYWZmaWMgc2VydmljZXMuXG4gICAqL1xuICBERUZBVUxULFxuXG4gIC8qKiBEbyBub3Qgc2V0IHNhbXBsaW5nIGVudmlyb25tZW50IHZhcmlhYmxlczsgcmV0YWluIERhdGFkb2cncyBkZWZhdWx0cy4gKi9cbiAgREFUQURPR19ERUZBVUxULFxuXG4gIC8qKiBTZXQgYSBmaXhlZCBzYW1wbGluZyBydWxlIG9uIHRoZSBhcHBsaWNhdGlvbiB0cmFjZXIuICovXG4gIEZJWEVEX1JBVEUsXG5cbiAgLyoqIFNldCBhIHBlci1BZ2VudCB0YXJnZXQgbnVtYmVyIG9mIHRyYWNlcyBwZXIgc2Vjb25kLiAqL1xuICBUQVJHRVRfUEVSX1NFQ09ORCxcbn1cblxuLyoqXG4gKiBVc2UgUklPJ3MgZGVmYXVsdCBEYXRhZG9nIEFnZW50IHNhbXBsaW5nIHRhcmdldHMuXG4gKlxuICogVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHdoZW4gYHRyYWNlU2FtcGxpbmdgIGlzIG9taXR0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmlvRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gTWF5IGJlIG9taXR0ZWQgdG8gdXNlIHRoZSBkZWZhdWx0LlxuICAgKlxuICAgKiBAZGVmYXVsdFZhbHVlIC0gYFRyYWNlU2FtcGxpbmdNb2RlLkRFRkFVTFRgXG4gICAqL1xuICByZWFkb25seSBtb2RlPzogVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVDtcbn1cblxuLyoqIERvIG5vdCBzZXQgc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOyByZXRhaW4gRGF0YWRvZydzIGRlZmF1bHRzLiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhZG9nRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gKi9cbiAgcmVhZG9ubHkgbW9kZTogVHJhY2VTYW1wbGluZ01vZGUuREFUQURPR19ERUZBVUxUO1xufVxuXG4vKiogQ29uZmlndXJlIGEgZml4ZWQgYXBwbGljYXRpb24tdHJhY2VyIHNhbXBsaW5nIHJhdGUuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpeGVkUmF0ZVRyYWNlU2FtcGxpbmdPcHRpb25zIHtcbiAgLyoqIFRoZSBzYW1wbGluZyBzdHJhdGVneS4gKi9cbiAgcmVhZG9ubHkgbW9kZTogVHJhY2VTYW1wbGluZ01vZGUuRklYRURfUkFURTtcblxuICAvKipcbiAgICogVGhlIGdsb2JhbCB0cmFjZXIgc2FtcGxpbmctcnVsZSByYXRlLCBmcm9tIDAuMCB0byAxLjAgaW5jbHVzaXZlLlxuICAgKiBEYXRhZG9nIHRyYWNlcnMgYWRkaXRpb25hbGx5IGFwcGx5IHRoZWlyIGJ1aWx0LWluIDEwMC10cmFjZXMtcGVyLXNlY29uZFxuICAgKiByYXRlIGxpbWl0IHdoZW4gc2FtcGxpbmcgcnVsZXMgYXJlIGNvbmZpZ3VyZWQuIFRoaXMgY29uc3RydWN0IGRvZXMgbm90XG4gICAqIGV4cG9zZSBvciBvdmVycmlkZSB0aGF0IHBlci1pbnN0YW5jZSBzYWZlZ3VhcmQuXG4gICAqL1xuICByZWFkb25seSBmaXhlZFJhdGU6IG51bWJlcjtcbn1cblxuLyoqIENvbmZpZ3VyZSBEYXRhZG9nIEFnZW50IHRhcmdldCBzYW1wbGluZy4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFyZ2V0UGVyU2Vjb25kVHJhY2VTYW1wbGluZ09wdGlvbnMge1xuICAvKiogVGhlIHNhbXBsaW5nIHN0cmF0ZWd5LiAqL1xuICByZWFkb25seSBtb2RlOiBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORDtcblxuICAvKipcbiAgICogVGhlIGF2ZXJhZ2UgaGVhZC1zYW1wbGluZyB0YXJnZXQgaW4gdHJhY2VzIHBlciBzZWNvbmQgZm9yIGVhY2ggQWdlbnRcbiAgICogc2lkZWNhciAoYW5kIHRoZXJlZm9yZSBlYWNoIEZhcmdhdGUgc2VydmljZSBpbnN0YW5jZSkuIFRyYWZmaWMgc3Bpa2VzXG4gICAqIGNhbiBleGNlZWQgdGhpcyB0YXJnZXQ7IGl0IGlzIG5vdCBhIGhhcmQgY2FwIG9uIHRvdGFsIGluZ2VzdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHRhcmdldFRyYWNlc1BlclNlY29uZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgYnVkZ2V0IGZvciBhZGRpdGlvbmFsIGxvY2FsIGVycm9yIHRyYWNlIGNodW5rcyBwZXIgc2Vjb25kIG1pc3NlZCBieVxuICAgKiBoZWFkIHNhbXBsaW5nLCBmb3IgZWFjaCBBZ2VudCBzaWRlY2FyIChhbmQgdGhlcmVmb3JlIGVhY2ggRmFyZ2F0ZSBzZXJ2aWNlXG4gICAqIGluc3RhbmNlKS4gVGhpcyBkb2VzIG5vdCBjYXAgZXJyb3IgdHJhY2VzIGFscmVhZHkga2VwdCBieSBoZWFkIHNhbXBsaW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JUcmFjZXNQZXJTZWNvbmQ/OiBudW1iZXI7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgY29uZmlndXJpbmcgRGF0YWRvZyBBUE0gdHJhY2Ugc2FtcGxpbmcuXG4gKlxuICogVGhpcyBkaXNjcmltaW5hdGVkIHVuaW9uIG1ha2VzIG1vZGUtc3BlY2lmaWMgc2V0dGluZ3MgaW52YWxpZCBpbiBUeXBlU2NyaXB0XG4gKiBiZWZvcmUgc3ludGhlc2lzLiBOdW1lcmljIHJhbmdlcyBhcmUgY2hlY2tlZCBkdXJpbmcgc3ludGhlc2lzLlxuICovXG5leHBvcnQgdHlwZSBUcmFjZVNhbXBsaW5nT3B0aW9ucyA9XG4gIHwgUmlvRGVmYXVsdFRyYWNlU2FtcGxpbmdPcHRpb25zXG4gIHwgRGF0YWRvZ0RlZmF1bHRUcmFjZVNhbXBsaW5nT3B0aW9uc1xuICB8IEZpeGVkUmF0ZVRyYWNlU2FtcGxpbmdPcHRpb25zXG4gIHwgVGFyZ2V0UGVyU2Vjb25kVHJhY2VTYW1wbGluZ09wdGlvbnM7XG5cbi8qKiBUaGUgdW50cnVzdGVkIHJ1bnRpbWUgc2hhcGUgdXNlZCBieSBzeW50aGVzaXMtdGltZSB2YWxpZGF0aW9uLiAqL1xudHlwZSBUcmFjZVNhbXBsaW5nVmFsdWVzID0ge1xuICByZWFkb25seSBtb2RlPzogVHJhY2VTYW1wbGluZ01vZGU7XG4gIHJlYWRvbmx5IGZpeGVkUmF0ZT86IG51bWJlcjtcbiAgcmVhZG9ubHkgdGFyZ2V0VHJhY2VzUGVyU2Vjb25kPzogbnVtYmVyO1xuICByZWFkb25seSBlcnJvclRyYWNlc1BlclNlY29uZD86IG51bWJlcjtcbn07XG5cbmV4cG9ydCBjbGFzcyBUcmFjZVNhbXBsaW5nVmFsaWRhdG9yIGltcGxlbWVudHMgY29uc3RydWN0cy5JVmFsaWRhdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgdHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKSB7fVxuXG4gIHZhbGlkYXRlKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvcHRpb25zID0gdGhpcy50cmFjZVNhbXBsaW5nO1xuICAgIGlmICghb3B0aW9ucykge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEtlZXAgdmFsaWRhdGluZyB0aGUgcnVudGltZSBzaGFwZTogSmF2YVNjcmlwdCBjb25zdW1lcnMgYW5kIFR5cGVTY3JpcHRcbiAgICAvLyBjYWxsZXJzIHVzaW5nIGEgY2FzdCBjYW4gYnlwYXNzIHRoZSBkaXNjcmltaW5hdGVkIHVuaW9uLlxuICAgIGNvbnN0IHZhbHVlcyA9IG9wdGlvbnMgYXMgVHJhY2VTYW1wbGluZ1ZhbHVlcztcbiAgICBjb25zdCBtb2RlID0gdmFsdWVzLm1vZGUgPz8gVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVDtcbiAgICBjb25zdCBoYXNGaXhlZFJhdGUgPSB2YWx1ZXMuZml4ZWRSYXRlICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaGFzVGFyZ2V0VHBzID0gdmFsdWVzLnRhcmdldFRyYWNlc1BlclNlY29uZCAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGhhc0Vycm9yVHBzID0gdmFsdWVzLmVycm9yVHJhY2VzUGVyU2Vjb25kICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGlzTm9uTmVnYXRpdmVJbnRlZ2VyID0gKHZhbHVlOiBudW1iZXIgfCB1bmRlZmluZWQpID0+XG4gICAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIHZhbHVlID49IDA7XG5cbiAgICBpZiAobW9kZSA9PT0gVHJhY2VTYW1wbGluZ01vZGUuREVGQVVMVCB8fCBtb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5EQVRBRE9HX0RFRkFVTFQpIHtcbiAgICAgIGlmIChoYXNGaXhlZFJhdGUgfHwgaGFzVGFyZ2V0VHBzIHx8IGhhc0Vycm9yVHBzKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKFxuICAgICAgICAgIGAke1RyYWNlU2FtcGxpbmdNb2RlW21vZGVdfSBkb2VzIG5vdCBhY2NlcHQgZml4ZWRSYXRlLCB0YXJnZXRUcmFjZXNQZXJTZWNvbmQsIG9yIGVycm9yVHJhY2VzUGVyU2Vjb25kLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKG1vZGUgPT09IFRyYWNlU2FtcGxpbmdNb2RlLkZJWEVEX1JBVEUpIHtcbiAgICAgIGNvbnN0IGZpeGVkUmF0ZSA9IHZhbHVlcy5maXhlZFJhdGU7XG4gICAgICBpZiAoXG4gICAgICAgICFoYXNGaXhlZFJhdGUgfHxcbiAgICAgICAgZml4ZWRSYXRlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgIU51bWJlci5pc0Zpbml0ZShmaXhlZFJhdGUpIHx8XG4gICAgICAgIGZpeGVkUmF0ZSA8IDAuMCB8fFxuICAgICAgICBmaXhlZFJhdGUgPiAxLjBcbiAgICAgICkge1xuICAgICAgICBlcnJvcnMucHVzaCgnRklYRURfUkFURSByZXF1aXJlcyBmaXhlZFJhdGUgdG8gYmUgYSBudW1iZXIgYmV0d2VlbiAwIGFuZCAxIGluY2x1c2l2ZS4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNUYXJnZXRUcHMpIHtcbiAgICAgICAgZXJyb3JzLnB1c2goJ0ZJWEVEX1JBVEUgZG9lcyBub3QgYWNjZXB0IHRhcmdldFRyYWNlc1BlclNlY29uZC4nKTtcbiAgICAgIH1cbiAgICAgIGlmIChoYXNFcnJvclRwcykge1xuICAgICAgICBlcnJvcnMucHVzaCgnRklYRURfUkFURSBkb2VzIG5vdCBhY2NlcHQgZXJyb3JUcmFjZXNQZXJTZWNvbmQuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChtb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORCkge1xuICAgICAgaWYgKCFpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZXMudGFyZ2V0VHJhY2VzUGVyU2Vjb25kKSkge1xuICAgICAgICBlcnJvcnMucHVzaCgnVEFSR0VUX1BFUl9TRUNPTkQgcmVxdWlyZXMgdGFyZ2V0VHJhY2VzUGVyU2Vjb25kIHRvIGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJyk7XG4gICAgICB9XG4gICAgICBpZiAoaGFzRml4ZWRSYXRlKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdUQVJHRVRfUEVSX1NFQ09ORCBkb2VzIG5vdCBhY2NlcHQgZml4ZWRSYXRlLicpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc0Vycm9yVHBzICYmICFpc05vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZXMuZXJyb3JUcmFjZXNQZXJTZWNvbmQpKSB7XG4gICAgICAgIGVycm9ycy5wdXNoKCdUQVJHRVRfUEVSX1NFQ09ORCBlcnJvclRyYWNlc1BlclNlY29uZCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGVycm9ycy5wdXNoKCd0cmFjZVNhbXBsaW5nLm1vZGUgbXVzdCBiZSBhIFRyYWNlU2FtcGxpbmdNb2RlIHZhbHVlLicpO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJvcnM7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFRyYWNlU2FtcGxpbmdFbnZpcm9ubWVudFdhcm5pbmcoXG4gIHNjb3BlOiBjb25zdHJ1Y3RzLkNvbnN0cnVjdCxcbiAgZW52aXJvbm1lbnQ6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gfCB1bmRlZmluZWRcbik6IHZvaWQge1xuICBjb25zdCBzYW1wbGluZ0tleXMgPSBbJ0REX1RSQUNFX1NBTVBMSU5HX1JVTEVTJywgJ0REX1RSQUNFX1NBTVBMRV9SQVRFJywgJ0REX0FQTV9UQVJHRVRfVFBTJywgJ0REX0FQTV9FUlJPUl9UUFMnXTtcbiAgY29uc3QgY29uZmlndXJlZEtleXMgPSBzYW1wbGluZ0tleXMuZmlsdGVyKGtleSA9PiBlbnZpcm9ubWVudCAmJiBrZXkgaW4gZW52aXJvbm1lbnQpO1xuICBpZiAoY29uZmlndXJlZEtleXMubGVuZ3RoID4gMCkge1xuICAgIGNkay5WYWxpZGF0aW9ucy5vZihzY29wZSkuYWRkV2FybmluZyhcbiAgICAgICdAcmlvLWNsb3VkL2Nkay12Mi1jb25zdHJ1Y3RzOmRpcmVjdFRyYWNlU2FtcGxpbmdFbnZpcm9ubWVudCcsXG4gICAgICBbXG4gICAgICAgIGBEaXJlY3QgdHJhY2Utc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGUocykgZGV0ZWN0ZWQ6ICR7Y29uZmlndXJlZEtleXMuam9pbignLCAnKX0uYCxcbiAgICAgICAgJ1JlY29tbWVuZGVkIGFjdGlvbjogcmVtb3ZlIHRoZXNlIHZhcmlhYmxlcyB0byB1c2UgdGhlIERFRkFVTFQgc2FtcGxpbmcgcG9saWN5LicsXG4gICAgICAgICdUbyBzZWxlY3QgYSBkaWZmZXJlbnQgcG9saWN5LCBjb25maWd1cmUgZGF0YWRvZ09wdGlvbnMudHJhY2VTYW1wbGluZyBleHBsaWNpdGx5LicsXG4gICAgICAgICdEaXJlY3Qgc2FtcGxpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHJlbWFpbiBzdXBwb3J0ZWQgb25seSBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuIFVzZXJzIHdobyBjaG9vc2UgdGhlbSBhcmUgcmVzcG9uc2libGUgZm9yIHRoZWlyIGNvbXBhdGliaWxpdHkgYW5kIG1haW50ZW5hbmNlLicsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXBwbGljYXRpb25UcmFjZVNhbXBsaW5nRW52aXJvbm1lbnQodHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKToge1xuICBba2V5OiBzdHJpbmddOiBzdHJpbmc7XG59IHtcbiAgaWYgKHRyYWNlU2FtcGxpbmc/Lm1vZGUgPT09IFRyYWNlU2FtcGxpbmdNb2RlLkZJWEVEX1JBVEUpIHtcbiAgICBjb25zdCBydWxlcyA9IFt7IHNhbXBsZV9yYXRlOiB0cmFjZVNhbXBsaW5nLmZpeGVkUmF0ZSB9XTtcbiAgICByZXR1cm4geyBERF9UUkFDRV9TQU1QTElOR19SVUxFUzogSlNPTi5zdHJpbmdpZnkocnVsZXMpIH07XG4gIH1cbiAgcmV0dXJuIHt9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdlbnRUcmFjZVNhbXBsaW5nRW52aXJvbm1lbnQodHJhY2VTYW1wbGluZz86IFRyYWNlU2FtcGxpbmdPcHRpb25zKTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSB7XG4gIGlmICh0cmFjZVNhbXBsaW5nPy5tb2RlID09PSB1bmRlZmluZWQgfHwgdHJhY2VTYW1wbGluZy5tb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5ERUZBVUxUKSB7XG4gICAgcmV0dXJuIHsgRERfQVBNX1RBUkdFVF9UUFM6ICc1JywgRERfQVBNX0VSUk9SX1RQUzogJzEwJyB9O1xuICB9XG4gIGlmICh0cmFjZVNhbXBsaW5nPy5tb2RlID09PSBUcmFjZVNhbXBsaW5nTW9kZS5UQVJHRVRfUEVSX1NFQ09ORCkge1xuICAgIGNvbnN0IGVudmlyb25tZW50OiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge307XG4gICAgaWYgKHRyYWNlU2FtcGxpbmcudGFyZ2V0VHJhY2VzUGVyU2Vjb25kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGVudmlyb25tZW50LkREX0FQTV9UQVJHRVRfVFBTID0gU3RyaW5nKHRyYWNlU2FtcGxpbmcudGFyZ2V0VHJhY2VzUGVyU2Vjb25kKTtcbiAgICB9XG4gICAgaWYgKHRyYWNlU2FtcGxpbmcuZXJyb3JUcmFjZXNQZXJTZWNvbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZW52aXJvbm1lbnQuRERfQVBNX0VSUk9SX1RQUyA9IFN0cmluZyh0cmFjZVNhbXBsaW5nLmVycm9yVHJhY2VzUGVyU2Vjb25kKTtcbiAgICB9XG4gICAgcmV0dXJuIGVudmlyb25tZW50O1xuICB9XG4gIHJldHVybiB7fTtcbn1cbiJdfQ==
|
|
@@ -38779,6 +38779,7 @@ __export(util_exports, {
|
|
|
38779
38779
|
required: () => required,
|
|
38780
38780
|
safeExtend: () => safeExtend,
|
|
38781
38781
|
shallowClone: () => shallowClone,
|
|
38782
|
+
sizeCaps: () => sizeCaps,
|
|
38782
38783
|
slugify: () => slugify,
|
|
38783
38784
|
stringifyPrimitive: () => stringifyPrimitive,
|
|
38784
38785
|
toZod: () => toZod,
|
|
@@ -39298,6 +39299,18 @@ function prefixIssues(path, issues) {
|
|
|
39298
39299
|
function unwrapMessage(message) {
|
|
39299
39300
|
return typeof message === "string" ? message : message?.message;
|
|
39300
39301
|
}
|
|
39302
|
+
function sizeCaps(defChecks) {
|
|
39303
|
+
const caps = [];
|
|
39304
|
+
for (const ch of defChecks ?? []) {
|
|
39305
|
+
const d5 = ch._zod.def;
|
|
39306
|
+
if (!/_(length|size)$|_equals$/.test(d5.check))
|
|
39307
|
+
break;
|
|
39308
|
+
const max = d5.maximum ?? d5.length ?? d5.size;
|
|
39309
|
+
if (max >= 0)
|
|
39310
|
+
caps.push([max, ch]);
|
|
39311
|
+
}
|
|
39312
|
+
return caps;
|
|
39313
|
+
}
|
|
39301
39314
|
function attachSchema(issues, start, inst) {
|
|
39302
39315
|
var _a4;
|
|
39303
39316
|
for (let i5 = start; i5 < issues.length; i5++) {
|
|
@@ -40219,7 +40232,7 @@ ${content.join("\n")}
|
|
|
40219
40232
|
var version = {
|
|
40220
40233
|
major: 4,
|
|
40221
40234
|
minor: 6,
|
|
40222
|
-
patch:
|
|
40235
|
+
patch: 7
|
|
40223
40236
|
};
|
|
40224
40237
|
|
|
40225
40238
|
// node_modules/zod/v4/core/schemas.js
|
|
@@ -40727,6 +40740,29 @@ var $ZodNever = /* @__PURE__ */ $constructor("$ZodNever", (inst, def) => {
|
|
|
40727
40740
|
return payload;
|
|
40728
40741
|
};
|
|
40729
40742
|
});
|
|
40743
|
+
function capSize(inst, size) {
|
|
40744
|
+
const caps = sizeCaps(inst._zod.def.checks);
|
|
40745
|
+
if (!caps.length)
|
|
40746
|
+
return;
|
|
40747
|
+
const cap = Math.min(...caps.map((c5) => c5[0]));
|
|
40748
|
+
const parse3 = inst._zod.parse;
|
|
40749
|
+
inst._zod.parse = (payload, ctx) => {
|
|
40750
|
+
const n3 = size(payload.value);
|
|
40751
|
+
if (n3 > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
|
|
40752
|
+
for (const [max, ch] of sizeCaps(inst._zod.def.checks)) {
|
|
40753
|
+
if (n3 > max && ch._zod.def.when(payload)) {
|
|
40754
|
+
const start = payload.issues.length;
|
|
40755
|
+
ch._zod.check(payload);
|
|
40756
|
+
payload.issues[start].continue = false;
|
|
40757
|
+
attachSchema(payload.issues, start, inst);
|
|
40758
|
+
return payload;
|
|
40759
|
+
}
|
|
40760
|
+
}
|
|
40761
|
+
}
|
|
40762
|
+
return parse3(payload, ctx);
|
|
40763
|
+
};
|
|
40764
|
+
}
|
|
40765
|
+
var arraySize = (input) => Array.isArray(input) ? input.length : -1;
|
|
40730
40766
|
function handleArrayResult(result, final, index) {
|
|
40731
40767
|
if (result.issues.length) {
|
|
40732
40768
|
final.issues.push(...prefixIssues(index, result.issues));
|
|
@@ -40770,6 +40806,7 @@ var $ZodArray = /* @__PURE__ */ $constructor("$ZodArray", (inst, def) => {
|
|
|
40770
40806
|
}
|
|
40771
40807
|
return payload;
|
|
40772
40808
|
};
|
|
40809
|
+
capSize(inst, arraySize);
|
|
40773
40810
|
});
|
|
40774
40811
|
function handlePropertyResult(result, final, key, input, optin, optout) {
|
|
40775
40812
|
const isPresent = key in input;
|
|
@@ -140,6 +140,33 @@ test("continue parsing despite array size error", () => {
|
|
|
140
140
|
`);
|
|
141
141
|
});
|
|
142
142
|
|
|
143
|
+
test("an upper size bound fails before any element is parsed", () => {
|
|
144
|
+
let parsed = 0;
|
|
145
|
+
const el = z.string().refine(() => ++parsed);
|
|
146
|
+
let refined = 0;
|
|
147
|
+
const schema = z
|
|
148
|
+
.array(el)
|
|
149
|
+
.max(2, "too many")
|
|
150
|
+
.refine(() => ++refined);
|
|
151
|
+
expect(schema.safeParse([1, 2, 3]).error!.issues).toMatchObject([{ code: "too_big", path: [], message: "too many" }]);
|
|
152
|
+
expect(z.array(el).length(2).safeParse(["a", "b", "c"]).error!.issues).toMatchObject([
|
|
153
|
+
{ code: "too_big", exact: true },
|
|
154
|
+
]);
|
|
155
|
+
expect(z.object({ a: z.array(el).max(1) }).safeParse({ a: [1, 2] }).error!.issues).toMatchObject([
|
|
156
|
+
{ code: "too_big", path: ["a"] },
|
|
157
|
+
]);
|
|
158
|
+
expect([parsed, refined]).toEqual([0, 0]);
|
|
159
|
+
|
|
160
|
+
// a check that may rewrite the value ends the gate
|
|
161
|
+
expect(
|
|
162
|
+
z
|
|
163
|
+
.array(z.number())
|
|
164
|
+
.overwrite((a) => a.slice(0, 2))
|
|
165
|
+
.max(2)
|
|
166
|
+
.parse([1, 2, 3])
|
|
167
|
+
).toEqual([1, 2]);
|
|
168
|
+
});
|
|
169
|
+
|
|
143
170
|
test("parse should fail given sparse array", () => {
|
|
144
171
|
const schema = z.array(z.string()).nonempty().min(1).max(3);
|
|
145
172
|
const result = schema.safeParse(new Array(3));
|
|
@@ -97,6 +97,13 @@ test("failing when map is bigger than max() ", () => {
|
|
|
97
97
|
expect(result.success).toEqual(false);
|
|
98
98
|
expect(result.error!.issues.length).toEqual(1);
|
|
99
99
|
expect(result.error!.issues[0].code).toEqual("too_big");
|
|
100
|
+
const bad = new Map([
|
|
101
|
+
[1, 1],
|
|
102
|
+
[2, 2],
|
|
103
|
+
]);
|
|
104
|
+
const capped = z.map(z.string(), z.string()).max(1);
|
|
105
|
+
expect(capped.safeParse(bad).error!.issues).toMatchObject([{ code: "too_big" }]);
|
|
106
|
+
expect(capped.safeParse(new Set([1, 2])).error!.issues[0]).toMatchObject({ code: "invalid_type", expected: "map" });
|
|
100
107
|
});
|
|
101
108
|
|
|
102
109
|
test("failing when map does not match size() ", () => {
|
|
@@ -83,6 +83,12 @@ test("failing when set is bigger than max() ", () => {
|
|
|
83
83
|
expect(result.success).toEqual(false);
|
|
84
84
|
expect(result.error!.issues.length).toEqual(1);
|
|
85
85
|
expect(result.error!.issues[0].code).toEqual("too_big");
|
|
86
|
+
expect(
|
|
87
|
+
z
|
|
88
|
+
.set(z.string())
|
|
89
|
+
.max(1)
|
|
90
|
+
.safeParse(new Set([1, 2])).error!.issues
|
|
91
|
+
).toMatchObject([{ code: "too_big" }]);
|
|
86
92
|
});
|
|
87
93
|
|
|
88
94
|
test("failing when set does not match size() ", () => {
|
|
@@ -1551,6 +1551,12 @@ function generateNullableCheck(
|
|
|
1551
1551
|
return outputVar;
|
|
1552
1552
|
}
|
|
1553
1553
|
|
|
1554
|
+
function generateSizeGate(doc: Doc, schema: SomeType, size: string): void {
|
|
1555
|
+
for (const [max, check] of util.sizeCaps(schema._zod.def.checks)) {
|
|
1556
|
+
doc.write(`if (${size} > ${numericOperand(max, check._zod.def.check)}) return INVALID;`);
|
|
1557
|
+
}
|
|
1558
|
+
}
|
|
1559
|
+
|
|
1554
1560
|
function generateArrayCheck(
|
|
1555
1561
|
doc: Doc,
|
|
1556
1562
|
ctx: CompileContext,
|
|
@@ -1560,6 +1566,7 @@ function generateArrayCheck(
|
|
|
1560
1566
|
): string | null {
|
|
1561
1567
|
const def = schema._zod.def as unknown as { element: SomeType };
|
|
1562
1568
|
doc.write(`if (!Array.isArray(${accessor})) return INVALID;`);
|
|
1569
|
+
generateSizeGate(doc, schema, `${accessor}.length`);
|
|
1563
1570
|
|
|
1564
1571
|
// Build a new array with validated/transformed elements.
|
|
1565
1572
|
const outputVar = buildsValue ? newVar(ctx) : null;
|
|
@@ -2094,6 +2101,7 @@ function generateMapCheck(doc: Doc, ctx: CompileContext, schema: SomeType, acces
|
|
|
2094
2101
|
const def = schema._zod.def as unknown as { keyType: SomeType; valueType: SomeType };
|
|
2095
2102
|
|
|
2096
2103
|
doc.write(`if (!(${accessor} instanceof Map)) return INVALID;`);
|
|
2104
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
2097
2105
|
|
|
2098
2106
|
const outputVar = newVar(ctx);
|
|
2099
2107
|
const kVar = newVar(ctx);
|
|
@@ -2115,6 +2123,7 @@ function generateSetCheck(doc: Doc, ctx: CompileContext, schema: SomeType, acces
|
|
|
2115
2123
|
const def = schema._zod.def as unknown as { valueType: SomeType };
|
|
2116
2124
|
|
|
2117
2125
|
doc.write(`if (!(${accessor} instanceof Set)) return INVALID;`);
|
|
2126
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
2118
2127
|
|
|
2119
2128
|
const outputVar = newVar(ctx);
|
|
2120
2129
|
const valVar = newVar(ctx);
|
|
@@ -1844,6 +1844,34 @@ export interface $ZodArrayInternals<T extends SomeType = $ZodType> extends _$Zod
|
|
|
1844
1844
|
|
|
1845
1845
|
export interface $ZodArray<T extends SomeType = $ZodType> extends $ZodType<any, any, $ZodArrayInternals<T>> {}
|
|
1846
1846
|
|
|
1847
|
+
// an oversized container fails its leading size checks before any element is parsed
|
|
1848
|
+
function capSize(inst: $ZodType, size: (input: any) => number): void {
|
|
1849
|
+
const caps = util.sizeCaps(inst._zod.def.checks);
|
|
1850
|
+
if (!caps.length) return;
|
|
1851
|
+
const cap = Math.min(...caps.map((c) => c[0]));
|
|
1852
|
+
const parse = inst._zod.parse;
|
|
1853
|
+
inst._zod.parse = (payload, ctx) => {
|
|
1854
|
+
const n = size(payload.value);
|
|
1855
|
+
if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
|
|
1856
|
+
for (const [max, ch] of util.sizeCaps(inst._zod.def.checks)) {
|
|
1857
|
+
if (n > max && ch._zod.def.when!(payload)) {
|
|
1858
|
+
const start = payload.issues.length;
|
|
1859
|
+
ch._zod.check(payload as ParsePayload<never>);
|
|
1860
|
+
// the value is still the raw input, so no later check may read it
|
|
1861
|
+
(payload.issues[start] as { continue?: boolean }).continue = false;
|
|
1862
|
+
util.attachSchema(payload.issues, start, inst);
|
|
1863
|
+
return payload;
|
|
1864
|
+
}
|
|
1865
|
+
}
|
|
1866
|
+
}
|
|
1867
|
+
return parse(payload, ctx);
|
|
1868
|
+
};
|
|
1869
|
+
}
|
|
1870
|
+
|
|
1871
|
+
const arraySize = (input: unknown): number => (Array.isArray(input) ? input.length : -1);
|
|
1872
|
+
const mapSize = (input: unknown): number => (input instanceof Map ? input.size : -1);
|
|
1873
|
+
const setSize = (input: unknown): number => (input instanceof Set ? input.size : -1);
|
|
1874
|
+
|
|
1847
1875
|
function handleArrayResult(result: ParsePayload<any>, final: ParsePayload<any[]>, index: number) {
|
|
1848
1876
|
if (result.issues.length) {
|
|
1849
1877
|
final.issues.push(...util.prefixIssues(index, result.issues));
|
|
@@ -1899,6 +1927,7 @@ export const $ZodArray: core.$constructor<$ZodArray> = /*@__PURE__*/ core.$const
|
|
|
1899
1927
|
|
|
1900
1928
|
return payload; //handleArrayResultsAsync(parseResults, final);
|
|
1901
1929
|
};
|
|
1930
|
+
capSize(inst, arraySize);
|
|
1902
1931
|
});
|
|
1903
1932
|
|
|
1904
1933
|
//////////////////////////////////////////
|
|
@@ -3218,8 +3247,11 @@ export type $InferZodRecordInput<
|
|
|
3218
3247
|
: Record<core.input<Key> & PropertyKey, core.input<Value>>;
|
|
3219
3248
|
|
|
3220
3249
|
export interface $ZodRecordInternals<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType>
|
|
3221
|
-
extends $ZodTypeInternals
|
|
3250
|
+
extends $ZodTypeInternals {
|
|
3222
3251
|
def: $ZodRecordDef<Key, Value>;
|
|
3252
|
+
// members rather than base type arguments, which TypeScript 7.1 reports as circular for `z.json()`
|
|
3253
|
+
output: $InferZodRecordOutput<Key, Value>;
|
|
3254
|
+
input: $InferZodRecordInput<Key, Value>;
|
|
3223
3255
|
isst: errors.$ZodIssueInvalidType | errors.$ZodIssueInvalidKey<Record<PropertyKey, unknown>>;
|
|
3224
3256
|
optin?: "optional" | undefined;
|
|
3225
3257
|
optout?: "optional" | undefined;
|
|
@@ -3480,6 +3512,7 @@ export const $ZodMap: core.$constructor<$ZodMap> = /*@__PURE__*/ core.$construct
|
|
|
3480
3512
|
if (proms.length) return Promise.all(proms).then(() => payload);
|
|
3481
3513
|
return payload;
|
|
3482
3514
|
};
|
|
3515
|
+
capSize(inst, mapSize);
|
|
3483
3516
|
});
|
|
3484
3517
|
|
|
3485
3518
|
function handleMapResult(
|
|
@@ -3582,6 +3615,7 @@ export const $ZodSet: core.$constructor<$ZodSet> = /*@__PURE__*/ core.$construct
|
|
|
3582
3615
|
if (proms.length) return Promise.all(proms).then(() => payload);
|
|
3583
3616
|
return payload;
|
|
3584
3617
|
};
|
|
3618
|
+
capSize(inst, setSize);
|
|
3585
3619
|
});
|
|
3586
3620
|
|
|
3587
3621
|
function handleSetResult(result: ParsePayload, final: ParsePayload<Set<any>>) {
|
|
@@ -935,6 +935,19 @@ export function unwrapMessage(message: string | { message: string } | undefined
|
|
|
935
935
|
}
|
|
936
936
|
|
|
937
937
|
/* A check holds no link back to the schema it is attached to — the same check instance is shared by every clone of that schema — so the owner is stamped onto the issues a check just raised, at the only point where both are in scope. Runs on the failure path only; `start` is the issue count from before the check ran. */
|
|
938
|
+
/** The leading size checks of `defChecks` that set an upper bound, each paired with it. */
|
|
939
|
+
export function sizeCaps(defChecks: checks.$ZodCheck<never>[] | undefined): [number, checks.$ZodCheck<never>][] {
|
|
940
|
+
const caps: [number, checks.$ZodCheck<never>][] = [];
|
|
941
|
+
for (const ch of defChecks ?? []) {
|
|
942
|
+
const d = ch._zod.def as any;
|
|
943
|
+
// a later check may rewrite the value
|
|
944
|
+
if (!/_(length|size)$|_equals$/.test(d.check)) break;
|
|
945
|
+
const max = d.maximum ?? d.length ?? d.size;
|
|
946
|
+
if (max >= 0) caps.push([max, ch]);
|
|
947
|
+
}
|
|
948
|
+
return caps;
|
|
949
|
+
}
|
|
950
|
+
|
|
938
951
|
export function attachSchema(issues: errors.$ZodRawIssue[], start: number, inst: schemas.$ZodType): void {
|
|
939
952
|
for (let i = start; i < issues.length; i++) {
|
|
940
953
|
(issues[i] as any).schema ??= inst;
|
|
@@ -1241,9 +1241,15 @@ function generateNullableCheck(doc, ctx, schema, accessor, buildsValue = true) {
|
|
|
1241
1241
|
doc.write(`}`);
|
|
1242
1242
|
return outputVar;
|
|
1243
1243
|
}
|
|
1244
|
+
function generateSizeGate(doc, schema, size) {
|
|
1245
|
+
for (const [max, check] of util.sizeCaps(schema._zod.def.checks)) {
|
|
1246
|
+
doc.write(`if (${size} > ${numericOperand(max, check._zod.def.check)}) return INVALID;`);
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1244
1249
|
function generateArrayCheck(doc, ctx, schema, accessor, buildsValue = true) {
|
|
1245
1250
|
const def = schema._zod.def;
|
|
1246
1251
|
doc.write(`if (!Array.isArray(${accessor})) return INVALID;`);
|
|
1252
|
+
generateSizeGate(doc, schema, `${accessor}.length`);
|
|
1247
1253
|
// Build a new array with validated/transformed elements.
|
|
1248
1254
|
const outputVar = buildsValue ? newVar(ctx) : null;
|
|
1249
1255
|
const iVar = newVar(ctx);
|
|
@@ -1707,6 +1713,7 @@ function literalPropertyKey(ctx, key) {
|
|
|
1707
1713
|
function generateMapCheck(doc, ctx, schema, accessor) {
|
|
1708
1714
|
const def = schema._zod.def;
|
|
1709
1715
|
doc.write(`if (!(${accessor} instanceof Map)) return INVALID;`);
|
|
1716
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
1710
1717
|
const outputVar = newVar(ctx);
|
|
1711
1718
|
const kVar = newVar(ctx);
|
|
1712
1719
|
const valVar = newVar(ctx);
|
|
@@ -1723,6 +1730,7 @@ function generateMapCheck(doc, ctx, schema, accessor) {
|
|
|
1723
1730
|
function generateSetCheck(doc, ctx, schema, accessor) {
|
|
1724
1731
|
const def = schema._zod.def;
|
|
1725
1732
|
doc.write(`if (!(${accessor} instanceof Set)) return INVALID;`);
|
|
1733
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
1726
1734
|
const outputVar = newVar(ctx);
|
|
1727
1735
|
const valVar = newVar(ctx);
|
|
1728
1736
|
doc.write(`const ${outputVar} = new Set();`);
|
|
@@ -1210,9 +1210,15 @@ function generateNullableCheck(doc, ctx, schema, accessor, buildsValue = true) {
|
|
|
1210
1210
|
doc.write(`}`);
|
|
1211
1211
|
return outputVar;
|
|
1212
1212
|
}
|
|
1213
|
+
function generateSizeGate(doc, schema, size) {
|
|
1214
|
+
for (const [max, check] of util.sizeCaps(schema._zod.def.checks)) {
|
|
1215
|
+
doc.write(`if (${size} > ${numericOperand(max, check._zod.def.check)}) return INVALID;`);
|
|
1216
|
+
}
|
|
1217
|
+
}
|
|
1213
1218
|
function generateArrayCheck(doc, ctx, schema, accessor, buildsValue = true) {
|
|
1214
1219
|
const def = schema._zod.def;
|
|
1215
1220
|
doc.write(`if (!Array.isArray(${accessor})) return INVALID;`);
|
|
1221
|
+
generateSizeGate(doc, schema, `${accessor}.length`);
|
|
1216
1222
|
// Build a new array with validated/transformed elements.
|
|
1217
1223
|
const outputVar = buildsValue ? newVar(ctx) : null;
|
|
1218
1224
|
const iVar = newVar(ctx);
|
|
@@ -1676,6 +1682,7 @@ function literalPropertyKey(ctx, key) {
|
|
|
1676
1682
|
function generateMapCheck(doc, ctx, schema, accessor) {
|
|
1677
1683
|
const def = schema._zod.def;
|
|
1678
1684
|
doc.write(`if (!(${accessor} instanceof Map)) return INVALID;`);
|
|
1685
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
1679
1686
|
const outputVar = newVar(ctx);
|
|
1680
1687
|
const kVar = newVar(ctx);
|
|
1681
1688
|
const valVar = newVar(ctx);
|
|
@@ -1692,6 +1699,7 @@ function generateMapCheck(doc, ctx, schema, accessor) {
|
|
|
1692
1699
|
function generateSetCheck(doc, ctx, schema, accessor) {
|
|
1693
1700
|
const def = schema._zod.def;
|
|
1694
1701
|
doc.write(`if (!(${accessor} instanceof Set)) return INVALID;`);
|
|
1702
|
+
generateSizeGate(doc, schema, `${accessor}.size`);
|
|
1695
1703
|
const outputVar = newVar(ctx);
|
|
1696
1704
|
const valVar = newVar(ctx);
|
|
1697
1705
|
doc.write(`const ${outputVar} = new Set();`);
|
|
@@ -860,6 +860,33 @@ exports.$ZodDate = core.$constructor("$ZodDate", (inst, def) => {
|
|
|
860
860
|
return payload;
|
|
861
861
|
};
|
|
862
862
|
});
|
|
863
|
+
// an oversized container fails its leading size checks before any element is parsed
|
|
864
|
+
function capSize(inst, size) {
|
|
865
|
+
const caps = util.sizeCaps(inst._zod.def.checks);
|
|
866
|
+
if (!caps.length)
|
|
867
|
+
return;
|
|
868
|
+
const cap = Math.min(...caps.map((c) => c[0]));
|
|
869
|
+
const parse = inst._zod.parse;
|
|
870
|
+
inst._zod.parse = (payload, ctx) => {
|
|
871
|
+
const n = size(payload.value);
|
|
872
|
+
if (n > cap && !ctx?.skipChecks && ctx?.direction !== "backward") {
|
|
873
|
+
for (const [max, ch] of util.sizeCaps(inst._zod.def.checks)) {
|
|
874
|
+
if (n > max && ch._zod.def.when(payload)) {
|
|
875
|
+
const start = payload.issues.length;
|
|
876
|
+
ch._zod.check(payload);
|
|
877
|
+
// the value is still the raw input, so no later check may read it
|
|
878
|
+
payload.issues[start].continue = false;
|
|
879
|
+
util.attachSchema(payload.issues, start, inst);
|
|
880
|
+
return payload;
|
|
881
|
+
}
|
|
882
|
+
}
|
|
883
|
+
}
|
|
884
|
+
return parse(payload, ctx);
|
|
885
|
+
};
|
|
886
|
+
}
|
|
887
|
+
const arraySize = (input) => (Array.isArray(input) ? input.length : -1);
|
|
888
|
+
const mapSize = (input) => (input instanceof Map ? input.size : -1);
|
|
889
|
+
const setSize = (input) => (input instanceof Set ? input.size : -1);
|
|
863
890
|
function handleArrayResult(result, final, index) {
|
|
864
891
|
if (result.issues.length) {
|
|
865
892
|
final.issues.push(...util.prefixIssues(index, result.issues));
|
|
@@ -905,6 +932,7 @@ exports.$ZodArray = core.$constructor("$ZodArray", (inst, def) => {
|
|
|
905
932
|
}
|
|
906
933
|
return payload; //handleArrayResultsAsync(parseResults, final);
|
|
907
934
|
};
|
|
935
|
+
capSize(inst, arraySize);
|
|
908
936
|
});
|
|
909
937
|
function handlePropertyResult(result, final, key, input, optin, optout) {
|
|
910
938
|
const isPresent = key in input;
|
|
@@ -1942,6 +1970,7 @@ exports.$ZodMap = core.$constructor("$ZodMap", (inst, def) => {
|
|
|
1942
1970
|
return Promise.all(proms).then(() => payload);
|
|
1943
1971
|
return payload;
|
|
1944
1972
|
};
|
|
1973
|
+
capSize(inst, mapSize);
|
|
1945
1974
|
});
|
|
1946
1975
|
function handleMapResult(keyResult, valueResult, final, key, input, inst, ctx) {
|
|
1947
1976
|
if (keyResult.issues.length) {
|
|
@@ -2011,6 +2040,7 @@ exports.$ZodSet = core.$constructor("$ZodSet", (inst, def) => {
|
|
|
2011
2040
|
return Promise.all(proms).then(() => payload);
|
|
2012
2041
|
return payload;
|
|
2013
2042
|
};
|
|
2043
|
+
capSize(inst, setSize);
|
|
2014
2044
|
});
|
|
2015
2045
|
function handleSetResult(result, final) {
|
|
2016
2046
|
if (result.issues.length) {
|
|
@@ -834,8 +834,10 @@ export type $InferZodRecordOutput<Key extends $ZodRecordKey = $ZodRecordKey, Val
|
|
|
834
834
|
export type $InferZodRecordInput<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> = Key extends $partial ? Partial<Record<core.input<Key> & PropertyKey, core.input<Value>>> : [
|
|
835
835
|
Value
|
|
836
836
|
] extends [OptionalInSchema] ? Partial<Record<core.input<Key> & PropertyKey, core.input<Value>>> : Record<core.input<Key> & PropertyKey, core.input<Value>>;
|
|
837
|
-
export interface $ZodRecordInternals<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> extends $ZodTypeInternals
|
|
837
|
+
export interface $ZodRecordInternals<Key extends $ZodRecordKey = $ZodRecordKey, Value extends SomeType = $ZodType> extends $ZodTypeInternals {
|
|
838
838
|
def: $ZodRecordDef<Key, Value>;
|
|
839
|
+
output: $InferZodRecordOutput<Key, Value>;
|
|
840
|
+
input: $InferZodRecordInput<Key, Value>;
|
|
839
841
|
isst: errors.$ZodIssueInvalidType | errors.$ZodIssueInvalidKey<Record<PropertyKey, unknown>>;
|
|
840
842
|
optin?: "optional" | undefined;
|
|
841
843
|
optout?: "optional" | undefined;
|