UNPKG

json-schema-describes-subset

Version:

Tools for static JSON schema analysis, including functions to determine if one schema describes a subset of another or if a schema describes the empty set or to convert a schema to its disjunctive normal form (DNF).

85 lines (84 loc) 3.32 kB
import { AllOfSchema, AtomicSchemaObject, type LogicalCombination, type LogicalCombinationOfLiterals } from '../../atomic-schema/index.js'; import { MultipleOfAtomicSchema } from '../../built-in-plugins/type.js'; import type { ExtractionPlugin, SimplificationPlugin, ValidationPlugin } from '../../plugin/index.js'; import { MaximumAtomicSchema, MinimumAtomicSchema } from '../../built-in-plugins/index.js'; export declare const stringFormatNames: ["date", "time", "date-time", "iso-time", "iso-date-time", "duration", "uri-reference", "uri-template", "uri", "email", "hostname", "ipv4", "ipv6", "regex", "uuid", "json-pointer", "relative-json-pointer", "byte"]; export type StringFormatName = (typeof stringFormatNames)[number]; export declare class StringFormatAtomicSchema<FormatName_ extends StringFormatName = StringFormatName> extends AtomicSchemaObject { readonly format: FormatName_; constructor(format: FormatName_); negate(): LogicalCombinationOfLiterals; toJSONSchema(): { format: FormatName_; }; } export declare const stringFormatLogicalCombinations: Record<StringFormatName, LogicalCombination>; export declare const numberFormatLogicalCombinations: { readonly int32: AllOfSchema<MultipleOfAtomicSchema | MinimumAtomicSchema | MaximumAtomicSchema>; readonly int64: MultipleOfAtomicSchema; }; export declare const formatExtractionPlugin: ExtractionPlugin; export declare const formatValidationPlugin: ValidationPlugin; export type FormatConjunctionSchema<FormatName extends string = string> = { allOf?: ({ format: FormatName; } | { not: { format: FormatName; }; })[]; }; export type FormatSimplificationPlugin = SimplificationPlugin<'string', FormatConjunctionSchema<StringFormatName>, never>; export declare const formatSimplificationPlugin: FormatSimplificationPlugin; export type FormatPlugin = [ ValidationPlugin, ExtractionPlugin, FormatSimplificationPlugin ]; /** * Adds support for the `format` values provided by * [`ajv-formats`](https://ajv.js.org/packages/ajv-formats.html). * * `format`s that apply to strings are only compared for equality, so that only * schemas like * * ```json * { * "allOf": [ * { "format": "email" }, * { "not": { "format": "email" } } * ] * } * ``` * * include a [contradiction](https://github.com/jobohner/json-schema-describes-subset/blob/v0.4.0/docs/README.md#contradictions). * * `format`s that apply to numbers are transformed to equivalent * {@link AtomicSchemaObject}s like {@link MultipleOfAtomicSchema}, * {@link MinimumAtomicSchema} or {@link MaximumAtomicSchema}. * * @example ```ts * import { schemaDescribesSubset } from 'json-schema-describes-subset' * import { formatPlugin } from 'json-schema-describes-subset/custom-plugins/format-plugin' * * console.log( * schemaDescribesSubset( * { format: 'email' }, * { format: 'date-time' }, * { plugins: [formatPlugin] }, * ), * ) // logs: `null` * * console.log( * schemaDescribesSubset( * { type: 'integer', minimum: 0, maximum: 10 }, * { format: 'int32' }, * { plugins: [formatPlugin] }, * ), * ) // logs: `true` * ``` * * @privateRemarks TODO: return type of {@link toDNF} * */ export declare const formatPlugin: FormatPlugin;