JSON Schema Support
Complete mapping of JSON Schema Draft-07 features to Luq plugins
Quick Setup
Full Feature Import
import { Builder } from "@maroonedog/luq";
import { jsonSchemaFullFeaturePlugin } from "@maroonedog/luq/plugins/jsonSchemaFullFeature";
const validator = Builder()
.use(jsonSchemaFullFeaturePlugin)
.fromJsonSchema(schema)
.build();
Selective Import
import { Builder } from "@maroonedog/luq";
import { jsonSchemaPlugin } from "@maroonedog/luq/plugins/jsonSchema";
import { requiredPlugin } from "@maroonedog/luq/plugins/required";
import { stringMinPlugin } from "@maroonedog/luq/plugins/stringMin";
import { stringEmailPlugin } from "@maroonedog/luq/plugins/stringEmail";
const validator = Builder()
.use(jsonSchemaPlugin)
.use(requiredPlugin)
.use(stringMinPlugin)
.use(stringEmailPlugin)
.fromJsonSchema(schema)
.build();
Complete Feature Mapping
Core Types
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
type: "string" | Built-in | String type validation |
type: "number" | Built-in | Number type validation |
type: "integer" | numberIntegerPlugin | Integer validation |
type: "boolean" | Built-in | Boolean type validation |
type: "null" | nullablePlugin | Null type validation |
type: "array" | Built-in | Array type validation |
type: "object" | Built-in | Object type validation |
String Constraints
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
minLength | stringMinPlugin | Minimum string length |
maxLength | stringMaxPlugin | Maximum string length |
pattern | stringPatternPlugin | Regex pattern matching |
String Formats
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
format: "email" | stringEmailPlugin | Email validation |
format: "url"/"uri" | stringUrlPlugin | URL/URI validation |
format: "uuid" | uuidPlugin | UUID validation |
format: "ipv4" | stringIpv4Plugin | IPv4 address validation |
format: "ipv6" | stringIpv6Plugin | IPv6 address validation |
format: "hostname" | stringHostnamePlugin | Hostname validation |
format: "date-time" | stringDatetimePlugin | ISO 8601 date-time with timezone support |
format: "date" | stringDatePlugin | ISO 8601 date (YYYY-MM-DD) |
format: "time" | stringTimePlugin | Time format (HH:MM:SS) |
format: "duration" | stringDurationPlugin | ISO 8601 duration |
format: "json-pointer" | stringJsonPointerPlugin | JSON Pointer (RFC 6901) |
format: "relative-json-pointer" | stringRelativeJsonPointerPlugin | Relative JSON Pointer |
format: "iri" | stringIriPlugin | IRI (RFC 3987) |
format: "iri-reference" | stringIriReferencePlugin | IRI reference |
format: "uri-template" | stringUriTemplatePlugin | URI Template (RFC 6570) |
Number Constraints
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
minimum | numberMinPlugin | Minimum value (inclusive) |
maximum | numberMaxPlugin | Maximum value (inclusive) |
exclusiveMinimum | numberMinPlugin | Minimum value (exclusive) |
exclusiveMaximum | numberMaxPlugin | Maximum value (exclusive) |
multipleOf | numberMultipleOfPlugin | Multiple of a number |
Array Constraints
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
minItems | arrayMinLengthPlugin | Minimum array length |
maxItems | arrayMaxLengthPlugin | Maximum array length |
uniqueItems | arrayUniquePlugin | Unique array items |
contains | arrayContainsPlugin | Array contains schema |
items (tuple) | tupleBuilderPlugin | Tuple validation |
Object Constraints
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
minProperties | objectMinPropertiesPlugin | Minimum properties count |
maxProperties | objectMaxPropertiesPlugin | Maximum properties count |
required | requiredPlugin | Required properties |
additionalProperties | objectAdditionalPropertiesPlugin | Additional properties validation |
properties | Built-in | Object properties definition |
patternProperties | objectPatternPropertiesPlugin | Pattern-based properties |
propertyNames | objectPropertyNamesPlugin | Property name validation |
dependentRequired | objectDependentRequiredPlugin | Conditional required fields |
dependentSchemas | objectDependentSchemasPlugin | Conditional schemas |
Value Constraints
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
enum | oneOfPlugin | Enumeration values |
const | literalPlugin | Constant value |
Schema Composition
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
allOf | customPlugin | All schemas must match |
anyOf | customPlugin | Any schema must match |
oneOf | oneOfPlugin + customPlugin | Exactly one schema must match |
not | customPlugin | Schema must not match |
Conditional Validation
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
if/then/else | requiredIfPlugin + customPlugin | Conditional validation |
References
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
$ref | Built-in (jsonSchemaPlugin) | Schema references |
definitions/$defs | Built-in (jsonSchemaPlugin) | Schema definitions |
Content Validation
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
contentEncoding | stringContentEncodingPlugin | Content encoding validation |
contentMediaType | stringContentMediaTypePlugin | Media type validation |
Access Control
JSON Schema Feature | Luq Plugin | Description |
---|---|---|
readOnly | readOnlyWriteOnlyPlugin | Read-only field validation |
writeOnly | readOnlyWriteOnlyPlugin | Write-only field validation |
Complete Example
JSON Schema to Luq Conversion
// JSON Schema Definition
const userSchema = {
type: "object",
properties: {
name: {
type: "string",
minLength: 3,
maxLength: 50
},
email: {
type: "string",
format: "email"
},
age: {
type: "number",
minimum: 18,
maximum: 120
},
roles: {
type: "array",
items: {
type: "string",
enum: ["admin", "user", "guest"]
},
minItems: 1,
uniqueItems: true
}
},
required: ["name", "email"],
additionalProperties: false
};
// Luq Validator
const validator = Builder()
.use(jsonSchemaFullFeaturePlugin)
.fromJsonSchema(userSchema)
.build();
// Validation
const result = validator.validate({
name: "John Doe",
email: "john@example.com",
age: 25,
roles: ["admin"]
});
if (result.isValid()) {
console.log("Valid data:", result.unwrap());
} else {
console.log("Validation errors:", result.errors);
}