MCPcopy Create free account
hub / github.com/Effect-TS/effect / toSchemaDraft07

Function toSchemaDraft07

packages/effect/src/JsonSchema.ts:681–743  ·  view source on GitHub ↗
(schema: JsonSchema)

Source from the content-addressed store, hash-verified

679}
680
681function toSchemaDraft07(schema: JsonSchema): JsonSchema {
682 return transformSchema(schema, (src) => {
683 rewriteSchemaRef(src, (ref) => ref.replace(RE_DEFS, "#/definitions"))
684 const out: Record<string, unknown> = {}
685
686 let prefixItems: unknown = undefined
687 let items: unknown = undefined
688
689 for (const k of Object.keys(src)) {
690 const v = src[k]
691
692 if (k === "required" && Array.isArray(v) && v.length === 0) continue
693 if (DRAFT_07_COPY_KEYWORDS.has(k)) {
694 out[k] = v
695 continue
696 }
697 if (
698 MAP_SUBSCHEMA_KEYWORDS.has(k) ||
699 ARRAY_SUBSCHEMA_KEYWORDS.has(k) ||
700 DRAFT_07_SINGLE_SUBSCHEMA_KEYWORDS.has(k)
701 ) {
702 out[k] = v
703 continue
704 }
705
706 switch (k) {
707 // Tuple handling (2020-12 form)
708 case "prefixItems":
709 prefixItems = v
710 break
711 case "items":
712 items = v
713 break
714
715 default:
716 // drop everything else (subset)
717 break
718 }
719 }
720
721 // 2020-12 tuples -> Draft-07 tuples
722 if (prefixItems !== undefined) {
723 if (Array.isArray(prefixItems)) {
724 out.items = prefixItems
725 if (items !== undefined) out.additionalItems = items
726 } else {
727 // Non-standard, but keep a reasonable behavior
728 out.items = prefixItems
729 }
730 } else if (items !== undefined) {
731 // Regular items schema stays as items
732 out.items = items
733 }
734
735 const $ref = out.$ref
736 if (typeof $ref === "string" && Object.keys(out).length > 1) {
737 delete out.$ref
738 out.allOf = [{ $ref }, ...(Array.isArray(out.allOf) ? out.allOf : [])]

Callers 1

toDocumentDraft07Function · 0.85

Calls 4

transformSchemaFunction · 0.85
rewriteSchemaRefFunction · 0.85
replaceMethod · 0.45
hasMethod · 0.45

Tested by

no test coverage detected