@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/schema/json-schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"json-schema.js","sourceRoot":"","sources":["../../src/schema/json-schema.ts"],"names":[],"mappings":"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","sourcesContent":["import { JSONSchema7 } from \"json-schema\";\nimport { z } from \"zod/v4\";\n\nconst jsonSchemaType = z.union([\n z.literal(\"object\"),\n z.literal(\"array\"),\n z.literal(\"string\"),\n z.literal(\"number\"),\n z.literal(\"integer\"),\n z.literal(\"boolean\"),\n z.literal(\"null\"),\n z.array(\n z.union([\n z.literal(\"object\"),\n z.literal(\"array\"),\n z.literal(\"string\"),\n z.literal(\"number\"),\n z.literal(\"integer\"),\n z.literal(\"boolean\"),\n z.literal(\"null\"),\n ]),\n ),\n]);\n\nconst jsonSchemaTopLevel = z\n .looseObject({\n type: jsonSchemaType.optional(),\n properties: z.record(z.string(), z.unknown()).optional(),\n items: z.union([z.array(z.unknown()), z.unknown()]).optional(),\n required: z.array(z.string()).optional(),\n additionalProperties: z.union([z.boolean(), z.unknown()]).optional(),\n enum: z.array(z.unknown()).optional(),\n const: z.unknown().optional(),\n $ref: z.string().optional(),\n $id: z.string().optional(),\n $schema: z.string().optional(),\n title: z.string().optional(),\n description: z.string().optional(),\n })\n .refine((value) => {\n return (\n value.type !== undefined ||\n value.properties !== undefined ||\n value.items !== undefined ||\n value.enum !== undefined ||\n value.const !== undefined ||\n value.$ref !== undefined\n );\n });\n\n/**\n * Basic heuristic to check if an object looks like a JSON Schema at the top level.\n *\n * This uses a Zod schema to verify only top-level keys (type, properties, items,\n * etc.). It intentionally does not perform full JSON Schema validation; a more\n * thorough check should be done server-side.\n * @param obj - The value to check\n * @returns True if the value appears to be a JSON Schema\n */\nexport function looksLikeJSONSchema(obj: unknown): obj is JSONSchema7 {\n if (obj === null || typeof obj !== \"object\") {\n return false;\n }\n\n return jsonSchemaTopLevel.safeParse(obj).success;\n}\n\n/**\n * Extended JSON Schema type that includes draft 2020-12 features like prefixItems.\n * The json-schema package types are from draft-07 and don't include prefixItems.\n */\nexport type JSONSchema7Extended = JSONSchema7 & {\n prefixItems?: JSONSchema7[];\n};\n\n/**\n * Checks if a JSON Schema represents a tuple (array with positional items).\n * Supports both draft-07 (items as array) and draft 2020-12 (prefixItems).\n * @param schema - The JSON Schema to check\n * @returns True if the schema represents a tuple\n */\nexport function isJsonSchemaTuple(\n schema: JSONSchema7Extended,\n): schema is JSONSchema7Extended & { type: \"array\" } {\n if (schema.type !== \"array\") {\n return false;\n }\n\n // Draft 2020-12: prefixItems array\n if (schema.prefixItems && Array.isArray(schema.prefixItems)) {\n return true;\n }\n\n // Draft-07: items as array (not object)\n if (Array.isArray(schema.items)) {\n return true;\n }\n\n return false;\n}\n\n/**\n * Gets the tuple items from a JSON Schema.\n * Supports both draft-07 (items as array) and draft 2020-12 (prefixItems).\n * @param schema - The JSON Schema tuple\n * @returns Array of item schemas, or undefined if not a tuple\n */\nexport function getJsonSchemaTupleItems(\n schema: JSONSchema7Extended,\n): JSONSchema7[] | undefined {\n if (schema.type !== \"array\") {\n return undefined;\n }\n\n // Draft 2020-12: prefixItems array\n if (schema.prefixItems && Array.isArray(schema.prefixItems)) {\n return schema.prefixItems;\n }\n\n // Draft-07: items as array\n if (Array.isArray(schema.items)) {\n return schema.items as JSONSchema7[];\n }\n\n return undefined;\n}\n\n/**\n * Creates a partial version of a JSON Schema by removing required constraints.\n * This allows LLM to provide only the properties it wants to update.\n * @param schema - The JSON Schema to make partial\n * @returns A new JSON Schema with the required constraint removed\n */\nexport function makeJsonSchemaPartial(schema: JSONSchema7): JSONSchema7 {\n const { required: _required, ...rest } = schema;\n return rest;\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as z3 from "zod/v3";
|
|
2
2
|
import * as z4 from "zod/v4";
|
|
3
3
|
import { looksLikeJSONSchema } from "./json-schema";
|
|
4
|
-
import { getParametersFromToolSchema } from "./schema";
|
|
4
|
+
import { getParametersFromToolSchema, hasInputSchema, safeSchemaToJsonSchema, schemaToJsonSchema, } from "./schema";
|
|
5
5
|
import { isStandardSchema } from "./standard-schema";
|
|
6
6
|
describe("schema utilities", () => {
|
|
7
7
|
describe("looksLikeJSONSchema", () => {
|
|
@@ -288,6 +288,243 @@ describe("schema utilities", () => {
|
|
|
288
288
|
expect(params.length).toBeGreaterThanOrEqual(1);
|
|
289
289
|
expect(params[0].name).toBe("param1");
|
|
290
290
|
});
|
|
291
|
+
it("handles toolSchema with JSON Schema directly", () => {
|
|
292
|
+
const tool = {
|
|
293
|
+
name: "test-tool",
|
|
294
|
+
description: "Test tool",
|
|
295
|
+
tool: jest.fn(),
|
|
296
|
+
toolSchema: {
|
|
297
|
+
type: "object",
|
|
298
|
+
properties: {
|
|
299
|
+
query: { type: "string", description: "Search query" },
|
|
300
|
+
},
|
|
301
|
+
required: ["query"],
|
|
302
|
+
},
|
|
303
|
+
};
|
|
304
|
+
const params = getParametersFromToolSchema(tool);
|
|
305
|
+
// JSON Schema in toolSchema should return params wrapped
|
|
306
|
+
expect(params.length).toBeGreaterThanOrEqual(1);
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
describe("edge cases and error handling", () => {
|
|
310
|
+
it("returns empty params when inputSchema is unknown type", () => {
|
|
311
|
+
// Create a tool with an invalid inputSchema that isn't Standard Schema or JSON Schema
|
|
312
|
+
const tool = {
|
|
313
|
+
name: "test-tool",
|
|
314
|
+
description: "Test tool",
|
|
315
|
+
tool: jest.fn(),
|
|
316
|
+
inputSchema: "invalid-schema", // Not a valid schema
|
|
317
|
+
outputSchema: z4.void(),
|
|
318
|
+
};
|
|
319
|
+
const consoleSpy = jest.spyOn(console, "warn").mockImplementation();
|
|
320
|
+
const params = getParametersFromToolSchema(tool);
|
|
321
|
+
consoleSpy.mockRestore();
|
|
322
|
+
expect(params).toEqual([]);
|
|
323
|
+
});
|
|
324
|
+
it("throws when toolSchema is undefined", () => {
|
|
325
|
+
// Create a tool with toolSchema that has undefined toolSchema
|
|
326
|
+
const tool = {
|
|
327
|
+
name: "test-tool",
|
|
328
|
+
description: "Test tool",
|
|
329
|
+
tool: jest.fn(),
|
|
330
|
+
toolSchema: undefined,
|
|
331
|
+
};
|
|
332
|
+
expect(() => getParametersFromToolSchema(tool)).toThrow("Unable to determine parameters from zod function schema");
|
|
333
|
+
});
|
|
334
|
+
it("throws when toolSchema args are not recognized", () => {
|
|
335
|
+
// Create a tool with toolSchema that is not a function schema or JSON schema
|
|
336
|
+
// This causes getArgsFromToolSchema to attempt extraction but fail
|
|
337
|
+
const tool = {
|
|
338
|
+
name: "test-tool",
|
|
339
|
+
description: "Test tool",
|
|
340
|
+
tool: jest.fn(),
|
|
341
|
+
toolSchema: { notASchema: true },
|
|
342
|
+
};
|
|
343
|
+
// This throws because it's not a Zod function schema
|
|
344
|
+
expect(() => getParametersFromToolSchema(tool)).toThrow("Unable to determine parameters from zod function schema");
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
describe("toolSchema with JSON Schema tuple", () => {
|
|
348
|
+
it("handles toolSchema with JSON Schema array/tuple directly", () => {
|
|
349
|
+
const tool = {
|
|
350
|
+
name: "test-tool",
|
|
351
|
+
description: "Test tool",
|
|
352
|
+
tool: jest.fn(),
|
|
353
|
+
// JSON Schema tuple format
|
|
354
|
+
toolSchema: {
|
|
355
|
+
type: "array",
|
|
356
|
+
items: [
|
|
357
|
+
{ type: "string", description: "First param" },
|
|
358
|
+
{ type: "number", description: "Second param" },
|
|
359
|
+
],
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
const params = getParametersFromToolSchema(tool);
|
|
363
|
+
// JSON Schema tuples should be extracted as positional params
|
|
364
|
+
expect(params).toHaveLength(2);
|
|
365
|
+
expect(params[0].name).toBe("param1");
|
|
366
|
+
expect(params[0].type).toBe("string");
|
|
367
|
+
expect(params[0].description).toBe("First param");
|
|
368
|
+
expect(params[1].name).toBe("param2");
|
|
369
|
+
expect(params[1].type).toBe("number");
|
|
370
|
+
});
|
|
371
|
+
it("handles toolSchema with JSON Schema prefixItems (2020-12 format)", () => {
|
|
372
|
+
const tool = {
|
|
373
|
+
name: "test-tool",
|
|
374
|
+
description: "Test tool",
|
|
375
|
+
tool: jest.fn(),
|
|
376
|
+
// JSON Schema 2020-12 tuple format
|
|
377
|
+
toolSchema: {
|
|
378
|
+
type: "array",
|
|
379
|
+
prefixItems: [
|
|
380
|
+
{ type: "boolean", description: "Flag" },
|
|
381
|
+
{ type: "string" },
|
|
382
|
+
],
|
|
383
|
+
},
|
|
384
|
+
};
|
|
385
|
+
const params = getParametersFromToolSchema(tool);
|
|
386
|
+
expect(params).toHaveLength(2);
|
|
387
|
+
expect(params[0].name).toBe("param1");
|
|
388
|
+
expect(params[0].type).toBe("boolean");
|
|
389
|
+
expect(params[0].description).toBe("Flag");
|
|
390
|
+
expect(params[1].name).toBe("param2");
|
|
391
|
+
expect(params[1].type).toBe("string");
|
|
392
|
+
});
|
|
393
|
+
it("handles toolSchema with non-tuple JSON Schema (fallback)", () => {
|
|
394
|
+
const tool = {
|
|
395
|
+
name: "test-tool",
|
|
396
|
+
description: "Test tool",
|
|
397
|
+
tool: jest.fn(),
|
|
398
|
+
// Non-tuple JSON Schema - should be wrapped as single param
|
|
399
|
+
toolSchema: {
|
|
400
|
+
type: "object",
|
|
401
|
+
properties: {
|
|
402
|
+
name: { type: "string" },
|
|
403
|
+
},
|
|
404
|
+
},
|
|
405
|
+
};
|
|
406
|
+
const params = getParametersFromToolSchema(tool);
|
|
407
|
+
// Non-tuple schemas should be wrapped as a single param
|
|
408
|
+
expect(params).toHaveLength(1);
|
|
409
|
+
expect(params[0].name).toBe("param1");
|
|
410
|
+
expect(params[0].type).toBe("object");
|
|
411
|
+
});
|
|
412
|
+
});
|
|
413
|
+
});
|
|
414
|
+
describe("schemaToJsonSchema", () => {
|
|
415
|
+
it("returns JSON Schema as-is when already a JSON Schema", () => {
|
|
416
|
+
const jsonSchema = {
|
|
417
|
+
type: "object",
|
|
418
|
+
properties: {
|
|
419
|
+
name: { type: "string" },
|
|
420
|
+
},
|
|
421
|
+
};
|
|
422
|
+
const result = schemaToJsonSchema(jsonSchema);
|
|
423
|
+
expect(result).toBe(jsonSchema); // Same reference
|
|
424
|
+
});
|
|
425
|
+
it("converts Zod 4 schema to JSON Schema", () => {
|
|
426
|
+
const zodSchema = z4.object({
|
|
427
|
+
name: z4.string(),
|
|
428
|
+
count: z4.number(),
|
|
429
|
+
});
|
|
430
|
+
const result = schemaToJsonSchema(zodSchema);
|
|
431
|
+
expect(result).toEqual(expect.objectContaining({
|
|
432
|
+
type: "object",
|
|
433
|
+
properties: expect.objectContaining({
|
|
434
|
+
name: expect.objectContaining({ type: "string" }),
|
|
435
|
+
count: expect.objectContaining({ type: "number" }),
|
|
436
|
+
}),
|
|
437
|
+
}));
|
|
438
|
+
});
|
|
439
|
+
it("converts Zod 3 schema to JSON Schema", () => {
|
|
440
|
+
const zodSchema = z3.object({
|
|
441
|
+
title: z3.string(),
|
|
442
|
+
});
|
|
443
|
+
const result = schemaToJsonSchema(zodSchema);
|
|
444
|
+
expect(result).toEqual(expect.objectContaining({
|
|
445
|
+
type: "object",
|
|
446
|
+
properties: expect.objectContaining({
|
|
447
|
+
title: expect.objectContaining({ type: "string" }),
|
|
448
|
+
}),
|
|
449
|
+
}));
|
|
450
|
+
});
|
|
451
|
+
});
|
|
452
|
+
describe("safeSchemaToJsonSchema", () => {
|
|
453
|
+
it("returns undefined for null schema", () => {
|
|
454
|
+
expect(safeSchemaToJsonSchema(null)).toBeUndefined();
|
|
455
|
+
});
|
|
456
|
+
it("returns undefined for undefined schema", () => {
|
|
457
|
+
expect(safeSchemaToJsonSchema(undefined)).toBeUndefined();
|
|
458
|
+
});
|
|
459
|
+
it("converts valid schema successfully", () => {
|
|
460
|
+
const zodSchema = z4.object({ name: z4.string() });
|
|
461
|
+
const result = safeSchemaToJsonSchema(zodSchema);
|
|
462
|
+
expect(result).toEqual(expect.objectContaining({
|
|
463
|
+
type: "object",
|
|
464
|
+
properties: expect.objectContaining({
|
|
465
|
+
name: expect.objectContaining({ type: "string" }),
|
|
466
|
+
}),
|
|
467
|
+
}));
|
|
468
|
+
});
|
|
469
|
+
it("returns undefined and calls onError for invalid schema", () => {
|
|
470
|
+
// Create something that looks like a Standard Schema but will fail conversion
|
|
471
|
+
const brokenSchema = {
|
|
472
|
+
"~standard": {
|
|
473
|
+
version: 1,
|
|
474
|
+
vendor: "broken",
|
|
475
|
+
validate: () => ({ value: {} }),
|
|
476
|
+
},
|
|
477
|
+
};
|
|
478
|
+
const onError = jest.fn();
|
|
479
|
+
const consoleSpy = jest.spyOn(console, "error").mockImplementation();
|
|
480
|
+
const result = safeSchemaToJsonSchema(brokenSchema, onError);
|
|
481
|
+
consoleSpy.mockRestore();
|
|
482
|
+
expect(result).toBeUndefined();
|
|
483
|
+
expect(onError).toHaveBeenCalled();
|
|
484
|
+
});
|
|
485
|
+
it("logs error to console when conversion fails", () => {
|
|
486
|
+
const brokenSchema = {
|
|
487
|
+
"~standard": {
|
|
488
|
+
version: 1,
|
|
489
|
+
vendor: "broken",
|
|
490
|
+
validate: () => ({ value: {} }),
|
|
491
|
+
},
|
|
492
|
+
};
|
|
493
|
+
const consoleSpy = jest.spyOn(console, "error").mockImplementation();
|
|
494
|
+
safeSchemaToJsonSchema(brokenSchema);
|
|
495
|
+
expect(consoleSpy).toHaveBeenCalledWith("Error converting schema to JSON Schema:", expect.any(Error));
|
|
496
|
+
consoleSpy.mockRestore();
|
|
497
|
+
});
|
|
498
|
+
});
|
|
499
|
+
describe("hasInputSchema", () => {
|
|
500
|
+
it("returns true for tool with inputSchema", () => {
|
|
501
|
+
const tool = {
|
|
502
|
+
name: "test",
|
|
503
|
+
description: "test",
|
|
504
|
+
tool: jest.fn(),
|
|
505
|
+
inputSchema: z4.object({ a: z4.string() }),
|
|
506
|
+
outputSchema: z4.void(),
|
|
507
|
+
};
|
|
508
|
+
expect(hasInputSchema(tool)).toBe(true);
|
|
509
|
+
});
|
|
510
|
+
it("returns false for tool with toolSchema (deprecated)", () => {
|
|
511
|
+
const tool = {
|
|
512
|
+
name: "test",
|
|
513
|
+
description: "test",
|
|
514
|
+
tool: jest.fn(),
|
|
515
|
+
toolSchema: z3.function().args(z3.string()).returns(z3.void()),
|
|
516
|
+
};
|
|
517
|
+
expect(hasInputSchema(tool)).toBe(false);
|
|
518
|
+
});
|
|
519
|
+
it("returns false for tool with null inputSchema", () => {
|
|
520
|
+
const tool = {
|
|
521
|
+
name: "test",
|
|
522
|
+
description: "test",
|
|
523
|
+
tool: jest.fn(),
|
|
524
|
+
inputSchema: null,
|
|
525
|
+
outputSchema: z4.void(),
|
|
526
|
+
};
|
|
527
|
+
expect(hasInputSchema(tool)).toBe(false);
|
|
291
528
|
});
|
|
292
529
|
});
|
|
293
530
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/schema/schema.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport { TamboTool } from \"../model/component-metadata\";\nimport { looksLikeJSONSchema } from \"./json-schema\";\nimport { getParametersFromToolSchema } from \"./schema\";\nimport { isStandardSchema } from \"./standard-schema\";\n\ndescribe(\"schema utilities\", () => {\n describe(\"looksLikeJSONSchema\", () => {\n it(\"returns true for a basic JSON Schema object\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"integer\" },\n },\n required: [\"name\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns true for a union type JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: [\"string\", \"null\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns false for Standard Schema validators\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n });\n\n expect(isStandardSchema(zodSchema)).toBe(true);\n expect(looksLikeJSONSchema(zodSchema)).toBe(false);\n });\n\n it(\"returns false for arbitrary objects that do not resemble JSON Schema\", () => {\n const notSchema = {\n type: \"foo\",\n other: \"bar\",\n };\n\n expect(looksLikeJSONSchema(notSchema)).toBe(false);\n });\n });\n\n describe(\"getParametersFromToolSchema\", () => {\n describe(\"inputSchema interface (object schemas)\", () => {\n it(\"extracts parameters from Zod 4 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n query: z4.string().describe(\"Search query\"),\n limit: z4.number().describe(\"Max results\"),\n enabled: z4.boolean().optional().describe(\"Whether enabled\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const queryParam = params.find((p) => p.name === \"query\");\n expect(queryParam).toBeDefined();\n expect(queryParam?.type).toBe(\"string\");\n expect(queryParam?.description).toBe(\"Search query\");\n expect(queryParam?.isRequired).toBe(true);\n\n const limitParam = params.find((p) => p.name === \"limit\");\n expect(limitParam).toBeDefined();\n expect(limitParam?.type).toBe(\"number\");\n expect(limitParam?.description).toBe(\"Max results\");\n expect(limitParam?.isRequired).toBe(true);\n\n const enabledParam = params.find((p) => p.name === \"enabled\");\n expect(enabledParam).toBeDefined();\n expect(enabledParam?.type).toBe(\"boolean\");\n // Optional fields are not required\n expect(enabledParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from Zod 3 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().optional(),\n }),\n outputSchema: z3.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n const ageParam = params.find((p) => p.name === \"age\");\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from JSON Schema object properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Item ID\" },\n count: { type: \"number\", description: \"Item count\" },\n active: { type: \"boolean\" },\n },\n required: [\"id\"],\n } as JSONSchema7,\n outputSchema: {},\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const idParam = params.find((p) => p.name === \"id\");\n expect(idParam).toBeDefined();\n expect(idParam?.type).toBe(\"string\");\n expect(idParam?.description).toBe(\"Item ID\");\n expect(idParam?.isRequired).toBe(true);\n\n const countParam = params.find((p) => p.name === \"count\");\n expect(countParam).toBeDefined();\n expect(countParam?.type).toBe(\"number\");\n expect(countParam?.isRequired).toBe(false);\n\n const activeParam = params.find((p) => p.name === \"active\");\n expect(activeParam).toBeDefined();\n expect(activeParam?.type).toBe(\"boolean\");\n expect(activeParam?.isRequired).toBe(false);\n });\n\n it(\"handles empty object schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({}),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n expect(params).toHaveLength(0);\n });\n\n it(\"handles nested object schemas\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n user: z4\n .object({\n name: z4.string(),\n email: z4.string(),\n })\n .describe(\"User info\"),\n options: z4.object({\n notify: z4.boolean(),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const userParam = params.find((p) => p.name === \"user\");\n expect(userParam).toBeDefined();\n expect(userParam?.type).toBe(\"object\");\n expect(userParam?.description).toBe(\"User info\");\n\n const optionsParam = params.find((p) => p.name === \"options\");\n expect(optionsParam).toBeDefined();\n expect(optionsParam?.type).toBe(\"object\");\n });\n\n it(\"handles array properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n tags: z4.array(z4.string()).describe(\"List of tags\"),\n items: z4.array(z4.object({ id: z4.number() })),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const tagsParam = params.find((p) => p.name === \"tags\");\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n expect(tagsParam?.description).toBe(\"List of tags\");\n\n const itemsParam = params.find((p) => p.name === \"items\");\n expect(itemsParam).toBeDefined();\n expect(itemsParam?.type).toBe(\"array\");\n });\n });\n\n describe(\"realistic inputSchema scenarios\", () => {\n it(\"handles enum properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n status: z4.enum([\"pending\", \"active\", \"completed\"]),\n priority: z4\n .enum([\"low\", \"medium\", \"high\"])\n .describe(\"Task priority\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const statusParam = params.find((p) => p.name === \"status\");\n expect(statusParam).toBeDefined();\n expect(statusParam?.type).toBe(\"string\");\n expect(statusParam?.isRequired).toBe(true);\n\n const priorityParam = params.find((p) => p.name === \"priority\");\n expect(priorityParam).toBeDefined();\n expect(priorityParam?.type).toBe(\"string\");\n expect(priorityParam?.description).toBe(\"Task priority\");\n });\n\n it(\"handles nullable properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n name: z4.string().nullable().describe(\"Optional name\"),\n count: z4.number().nullable(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.description).toBe(\"Optional name\");\n // Nullable fields are still required (they must be provided, even if null)\n expect(nameParam?.isRequired).toBe(true);\n });\n\n it(\"handles deeply nested schemas and preserves full schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n config: z4.object({\n database: z4.object({\n host: z4.string(),\n port: z4.number().optional(),\n }),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"config\");\n expect(params[0].type).toBe(\"object\");\n // The full nested schema should be preserved\n expect(params[0].schema).toHaveProperty(\"properties\");\n });\n\n it(\"handles mixed required and optional fields correctly\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n required1: z4.string(),\n optional1: z4.string().optional(),\n required2: z4.number(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const required1 = params.find((p) => p.name === \"required1\");\n const optional1 = params.find((p) => p.name === \"optional1\");\n const required2 = params.find((p) => p.name === \"required2\");\n\n expect(required1?.isRequired).toBe(true);\n expect(optional1?.isRequired).toBe(false);\n expect(required2?.isRequired).toBe(true);\n });\n });\n\n describe(\"deprecated toolSchema interface (tuple/positional args)\", () => {\n it(\"extracts positional parameters from Zod 3 function schema\", () => {\n const tool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: z3\n .function()\n .args(\n z3.string().describe(\"First arg\"),\n z3.number().describe(\"Second arg\"),\n )\n .returns(z3.void()),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // toolSchema uses positional params (param1, param2, etc.)\n expect(params.length).toBeGreaterThanOrEqual(1);\n expect(params[0].name).toBe(\"param1\");\n });\n });\n });\n});\n"]}
|
|
1
|
+
{"version":3,"file":"schema.test.js","sourceRoot":"","sources":["../../src/schema/schema.test.ts"],"names":[],"mappings":"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","sourcesContent":["import type { JSONSchema7 } from \"json-schema\";\nimport * as z3 from \"zod/v3\";\nimport * as z4 from \"zod/v4\";\nimport {\n TamboTool,\n TamboToolWithToolSchema,\n} from \"../model/component-metadata\";\nimport { looksLikeJSONSchema } from \"./json-schema\";\nimport {\n getParametersFromToolSchema,\n hasInputSchema,\n safeSchemaToJsonSchema,\n schemaToJsonSchema,\n} from \"./schema\";\nimport { isStandardSchema } from \"./standard-schema\";\n\ndescribe(\"schema utilities\", () => {\n describe(\"looksLikeJSONSchema\", () => {\n it(\"returns true for a basic JSON Schema object\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n age: { type: \"integer\" },\n },\n required: [\"name\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns true for a union type JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: [\"string\", \"null\"],\n };\n\n expect(looksLikeJSONSchema(jsonSchema)).toBe(true);\n });\n\n it(\"returns false for Standard Schema validators\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n });\n\n expect(isStandardSchema(zodSchema)).toBe(true);\n expect(looksLikeJSONSchema(zodSchema)).toBe(false);\n });\n\n it(\"returns false for arbitrary objects that do not resemble JSON Schema\", () => {\n const notSchema = {\n type: \"foo\",\n other: \"bar\",\n };\n\n expect(looksLikeJSONSchema(notSchema)).toBe(false);\n });\n });\n\n describe(\"getParametersFromToolSchema\", () => {\n describe(\"inputSchema interface (object schemas)\", () => {\n it(\"extracts parameters from Zod 4 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n query: z4.string().describe(\"Search query\"),\n limit: z4.number().describe(\"Max results\"),\n enabled: z4.boolean().optional().describe(\"Whether enabled\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const queryParam = params.find((p) => p.name === \"query\");\n expect(queryParam).toBeDefined();\n expect(queryParam?.type).toBe(\"string\");\n expect(queryParam?.description).toBe(\"Search query\");\n expect(queryParam?.isRequired).toBe(true);\n\n const limitParam = params.find((p) => p.name === \"limit\");\n expect(limitParam).toBeDefined();\n expect(limitParam?.type).toBe(\"number\");\n expect(limitParam?.description).toBe(\"Max results\");\n expect(limitParam?.isRequired).toBe(true);\n\n const enabledParam = params.find((p) => p.name === \"enabled\");\n expect(enabledParam).toBeDefined();\n expect(enabledParam?.type).toBe(\"boolean\");\n // Optional fields are not required\n expect(enabledParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from Zod 3 object schema properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z3.object({\n name: z3.string().describe(\"User name\"),\n age: z3.number().optional(),\n }),\n outputSchema: z3.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.type).toBe(\"string\");\n expect(nameParam?.isRequired).toBe(true);\n\n const ageParam = params.find((p) => p.name === \"age\");\n expect(ageParam).toBeDefined();\n expect(ageParam?.type).toBe(\"number\");\n expect(ageParam?.isRequired).toBe(false);\n });\n\n it(\"extracts parameters from JSON Schema object properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: {\n type: \"object\",\n properties: {\n id: { type: \"string\", description: \"Item ID\" },\n count: { type: \"number\", description: \"Item count\" },\n active: { type: \"boolean\" },\n },\n required: [\"id\"],\n } as JSONSchema7,\n outputSchema: {},\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const idParam = params.find((p) => p.name === \"id\");\n expect(idParam).toBeDefined();\n expect(idParam?.type).toBe(\"string\");\n expect(idParam?.description).toBe(\"Item ID\");\n expect(idParam?.isRequired).toBe(true);\n\n const countParam = params.find((p) => p.name === \"count\");\n expect(countParam).toBeDefined();\n expect(countParam?.type).toBe(\"number\");\n expect(countParam?.isRequired).toBe(false);\n\n const activeParam = params.find((p) => p.name === \"active\");\n expect(activeParam).toBeDefined();\n expect(activeParam?.type).toBe(\"boolean\");\n expect(activeParam?.isRequired).toBe(false);\n });\n\n it(\"handles empty object schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({}),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n expect(params).toHaveLength(0);\n });\n\n it(\"handles nested object schemas\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n user: z4\n .object({\n name: z4.string(),\n email: z4.string(),\n })\n .describe(\"User info\"),\n options: z4.object({\n notify: z4.boolean(),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const userParam = params.find((p) => p.name === \"user\");\n expect(userParam).toBeDefined();\n expect(userParam?.type).toBe(\"object\");\n expect(userParam?.description).toBe(\"User info\");\n\n const optionsParam = params.find((p) => p.name === \"options\");\n expect(optionsParam).toBeDefined();\n expect(optionsParam?.type).toBe(\"object\");\n });\n\n it(\"handles array properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n tags: z4.array(z4.string()).describe(\"List of tags\"),\n items: z4.array(z4.object({ id: z4.number() })),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const tagsParam = params.find((p) => p.name === \"tags\");\n expect(tagsParam).toBeDefined();\n expect(tagsParam?.type).toBe(\"array\");\n expect(tagsParam?.description).toBe(\"List of tags\");\n\n const itemsParam = params.find((p) => p.name === \"items\");\n expect(itemsParam).toBeDefined();\n expect(itemsParam?.type).toBe(\"array\");\n });\n });\n\n describe(\"realistic inputSchema scenarios\", () => {\n it(\"handles enum properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n status: z4.enum([\"pending\", \"active\", \"completed\"]),\n priority: z4\n .enum([\"low\", \"medium\", \"high\"])\n .describe(\"Task priority\"),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const statusParam = params.find((p) => p.name === \"status\");\n expect(statusParam).toBeDefined();\n expect(statusParam?.type).toBe(\"string\");\n expect(statusParam?.isRequired).toBe(true);\n\n const priorityParam = params.find((p) => p.name === \"priority\");\n expect(priorityParam).toBeDefined();\n expect(priorityParam?.type).toBe(\"string\");\n expect(priorityParam?.description).toBe(\"Task priority\");\n });\n\n it(\"handles nullable properties\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n name: z4.string().nullable().describe(\"Optional name\"),\n count: z4.number().nullable(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n\n const nameParam = params.find((p) => p.name === \"name\");\n expect(nameParam).toBeDefined();\n expect(nameParam?.description).toBe(\"Optional name\");\n // Nullable fields are still required (they must be provided, even if null)\n expect(nameParam?.isRequired).toBe(true);\n });\n\n it(\"handles deeply nested schemas and preserves full schema\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n config: z4.object({\n database: z4.object({\n host: z4.string(),\n port: z4.number().optional(),\n }),\n }),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"config\");\n expect(params[0].type).toBe(\"object\");\n // The full nested schema should be preserved\n expect(params[0].schema).toHaveProperty(\"properties\");\n });\n\n it(\"handles mixed required and optional fields correctly\", () => {\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: z4.object({\n required1: z4.string(),\n optional1: z4.string().optional(),\n required2: z4.number(),\n }),\n outputSchema: z4.void(),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(3);\n\n const required1 = params.find((p) => p.name === \"required1\");\n const optional1 = params.find((p) => p.name === \"optional1\");\n const required2 = params.find((p) => p.name === \"required2\");\n\n expect(required1?.isRequired).toBe(true);\n expect(optional1?.isRequired).toBe(false);\n expect(required2?.isRequired).toBe(true);\n });\n });\n\n describe(\"deprecated toolSchema interface (tuple/positional args)\", () => {\n it(\"extracts positional parameters from Zod 3 function schema\", () => {\n const tool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: z3\n .function()\n .args(\n z3.string().describe(\"First arg\"),\n z3.number().describe(\"Second arg\"),\n )\n .returns(z3.void()),\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // toolSchema uses positional params (param1, param2, etc.)\n expect(params.length).toBeGreaterThanOrEqual(1);\n expect(params[0].name).toBe(\"param1\");\n });\n\n it(\"handles toolSchema with JSON Schema directly\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Search query\" },\n },\n required: [\"query\"],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // JSON Schema in toolSchema should return params wrapped\n expect(params.length).toBeGreaterThanOrEqual(1);\n });\n });\n\n describe(\"edge cases and error handling\", () => {\n it(\"returns empty params when inputSchema is unknown type\", () => {\n // Create a tool with an invalid inputSchema that isn't Standard Schema or JSON Schema\n const tool: TamboTool = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n inputSchema: \"invalid-schema\" as any, // Not a valid schema\n outputSchema: z4.void(),\n };\n\n const consoleSpy = jest.spyOn(console, \"warn\").mockImplementation();\n const params = getParametersFromToolSchema(tool);\n consoleSpy.mockRestore();\n\n expect(params).toEqual([]);\n });\n\n it(\"throws when toolSchema is undefined\", () => {\n // Create a tool with toolSchema that has undefined toolSchema\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: undefined as any,\n };\n\n expect(() => getParametersFromToolSchema(tool)).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n\n it(\"throws when toolSchema args are not recognized\", () => {\n // Create a tool with toolSchema that is not a function schema or JSON schema\n // This causes getArgsFromToolSchema to attempt extraction but fail\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n toolSchema: { notASchema: true } as any,\n };\n\n // This throws because it's not a Zod function schema\n expect(() => getParametersFromToolSchema(tool)).toThrow(\n \"Unable to determine parameters from zod function schema\",\n );\n });\n });\n\n describe(\"toolSchema with JSON Schema tuple\", () => {\n it(\"handles toolSchema with JSON Schema array/tuple directly\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // JSON Schema tuple format\n toolSchema: {\n type: \"array\",\n items: [\n { type: \"string\", description: \"First param\" },\n { type: \"number\", description: \"Second param\" },\n ],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // JSON Schema tuples should be extracted as positional params\n expect(params).toHaveLength(2);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"string\");\n expect(params[0].description).toBe(\"First param\");\n expect(params[1].name).toBe(\"param2\");\n expect(params[1].type).toBe(\"number\");\n });\n\n it(\"handles toolSchema with JSON Schema prefixItems (2020-12 format)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // JSON Schema 2020-12 tuple format\n toolSchema: {\n type: \"array\",\n prefixItems: [\n { type: \"boolean\", description: \"Flag\" },\n { type: \"string\" },\n ],\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n expect(params).toHaveLength(2);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"boolean\");\n expect(params[0].description).toBe(\"Flag\");\n expect(params[1].name).toBe(\"param2\");\n expect(params[1].type).toBe(\"string\");\n });\n\n it(\"handles toolSchema with non-tuple JSON Schema (fallback)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test-tool\",\n description: \"Test tool\",\n tool: jest.fn(),\n // Non-tuple JSON Schema - should be wrapped as single param\n toolSchema: {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n },\n } as JSONSchema7,\n };\n\n const params = getParametersFromToolSchema(tool);\n\n // Non-tuple schemas should be wrapped as a single param\n expect(params).toHaveLength(1);\n expect(params[0].name).toBe(\"param1\");\n expect(params[0].type).toBe(\"object\");\n });\n });\n });\n\n describe(\"schemaToJsonSchema\", () => {\n it(\"returns JSON Schema as-is when already a JSON Schema\", () => {\n const jsonSchema: JSONSchema7 = {\n type: \"object\",\n properties: {\n name: { type: \"string\" },\n },\n };\n\n const result = schemaToJsonSchema(jsonSchema);\n expect(result).toBe(jsonSchema); // Same reference\n });\n\n it(\"converts Zod 4 schema to JSON Schema\", () => {\n const zodSchema = z4.object({\n name: z4.string(),\n count: z4.number(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n count: expect.objectContaining({ type: \"number\" }),\n }),\n }),\n );\n });\n\n it(\"converts Zod 3 schema to JSON Schema\", () => {\n const zodSchema = z3.object({\n title: z3.string(),\n });\n\n const result = schemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n title: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n });\n\n describe(\"safeSchemaToJsonSchema\", () => {\n it(\"returns undefined for null schema\", () => {\n expect(safeSchemaToJsonSchema(null)).toBeUndefined();\n });\n\n it(\"returns undefined for undefined schema\", () => {\n expect(safeSchemaToJsonSchema(undefined)).toBeUndefined();\n });\n\n it(\"converts valid schema successfully\", () => {\n const zodSchema = z4.object({ name: z4.string() });\n const result = safeSchemaToJsonSchema(zodSchema);\n\n expect(result).toEqual(\n expect.objectContaining({\n type: \"object\",\n properties: expect.objectContaining({\n name: expect.objectContaining({ type: \"string\" }),\n }),\n }),\n );\n });\n\n it(\"returns undefined and calls onError for invalid schema\", () => {\n // Create something that looks like a Standard Schema but will fail conversion\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const onError = jest.fn();\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n const result = safeSchemaToJsonSchema(brokenSchema as any, onError);\n\n consoleSpy.mockRestore();\n\n expect(result).toBeUndefined();\n expect(onError).toHaveBeenCalled();\n });\n\n it(\"logs error to console when conversion fails\", () => {\n const brokenSchema = {\n \"~standard\": {\n version: 1,\n vendor: \"broken\",\n validate: () => ({ value: {} }),\n },\n };\n\n const consoleSpy = jest.spyOn(console, \"error\").mockImplementation();\n\n safeSchemaToJsonSchema(brokenSchema as any);\n\n expect(consoleSpy).toHaveBeenCalledWith(\n \"Error converting schema to JSON Schema:\",\n expect.any(Error),\n );\n\n consoleSpy.mockRestore();\n });\n });\n\n describe(\"hasInputSchema\", () => {\n it(\"returns true for tool with inputSchema\", () => {\n const tool: TamboTool = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n inputSchema: z4.object({ a: z4.string() }),\n outputSchema: z4.void(),\n };\n\n expect(hasInputSchema(tool)).toBe(true);\n });\n\n it(\"returns false for tool with toolSchema (deprecated)\", () => {\n const tool: TamboToolWithToolSchema = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n toolSchema: z3.function().args(z3.string()).returns(z3.void()),\n };\n\n expect(hasInputSchema(tool)).toBe(false);\n });\n\n it(\"returns false for tool with null inputSchema\", () => {\n const tool = {\n name: \"test\",\n description: \"test\",\n tool: jest.fn(),\n inputSchema: null,\n outputSchema: z4.void(),\n };\n\n expect(hasInputSchema(tool as any)).toBe(false);\n });\n });\n});\n"]}
|
|
@@ -4,6 +4,7 @@ import { StandardSchemaV1 } from "@standard-schema/spec";
|
|
|
4
4
|
*
|
|
5
5
|
* Standard Schema compliant validators have a `~standard` property containing
|
|
6
6
|
* metadata about the schema including version, vendor, and validate function.
|
|
7
|
+
* Uses duck typing to avoid cross-version Zod compatibility issues.
|
|
7
8
|
* @param obj - The object to check
|
|
8
9
|
* @returns True if the object implements StandardSchemaV1
|
|
9
10
|
* @example
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.d.ts","sourceRoot":"","sources":["../../src/schema/standard-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"standard-schema.d.ts","sourceRoot":"","sources":["../../src/schema/standard-schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAuBtE"}
|
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
import { z } from "./alias";
|
|
2
|
-
const standardSchemaProps = z.object({
|
|
3
|
-
version: z.literal(1),
|
|
4
|
-
vendor: z.string(),
|
|
5
|
-
validate: z.function({
|
|
6
|
-
input: [z.unknown()],
|
|
7
|
-
output: z.union([z.unknown(), z.promise(z.unknown())]),
|
|
8
|
-
}),
|
|
9
|
-
});
|
|
10
|
-
const standardSchemaObject = z.object({
|
|
11
|
-
"~standard": standardSchemaProps,
|
|
12
|
-
});
|
|
13
1
|
/**
|
|
14
2
|
* Type guard to check if an object implements the Standard Schema interface.
|
|
15
3
|
*
|
|
16
4
|
* Standard Schema compliant validators have a `~standard` property containing
|
|
17
5
|
* metadata about the schema including version, vendor, and validate function.
|
|
6
|
+
* Uses duck typing to avoid cross-version Zod compatibility issues.
|
|
18
7
|
* @param obj - The object to check
|
|
19
8
|
* @returns True if the object implements StandardSchemaV1
|
|
20
9
|
* @example
|
|
@@ -29,6 +18,22 @@ const standardSchemaObject = z.object({
|
|
|
29
18
|
* ```
|
|
30
19
|
*/
|
|
31
20
|
export function isStandardSchema(obj) {
|
|
32
|
-
|
|
21
|
+
if (typeof obj !== "object" || obj === null) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
if (!("~standard" in obj)) {
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
const standard = obj["~standard"];
|
|
28
|
+
if (typeof standard !== "object" || standard === null) {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
// Check required Standard Schema v1 properties
|
|
32
|
+
return ("version" in standard &&
|
|
33
|
+
standard.version === 1 &&
|
|
34
|
+
"vendor" in standard &&
|
|
35
|
+
typeof standard.vendor === "string" &&
|
|
36
|
+
"validate" in standard &&
|
|
37
|
+
typeof standard.validate === "function");
|
|
33
38
|
}
|
|
34
39
|
//# sourceMappingURL=standard-schema.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../../src/schema/standard-schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"standard-schema.js","sourceRoot":"","sources":["../../src/schema/standard-schema.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,UAAU,gBAAgB,CAAC,GAAY;IAC3C,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,CAAC,CAAC,WAAW,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,CAAC,CAAC;IAClC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,+CAA+C;IAC/C,OAAO,CACL,SAAS,IAAI,QAAQ;QACrB,QAAQ,CAAC,OAAO,KAAK,CAAC;QACtB,QAAQ,IAAI,QAAQ;QACpB,OAAO,QAAQ,CAAC,MAAM,KAAK,QAAQ;QACnC,UAAU,IAAI,QAAQ;QACtB,OAAO,QAAQ,CAAC,QAAQ,KAAK,UAAU,CACxC,CAAC;AACJ,CAAC","sourcesContent":["import { StandardSchemaV1 } from \"@standard-schema/spec\";\n\n/**\n * Type guard to check if an object implements the Standard Schema interface.\n *\n * Standard Schema compliant validators have a `~standard` property containing\n * metadata about the schema including version, vendor, and validate function.\n * Uses duck typing to avoid cross-version Zod compatibility issues.\n * @param obj - The object to check\n * @returns True if the object implements StandardSchemaV1\n * @example\n * ```typescript\n * import { z } from \"zod/v4\";\n *\n * const zodSchema = z.object({ name: z.string() });\n * isStandardSchema(zodSchema); // true\n *\n * const jsonSchema = { type: \"object\", properties: { name: { type: \"string\" } } };\n * isStandardSchema(jsonSchema); // false\n * ```\n */\nexport function isStandardSchema(obj: unknown): obj is StandardSchemaV1 {\n if (typeof obj !== \"object\" || obj === null) {\n return false;\n }\n\n if (!(\"~standard\" in obj)) {\n return false;\n }\n\n const standard = obj[\"~standard\"];\n if (typeof standard !== \"object\" || standard === null) {\n return false;\n }\n\n // Check required Standard Schema v1 properties\n return (\n \"version\" in standard &&\n standard.version === 1 &&\n \"vendor\" in standard &&\n typeof standard.vendor === \"string\" &&\n \"validate\" in standard &&\n typeof standard.validate === \"function\"\n );\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"standard-schema.test.d.ts","sourceRoot":"","sources":["../../src/schema/standard-schema.test.ts"],"names":[],"mappings":""}
|