-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
index.ts
62 lines (53 loc) · 1.75 KB
/
index.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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