PSA/shared/workflow/runtime/registries/schemaRegistry.ts
Hermes 284313f908
Some checks are pending
Bidi Control Character Guard / bidi-control-guard (push) Waiting to run
Circular Dependency Check / Check for new circular dependencies (push) Waiting to run
Citus Migration Smoke / Combined migrations on single-node Citus (push) Waiting to run
E2E Fresh Install Tests / fresh-install-e2e (push) Waiting to run
ext-v2 guardrails / Run ext-v2 guard and ESLint (push) Waiting to run
Integration Tests / Check for relevant changes (push) Waiting to run
Integration Tests / ${{ (github.event_name == 'schedule' || github.event.inputs.suite == 'full') && 'Full integration suite' || 'Tier-1 integration subset' }} (push) Blocked by required conditions
Mobile checks / Mobile lint + typecheck (push) Waiting to run
Mobile checks / Mobile unit tests (push) Waiting to run
Mobile checks / Mobile dependency audit (report) (push) Waiting to run
Mobile checks / Mobile reproducibility checks (push) Waiting to run
Secrets guard (env backups) / Ensure no tracked env backup files (push) Waiting to run
Temporal Readiness / fast-readiness (push) Waiting to run
Temporal Readiness / docker-parity (push) Waiting to run
TypeScript Type Check / Nx affected typecheck (push) Waiting to run
Unit Tests / Skipped-test budget (push) Waiting to run
Unit Tests / Nx affected unit tests (push) Waiting to run
Unit Tests / Server unit coverage (informational) (push) Waiting to run
Validate Tenant Management Schema / Check for relevant changes (push) Waiting to run
Validate Tenant Management Schema / Validate Tenant Management Schema (push) Blocked by required conditions
EE Workflows Build Guard / ee-workflows-build-guard (push) Waiting to run
Initial import of AlgaPSA codebase from PSA server
Excluded: .git, node_modules, secrets/, compose.env, assemblyscript tgz

Source: /opt/alga-psa on psa.joliet.tech
2026-06-22 16:12:17 -05:00

59 lines
1.7 KiB
TypeScript

import { ZodSchema } from 'zod';
import { zodToWorkflowJsonSchema } from '../jsonSchemaMetadata';
export type JsonSchema = Record<string, unknown>;
export class SchemaRegistry {
private schemas: Map<string, ZodSchema<unknown>> = new Map();
private jsonSchemaCache: Map<string, JsonSchema> = new Map();
private refsCache: string[] | null = null;
register(ref: string, schema: ZodSchema<unknown>): void {
if (!ref || !schema) {
throw new Error('SchemaRegistry.register requires ref and schema');
}
if (this.schemas.has(ref)) {
throw new Error(`SchemaRegistry already has schema for ref "${ref}"`);
}
this.schemas.set(ref, schema);
this.jsonSchemaCache.delete(ref);
this.refsCache = null;
}
get(ref: string): ZodSchema<unknown> {
const schema = this.schemas.get(ref);
if (!schema) {
throw new Error(`SchemaRegistry missing schema for ref "${ref}"`);
}
return schema;
}
has(ref: string): boolean {
return this.schemas.has(ref);
}
listRefs(): string[] {
if (this.refsCache) return this.refsCache;
this.refsCache = Array.from(this.schemas.keys()).sort();
return this.refsCache;
}
toJsonSchema(ref: string): JsonSchema {
const cached = this.jsonSchemaCache.get(ref);
if (cached) return cached;
const schema = this.get(ref);
const json = zodToWorkflowJsonSchema(schema, { name: ref }) as JsonSchema;
this.jsonSchemaCache.set(ref, json);
return json;
}
}
let registryInstance: SchemaRegistry | null = null;
export function getSchemaRegistry(): SchemaRegistry {
if (!registryInstance) {
registryInstance = new SchemaRegistry();
}
return registryInstance;
}