fortify-schema
Version:
A modern TypeScript validation library designed around familiar interface syntax and powerful conditional validation. Experience schema validation that feels natural to TypeScript developers while unlocking advanced runtime validation capabilities.
117 lines (99 loc) • 3.21 kB
JavaScript
const { Interface, Mod } = require('fortify-schema');
// Test 1: Schema basique
console.log('=== Test 1: Schema basique ===');
const UserSchema = Interface({
id: "number",
email: "email",
name: "string(2,50)",
age: "number(18,120)?",
status: "active|inactive"
});
const validUser = {
id: 1,
email: "test@example.com",
name: "John Doe",
age: 25,
status: "active"
};
const invalidUser = {
id: "not-a-number",
email: "invalid-email",
name: "X", // trop court
age: 15, // trop jeune
status: "unknown"
};
console.log('Utilisateur valide:', UserSchema.safeParse(validUser));
console.log('Utilisateur invalide:', UserSchema.safeParse(invalidUser));
// Test 2: Validation conditionnelle
console.log('\n=== Test 2: Validation conditionnelle ===');
const ConditionalSchema = Interface({
role: "admin|user|guest",
permissions: "when role=admin *? string[] : string[]?",
maxProjects: "when role=free *? int(1,3) : int(1,)"
});
const adminUser = {
role: "admin",
permissions: ["read", "write", "delete"],
maxProjects: 100
};
const guestUser = {
role: "guest",
// permissions optionnel pour non-admin
maxProjects: 1
};
console.log('Admin user:', ConditionalSchema.safeParse(adminUser));
console.log('Guest user:', ConditionalSchema.safeParse(guestUser));
// Test 3: Arrays et types complexes
console.log('\n=== Test 3: Arrays et types complexes ===');
const ComplexSchema = Interface({
tags: "string[](1,5)?",
metadata: "object?",
createdAt: "date",
isActive: "boolean"
});
const complexData = {
tags: ["javascript", "validation", "schema"],
metadata: { source: "api", version: "1.0" },
createdAt: new Date(),
isActive: true
};
console.log('Données complexes:', ComplexSchema.safeParse(complexData));
// Test 4: Transformation de schema
console.log('\n=== Test 4: Transformation de schema ===');
try {
const PublicUserSchema = Mod.omit(UserSchema, ["id"]);
const ExtendedUserSchema = Mod.extend(UserSchema, {
createdAt: "date",
updatedAt: "date?"
});
console.log('Schema public (sans id):', PublicUserSchema.safeParse({
email: "test@example.com",
name: "Jane Doe",
status: "active"
}));
console.log('Schema étendu:', ExtendedUserSchema.safeParse({
...validUser,
createdAt: new Date()
}));
} catch (error) {
console.log('Erreur transformation:', error.message);
}
// Test 5: Cas limites et erreurs
console.log('\n=== Test 5: Cas limites ===');
const EdgeCaseSchema = Interface({
literal: "=exactly-this",
union: "red|green|blue",
range: "number(0,100)",
optional: "string?"
});
console.log('Littéral correct:', EdgeCaseSchema.safeParse({ literal: "exactly-this" }));
console.log('Littéral incorrect:', EdgeCaseSchema.safeParse({ literal: "wrong-value" }));
// Test 6: Performance basique
console.log('\n=== Test 6: Performance ===');
const start = performance.now();
for (let i = 0; i < 4; i++) {
UserSchema.safeParse(validUser);
}
const end = performance.now();
console.log(`4 validations en ${(end - start).toFixed(2)}ms`);
console.log('\n=== Fin des tests ===');