63 lines
1.8 KiB
TypeScript
63 lines
1.8 KiB
TypeScript
|
import {
|
||
|
DefinedFormats,
|
||
|
FormatMode,
|
||
|
FormatName,
|
||
|
formatNames,
|
||
|
fastFormats,
|
||
|
fullFormats,
|
||
|
} from "./formats"
|
||
|
import formatLimit from "./limit"
|
||
|
import type Ajv from "ajv"
|
||
|
import type {Plugin, Format} from "ajv"
|
||
|
import {_, Name} from "ajv/dist/compile/codegen"
|
||
|
|
||
|
export {FormatMode, FormatName} from "./formats"
|
||
|
export {LimitFormatError} from "./limit"
|
||
|
export interface FormatOptions {
|
||
|
mode?: FormatMode
|
||
|
formats?: FormatName[]
|
||
|
keywords?: boolean
|
||
|
}
|
||
|
|
||
|
export type FormatsPluginOptions = FormatName[] | FormatOptions
|
||
|
|
||
|
export interface FormatsPlugin extends Plugin<FormatsPluginOptions> {
|
||
|
get: (format: FormatName, mode?: FormatMode) => Format
|
||
|
}
|
||
|
|
||
|
const fullName = new Name("fullFormats")
|
||
|
const fastName = new Name("fastFormats")
|
||
|
|
||
|
const formatsPlugin: FormatsPlugin = (
|
||
|
ajv: Ajv,
|
||
|
opts: FormatsPluginOptions = {keywords: true}
|
||
|
): Ajv => {
|
||
|
if (Array.isArray(opts)) {
|
||
|
addFormats(ajv, opts, fullFormats, fullName)
|
||
|
return ajv
|
||
|
}
|
||
|
const [formats, exportName] =
|
||
|
opts.mode === "fast" ? [fastFormats, fastName] : [fullFormats, fullName]
|
||
|
const list = opts.formats || formatNames
|
||
|
addFormats(ajv, list, formats, exportName)
|
||
|
if (opts.keywords) formatLimit(ajv)
|
||
|
return ajv
|
||
|
}
|
||
|
|
||
|
formatsPlugin.get = (name: FormatName, mode: FormatMode = "full"): Format => {
|
||
|
const formats = mode === "fast" ? fastFormats : fullFormats
|
||
|
const f = formats[name]
|
||
|
if (!f) throw new Error(`Unknown format "${name}"`)
|
||
|
return f
|
||
|
}
|
||
|
|
||
|
function addFormats(ajv: Ajv, list: FormatName[], fs: DefinedFormats, exportName: Name): void {
|
||
|
ajv.opts.code.formats ??= _`require("ajv-formats/dist/formats").${exportName}`
|
||
|
for (const f of list) ajv.addFormat(f, fs[f])
|
||
|
}
|
||
|
|
||
|
module.exports = exports = formatsPlugin
|
||
|
Object.defineProperty(exports, "__esModule", {value: true})
|
||
|
|
||
|
export default formatsPlugin
|