index.ts 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import {
  2. DefinedFormats,
  3. FormatMode,
  4. FormatName,
  5. formatNames,
  6. fastFormats,
  7. fullFormats,
  8. } from "./formats"
  9. import formatLimit from "./limit"
  10. import type Ajv from "ajv"
  11. import type {Plugin, Format} from "ajv"
  12. import {_, Name} from "ajv/dist/compile/codegen"
  13. export {FormatMode, FormatName} from "./formats"
  14. export {LimitFormatError} from "./limit"
  15. export interface FormatOptions {
  16. mode?: FormatMode
  17. formats?: FormatName[]
  18. keywords?: boolean
  19. }
  20. export type FormatsPluginOptions = FormatName[] | FormatOptions
  21. export interface FormatsPlugin extends Plugin<FormatsPluginOptions> {
  22. get: (format: FormatName, mode?: FormatMode) => Format
  23. }
  24. const fullName = new Name("fullFormats")
  25. const fastName = new Name("fastFormats")
  26. const formatsPlugin: FormatsPlugin = (
  27. ajv: Ajv,
  28. opts: FormatsPluginOptions = {keywords: true}
  29. ): Ajv => {
  30. if (Array.isArray(opts)) {
  31. addFormats(ajv, opts, fullFormats, fullName)
  32. return ajv
  33. }
  34. const [formats, exportName] =
  35. opts.mode === "fast" ? [fastFormats, fastName] : [fullFormats, fullName]
  36. const list = opts.formats || formatNames
  37. addFormats(ajv, list, formats, exportName)
  38. if (opts.keywords) formatLimit(ajv)
  39. return ajv
  40. }
  41. formatsPlugin.get = (name: FormatName, mode: FormatMode = "full"): Format => {
  42. const formats = mode === "fast" ? fastFormats : fullFormats
  43. const f = formats[name]
  44. if (!f) throw new Error(`Unknown format "${name}"`)
  45. return f
  46. }
  47. function addFormats(ajv: Ajv, list: FormatName[], fs: DefinedFormats, exportName: Name): void {
  48. ajv.opts.code.formats ??= _`require("ajv-formats/dist/formats").${exportName}`
  49. for (const f of list) ajv.addFormat(f, fs[f])
  50. }
  51. module.exports = exports = formatsPlugin
  52. Object.defineProperty(exports, "__esModule", {value: true})
  53. export default formatsPlugin