@wearesage/schema
Version:
A flexible schema definition and validation system for TypeScript with multi-database support
65 lines (54 loc) • 2.6 kB
text/typescript
// Example of using the new schema system with explicit dependencies
import {
MetadataRegistry,
SchemaBuilder,
SchemaReflector
} from "../core";
import { MongoDBAdapter } from "../adapters/mongodb";
import { Neo4jAdapter } from "../adapters/neo4j";
import { PostgreSQLAdapter } from "../adapters/postgresql";
import { Repository } from "../adapters/repository";
// Import the blog entities
import { User } from "./blog/User";
import { Post } from "./blog/Post";
import { Tag } from "./blog/Tag";
// Create a registry and builder
const registry = new MetadataRegistry();
const builder = new SchemaBuilder(registry);
// Register all blog entities
console.log("Registering blog entities...");
builder.registerEntities([User, Post, Tag]);
// Get entity metadata
const userMetadata = registry.getEntityMetadata(User);
console.log("\nUser entity metadata:", userMetadata);
// Get all entity properties
const postProperties = registry.getAllProperties(Post);
console.log("\nPost properties:");
postProperties?.forEach((options, key) => {
console.log(`- ${key}: ${JSON.stringify(options)}`);
});
// Get all entity relationships
const userRelationships = registry.getAllRelationships(User);
console.log("\nUser relationships:");
userRelationships?.forEach((options, key) => {
console.log(`- ${key}: ${JSON.stringify(options)}`);
});
// Create database adapters with the registry
console.log("\nCreating database adapters...");
const mongoAdapter = new MongoDBAdapter(registry, "mongodb://localhost:27017/blog");
const neo4jAdapter = new Neo4jAdapter(registry, "bolt://localhost:7687");
const postgresAdapter = new PostgreSQLAdapter(registry, "postgres://user:pass@localhost:5432/blog");
// Create repositories
console.log("Creating repositories with explicit registry dependency...");
const userRepo = new Repository<User>(User, mongoAdapter, registry);
const postRepo = new Repository<Post>(Post, neo4jAdapter, registry);
const tagRepo = new Repository<Tag>(Tag, postgresAdapter, registry);
// Create a schema reflector with our registry
const reflector = new SchemaReflector(registry);
// Get a schema for an entity
const userSchema = reflector.getEntitySchema(User);
console.log("\nUser schema:", JSON.stringify(userSchema, null, 2));
console.log("\nDone! New architecture successfully demonstrated.");
console.log("The decorated entities are registered with the SchemaBuilder instead of directly with the registry.");
console.log("This separates schema definition from schema registration.");
console.log("All components now use explicit dependency injection instead of singletons.\n");