@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.
Files changed (33) hide show
  1. package/.jsii +883 -183
  2. package/README.md +65 -0
  3. package/docs/AGENTS_DOCUMENTATION.md +20 -203
  4. package/lib/fargate/datadog.d.ts +4 -1
  5. package/lib/fargate/datadog.js +6 -3
  6. package/lib/fargate/rio-fargate-service-blue-green-alpha.js +6 -1
  7. package/lib/fargate/rio-fargate-service.d.ts +22 -1
  8. package/lib/fargate/rio-fargate-service.js +11 -2
  9. package/lib/fargate/trace-sampling.d.ts +87 -0
  10. package/lib/fargate/trace-sampling.js +123 -0
  11. package/lib/sbom-catalog/lambda/handler.cjs +38 -1
  12. package/node_modules/zod/package.json +1 -1
  13. package/node_modules/zod/src/v4/classic/tests/array.test.ts +27 -0
  14. package/node_modules/zod/src/v4/classic/tests/map.test.ts +7 -0
  15. package/node_modules/zod/src/v4/classic/tests/set.test.ts +6 -0
  16. package/node_modules/zod/src/v4/core/compile.ts +9 -0
  17. package/node_modules/zod/src/v4/core/schemas.ts +35 -1
  18. package/node_modules/zod/src/v4/core/util.ts +13 -0
  19. package/node_modules/zod/src/v4/core/versions.ts +1 -1
  20. package/node_modules/zod/v4/core/compile.cjs +8 -0
  21. package/node_modules/zod/v4/core/compile.js +8 -0
  22. package/node_modules/zod/v4/core/schemas.cjs +30 -0
  23. package/node_modules/zod/v4/core/schemas.d.cts +3 -1
  24. package/node_modules/zod/v4/core/schemas.d.ts +3 -1
  25. package/node_modules/zod/v4/core/schemas.js +30 -0
  26. package/node_modules/zod/v4/core/util.cjs +15 -0
  27. package/node_modules/zod/v4/core/util.d.cts +2 -0
  28. package/node_modules/zod/v4/core/util.d.ts +2 -0
  29. package/node_modules/zod/v4/core/util.js +14 -0
  30. package/node_modules/zod/v4/core/versions.cjs +1 -1
  31. package/node_modules/zod/v4/core/versions.js +1 -1
  32. package/package.json +1 -1
  33. 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: 5
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;
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zod",
3
- "version": "4.6.5",
3
+ "version": "4.6.7",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "author": "Colin McDonnell <zod@colinhacks.com>",
@@ -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<$InferZodRecordOutput<Key, Value>, $InferZodRecordInput<Key, Value>> {
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;
@@ -1,5 +1,5 @@
1
1
  export const version = {
2
2
  major: 4,
3
3
  minor: 6,
4
- patch: 5 as number,
4
+ patch: 7 as number,
5
5
  } as const;
@@ -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<$InferZodRecordOutput<Key, Value>, $InferZodRecordInput<Key, Value>> {
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;