vite-plugin-ajv-compile
v0.0.1
Published
Vite plugin to compile AJV validators as virtual modules
Downloads
15
Maintainers
Readme
vite-plugin-ajv-compile
Table of contents
- 🍵 Introduction
- 🚀 Get started
- ⚙️ Options
- 🧬 Types
- 🤝 Contribute
- 👑 Author
- ⚖️ License
- 📰 Changelog
- 🧱 Related packages
🍵 Introduction
This Vite plugin allows you to automatically pre-compile your AJV data validators and inject it as virtual modules.
It is also designed to avoid unsafe eval calls from ajv as mentioned here.
- TypeScript friendly 👍
- Tree-shaking compatible 🌴
- No unsafe
eval✔
Note: Under the hood, this plugin does not use the virtual modules specific feature but i think we have to consider these modules as virtual as they are generated dependencies.
🚀 Get started
npm install -D vite-plugin-ajv-compileAdd the plugin in your vite.config.ts file:
// vite.config.ts
import { defineConfig } from 'vite'
import ajvCompile from 'vite-plugin-ajv-compile'
export default defineConfig({
plugins: [
ajvCompile({
validators: [
{
moduleId: 'virtual:schemas.validators/User',
file: './User.json'
}
]
})
]
})👀 See also: the options section below
Supposing you have the following JSON Schema:
// User.json
{
"$id": "User.json",
"title": "User",
"description": "User model DTO",
"required": [
"id",
"firstname",
"lastname",
"created_at"
],
"properties": {
"id": {
"description": "User unique ID",
"type": "integer"
},
"firstname": {
"description": "Firstname",
"type": "string"
},
"lastname": {
"description": "Lastname",
"type": "string"
},
"created_at": {
"description": "User creation date",
"type": "string",
"format": "date-time"
}
},
"type": "object"
}So, just import the data validator from your virtual module:
import validateUser from 'virtual:schemas.validators/User'
validateUser({ id: 1, firstname: 'Chuck', lastname: 'Norris', created_at: '0000-00-00 00:00:00' })
// see AJV documentation to learn more about data validationWith TypeScript
You should use TypeScript module augmentation feature
to automatically resolve your data validator types. For example, in a virtual.d.ts file:
// virtual.d.ts
declare module 'virtual:schemas.validators/*' {
function validator<T> (data: T): data is T
export default validator
}See also the example.
⚙️ Options
This plugin supports some options. See Options type below.
Example:
// vite.config.ts
import { defineConfig } from 'vite'
import path from 'node:path'
import addFormats from 'ajv-formats'
import ajvCompile from 'vite-plugin-ajv-compile'
export default defineConfig({
plugins: [
ajvCompile({
validators: [
{
moduleId: 'virtual:schemas.validators/User',
file: path.resolve(import.meta.dirname, './User.json'),
extendAjvInstance: (ajv) => {
addFormats(ajv)
return ajv
}
}
],
clearCache: false
})
]
})🧬 Types
Options
export interface Options {
/**
* Validators configuration
*/
validators: ValidatorOption[]
/**
* Clear the cache. (Default: true)
*/
clearCache?: boolean
}
ValidatorOption
export interface ValidatorOption {
/**
* The virtual module ID
*/
moduleId: string
/**
* The JSON schema file
*/
file?: string
/**
* The JSON schema object. (Ignored if file is provided)
*/
schema?: object
/**
* Extend or configure the AJV instance
*/
extendAjvInstance?: (ajv: Ajv) => Ajv
}
🤝 Contribute
You would like to contribute to this project? You are welcome!
First, please check:
👑 Author
Made with ❤ by Hervé Perchec
⚖️ License
📰 Changelog
See all changes to this project in the CHANGELOG.md file.
🧱 Related packages
Made with ❤ by [object Object]
README.md - this file was auto generated with juisy README templater. Don't edit it.
