1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- 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
|