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);
}