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
TypeScript
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;