@tambo-ai/react 0.68.0 → 0.69.1
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/README.md +1 -1
- package/dist/context-helpers/context-helpers.test.js +16 -4
- package/dist/context-helpers/context-helpers.test.js.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/dist/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/dist/context-helpers/current-interactables-context-helper.js +31 -15
- package/dist/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/dist/context-helpers/registry.d.ts +2 -2
- package/dist/context-helpers/registry.d.ts.map +1 -1
- package/dist/context-helpers/registry.js.map +1 -1
- package/dist/context-helpers/types.d.ts +2 -2
- package/dist/context-helpers/types.d.ts.map +1 -1
- package/dist/context-helpers/types.js.map +1 -1
- package/dist/hooks/use-message-images.test.js +174 -37
- package/dist/hooks/use-message-images.test.js.map +1 -1
- package/dist/hooks/use-tambo-voice.d.ts +1 -1
- package/dist/hooks/use-tambo-voice.js +1 -1
- package/dist/hooks/use-tambo-voice.js.map +1 -1
- package/dist/hooks/use-tambo-voice.test.d.ts +2 -0
- package/dist/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/dist/hooks/use-tambo-voice.test.js +239 -0
- package/dist/hooks/use-tambo-voice.test.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/elicitation.d.ts.map +1 -1
- package/dist/mcp/elicitation.js +12 -0
- package/dist/mcp/elicitation.js.map +1 -1
- package/dist/mcp/elicitation.test.js +8 -1
- package/dist/mcp/elicitation.test.js.map +1 -1
- package/dist/mcp/mcp-client.d.ts +6 -10
- package/dist/mcp/mcp-client.d.ts.map +1 -1
- package/dist/mcp/mcp-client.js.map +1 -1
- package/dist/mcp/mcp-hooks.d.ts +12 -60
- package/dist/mcp/mcp-hooks.d.ts.map +1 -1
- package/dist/mcp/mcp-hooks.js +90 -10
- package/dist/mcp/mcp-hooks.js.map +1 -1
- package/dist/mcp/mcp-hooks.test.js +423 -0
- package/dist/mcp/mcp-hooks.test.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/dist/mcp/tambo-mcp-provider.js +3 -0
- package/dist/mcp/tambo-mcp-provider.js.map +1 -1
- package/dist/mcp/tambo-mcp-provider.test.js +37 -0
- package/dist/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/dist/model/component-metadata.d.ts +53 -20
- package/dist/model/component-metadata.d.ts.map +1 -1
- package/dist/model/component-metadata.js.map +1 -1
- package/dist/model/tambo-interactable.d.ts +6 -0
- package/dist/model/tambo-interactable.d.ts.map +1 -1
- package/dist/model/tambo-interactable.js.map +1 -1
- package/dist/providers/index.d.ts +1 -1
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/tambo-client-provider.d.ts +8 -0
- package/dist/providers/tambo-client-provider.d.ts.map +1 -1
- package/dist/providers/tambo-client-provider.js +10 -11
- package/dist/providers/tambo-client-provider.js.map +1 -1
- package/dist/providers/tambo-client-provider.test.d.ts +2 -0
- package/dist/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/dist/providers/tambo-client-provider.test.js +208 -0
- package/dist/providers/tambo-client-provider.test.js.map +1 -0
- package/dist/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/dist/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.js +62 -105
- package/dist/providers/tambo-context-attachment-provider.js.map +1 -1
- package/dist/providers/tambo-context-attachment-provider.test.js +229 -463
- package/dist/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.d.ts +2 -0
- package/dist/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/dist/providers/tambo-interactable-provider.js +29 -4
- package/dist/providers/tambo-interactable-provider.js.map +1 -1
- package/dist/providers/tambo-interactable-provider.test.js +1 -1
- package/dist/providers/tambo-interactable-provider.test.js.map +1 -1
- package/dist/providers/tambo-interactables-additional-context.test.js +2 -5
- package/dist/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/dist/providers/tambo-provider.d.ts +2 -3
- package/dist/providers/tambo-provider.d.ts.map +1 -1
- package/dist/providers/tambo-provider.js +5 -6
- package/dist/providers/tambo-provider.js.map +1 -1
- package/dist/providers/tambo-registry-provider.test.js +16 -0
- package/dist/providers/tambo-registry-provider.test.js.map +1 -1
- package/dist/providers/tambo-registry-schema-compat.test.js +31 -0
- package/dist/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts +1 -1
- package/dist/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-input-provider.js +5 -1
- package/dist/providers/tambo-thread-input-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/dist/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/dist/providers/tambo-thread-provider.d.ts.map +1 -1
- package/dist/providers/tambo-thread-provider.js +56 -43
- package/dist/providers/tambo-thread-provider.js.map +1 -1
- package/dist/providers/tambo-thread-provider.test.js +456 -262
- package/dist/providers/tambo-thread-provider.test.js.map +1 -1
- package/dist/schema/json-schema.js +29 -29
- package/dist/schema/json-schema.js.map +1 -1
- package/dist/schema/schema.test.js +237 -0
- package/dist/schema/schema.test.js.map +1 -1
- package/dist/schema/standard-schema.d.ts +1 -0
- package/dist/schema/standard-schema.d.ts.map +1 -1
- package/dist/schema/standard-schema.js +18 -13
- package/dist/schema/standard-schema.js.map +1 -1
- package/dist/schema/standard-schema.test.d.ts +2 -0
- package/dist/schema/standard-schema.test.d.ts.map +1 -0
- package/dist/schema/standard-schema.test.js +165 -0
- package/dist/schema/standard-schema.test.js.map +1 -0
- package/dist/schema/validate.test.js +149 -0
- package/dist/schema/validate.test.js.map +1 -1
- package/dist/schema/zod.d.ts +7 -4
- package/dist/schema/zod.d.ts.map +1 -1
- package/dist/schema/zod.js +65 -22
- package/dist/schema/zod.js.map +1 -1
- package/dist/schema/zod.test.js +112 -0
- package/dist/schema/zod.test.js.map +1 -1
- package/dist/testing/tools.d.ts +4 -1
- package/dist/testing/tools.d.ts.map +1 -1
- package/dist/testing/tools.js +6 -1
- package/dist/testing/tools.js.map +1 -1
- package/dist/util/generate-component.d.ts.map +1 -1
- package/dist/util/generate-component.js +18 -3
- package/dist/util/generate-component.js.map +1 -1
- package/dist/util/generate-component.test.d.ts +2 -0
- package/dist/util/generate-component.test.d.ts.map +1 -0
- package/dist/util/generate-component.test.js +340 -0
- package/dist/util/generate-component.test.js.map +1 -0
- package/dist/util/is-promise.d.ts +9 -0
- package/dist/util/is-promise.d.ts.map +1 -0
- package/dist/util/is-promise.js +20 -0
- package/dist/util/is-promise.js.map +1 -0
- package/dist/util/is-promise.test.d.ts +2 -0
- package/dist/util/is-promise.test.d.ts.map +1 -0
- package/dist/util/is-promise.test.js +48 -0
- package/dist/util/is-promise.test.js.map +1 -0
- package/dist/util/query-utils.test.d.ts +2 -0
- package/dist/util/query-utils.test.d.ts.map +1 -0
- package/dist/util/query-utils.test.js +382 -0
- package/dist/util/query-utils.test.js.map +1 -0
- package/dist/util/registry-validators.d.ts.map +1 -1
- package/dist/util/registry-validators.js +7 -0
- package/dist/util/registry-validators.js.map +1 -1
- package/dist/util/registry-validators.test.js +57 -0
- package/dist/util/registry-validators.test.js.map +1 -1
- package/dist/util/registry.d.ts.map +1 -1
- package/dist/util/registry.js +9 -0
- package/dist/util/registry.js.map +1 -1
- package/dist/util/registry.test.js +323 -1
- package/dist/util/registry.test.js.map +1 -1
- package/dist/util/resource-validators.test.d.ts +2 -0
- package/dist/util/resource-validators.test.d.ts.map +1 -0
- package/dist/util/resource-validators.test.js +90 -0
- package/dist/util/resource-validators.test.js.map +1 -0
- package/dist/util/tool-caller.d.ts +2 -2
- package/dist/util/tool-caller.d.ts.map +1 -1
- package/dist/util/tool-caller.js +8 -8
- package/dist/util/tool-caller.js.map +1 -1
- package/dist/util/validate-component-name.test.d.ts +2 -0
- package/dist/util/validate-component-name.test.d.ts.map +1 -0
- package/dist/util/validate-component-name.test.js +35 -0
- package/dist/util/validate-component-name.test.js.map +1 -0
- package/esm/context-helpers/context-helpers.test.js +16 -4
- package/esm/context-helpers/context-helpers.test.js.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.d.ts +2 -2
- package/esm/context-helpers/current-interactables-context-helper.d.ts.map +1 -1
- package/esm/context-helpers/current-interactables-context-helper.js +31 -15
- package/esm/context-helpers/current-interactables-context-helper.js.map +1 -1
- package/esm/context-helpers/registry.d.ts +2 -2
- package/esm/context-helpers/registry.d.ts.map +1 -1
- package/esm/context-helpers/registry.js.map +1 -1
- package/esm/context-helpers/types.d.ts +2 -2
- package/esm/context-helpers/types.d.ts.map +1 -1
- package/esm/context-helpers/types.js.map +1 -1
- package/esm/hooks/use-message-images.test.js +174 -37
- package/esm/hooks/use-message-images.test.js.map +1 -1
- package/esm/hooks/use-tambo-voice.d.ts +1 -1
- package/esm/hooks/use-tambo-voice.js +1 -1
- package/esm/hooks/use-tambo-voice.js.map +1 -1
- package/esm/hooks/use-tambo-voice.test.d.ts +2 -0
- package/esm/hooks/use-tambo-voice.test.d.ts.map +1 -0
- package/esm/hooks/use-tambo-voice.test.js +234 -0
- package/esm/hooks/use-tambo-voice.test.js.map +1 -0
- package/esm/index.d.ts +2 -2
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js.map +1 -1
- package/esm/mcp/elicitation.d.ts.map +1 -1
- package/esm/mcp/elicitation.js +12 -0
- package/esm/mcp/elicitation.js.map +1 -1
- package/esm/mcp/elicitation.test.js +8 -1
- package/esm/mcp/elicitation.test.js.map +1 -1
- package/esm/mcp/mcp-client.d.ts +6 -10
- package/esm/mcp/mcp-client.d.ts.map +1 -1
- package/esm/mcp/mcp-client.js.map +1 -1
- package/esm/mcp/mcp-hooks.d.ts +12 -60
- package/esm/mcp/mcp-hooks.d.ts.map +1 -1
- package/esm/mcp/mcp-hooks.js +57 -10
- package/esm/mcp/mcp-hooks.js.map +1 -1
- package/esm/mcp/mcp-hooks.test.js +423 -0
- package/esm/mcp/mcp-hooks.test.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.d.ts.map +1 -1
- package/esm/mcp/tambo-mcp-provider.js +3 -0
- package/esm/mcp/tambo-mcp-provider.js.map +1 -1
- package/esm/mcp/tambo-mcp-provider.test.js +37 -0
- package/esm/mcp/tambo-mcp-provider.test.js.map +1 -1
- package/esm/model/component-metadata.d.ts +53 -20
- package/esm/model/component-metadata.d.ts.map +1 -1
- package/esm/model/component-metadata.js.map +1 -1
- package/esm/model/tambo-interactable.d.ts +6 -0
- package/esm/model/tambo-interactable.d.ts.map +1 -1
- package/esm/model/tambo-interactable.js.map +1 -1
- package/esm/providers/index.d.ts +1 -1
- package/esm/providers/index.d.ts.map +1 -1
- package/esm/providers/index.js.map +1 -1
- package/esm/providers/tambo-client-provider.d.ts +8 -0
- package/esm/providers/tambo-client-provider.d.ts.map +1 -1
- package/esm/providers/tambo-client-provider.js +11 -12
- package/esm/providers/tambo-client-provider.js.map +1 -1
- package/esm/providers/tambo-client-provider.test.d.ts +2 -0
- package/esm/providers/tambo-client-provider.test.d.ts.map +1 -0
- package/esm/providers/tambo-client-provider.test.js +203 -0
- package/esm/providers/tambo-client-provider.test.js.map +1 -0
- package/esm/providers/tambo-context-attachment-provider.d.ts +34 -92
- package/esm/providers/tambo-context-attachment-provider.d.ts.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.js +63 -106
- package/esm/providers/tambo-context-attachment-provider.js.map +1 -1
- package/esm/providers/tambo-context-attachment-provider.test.js +230 -464
- package/esm/providers/tambo-context-attachment-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.d.ts +2 -0
- package/esm/providers/tambo-interactable-provider.d.ts.map +1 -1
- package/esm/providers/tambo-interactable-provider.js +29 -4
- package/esm/providers/tambo-interactable-provider.js.map +1 -1
- package/esm/providers/tambo-interactable-provider.test.js +1 -1
- package/esm/providers/tambo-interactable-provider.test.js.map +1 -1
- package/esm/providers/tambo-interactables-additional-context.test.js +2 -5
- package/esm/providers/tambo-interactables-additional-context.test.js.map +1 -1
- package/esm/providers/tambo-provider.d.ts +2 -3
- package/esm/providers/tambo-provider.d.ts.map +1 -1
- package/esm/providers/tambo-provider.js +5 -6
- package/esm/providers/tambo-provider.js.map +1 -1
- package/esm/providers/tambo-registry-provider.test.js +16 -0
- package/esm/providers/tambo-registry-provider.test.js.map +1 -1
- package/esm/providers/tambo-registry-schema-compat.test.js +31 -0
- package/esm/providers/tambo-registry-schema-compat.test.js.map +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts +1 -1
- package/esm/providers/tambo-thread-input-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-input-provider.js +5 -1
- package/esm/providers/tambo-thread-input-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider-initial-messages.test.js +84 -2
- package/esm/providers/tambo-thread-provider-initial-messages.test.js.map +1 -1
- package/esm/providers/tambo-thread-provider.d.ts.map +1 -1
- package/esm/providers/tambo-thread-provider.js +56 -43
- package/esm/providers/tambo-thread-provider.js.map +1 -1
- package/esm/providers/tambo-thread-provider.test.js +456 -262
- package/esm/providers/tambo-thread-provider.test.js.map +1 -1
- package/esm/schema/json-schema.js +1 -1
- package/esm/schema/json-schema.js.map +1 -1
- package/esm/schema/schema.test.js +238 -1
- package/esm/schema/schema.test.js.map +1 -1
- package/esm/schema/standard-schema.d.ts +1 -0
- package/esm/schema/standard-schema.d.ts.map +1 -1
- package/esm/schema/standard-schema.js +18 -13
- package/esm/schema/standard-schema.js.map +1 -1
- package/esm/schema/standard-schema.test.d.ts +2 -0
- package/esm/schema/standard-schema.test.d.ts.map +1 -0
- package/esm/schema/standard-schema.test.js +130 -0
- package/esm/schema/standard-schema.test.js.map +1 -0
- package/esm/schema/validate.test.js +149 -0
- package/esm/schema/validate.test.js.map +1 -1
- package/esm/schema/zod.d.ts +7 -4
- package/esm/schema/zod.d.ts.map +1 -1
- package/esm/schema/zod.js +65 -22
- package/esm/schema/zod.js.map +1 -1
- package/esm/schema/zod.test.js +113 -1
- package/esm/schema/zod.test.js.map +1 -1
- package/esm/testing/tools.d.ts +4 -1
- package/esm/testing/tools.d.ts.map +1 -1
- package/esm/testing/tools.js +6 -1
- package/esm/testing/tools.js.map +1 -1
- package/esm/util/generate-component.d.ts.map +1 -1
- package/esm/util/generate-component.js +18 -3
- package/esm/util/generate-component.js.map +1 -1
- package/esm/util/generate-component.test.d.ts +2 -0
- package/esm/util/generate-component.test.d.ts.map +1 -0
- package/esm/util/generate-component.test.js +302 -0
- package/esm/util/generate-component.test.js.map +1 -0
- package/esm/util/is-promise.d.ts +9 -0
- package/esm/util/is-promise.d.ts.map +1 -0
- package/esm/util/is-promise.js +17 -0
- package/esm/util/is-promise.js.map +1 -0
- package/esm/util/is-promise.test.d.ts +2 -0
- package/esm/util/is-promise.test.d.ts.map +1 -0
- package/esm/util/is-promise.test.js +46 -0
- package/esm/util/is-promise.test.js.map +1 -0
- package/esm/util/query-utils.test.d.ts +2 -0
- package/esm/util/query-utils.test.d.ts.map +1 -0
- package/esm/util/query-utils.test.js +380 -0
- package/esm/util/query-utils.test.js.map +1 -0
- package/esm/util/registry-validators.d.ts.map +1 -1
- package/esm/util/registry-validators.js +7 -0
- package/esm/util/registry-validators.js.map +1 -1
- package/esm/util/registry-validators.test.js +57 -0
- package/esm/util/registry-validators.test.js.map +1 -1
- package/esm/util/registry.d.ts.map +1 -1
- package/esm/util/registry.js +9 -0
- package/esm/util/registry.js.map +1 -1
- package/esm/util/registry.test.js +324 -2
- package/esm/util/registry.test.js.map +1 -1
- package/esm/util/resource-validators.test.d.ts +2 -0
- package/esm/util/resource-validators.test.d.ts.map +1 -0
- package/esm/util/resource-validators.test.js +88 -0
- package/esm/util/resource-validators.test.js.map +1 -0
- package/esm/util/tool-caller.d.ts +2 -2
- package/esm/util/tool-caller.d.ts.map +1 -1
- package/esm/util/tool-caller.js +8 -8
- package/esm/util/tool-caller.js.map +1 -1
- package/esm/util/validate-component-name.test.d.ts +2 -0
- package/esm/util/validate-component-name.test.d.ts.map +1 -0
- package/esm/util/validate-component-name.test.js +33 -0
- package/esm/util/validate-component-name.test.js.map +1 -0
- package/package.json +15 -23
- package/dist/schema/alias.d.ts +0 -3
- package/dist/schema/alias.d.ts.map +0 -1
- package/dist/schema/alias.js +0 -6
- package/dist/schema/alias.js.map +0 -1
- package/esm/schema/alias.d.ts +0 -3
- package/esm/schema/alias.d.ts.map +0 -1
- package/esm/schema/alias.js +0 -13
- package/esm/schema/alias.js.map +0 -1
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const z3 = __importStar(require("zod/v3"));
|
|
37
|
+
const z4 = __importStar(require("zod/v4"));
|
|
38
|
+
const standard_schema_1 = require("./standard-schema");
|
|
39
|
+
describe("isStandardSchema", () => {
|
|
40
|
+
describe("returns true for valid Standard Schema implementations", () => {
|
|
41
|
+
it("recognizes Zod 4 object schema", () => {
|
|
42
|
+
const schema = z4.object({ name: z4.string() });
|
|
43
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
44
|
+
});
|
|
45
|
+
it("recognizes Zod 3 object schema", () => {
|
|
46
|
+
const schema = z3.object({ name: z3.string() });
|
|
47
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
it("recognizes Zod 4 string schema", () => {
|
|
50
|
+
const schema = z4.string();
|
|
51
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
52
|
+
});
|
|
53
|
+
it("recognizes Zod 3 string schema", () => {
|
|
54
|
+
const schema = z3.string();
|
|
55
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it("recognizes Zod 4 array schema", () => {
|
|
58
|
+
const schema = z4.array(z4.number());
|
|
59
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
60
|
+
});
|
|
61
|
+
it("recognizes Zod 3 array schema", () => {
|
|
62
|
+
const schema = z3.array(z3.number());
|
|
63
|
+
expect((0, standard_schema_1.isStandardSchema)(schema)).toBe(true);
|
|
64
|
+
});
|
|
65
|
+
it("recognizes custom object implementing Standard Schema v1", () => {
|
|
66
|
+
const customSchema = {
|
|
67
|
+
"~standard": {
|
|
68
|
+
version: 1,
|
|
69
|
+
vendor: "custom",
|
|
70
|
+
validate: () => ({ value: {} }),
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
expect((0, standard_schema_1.isStandardSchema)(customSchema)).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
describe("returns false for non-Standard Schema values", () => {
|
|
77
|
+
it("rejects null", () => {
|
|
78
|
+
expect((0, standard_schema_1.isStandardSchema)(null)).toBe(false);
|
|
79
|
+
});
|
|
80
|
+
it("rejects undefined", () => {
|
|
81
|
+
expect((0, standard_schema_1.isStandardSchema)(undefined)).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
it("rejects primitives", () => {
|
|
84
|
+
expect((0, standard_schema_1.isStandardSchema)("string")).toBe(false);
|
|
85
|
+
expect((0, standard_schema_1.isStandardSchema)(123)).toBe(false);
|
|
86
|
+
expect((0, standard_schema_1.isStandardSchema)(true)).toBe(false);
|
|
87
|
+
});
|
|
88
|
+
it("rejects plain objects without ~standard", () => {
|
|
89
|
+
expect((0, standard_schema_1.isStandardSchema)({ foo: "bar" })).toBe(false);
|
|
90
|
+
});
|
|
91
|
+
it("rejects JSON Schema objects", () => {
|
|
92
|
+
const jsonSchema = {
|
|
93
|
+
type: "object",
|
|
94
|
+
properties: { name: { type: "string" } },
|
|
95
|
+
};
|
|
96
|
+
expect((0, standard_schema_1.isStandardSchema)(jsonSchema)).toBe(false);
|
|
97
|
+
});
|
|
98
|
+
it("rejects objects with ~standard that is not an object", () => {
|
|
99
|
+
expect((0, standard_schema_1.isStandardSchema)({ "~standard": "invalid" })).toBe(false);
|
|
100
|
+
expect((0, standard_schema_1.isStandardSchema)({ "~standard": 123 })).toBe(false);
|
|
101
|
+
expect((0, standard_schema_1.isStandardSchema)({ "~standard": true })).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
it("rejects objects with ~standard that is null", () => {
|
|
104
|
+
expect((0, standard_schema_1.isStandardSchema)({ "~standard": null })).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
it("rejects objects with wrong version", () => {
|
|
107
|
+
const invalidVersion = {
|
|
108
|
+
"~standard": {
|
|
109
|
+
version: 2, // Wrong version
|
|
110
|
+
vendor: "custom",
|
|
111
|
+
validate: () => ({ value: {} }),
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
expect((0, standard_schema_1.isStandardSchema)(invalidVersion)).toBe(false);
|
|
115
|
+
});
|
|
116
|
+
it("rejects objects with missing version", () => {
|
|
117
|
+
const missingVersion = {
|
|
118
|
+
"~standard": {
|
|
119
|
+
vendor: "custom",
|
|
120
|
+
validate: () => ({ value: {} }),
|
|
121
|
+
},
|
|
122
|
+
};
|
|
123
|
+
expect((0, standard_schema_1.isStandardSchema)(missingVersion)).toBe(false);
|
|
124
|
+
});
|
|
125
|
+
it("rejects objects with non-string vendor", () => {
|
|
126
|
+
const invalidVendor = {
|
|
127
|
+
"~standard": {
|
|
128
|
+
version: 1,
|
|
129
|
+
vendor: 123, // Not a string
|
|
130
|
+
validate: () => ({ value: {} }),
|
|
131
|
+
},
|
|
132
|
+
};
|
|
133
|
+
expect((0, standard_schema_1.isStandardSchema)(invalidVendor)).toBe(false);
|
|
134
|
+
});
|
|
135
|
+
it("rejects objects with missing vendor", () => {
|
|
136
|
+
const missingVendor = {
|
|
137
|
+
"~standard": {
|
|
138
|
+
version: 1,
|
|
139
|
+
validate: () => ({ value: {} }),
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
expect((0, standard_schema_1.isStandardSchema)(missingVendor)).toBe(false);
|
|
143
|
+
});
|
|
144
|
+
it("rejects objects with non-function validate", () => {
|
|
145
|
+
const invalidValidate = {
|
|
146
|
+
"~standard": {
|
|
147
|
+
version: 1,
|
|
148
|
+
vendor: "custom",
|
|
149
|
+
validate: "not-a-function",
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
expect((0, standard_schema_1.isStandardSchema)(invalidValidate)).toBe(false);
|
|
153
|
+
});
|
|
154
|
+
it("rejects objects with missing validate", () => {
|
|
155
|
+
const missingValidate = {
|
|
156
|
+
"~standard": {
|
|
157
|
+
version: 1,
|
|
158
|
+
vendor: "custom",
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
expect((0, standard_schema_1.isStandardSchema)(missingValidate)).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
});
|
|
165
|
+
//# sourceMappingURL=standard-schema.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-schema.test.js","sourceRoot":"","sources":["../../src/schema/standard-schema.test.ts"],"names":[],"mappings":"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","sourcesContent":["import * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport { isStandardSchema } from \"./standard-schema\";\n\ndescribe(\"isStandardSchema\", () => {\n describe(\"returns true for valid Standard Schema implementations\", () => {\n it(\"recognizes Zod 4 object schema\", () => {\n const schema = z4.object({ name: z4.string() });\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes Zod 3 object schema\", () => {\n const schema = z3.object({ name: z3.string() });\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes Zod 4 string schema\", () => {\n const schema = z4.string();\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes Zod 3 string schema\", () => {\n const schema = z3.string();\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes Zod 4 array schema\", () => {\n const schema = z4.array(z4.number());\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes Zod 3 array schema\", () => {\n const schema = z3.array(z3.number());\n expect(isStandardSchema(schema)).toBe(true);\n });\n\n it(\"recognizes custom object implementing Standard Schema v1\", () => {\n const customSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"custom\",\n validate: () => ({ value: {} }),\n },\n };\n expect(isStandardSchema(customSchema)).toBe(true);\n });\n });\n\n describe(\"returns false for non-Standard Schema values\", () => {\n it(\"rejects null\", () => {\n expect(isStandardSchema(null)).toBe(false);\n });\n\n it(\"rejects undefined\", () => {\n expect(isStandardSchema(undefined)).toBe(false);\n });\n\n it(\"rejects primitives\", () => {\n expect(isStandardSchema(\"string\")).toBe(false);\n expect(isStandardSchema(123)).toBe(false);\n expect(isStandardSchema(true)).toBe(false);\n });\n\n it(\"rejects plain objects without ~standard\", () => {\n expect(isStandardSchema({ foo: \"bar\" })).toBe(false);\n });\n\n it(\"rejects JSON Schema objects\", () => {\n const jsonSchema = {\n type: \"object\",\n properties: { name: { type: \"string\" } },\n };\n expect(isStandardSchema(jsonSchema)).toBe(false);\n });\n\n it(\"rejects objects with ~standard that is not an object\", () => {\n expect(isStandardSchema({ \"~standard\": \"invalid\" })).toBe(false);\n expect(isStandardSchema({ \"~standard\": 123 })).toBe(false);\n expect(isStandardSchema({ \"~standard\": true })).toBe(false);\n });\n\n it(\"rejects objects with ~standard that is null\", () => {\n expect(isStandardSchema({ \"~standard\": null })).toBe(false);\n });\n\n it(\"rejects objects with wrong version\", () => {\n const invalidVersion = {\n \"~standard\": {\n version: 2, // Wrong version\n vendor: \"custom\",\n validate: () => ({ value: {} }),\n },\n };\n expect(isStandardSchema(invalidVersion)).toBe(false);\n });\n\n it(\"rejects objects with missing version\", () => {\n const missingVersion = {\n \"~standard\": {\n vendor: \"custom\",\n validate: () => ({ value: {} }),\n },\n };\n expect(isStandardSchema(missingVersion)).toBe(false);\n });\n\n it(\"rejects objects with non-string vendor\", () => {\n const invalidVendor = {\n \"~standard\": {\n version: 1,\n vendor: 123, // Not a string\n validate: () => ({ value: {} }),\n },\n };\n expect(isStandardSchema(invalidVendor)).toBe(false);\n });\n\n it(\"rejects objects with missing vendor\", () => {\n const missingVendor = {\n \"~standard\": {\n version: 1,\n validate: () => ({ value: {} }),\n },\n };\n expect(isStandardSchema(missingVendor)).toBe(false);\n });\n\n it(\"rejects objects with non-function validate\", () => {\n const invalidValidate = {\n \"~standard\": {\n version: 1,\n vendor: \"custom\",\n validate: \"not-a-function\",\n },\n };\n expect(isStandardSchema(invalidValidate)).toBe(false);\n });\n\n it(\"rejects objects with missing validate\", () => {\n const missingValidate = {\n \"~standard\": {\n version: 1,\n vendor: \"custom\",\n },\n };\n expect(isStandardSchema(missingValidate)).toBe(false);\n });\n });\n});\n"]}
|
|
@@ -3,6 +3,54 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const v4_1 = require("zod/v4");
|
|
4
4
|
const validate_1 = require("./validate");
|
|
5
5
|
describe("assertNoRecordSchema", () => {
|
|
6
|
+
describe("falsy inputs", () => {
|
|
7
|
+
it("should return early for null", () => {
|
|
8
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(null)).not.toThrow();
|
|
9
|
+
});
|
|
10
|
+
it("should return early for undefined", () => {
|
|
11
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(undefined)).not.toThrow();
|
|
12
|
+
});
|
|
13
|
+
it("should return early for empty string", () => {
|
|
14
|
+
expect(() => (0, validate_1.assertNoRecordSchema)("")).not.toThrow();
|
|
15
|
+
});
|
|
16
|
+
it("should return early for zero", () => {
|
|
17
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(0)).not.toThrow();
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("unknown schema types", () => {
|
|
21
|
+
it("should skip validation for unknown object types without type property", () => {
|
|
22
|
+
const unknownSchema = { foo: "bar", baz: 123 };
|
|
23
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(unknownSchema)).not.toThrow();
|
|
24
|
+
});
|
|
25
|
+
it("should skip validation for arrays", () => {
|
|
26
|
+
expect(() => (0, validate_1.assertNoRecordSchema)([1, 2, 3])).not.toThrow();
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
describe("schema conversion errors", () => {
|
|
30
|
+
it("should skip validation when Standard Schema conversion fails", () => {
|
|
31
|
+
// Create a mock that looks like Standard Schema but will fail conversion
|
|
32
|
+
const brokenSchema = {
|
|
33
|
+
"~standard": {
|
|
34
|
+
version: 1,
|
|
35
|
+
vendor: "broken-vendor",
|
|
36
|
+
validate: () => ({ value: {} }),
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
// Should not throw, just skip validation
|
|
40
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(brokenSchema)).not.toThrow();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
describe("empty converted schemas", () => {
|
|
44
|
+
it("should skip validation for function schemas that return empty JSON Schema", () => {
|
|
45
|
+
// Function schemas can't be directly converted to JSON Schema
|
|
46
|
+
const funcSchema = v4_1.z.function({
|
|
47
|
+
input: [v4_1.z.string()],
|
|
48
|
+
output: v4_1.z.void(),
|
|
49
|
+
});
|
|
50
|
+
// Should not throw - function schemas are handled specially
|
|
51
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(funcSchema)).not.toThrow();
|
|
52
|
+
});
|
|
53
|
+
});
|
|
6
54
|
it("should allow valid schemas without records", () => {
|
|
7
55
|
const schema = v4_1.z.object({
|
|
8
56
|
name: v4_1.z.string(),
|
|
@@ -71,6 +119,107 @@ describe("assertNoRecordSchema", () => {
|
|
|
71
119
|
const schema = v4_1.z.record(v4_1.z.string(), v4_1.z.string());
|
|
72
120
|
expect(() => (0, validate_1.assertNoRecordSchema)(schema, "mySchema")).toThrow('Record types (objects with dynamic keys) are not supported in mySchema. Found at path "(root)". Replace it with an object using explicit keys.');
|
|
73
121
|
});
|
|
122
|
+
describe("JSON Schema conditional keywords", () => {
|
|
123
|
+
it("should throw when encountering a record in if clause", () => {
|
|
124
|
+
const jsonSchema = {
|
|
125
|
+
type: "object",
|
|
126
|
+
if: {
|
|
127
|
+
type: "object",
|
|
128
|
+
additionalProperties: { type: "string" },
|
|
129
|
+
},
|
|
130
|
+
then: {
|
|
131
|
+
properties: { name: { type: "string" } },
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "if". Replace it with an object using explicit keys.');
|
|
135
|
+
});
|
|
136
|
+
it("should throw when encountering a record in then clause", () => {
|
|
137
|
+
const jsonSchema = {
|
|
138
|
+
type: "object",
|
|
139
|
+
if: {
|
|
140
|
+
properties: { type: { const: "map" } },
|
|
141
|
+
},
|
|
142
|
+
then: {
|
|
143
|
+
type: "object",
|
|
144
|
+
additionalProperties: { type: "number" },
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "then". Replace it with an object using explicit keys.');
|
|
148
|
+
});
|
|
149
|
+
it("should throw when encountering a record in else clause", () => {
|
|
150
|
+
const jsonSchema = {
|
|
151
|
+
type: "object",
|
|
152
|
+
if: {
|
|
153
|
+
properties: { type: { const: "simple" } },
|
|
154
|
+
},
|
|
155
|
+
then: {
|
|
156
|
+
properties: { value: { type: "string" } },
|
|
157
|
+
},
|
|
158
|
+
else: {
|
|
159
|
+
type: "object",
|
|
160
|
+
additionalProperties: { type: "boolean" },
|
|
161
|
+
},
|
|
162
|
+
};
|
|
163
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "else". Replace it with an object using explicit keys.');
|
|
164
|
+
});
|
|
165
|
+
it("should throw when encountering a record in not clause", () => {
|
|
166
|
+
const jsonSchema = {
|
|
167
|
+
type: "object",
|
|
168
|
+
not: {
|
|
169
|
+
type: "object",
|
|
170
|
+
additionalProperties: { type: "string" },
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "!". Replace it with an object using explicit keys.');
|
|
174
|
+
});
|
|
175
|
+
it("should throw when encountering a record in oneOf", () => {
|
|
176
|
+
const jsonSchema = {
|
|
177
|
+
type: "object",
|
|
178
|
+
oneOf: [
|
|
179
|
+
{ type: "string" },
|
|
180
|
+
{
|
|
181
|
+
type: "object",
|
|
182
|
+
additionalProperties: { type: "number" },
|
|
183
|
+
},
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "|1". Replace it with an object using explicit keys.');
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
describe("nested records in additionalProperties", () => {
|
|
190
|
+
it("should throw for nested record inside additionalProperties value schema", () => {
|
|
191
|
+
const jsonSchema = {
|
|
192
|
+
type: "object",
|
|
193
|
+
additionalProperties: {
|
|
194
|
+
type: "object",
|
|
195
|
+
properties: {
|
|
196
|
+
nested: {
|
|
197
|
+
type: "object",
|
|
198
|
+
additionalProperties: { type: "string" },
|
|
199
|
+
},
|
|
200
|
+
},
|
|
201
|
+
},
|
|
202
|
+
};
|
|
203
|
+
// First it finds the root level record
|
|
204
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "(root)". Replace it with an object using explicit keys.');
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe("prefixItems (JSON Schema 2020-12)", () => {
|
|
208
|
+
it("should throw when encountering a record in prefixItems", () => {
|
|
209
|
+
// Using JSON Schema 2020-12 style tuple
|
|
210
|
+
const jsonSchema = {
|
|
211
|
+
type: "array",
|
|
212
|
+
prefixItems: [
|
|
213
|
+
{ type: "string" },
|
|
214
|
+
{
|
|
215
|
+
type: "object",
|
|
216
|
+
additionalProperties: { type: "number" },
|
|
217
|
+
},
|
|
218
|
+
],
|
|
219
|
+
};
|
|
220
|
+
expect(() => (0, validate_1.assertNoRecordSchema)(jsonSchema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "1". Replace it with an object using explicit keys.');
|
|
221
|
+
});
|
|
222
|
+
});
|
|
74
223
|
it("should handle ZodLazy schemas", () => {
|
|
75
224
|
const schema = v4_1.z.lazy(() => v4_1.z.record(v4_1.z.string(), v4_1.z.string()));
|
|
76
225
|
expect(() => (0, validate_1.assertNoRecordSchema)(schema)).toThrow('Record types (objects with dynamic keys) are not supported in schema. Found at path "(root)". Replace it with an object using explicit keys.');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/schema/validate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { z } from \"zod/v4\";\nimport { assertNoRecordSchema } from \"./validate\";\n\ndescribe(\"assertNoRecordSchema\", () => {\n it(\"should allow valid schemas without records\", () => {\n const schema = z.object({\n name: z.string(),\n age: z.number(),\n tags: z.array(z.string()),\n address: z.object({\n street: z.string(),\n city: z.string(),\n }),\n });\n\n expect(() => assertNoRecordSchema(schema)).not.toThrow();\n });\n\n it(\"should throw when encountering a record at root level\", () => {\n const schema = z.record(z.string(), z.string());\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a nested record\", () => {\n const schema = z.object({\n name: z.string(),\n metadata: z.record(z.string(), z.string()),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"metadata\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in an array\", () => {\n const schema = z.object({\n items: z.array(z.record(z.string(), z.string())),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"items.[]\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in a union\", () => {\n const schema = z.union([z.string(), z.record(z.string(), z.number())]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"|1\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in an intersection\", () => {\n const schema = z.intersection(\n z.object({ name: z.string() }),\n z.object({ metadata: z.record(z.string(), z.string()) }),\n );\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"(&1\\.)?metadata\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in a discriminated union\", () => {\n const schema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"string\"), value: z.string() }),\n z.object({\n type: z.literal(\"record\"),\n value: z.record(z.string(), z.number()),\n }),\n ]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"\\|1\\.value\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in an optional field\", () => {\n const schema = z.object({\n optional: z.optional(z.record(z.string(), z.string())),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"optional\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in a nullable field\", () => {\n const schema = z.object({\n nullable: z.nullable(z.record(z.string(), z.string())),\n });\n\n // Nullable creates a oneOf in JSON Schema, so the path includes the union index\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"nullable(\\.\\|0)?\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in a tuple\", () => {\n const schema = z.tuple([z.string(), z.record(z.string(), z.number())]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"1\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should use custom context name in error message\", () => {\n const schema = z.record(z.string(), z.string());\n\n expect(() => assertNoRecordSchema(schema, \"mySchema\")).toThrow(\n 'Record types (objects with dynamic keys) are not supported in mySchema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should handle ZodLazy schemas\", () => {\n const schema = z.lazy(() => z.record(z.string(), z.string()));\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should allow z.function() with valid arguments\", () => {\n const schema = z.function({\n input: [z.string(), z.number()],\n output: z.string(),\n });\n\n // Function schemas can't be converted to JSON Schema directly,\n // so they should not throw (validation happens on the extracted parameters)\n expect(() => assertNoRecordSchema(schema)).not.toThrow();\n });\n\n it(\"should allow JSON Schema without records\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" as const },\n age: { type: \"number\" as const },\n },\n required: [\"name\"],\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).not.toThrow();\n });\n\n it(\"should throw when JSON Schema has record pattern\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n additionalProperties: { type: \"string\" as const },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should treat JSON Schema with properties and additionalProperties as a record\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n id: { type: \"string\" as const },\n },\n additionalProperties: { type: \"number\" as const },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when nested JSON Schema has record pattern\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n metadata: {\n type: \"object\" as const,\n additionalProperties: { type: \"string\" as const },\n },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"metadata\". Replace it with an object using explicit keys.',\n );\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"validate.test.js","sourceRoot":"","sources":["../../src/schema/validate.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport { z } from \"zod/v4\";\nimport { assertNoRecordSchema } from \"./validate\";\n\ndescribe(\"assertNoRecordSchema\", () => {\n describe(\"falsy inputs\", () => {\n it(\"should return early for null\", () => {\n expect(() => assertNoRecordSchema(null)).not.toThrow();\n });\n\n it(\"should return early for undefined\", () => {\n expect(() => assertNoRecordSchema(undefined)).not.toThrow();\n });\n\n it(\"should return early for empty string\", () => {\n expect(() => assertNoRecordSchema(\"\")).not.toThrow();\n });\n\n it(\"should return early for zero\", () => {\n expect(() => assertNoRecordSchema(0)).not.toThrow();\n });\n });\n\n describe(\"unknown schema types\", () => {\n it(\"should skip validation for unknown object types without type property\", () => {\n const unknownSchema = { foo: \"bar\", baz: 123 };\n expect(() => assertNoRecordSchema(unknownSchema)).not.toThrow();\n });\n\n it(\"should skip validation for arrays\", () => {\n expect(() => assertNoRecordSchema([1, 2, 3])).not.toThrow();\n });\n });\n\n describe(\"schema conversion errors\", () => {\n it(\"should skip validation when Standard Schema conversion fails\", () => {\n // Create a mock that looks like Standard Schema but will fail conversion\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken-vendor\",\n validate: () => ({ value: {} }),\n },\n };\n\n // Should not throw, just skip validation\n expect(() => assertNoRecordSchema(brokenSchema)).not.toThrow();\n });\n });\n\n describe(\"empty converted schemas\", () => {\n it(\"should skip validation for function schemas that return empty JSON Schema\", () => {\n // Function schemas can't be directly converted to JSON Schema\n const funcSchema = z.function({\n input: [z.string()],\n output: z.void(),\n });\n\n // Should not throw - function schemas are handled specially\n expect(() => assertNoRecordSchema(funcSchema)).not.toThrow();\n });\n });\n\n it(\"should allow valid schemas without records\", () => {\n const schema = z.object({\n name: z.string(),\n age: z.number(),\n tags: z.array(z.string()),\n address: z.object({\n street: z.string(),\n city: z.string(),\n }),\n });\n\n expect(() => assertNoRecordSchema(schema)).not.toThrow();\n });\n\n it(\"should throw when encountering a record at root level\", () => {\n const schema = z.record(z.string(), z.string());\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a nested record\", () => {\n const schema = z.object({\n name: z.string(),\n metadata: z.record(z.string(), z.string()),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"metadata\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in an array\", () => {\n const schema = z.object({\n items: z.array(z.record(z.string(), z.string())),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"items.[]\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in a union\", () => {\n const schema = z.union([z.string(), z.record(z.string(), z.number())]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"|1\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in an intersection\", () => {\n const schema = z.intersection(\n z.object({ name: z.string() }),\n z.object({ metadata: z.record(z.string(), z.string()) }),\n );\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"(&1\\.)?metadata\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in a discriminated union\", () => {\n const schema = z.discriminatedUnion(\"type\", [\n z.object({ type: z.literal(\"string\"), value: z.string() }),\n z.object({\n type: z.literal(\"record\"),\n value: z.record(z.string(), z.number()),\n }),\n ]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"\\|1\\.value\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in an optional field\", () => {\n const schema = z.object({\n optional: z.optional(z.record(z.string(), z.string())),\n });\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"optional\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in a nullable field\", () => {\n const schema = z.object({\n nullable: z.nullable(z.record(z.string(), z.string())),\n });\n\n // Nullable creates a oneOf in JSON Schema, so the path includes the union index\n expect(() => assertNoRecordSchema(schema)).toThrow(\n /Record types \\(objects with dynamic keys\\) are not supported in schema\\. Found at path \"nullable(\\.\\|0)?\"\\. Replace it with an object using explicit keys\\./,\n );\n });\n\n it(\"should throw when encountering a record in a tuple\", () => {\n const schema = z.tuple([z.string(), z.record(z.string(), z.number())]);\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"1\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should use custom context name in error message\", () => {\n const schema = z.record(z.string(), z.string());\n\n expect(() => assertNoRecordSchema(schema, \"mySchema\")).toThrow(\n 'Record types (objects with dynamic keys) are not supported in mySchema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n describe(\"JSON Schema conditional keywords\", () => {\n it(\"should throw when encountering a record in if clause\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n if: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n },\n then: {\n properties: { name: { type: \"string\" } },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"if\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in then clause\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n if: {\n properties: { type: { const: \"map\" } },\n },\n then: {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"then\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in else clause\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n if: {\n properties: { type: { const: \"simple\" } },\n },\n then: {\n properties: { value: { type: \"string\" } },\n },\n else: {\n type: \"object\",\n additionalProperties: { type: \"boolean\" },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"else\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in not clause\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n not: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"!\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when encountering a record in oneOf\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n oneOf: [\n { type: \"string\" },\n {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n ],\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"|1\". Replace it with an object using explicit keys.',\n );\n });\n });\n\n describe(\"nested records in additionalProperties\", () => {\n it(\"should throw for nested record inside additionalProperties value schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n additionalProperties: {\n type: \"object\",\n properties: {\n nested: {\n type: \"object\",\n additionalProperties: { type: \"string\" },\n },\n },\n },\n };\n\n // First it finds the root level record\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n });\n\n describe(\"prefixItems (JSON Schema 2020-12)\", () => {\n it(\"should throw when encountering a record in prefixItems\", () => {\n // Using JSON Schema 2020-12 style tuple\n const jsonSchema = {\n type: \"array\",\n prefixItems: [\n { type: \"string\" },\n {\n type: \"object\",\n additionalProperties: { type: \"number\" },\n },\n ],\n } as JSONSchema7;\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"1\". Replace it with an object using explicit keys.',\n );\n });\n });\n\n it(\"should handle ZodLazy schemas\", () => {\n const schema = z.lazy(() => z.record(z.string(), z.string()));\n\n expect(() => assertNoRecordSchema(schema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should allow z.function() with valid arguments\", () => {\n const schema = z.function({\n input: [z.string(), z.number()],\n output: z.string(),\n });\n\n // Function schemas can't be converted to JSON Schema directly,\n // so they should not throw (validation happens on the extracted parameters)\n expect(() => assertNoRecordSchema(schema)).not.toThrow();\n });\n\n it(\"should allow JSON Schema without records\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n name: { type: \"string\" as const },\n age: { type: \"number\" as const },\n },\n required: [\"name\"],\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).not.toThrow();\n });\n\n it(\"should throw when JSON Schema has record pattern\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n additionalProperties: { type: \"string\" as const },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should treat JSON Schema with properties and additionalProperties as a record\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n id: { type: \"string\" as const },\n },\n additionalProperties: { type: \"number\" as const },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"(root)\". Replace it with an object using explicit keys.',\n );\n });\n\n it(\"should throw when nested JSON Schema has record pattern\", () => {\n const jsonSchema = {\n type: \"object\" as const,\n properties: {\n metadata: {\n type: \"object\" as const,\n additionalProperties: { type: \"string\" as const },\n },\n },\n };\n\n expect(() => assertNoRecordSchema(jsonSchema)).toThrow(\n 'Record types (objects with dynamic keys) are not supported in schema. Found at path \"metadata\". Replace it with an object using explicit keys.',\n );\n });\n});\n"]}
|
package/dist/schema/zod.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { JSONSchema7 } from "json-schema";
|
|
1
2
|
import { ZodFunction, ZodTuple, ZodTupleItems, ZodType, ZodTypeAny } from "zod/v3";
|
|
2
3
|
import { $ZodFunction, $ZodType } from "zod/v4/core";
|
|
3
4
|
/**
|
|
@@ -25,14 +26,14 @@ export declare function getZodFunctionArgs(schema: unknown): import("zod/v4/core
|
|
|
25
26
|
* @param schema - The Zod function schema
|
|
26
27
|
* @returns The return schema, or undefined if not a Zod function schema
|
|
27
28
|
*/
|
|
28
|
-
export declare function getZodFunctionReturns(schema: unknown):
|
|
29
|
+
export declare function getZodFunctionReturns(schema: unknown): ZodTypeAny | import("zod/v4/core").$ZodFunctionOut;
|
|
29
30
|
/**
|
|
30
31
|
* Handles conversion of Zod schemas to JSON Schema.
|
|
31
32
|
* Supports both Zod 3 (via zod-to-json-schema) and Zod 4 (native).
|
|
32
33
|
* @param schema - The Zod schema to convert
|
|
33
34
|
* @returns The JSON Schema representation
|
|
34
35
|
*/
|
|
35
|
-
export declare function handleZodSchemaToJson(schema: unknown):
|
|
36
|
+
export declare function handleZodSchemaToJson(schema: unknown): JSONSchema7;
|
|
36
37
|
/**
|
|
37
38
|
* Checks if a schema is probably a Zod 3 schema.
|
|
38
39
|
* @param schema - The schema to check
|
|
@@ -40,8 +41,10 @@ export declare function handleZodSchemaToJson(schema: unknown): any;
|
|
|
40
41
|
*/
|
|
41
42
|
export declare function isZod3Schema(schema: unknown): schema is ZodType;
|
|
42
43
|
/**
|
|
43
|
-
* Detects if a schema is Zod 4 by checking for
|
|
44
|
-
*
|
|
44
|
+
* Detects if a schema is Zod 4 by checking for Zod 4 markers.
|
|
45
|
+
* - v4.1.x has `_zod` property
|
|
46
|
+
* - v4.0.x (bundled in zod@3.25) has `def` directly but no `_def` for regular schemas
|
|
47
|
+
* - v4.0.x function schemas have both `_def` and `def` (special case)
|
|
45
48
|
* @returns True if the schema appears to be Zod 4 style
|
|
46
49
|
*/
|
|
47
50
|
export declare function isZod4Schema(schema: unknown): schema is $ZodType;
|
package/dist/schema/zod.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/schema/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,EACP,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,YAAY,EACZ,QAAQ,EAET,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAoB5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,iKAElD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,yEAWjD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/schema/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EACL,WAAW,EACX,QAAQ,EACR,aAAa,EACb,OAAO,EACP,UAAU,EACX,MAAM,QAAQ,CAAC;AAChB,OAAO,EACL,YAAY,EACZ,QAAQ,EAET,MAAM,aAAa,CAAC;AAErB;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,OAAO,GACd,MAAM,IAAI,WAAW,CAAC,QAAQ,CAAC,aAAa,EAAE,GAAG,CAAC,EAAE,UAAU,CAAC,CAQjE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,YAAY,CAoB5E;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,OAAO,iKAElD;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,OAAO,yEAWjD;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,sDAapD;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,OAAO,eAoBpD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,OAAO,CAE/D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,QAAQ,CA0BhE;AAED;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,IAAI,OAAO,GAAG,QAAQ,CA0CzE"}
|
package/dist/schema/zod.js
CHANGED
|
@@ -32,7 +32,7 @@ function isZod4FunctionSchema(schema) {
|
|
|
32
32
|
// extend $ZodType. This is corrected in zod 4.1, but zod 3 does not include
|
|
33
33
|
// the types for 4.1 yet (and might not ever).
|
|
34
34
|
// See: https://github.com/colinhacks/zod/blob/463f03eb8183dcdcdf735b180f2bf40883e66220/packages/zod/src/v4/core/function.ts#L48
|
|
35
|
-
if ("def" in schema && typeof schema.def
|
|
35
|
+
if ("def" in schema && typeof schema.def === "object" && schema.def) {
|
|
36
36
|
if (schema.def?.type === "function") {
|
|
37
37
|
return true;
|
|
38
38
|
}
|
|
@@ -75,8 +75,10 @@ function getZodFunctionReturns(schema) {
|
|
|
75
75
|
return schema._def.returns;
|
|
76
76
|
}
|
|
77
77
|
if (isZod4FunctionSchema(schema)) {
|
|
78
|
-
//
|
|
79
|
-
|
|
78
|
+
// v4.0.x: output on .def directly
|
|
79
|
+
// v4.1.x: output on ._zod.def
|
|
80
|
+
// @ts-expect-error -- Type differences between v4.0.x and v4.1.x
|
|
81
|
+
return schema.def?.output ?? schema._zod?.def?.output;
|
|
80
82
|
}
|
|
81
83
|
throw new Error("Unable to determine return type from zod function schema");
|
|
82
84
|
}
|
|
@@ -88,8 +90,9 @@ function getZodFunctionReturns(schema) {
|
|
|
88
90
|
*/
|
|
89
91
|
function handleZodSchemaToJson(schema) {
|
|
90
92
|
// If Zod4 schema detected, use the toJSONSchema function from "zod/v4/core"
|
|
91
|
-
if (isZod4Schema(schema))
|
|
93
|
+
if (isZod4Schema(schema)) {
|
|
92
94
|
return (0, core_1.toJSONSchema)(schema, { reused: "inline" });
|
|
95
|
+
}
|
|
93
96
|
try {
|
|
94
97
|
// Dynamic require for optional peer dependency
|
|
95
98
|
// eslint-disable-next-line @typescript-eslint/no-require-imports -- need require because zod-to-json-schema may be missing
|
|
@@ -112,12 +115,36 @@ function isZod3Schema(schema) {
|
|
|
112
115
|
return isZodSchema(schema) && "_def" in schema && !("def" in schema);
|
|
113
116
|
}
|
|
114
117
|
/**
|
|
115
|
-
* Detects if a schema is Zod 4 by checking for
|
|
116
|
-
*
|
|
118
|
+
* Detects if a schema is Zod 4 by checking for Zod 4 markers.
|
|
119
|
+
* - v4.1.x has `_zod` property
|
|
120
|
+
* - v4.0.x (bundled in zod@3.25) has `def` directly but no `_def` for regular schemas
|
|
121
|
+
* - v4.0.x function schemas have both `_def` and `def` (special case)
|
|
117
122
|
* @returns True if the schema appears to be Zod 4 style
|
|
118
123
|
*/
|
|
119
124
|
function isZod4Schema(schema) {
|
|
120
|
-
|
|
125
|
+
if (!isZodSchema(schema))
|
|
126
|
+
return false;
|
|
127
|
+
// v4.1.x: has _zod property
|
|
128
|
+
if ("_zod" in schema)
|
|
129
|
+
return true;
|
|
130
|
+
// v4.0.x regular schemas: has def directly but NOT _def (v3 has _def)
|
|
131
|
+
// Also check def.type is a string; in Zod v4 this is typically a string
|
|
132
|
+
// literal like "string"
|
|
133
|
+
if ("def" in schema && !("_def" in schema)) {
|
|
134
|
+
const def = schema.def;
|
|
135
|
+
if (def && typeof def === "object" && "type" in def) {
|
|
136
|
+
return typeof def.type === "string";
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// v4.0.x function schemas: have both _def and def with type "function"
|
|
140
|
+
// This is a special case where _def exists but it's still a v4 schema
|
|
141
|
+
if ("_def" in schema && "def" in schema) {
|
|
142
|
+
const def = schema.def;
|
|
143
|
+
if (def && typeof def === "object" && "type" in def) {
|
|
144
|
+
return def.type === "function";
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return false;
|
|
121
148
|
}
|
|
122
149
|
/**
|
|
123
150
|
* Checks if a schema is a Zod schema
|
|
@@ -125,24 +152,40 @@ function isZod4Schema(schema) {
|
|
|
125
152
|
* @returns True if the schema is a Zod schema
|
|
126
153
|
*/
|
|
127
154
|
function isZodSchema(schema) {
|
|
128
|
-
// schema must be { ~standard: { vendor: "zod" } }
|
|
129
155
|
if (typeof schema !== "object")
|
|
130
156
|
return false;
|
|
131
157
|
if (!schema)
|
|
132
158
|
return false;
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
//
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
// Standard detection: schema has { ~standard: { vendor: "zod" } }
|
|
160
|
+
if ("~standard" in schema && schema["~standard"]) {
|
|
161
|
+
const std = schema["~standard"];
|
|
162
|
+
if (typeof std === "object" && "vendor" in std && std.vendor === "zod") {
|
|
163
|
+
// Require at least one internal marker to reduce false positives
|
|
164
|
+
const looksLikeV3 = "_def" in schema;
|
|
165
|
+
const looksLikeV4 = "_zod" in schema || "def" in schema;
|
|
166
|
+
return looksLikeV3 || looksLikeV4;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
// v4.0.x function schemas: have _def and def with type "function"
|
|
170
|
+
// but don't have ~standard at the top level (only on nested schemas)
|
|
171
|
+
if ("_def" in schema && "def" in schema) {
|
|
172
|
+
const def = schema.def;
|
|
173
|
+
if (def &&
|
|
174
|
+
typeof def === "object" &&
|
|
175
|
+
"type" in def &&
|
|
176
|
+
def.type === "function") {
|
|
177
|
+
// Check if nested input/output have zod markers
|
|
178
|
+
const inputIsZod = "input" in def &&
|
|
179
|
+
typeof def.input === "object" &&
|
|
180
|
+
def.input !== null &&
|
|
181
|
+
"~standard" in def.input;
|
|
182
|
+
const outputIsZod = "output" in def &&
|
|
183
|
+
typeof def.output === "object" &&
|
|
184
|
+
def.output !== null &&
|
|
185
|
+
"~standard" in def.output;
|
|
186
|
+
return inputIsZod || outputIsZod;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return false;
|
|
147
190
|
}
|
|
148
191
|
//# sourceMappingURL=zod.js.map
|