(js: JsonSchema): Document<"draft-2020-12">Parses a raw Draft-07 JSON Schema into a Document<"draft-2020-12">.
When to use
Use when you have a raw JSON Schema object that follows Draft-07 conventions and need the canonical Draft-2020-12 document representation.
Details
This converts Draft-07 tuple syntax (items as array plus
additionalItems) to Draft-2020-12 form (prefixItems plus items),
rewrites #/definitions/... refs to #/$defs/..., and extracts root-level
definitions into the definitions field.
Gotchas
Unsupported keywords, such as if/then/else and $id, are dropped.
Example (Parsing a Draft-07 schema)
import { JsonSchema } from "effect"
const raw: JsonSchema.JsonSchema = {
type: "object",
properties: {
tags: {
type: "array",
items: { type: "string" }
}
}
}
const doc = JsonSchema.fromSchemaDraft07(raw)
console.log(doc.dialect) // "draft-2020-12"
console.log(doc.schema.properties) // { tags: { type: "array", items: { type: "string" } } }export function function fromSchemaDraft07(
js: JsonSchema
): Document<"draft-2020-12">
Parses a raw Draft-07 JSON Schema into a Document<"draft-2020-12">.
When to use
Use when you have a raw JSON Schema object that follows Draft-07 conventions
and need the canonical Draft-2020-12 document representation.
Details
This converts Draft-07 tuple syntax (items as array plus
additionalItems) to Draft-2020-12 form (prefixItems plus items),
rewrites #/definitions/... refs to #/$defs/..., and extracts root-level
definitions into the definitions field.
Gotchas
Unsupported keywords, such as if/then/else and $id, are dropped.
Example (Parsing a Draft-07 schema)
import { JsonSchema } from "effect"
const raw: JsonSchema.JsonSchema = {
type: "object",
properties: {
tags: {
type: "array",
items: { type: "string" }
}
}
}
const doc = JsonSchema.fromSchemaDraft07(raw)
console.log(doc.dialect) // "draft-2020-12"
console.log(doc.schema.properties) // { tags: { type: "array", items: { type: "string" } } }
fromSchemaDraft07(js: JsonSchemajs: JsonSchema): interface Document<D extends Dialect>A structured container for a single JSON Schema and its associated
definitions.
When to use
Use when you need to carry a root schema together with its shared
definitions, or when converting between dialects with the from* and to*
functions.
Details
The schema field holds the root schema without the definitions
collection. Root definitions are stored separately in definitions and
referenced via #/$defs/<name> for Draft-2020-12, #/definitions/<name>
for Draft-07, and #/components/schemas/<name> for OpenAPI 3.1 and
OpenAPI 3.0.
Example (Inspecting a parsed document)
import { JsonSchema } from "effect"
const raw: JsonSchema.JsonSchema = {
type: "string",
$defs: { Trimmed: { type: "string", minLength: 1 } }
}
const doc = JsonSchema.fromSchemaDraft2020_12(raw)
console.log(doc.dialect) // "draft-2020-12"
console.log(doc.schema) // { type: "string" }
console.log(doc.definitions) // { Trimmed: { type: "string", minLength: 1 } }
Document<"draft-2020-12"> {
let let definitions: Definitions | undefineddefinitions: Definitions | undefined
const const schema: JsonSchemaschema = function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(js: JsonSchemajs, true) as JsonSchema
return {
Document<"draft-2020-12">.dialect: "draft-2020-12"dialect: "draft-2020-12",
Document<D extends Dialect>.schema: JsonSchemaschema,
Document<D extends Dialect>.definitions: Definitionsdefinitions: let definitions: Definitions | undefineddefinitions ?? {}
}
function function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(node: unknownnode: unknown, isRoot: booleanisRoot: boolean): unknown {
if (var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(node: unknownnode)) return node: any[]node.Array<any>.map<unknown>(callbackfn: (value: any, index: number, array: any[]) => unknown, thisArg?: any): unknown[]Calls a defined callback function on each element of an array, and returns an array that contains the results.
map((v: anyv) => function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(v: anyv, false))
if (!import PredicatePredicate.function isObject(
input: unknown
): input is {
[x: PropertyKey]: unknown
}
Checks whether a value is a non-null object value that is not an array.
When to use
Use to narrow unknown input to a non-null, non-array object with a
Predicate guard.
Details
This is a structural runtime check using typeof input === "object", so it
also accepts object instances such as Date, Map, class instances, and
typed arrays. It excludes null and arrays.
Example (Guarding objects)
import { Predicate } from "effect"
console.log(Predicate.isObject({ a: 1 }))
console.log(Predicate.isObject([1, 2]))
isObject(node: unknownnode)) return node: unknownnode
const const out: Record<string, unknown>out: type Record<K extends keyof any, T> = {
[P in K]: T
}
Construct a type with a set of properties K of type T
Record<string, unknown> = {}
let let prefixItems: unknownprefixItems: unknown = var undefinedundefined
let let additionalItems: unknownadditionalItems: unknown = var undefinedundefined
for (const const k: stringk of var Object: ObjectConstructorProvides functionality common to all JavaScript objects.
Object.ObjectConstructor.keys(o: {}): string[] (+1 overload)Returns the names of the enumerable string properties and methods of an object.
keys(node: {
[x: string]: unknown
[x: number]: unknown
[x: symbol]: unknown
}
node)) {
const const v: unknownv = node: {
[x: string]: unknown
[x: number]: unknown
[x: symbol]: unknown
}
node[const k: stringk]
switch (const k: stringk) {
case "$ref":
const out: Record<string, unknown>out.unknown$ref = typeof const v: unknownv === "string" ? const v: stringv.String.replace(searchValue: {
[Symbol.replace](string: string, replaceValue: string): string;
}, replaceValue: string): string (+3 overloads)
Passes a string and
{@linkcode
replaceValue
}
to the [Symbol.replace] method on
{@linkcode
searchValue
}
. This method is expected to implement its own replacement algorithm.
replace(const RE_DEFINITIONS: RegExpRE_DEFINITIONS, "#/$defs") : const v: unknownv
break
case "definitions": {
const const mapped:
| Record<string, unknown>
| undefined
mapped = function walk_object(
value: unknown,
walk: (
node: unknown,
isRoot: boolean
) => unknown
): Record<string, unknown> | undefined
walk_object(const v: unknownv, function (local function) walk(node: unknown, isRoot: boolean): unknownwalk)
if (isRoot: booleanisRoot) {
let definitions: Definitions | undefineddefinitions = const mapped:
| Record<string, unknown>
| undefined
mapped as Definitions | undefined
} else {
const out: Record<string, unknown>out.unknowndefinitions = const mapped:
| Record<string, unknown>
| undefined
mapped ?? const v: unknownv
}
break
}
case "items":
let prefixItems: unknownprefixItems = const v: unknownv
break
case "additionalItems":
let additionalItems: unknownadditionalItems = const v: unknownv
break
case "properties":
case "patternProperties": {
const const mapped:
| Record<string, unknown>
| undefined
mapped = function walk_object(
value: unknown,
walk: (
node: unknown,
isRoot: boolean
) => unknown
): Record<string, unknown> | undefined
walk_object(const v: unknownv, function (local function) walk(node: unknown, isRoot: boolean): unknownwalk)
const out: Record<string, unknown>out[const k:
| "properties"
| "patternProperties"
k] = const mapped:
| Record<string, unknown>
| undefined
mapped ?? const v: unknownv
break
}
case "additionalProperties":
case "propertyNames":
const out: Record<string, unknown>out[const k:
| "additionalProperties"
| "propertyNames"
k] = function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(const v: unknownv, false)
break
case "allOf":
case "anyOf":
case "oneOf":
const out: Record<string, unknown>out[const k: "allOf" | "anyOf" | "oneOf"k] = var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(const v: unknownv) ? const v: any[]v.Array<any>.map<unknown>(callbackfn: (value: any, index: number, array: any[]) => unknown, thisArg?: any): unknown[]Calls a defined callback function on each element of an array, and returns an array that contains the results.
map((x: anyx) => function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(x: anyx, false)) : const v: unknownv
break
case "type":
case "required":
case "enum":
case "const":
case "title":
case "description":
case "default":
case "examples":
case "format":
case "readOnly":
case "writeOnly":
case "pattern":
case "minimum":
case "maximum":
case "exclusiveMinimum":
case "exclusiveMaximum":
case "minLength":
case "maxLength":
case "minItems":
case "maxItems":
case "minProperties":
case "maxProperties":
case "multipleOf":
case "uniqueItems":
const out: Record<string, unknown>out[const k:
| "type"
| "required"
| "enum"
| "const"
| "title"
| "description"
| "default"
| "examples"
| "format"
| "readOnly"
| "writeOnly"
| "pattern"
| "minimum"
| "maximum"
| "exclusiveMinimum"
| "exclusiveMaximum"
| "minLength"
| "maxLength"
| "minItems"
| "maxItems"
| "minProperties"
| "maxProperties"
| "multipleOf"
| "uniqueItems"
k] = const v: unknownv
break
default:
break
}
}
// Draft-07 tuples -> 2020-12 tuples
if (let prefixItems: unknownprefixItems !== var undefinedundefined) {
if (var Array: ArrayConstructorArray.ArrayConstructor.isArray(arg: any): arg is any[]isArray(let prefixItems: {} | nullprefixItems)) {
const out: Record<string, unknown>out.unknownprefixItems = let prefixItems: any[]prefixItems.Array<any>.map<unknown>(callbackfn: (value: any, index: number, array: any[]) => unknown, thisArg?: any): unknown[]Calls a defined callback function on each element of an array, and returns an array that contains the results.
map((x: anyx) => function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(x: anyx, false))
if (let additionalItems: unknownadditionalItems !== var undefinedundefined) const out: Record<string, unknown>out.unknownitems = function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(let additionalItems: {} | nulladditionalItems, false)
} else {
const out: Record<string, unknown>out.unknownitems = function (local function) walk(node: unknown, isRoot: boolean): unknownwalk(let prefixItems: {} | nullprefixItems, false)
}
}
return const out: Record<string, unknown>out
}
}