@danceroutine/tango-schema 1.4.0 → 1.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -5,4 +5,5 @@
5
5
  export * as domain from './domain/index';
6
6
  export * as model from './model/index';
7
7
  export type { DeleteReferentialAction, Field, FieldType, IndexDef, ModelHookModel, ModelKeyOf, ModelAugmentations, ModelMetadata, PersistedModelOutput, ModelWriteHookManager, ModelWriteHooks, BeforeCreateHookArgs, AfterCreateHookArgs, BeforeUpdateHookArgs, AfterUpdateHookArgs, BeforeDeleteHookArgs, AfterDeleteHookArgs, BeforeBulkCreateHookArgs, AfterBulkCreateHookArgs, RelationDef, RelationType, UpdateReferentialAction, } from './domain/index';
8
- export { Model, RelationBuilder, ModelRegistry, registerModelAugmentor, Constraints, Decorators, Indexes, Meta, c, i, m, t, type ModelDefinition, type ForeignKeyDecoratorConfig, type FieldDecoratorBuilder, type DecoratedFieldKind, type ManyToManyDecoratorConfig, type ModelRef, type ModelRefTarget, type OneToOneDecoratorConfig, type RelationDecoratedSchema, type TypedModelRef, } from './model/index';
8
+ export { Model, RelationBuilder, ModelRegistry, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, ResolvedRelationGraphArtifactFactory, registerModelAugmentor, Constraints, Decorators, Indexes, Meta, c, i, m, t, type ModelDefinition, type ForeignKeyDecoratorConfig, type FieldDecoratorBuilder, type DecoratedFieldKind, type ManyToManyDecoratorConfig, type ModelRef, type ModelRefTarget, type GeneratedRelationRegistryArtifact, type OneToOneDecoratorConfig, type RelationDecoratedSchema, type ResolvedRelationGraphSnapshot, type ResolvedRelationGraphSnapshotModel, type ResolvedRelationGraphSnapshotRelation, type TypedModelRef, } from './model/index';
9
+ export { createSchemaModuleAliases, resolveSchemaModuleEntrypoint } from './resolveSchemaModuleEntrypoint';
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { Constraints, Decorators, Indexes, Meta, Model, ModelRegistry, RelationBuilder, model_exports, registerModelAugmentor } from "./model-YLW1ydkV.js";
1
+ import { Constraints, Decorators, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, Indexes, Meta, Model, ModelRegistry, RelationBuilder, ResolvedRelationGraphArtifactFactory, createSchemaModuleAliases, model_exports, registerModelAugmentor, resolveSchemaModuleEntrypoint } from "./model-BxkSqwrt.js";
2
2
  import { domain_exports } from "./domain-Cufz6y1q.js";
3
3
 
4
- export { Constraints, Decorators, Indexes, Meta, Model, ModelRegistry, RelationBuilder, Constraints as c, domain_exports as domain, Indexes as i, Meta as m, model_exports as model, registerModelAugmentor, Decorators as t };
4
+ export { Constraints, Decorators, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, Indexes, Meta, Model, ModelRegistry, RelationBuilder, ResolvedRelationGraphArtifactFactory, Constraints as c, createSchemaModuleAliases, domain_exports as domain, Indexes as i, Meta as m, model_exports as model, registerModelAugmentor, resolveSchemaModuleEntrypoint, Decorators as t };
@@ -21,4 +21,4 @@ export { Meta, m } from './meta/index';
21
21
  export type { ModelConstraint, ModelMetaFragment } from './meta/index';
22
22
  export { Constraints, Indexes, c, i } from './constraints/index';
23
23
  export type { ConstraintDefinition } from './constraints/index';
24
- export { ModelRegistry } from './registry/index';
24
+ export { ModelRegistry, createSchemaModuleAliases, resolveSchemaModuleEntrypoint, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, ResolvedRelationGraphArtifactFactory, type GeneratedRelationRegistryArtifact, type ResolvedRelationGraphSnapshot, type ResolvedRelationGraphSnapshotModel, type ResolvedRelationGraphSnapshotRelation, } from './registry/index';
@@ -1,3 +1,3 @@
1
- import { Constraints, Decorators, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, constraints_exports, createTypedModelRef, decorators_exports, isTypedModelRef, meta_exports, registerModelAugmentor, registry_exports, relations_exports } from "../model-YLW1ydkV.js";
1
+ import { Constraints, Decorators, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, ResolvedRelationGraphArtifactFactory, constraints_exports, createSchemaModuleAliases, createTypedModelRef, decorators_exports, isTypedModelRef, meta_exports, registerModelAugmentor, registry_exports, relations_exports, resolveSchemaModuleEntrypoint } from "../model-BxkSqwrt.js";
2
2
 
3
- export { Constraints, Decorators, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, Constraints as c, constraints_exports as constraints, createTypedModelRef, decorators_exports as decorators, Indexes as i, isTypedModelRef, Meta as m, meta_exports as meta, registerModelAugmentor, registry_exports as registry, relations_exports as relations, Decorators as t };
3
+ export { Constraints, Decorators, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, ResolvedRelationGraphArtifactFactory, Constraints as c, constraints_exports as constraints, createSchemaModuleAliases, createTypedModelRef, decorators_exports as decorators, Indexes as i, isTypedModelRef, Meta as m, meta_exports as meta, registerModelAugmentor, registry_exports as registry, relations_exports as relations, resolveSchemaModuleEntrypoint, Decorators as t };
@@ -14,10 +14,6 @@ export declare class InternalSchemaModel<TSchema extends z.ZodObject<z.ZodRawSha
14
14
  readonly objects: ModelAugmentations<TSchema, TKey> extends {
15
15
  readonly objects: infer TObject;
16
16
  } ? TObject : never;
17
- private readonly registry;
18
- private readonly normalizedRelations;
19
- private readonly explicitFields?;
20
- private readonly explicitRelations?;
21
17
  private constructor();
22
18
  static create<TSchema extends z.ZodObject<z.ZodRawShape>>(definition: ModelDefinition<TSchema>, registry: ModelRegistry): InternalSchemaModel<TSchema>;
23
19
  static isInternalSchemaModel(value: unknown): value is AnyInternalSchemaModel;
@@ -27,5 +23,7 @@ export declare class InternalSchemaModel<TSchema extends z.ZodObject<z.ZodRawSha
27
23
  static getExplicitRelations(model: AnySchemaModel): Readonly<Record<string, RelationDef>> | undefined;
28
24
  private static validateDefinition;
29
25
  private static require;
26
+ private static carrier;
27
+ private static attachInternals;
30
28
  }
31
29
  export {};
@@ -0,0 +1,10 @@
1
+ import type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';
2
+ export declare const GENERATED_RELATION_REGISTRY_DIRNAME = ".tango";
3
+ export declare const GENERATED_RELATION_REGISTRY_TYPES_FILENAME = "relations.generated.d.ts";
4
+ export declare const GENERATED_RELATION_REGISTRY_METADATA_FILENAME = "relations.generated.json";
5
+ export declare const GENERATED_RELATION_REGISTRY_METADATA_VERSION = 1;
6
+ export type GeneratedRelationRegistryArtifact = {
7
+ version: typeof GENERATED_RELATION_REGISTRY_METADATA_VERSION;
8
+ fingerprint: string;
9
+ snapshot: ResolvedRelationGraphSnapshot;
10
+ };
@@ -2,11 +2,15 @@ import type { Field, Model } from '../../domain/index';
2
2
  import { type ModelRef } from '../decorators/domain/ModelRef';
3
3
  import type { FinalizedStorageArtifacts } from '../fields/FinalizedStorageArtifacts';
4
4
  import type { ResolvedRelationGraph } from '../relations/ResolvedRelationGraph';
5
+ import type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';
5
6
  /**
6
7
  * Registry that resolves Tango models by stable identity.
7
8
  *
8
- * The global registry is convenient for application bootstrapping, while
9
- * dedicated instances are useful in tests and tooling.
9
+ * The default shared registry is convenient for application bootstrapping
10
+ * within one schema package instance, while dedicated instances are useful in
11
+ * tests and tooling. Explicit active-registry binding stays process-shared so
12
+ * tooling can construct models across separate schema package copies without
13
+ * relying on the ambient default registry.
10
14
  */
11
15
  export declare class ModelRegistry {
12
16
  private static globalRegistry?;
@@ -14,12 +18,17 @@ export declare class ModelRegistry {
14
18
  private version;
15
19
  private storageCache?;
16
20
  private relationGraphCache?;
21
+ private lastRelationRegistryDriftCheckVersion?;
17
22
  /**
18
- * Return the shared process-wide registry used by `Model(...)`.
23
+ * Return the shared default registry used by `Model(...)` for this schema
24
+ * package instance.
19
25
  */
20
26
  static global(): ModelRegistry;
21
27
  /**
22
28
  * Return the registry currently bound to model construction work.
29
+ *
30
+ * This explicit binding is process-shared so code that imports separate
31
+ * schema package copies can still participate in one construction flow.
23
32
  */
24
33
  static active(): ModelRegistry;
25
34
  /**
@@ -53,7 +62,13 @@ export declare class ModelRegistry {
53
62
  /**
54
63
  * Return the owning registry for a model.
55
64
  */
56
- static getOwner(model: Model): ModelRegistry;
65
+ static getOwner(model: {
66
+ metadata: {
67
+ key?: string;
68
+ };
69
+ } & object): ModelRegistry;
70
+ private static runtimeGlobal;
71
+ private static activeRegistryStorage;
57
72
  /**
58
73
  * Register a model on this registry instance.
59
74
  */
@@ -86,6 +101,14 @@ export declare class ModelRegistry {
86
101
  * Resolve the registry's relation graph from finalized storage artifacts.
87
102
  */
88
103
  getResolvedRelationGraph(): ResolvedRelationGraph;
104
+ /**
105
+ * Return a canonical snapshot of the resolved relation graph.
106
+ */
107
+ getResolvedRelationGraphSnapshot(): ResolvedRelationGraphSnapshot;
108
+ /**
109
+ * Return a deterministic fingerprint for the resolved relation graph.
110
+ */
111
+ getResolvedRelationGraphFingerprint(): string;
89
112
  /**
90
113
  * Remove all registered models from this registry instance.
91
114
  */
@@ -98,4 +121,8 @@ export declare class ModelRegistry {
98
121
  private freezeFields;
99
122
  private inferPrimaryKeyName;
100
123
  private mergeStorageFields;
124
+ private warnOnGeneratedRelationRegistryDrift;
125
+ private shouldCheckGeneratedRelationRegistry;
126
+ private readGeneratedRelationRegistryArtifact;
127
+ private isPartialRegistrySnapshot;
101
128
  }
@@ -0,0 +1,13 @@
1
+ import type { ResolvedRelationGraph } from '../relations/ResolvedRelationGraph';
2
+ import type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';
3
+ /**
4
+ * Build canonical serialized artifacts from a resolved relation graph.
5
+ *
6
+ * Generation, drift detection, and related tooling all need the same stable
7
+ * snapshot shape and fingerprinting rules, so that work lives behind one class
8
+ * instead of a pair of free functions.
9
+ */
10
+ export declare class ResolvedRelationGraphArtifactFactory {
11
+ static createSnapshot(graph: ResolvedRelationGraph): ResolvedRelationGraphSnapshot;
12
+ static createFingerprint(value: ResolvedRelationGraph | ResolvedRelationGraphSnapshot): string;
13
+ }
@@ -0,0 +1,26 @@
1
+ import type { RelationCardinality, RelationPublicKind, RelationStorageStrategy } from '../relations/RelationSpec';
2
+ export type ResolvedRelationGraphSnapshotRelation = {
3
+ edgeId: string;
4
+ sourceModelKey: string;
5
+ targetModelKey: string;
6
+ name: string;
7
+ inverseEdgeId?: string;
8
+ kind: RelationPublicKind;
9
+ storageStrategy: RelationStorageStrategy;
10
+ cardinality: RelationCardinality;
11
+ localFieldName?: string;
12
+ targetFieldName?: string;
13
+ alias: string;
14
+ capabilities: {
15
+ migratable: boolean;
16
+ queryable: boolean;
17
+ hydratable: boolean;
18
+ };
19
+ };
20
+ export type ResolvedRelationGraphSnapshotModel = {
21
+ key: string;
22
+ relations: ResolvedRelationGraphSnapshotRelation[];
23
+ };
24
+ export type ResolvedRelationGraphSnapshot = {
25
+ models: ResolvedRelationGraphSnapshotModel[];
26
+ };
@@ -2,3 +2,7 @@
2
2
  * Domain boundary barrel: centralizes this subdomain's public contract.
3
3
  */
4
4
  export { ModelRegistry } from './ModelRegistry';
5
+ export { createSchemaModuleAliases, resolveSchemaModuleEntrypoint } from '../../resolveSchemaModuleEntrypoint';
6
+ export { GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, type GeneratedRelationRegistryArtifact, } from './GeneratedRelationRegistryArtifact';
7
+ export { ResolvedRelationGraphArtifactFactory } from './ResolvedRelationGraphArtifactFactory';
8
+ export { type ResolvedRelationGraphSnapshot, type ResolvedRelationGraphSnapshotModel, type ResolvedRelationGraphSnapshotRelation, } from './ResolvedRelationGraphSnapshot';
@@ -1,5 +1,6 @@
1
1
  import type { Model } from '../../domain/index';
2
2
  import type { FinalizedStorageArtifacts } from '../fields/FinalizedStorageArtifacts';
3
+ import type { ResolvedRelationGraphSnapshot } from '../registry/ResolvedRelationGraphSnapshot';
3
4
  import type { NormalizedRelationStorageDescriptor } from './NormalizedRelationStorageDescriptor';
4
5
  import type { ResolvedRelationGraph } from './ResolvedRelationGraph';
5
6
  type GraphBuilderOptions = {
@@ -28,6 +29,11 @@ export declare class ResolvedRelationGraphBuilder {
28
29
  private readonly matchedOverrides;
29
30
  constructor(options: GraphBuilderOptions);
30
31
  static build(options: GraphBuilderOptions): ResolvedRelationGraph;
32
+ /**
33
+ * Serialize a resolved graph into the canonical snapshot shape used by
34
+ * relation-registry code generation and fingerprinting.
35
+ */
36
+ static createSnapshot(graph: ResolvedRelationGraph): ResolvedRelationGraphSnapshot;
31
37
  /**
32
38
  * Resolve every model's normalized relation descriptors into a single
33
39
  * registry-scoped graph and fail when authoring ambiguity remains.
@@ -1,6 +1,10 @@
1
- import { getLogger } from "@danceroutine/tango-core";
1
+ import { getLogger, getLogger as getLogger$1 } from "@danceroutine/tango-core";
2
2
  import { z } from "zod";
3
3
  import { AsyncLocalStorage } from "node:async_hooks";
4
+ import { existsSync, existsSync as existsSync$1, readFileSync } from "node:fs";
5
+ import { dirname, extname, resolve, resolve as resolve$1 } from "node:path";
6
+ import { createHash } from "node:crypto";
7
+ import { fileURLToPath } from "node:url";
4
8
 
5
9
  //#region rolldown:runtime
6
10
  var __defProp = Object.defineProperty;
@@ -55,7 +59,7 @@ const warnedDecoratorKinds = new Set();
55
59
  function warnDeprecatedSchemaOverload(kind, replacement) {
56
60
  if (warnedDecoratorKinds.has(kind)) return;
57
61
  warnedDecoratorKinds.add(kind);
58
- getLogger("tango.schema.decorators").warn(`Deprecated positional schema overload used for t.${kind}(...). Prefer ${replacement} instead.`);
62
+ getLogger$1("tango.schema.decorators").warn(`Deprecated positional schema overload used for t.${kind}(...). Prefer ${replacement} instead.`);
59
63
  }
60
64
  function maybeDecorator(schemaOrUndefined, meta) {
61
65
  if (schemaOrUndefined) return decorate(schemaOrUndefined, meta);
@@ -622,24 +626,20 @@ function deriveTableName(name) {
622
626
 
623
627
  //#endregion
624
628
  //#region src/model/internal/InternalSchemaModel.ts
629
+ const REGISTRY_OWNER_KEY = Symbol.for("tango.schema.registryOwner");
630
+ const NORMALIZED_RELATIONS_KEY = Symbol.for("tango.schema.normalizedRelations");
631
+ const EXPLICIT_FIELDS_KEY = Symbol.for("tango.schema.explicitFields");
632
+ const EXPLICIT_RELATIONS_KEY = Symbol.for("tango.schema.explicitRelations");
625
633
  var InternalSchemaModel = class InternalSchemaModel {
626
634
  static BRAND = "tango.schema.internal_schema_model";
627
635
  __tangoBrand = InternalSchemaModel.BRAND;
628
636
  metadata;
629
637
  schema;
630
638
  hooks;
631
- registry;
632
- normalizedRelations;
633
- explicitFields;
634
- explicitRelations;
635
- constructor(registry, metadata, schema, hooks, normalizedRelations, explicitFields, explicitRelations) {
636
- this.registry = registry;
639
+ constructor(metadata, schema, hooks) {
637
640
  this.metadata = metadata;
638
641
  this.schema = schema;
639
642
  this.hooks = hooks;
640
- this.normalizedRelations = Object.freeze([...normalizedRelations]);
641
- this.explicitFields = explicitFields ? Object.freeze([...explicitFields]) : undefined;
642
- this.explicitRelations = explicitRelations;
643
643
  }
644
644
  static create(definition, registry) {
645
645
  InternalSchemaModel.validateDefinition(definition);
@@ -667,22 +667,31 @@ var InternalSchemaModel = class InternalSchemaModel {
667
667
  get: () => registry.getFinalizedFields(key)
668
668
  });
669
669
  Object.freeze(metadata);
670
- return new InternalSchemaModel(registry, metadata, definition.schema, definition.hooks, normalizedRelations, definition.fields, relations);
670
+ const model = new InternalSchemaModel(metadata, definition.schema, definition.hooks);
671
+ InternalSchemaModel.attachInternals(model, {
672
+ registry,
673
+ normalizedRelations,
674
+ explicitFields: definition.fields,
675
+ explicitRelations: relations
676
+ });
677
+ return model;
671
678
  }
672
679
  static isInternalSchemaModel(value) {
673
680
  return typeof value === "object" && value !== null && value.__tangoBrand === InternalSchemaModel.BRAND;
674
681
  }
675
682
  static getRegistryOwner(model) {
676
- return InternalSchemaModel.require(model).registry;
683
+ const owner = InternalSchemaModel.carrier(model)[REGISTRY_OWNER_KEY];
684
+ if (!owner) throw new Error(`Model '${model.metadata.key}' is missing internal registry ownership metadata.`);
685
+ return owner;
677
686
  }
678
687
  static getNormalizedRelations(model) {
679
- return InternalSchemaModel.require(model).normalizedRelations;
688
+ return InternalSchemaModel.carrier(model)[NORMALIZED_RELATIONS_KEY] ?? [];
680
689
  }
681
690
  static getExplicitFields(model) {
682
- return InternalSchemaModel.require(model).explicitFields;
691
+ return InternalSchemaModel.carrier(model)[EXPLICIT_FIELDS_KEY];
683
692
  }
684
693
  static getExplicitRelations(model) {
685
- return InternalSchemaModel.require(model).explicitRelations;
694
+ return InternalSchemaModel.carrier(model)[EXPLICIT_RELATIONS_KEY];
686
695
  }
687
696
  static validateDefinition(definition) {
688
697
  if (!definition.namespace.trim()) throw new Error("Model.namespace is required and cannot be empty.");
@@ -693,6 +702,38 @@ var InternalSchemaModel = class InternalSchemaModel {
693
702
  if (!InternalSchemaModel.isInternalSchemaModel(model)) throw new Error(`Model '${model.metadata.key}' is missing internal registry ownership metadata.`);
694
703
  return model;
695
704
  }
705
+ static carrier(model) {
706
+ return InternalSchemaModel.require(model);
707
+ }
708
+ static attachInternals(model, internals) {
709
+ const carrier = model;
710
+ Object.defineProperties(carrier, {
711
+ [REGISTRY_OWNER_KEY]: {
712
+ value: internals.registry,
713
+ enumerable: false,
714
+ configurable: false,
715
+ writable: false
716
+ },
717
+ [NORMALIZED_RELATIONS_KEY]: {
718
+ value: Object.freeze([...internals.normalizedRelations]),
719
+ enumerable: false,
720
+ configurable: false,
721
+ writable: false
722
+ },
723
+ [EXPLICIT_FIELDS_KEY]: {
724
+ value: internals.explicitFields ? Object.freeze([...internals.explicitFields]) : undefined,
725
+ enumerable: false,
726
+ configurable: false,
727
+ writable: false
728
+ },
729
+ [EXPLICIT_RELATIONS_KEY]: {
730
+ value: internals.explicitRelations,
731
+ enumerable: false,
732
+ configurable: false,
733
+ writable: false
734
+ }
735
+ });
736
+ }
696
737
  };
697
738
 
698
739
  //#endregion
@@ -742,6 +783,33 @@ var ResolvedRelationGraphBuilder = class ResolvedRelationGraphBuilder {
742
783
  return new ResolvedRelationGraphBuilder(options).build();
743
784
  }
744
785
  /**
786
+ * Serialize a resolved graph into the canonical snapshot shape used by
787
+ * relation-registry code generation and fingerprinting.
788
+ */
789
+ static createSnapshot(graph) {
790
+ return { models: Array.from(graph.byModel.entries()).sort(([left], [right]) => left.localeCompare(right)).map(([key, relations]) => ({
791
+ key,
792
+ relations: Array.from(relations.values()).sort((left, right) => left.name.localeCompare(right.name)).map((relation) => ({
793
+ edgeId: relation.edgeId,
794
+ sourceModelKey: relation.sourceModelKey,
795
+ targetModelKey: relation.targetModelKey,
796
+ name: relation.name,
797
+ inverseEdgeId: relation.inverseEdgeId,
798
+ kind: relation.kind,
799
+ storageStrategy: relation.storageStrategy,
800
+ cardinality: relation.cardinality,
801
+ localFieldName: relation.localFieldName,
802
+ targetFieldName: relation.targetFieldName,
803
+ alias: relation.alias,
804
+ capabilities: {
805
+ migratable: relation.capabilities.migratable,
806
+ queryable: relation.capabilities.queryable,
807
+ hydratable: relation.capabilities.hydratable
808
+ }
809
+ }))
810
+ })) };
811
+ }
812
+ /**
745
813
  * Resolve every model's normalized relation descriptors into a single
746
814
  * registry-scoped graph and fail when authoring ambiguity remains.
747
815
  */
@@ -868,34 +936,58 @@ var ResolvedRelationGraphBuilder = class ResolvedRelationGraphBuilder {
868
936
  }
869
937
  };
870
938
 
939
+ //#endregion
940
+ //#region src/model/registry/GeneratedRelationRegistryArtifact.ts
941
+ const GENERATED_RELATION_REGISTRY_DIRNAME = ".tango";
942
+ const GENERATED_RELATION_REGISTRY_TYPES_FILENAME = "relations.generated.d.ts";
943
+ const GENERATED_RELATION_REGISTRY_METADATA_FILENAME = "relations.generated.json";
944
+ const GENERATED_RELATION_REGISTRY_METADATA_VERSION = 1;
945
+
946
+ //#endregion
947
+ //#region src/model/registry/ResolvedRelationGraphArtifactFactory.ts
948
+ var ResolvedRelationGraphArtifactFactory = class ResolvedRelationGraphArtifactFactory {
949
+ static createSnapshot(graph) {
950
+ return ResolvedRelationGraphBuilder.createSnapshot(graph);
951
+ }
952
+ static createFingerprint(value) {
953
+ const snapshot = "byModel" in value ? ResolvedRelationGraphArtifactFactory.createSnapshot(value) : value;
954
+ return createHash("sha256").update(JSON.stringify(snapshot)).digest("hex");
955
+ }
956
+ };
957
+
871
958
  //#endregion
872
959
  //#region src/model/registry/ModelRegistry.ts
873
960
  const DEFAULT_IDENTIFIER_NAME = "id";
874
- const activeRegistryStorage = new AsyncLocalStorage();
961
+ const ACTIVE_REGISTRY_STORAGE_KEY = Symbol.for("tango.schema.activeRegistryStorage");
875
962
  var ModelRegistry = class ModelRegistry {
876
963
  static globalRegistry;
877
964
  models = new Map();
878
965
  version = 0;
879
966
  storageCache;
880
967
  relationGraphCache;
968
+ lastRelationRegistryDriftCheckVersion;
881
969
  /**
882
- * Return the shared process-wide registry used by `Model(...)`.
970
+ * Return the shared default registry used by `Model(...)` for this schema
971
+ * package instance.
883
972
  */
884
973
  static global() {
885
- if (!ModelRegistry.globalRegistry) ModelRegistry.globalRegistry = new ModelRegistry();
974
+ ModelRegistry.globalRegistry ??= new ModelRegistry();
886
975
  return ModelRegistry.globalRegistry;
887
976
  }
888
977
  /**
889
978
  * Return the registry currently bound to model construction work.
979
+ *
980
+ * This explicit binding is process-shared so code that imports separate
981
+ * schema package copies can still participate in one construction flow.
890
982
  */
891
983
  static active() {
892
- return activeRegistryStorage.getStore() ?? ModelRegistry.global();
984
+ return ModelRegistry.activeRegistryStorage().getStore() ?? ModelRegistry.global();
893
985
  }
894
986
  /**
895
987
  * Run work with a specific registry bound as the active construction target.
896
988
  */
897
989
  static async runWithRegistry(registry, work) {
898
- return await activeRegistryStorage.run(registry, work);
990
+ return await ModelRegistry.activeRegistryStorage().run(registry, work);
899
991
  }
900
992
  /**
901
993
  * Register a model on the shared global registry.
@@ -939,6 +1031,14 @@ var ModelRegistry = class ModelRegistry {
939
1031
  static getOwner(model) {
940
1032
  return InternalSchemaModel.getRegistryOwner(model);
941
1033
  }
1034
+ static runtimeGlobal() {
1035
+ return globalThis;
1036
+ }
1037
+ static activeRegistryStorage() {
1038
+ const runtimeGlobal = ModelRegistry.runtimeGlobal();
1039
+ if (!runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY]) runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY] = new AsyncLocalStorage();
1040
+ return runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY];
1041
+ }
942
1042
  /**
943
1043
  * Register a model on this registry instance.
944
1044
  */
@@ -1039,9 +1139,22 @@ var ModelRegistry = class ModelRegistry {
1039
1139
  resolveRef: (ref) => this.resolveRef(ref)
1040
1140
  });
1041
1141
  this.relationGraphCache = finalized;
1142
+ this.warnOnGeneratedRelationRegistryDrift(finalized);
1042
1143
  return finalized;
1043
1144
  }
1044
1145
  /**
1146
+ * Return a canonical snapshot of the resolved relation graph.
1147
+ */
1148
+ getResolvedRelationGraphSnapshot() {
1149
+ return ResolvedRelationGraphArtifactFactory.createSnapshot(this.getResolvedRelationGraph());
1150
+ }
1151
+ /**
1152
+ * Return a deterministic fingerprint for the resolved relation graph.
1153
+ */
1154
+ getResolvedRelationGraphFingerprint() {
1155
+ return ResolvedRelationGraphArtifactFactory.createFingerprint(this.getResolvedRelationGraph());
1156
+ }
1157
+ /**
1045
1158
  * Remove all registered models from this registry instance.
1046
1159
  */
1047
1160
  clear() {
@@ -1058,6 +1171,7 @@ var ModelRegistry = class ModelRegistry {
1058
1171
  this.version += 1;
1059
1172
  this.storageCache = undefined;
1060
1173
  this.relationGraphCache = undefined;
1174
+ this.lastRelationRegistryDriftCheckVersion = undefined;
1061
1175
  }
1062
1176
  freezeFields(fields) {
1063
1177
  return Object.freeze(fields.map((field$1) => Object.freeze({ ...field$1 })));
@@ -1077,12 +1191,85 @@ var ModelRegistry = class ModelRegistry {
1077
1191
  for (const explicitField of explicitFields) mergedFields.set(explicitField.name, explicitField);
1078
1192
  return Array.from(mergedFields.values());
1079
1193
  }
1194
+ warnOnGeneratedRelationRegistryDrift(graph) {
1195
+ if (this.lastRelationRegistryDriftCheckVersion === this.version || !this.shouldCheckGeneratedRelationRegistry()) return;
1196
+ this.lastRelationRegistryDriftCheckVersion = this.version;
1197
+ const expected = this.readGeneratedRelationRegistryArtifact();
1198
+ if (!expected) return;
1199
+ const liveSnapshot = ResolvedRelationGraphArtifactFactory.createSnapshot(graph);
1200
+ if (this.isPartialRegistrySnapshot(liveSnapshot, expected.snapshot)) return;
1201
+ const liveFingerprint = ResolvedRelationGraphArtifactFactory.createFingerprint(liveSnapshot);
1202
+ if (liveFingerprint === expected.fingerprint) return;
1203
+ getLogger("tango.schema.registry").warn(`Generated relation registry drift detected. Run 'tango codegen relations' to refresh ${GENERATED_RELATION_REGISTRY_DIRNAME}/${GENERATED_RELATION_REGISTRY_METADATA_FILENAME}.`);
1204
+ }
1205
+ shouldCheckGeneratedRelationRegistry() {
1206
+ return process.env.NODE_ENV === "development" || process.env.NODE_ENV === "test";
1207
+ }
1208
+ readGeneratedRelationRegistryArtifact() {
1209
+ const metadataPath = resolve$1(process.cwd(), GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME);
1210
+ if (!existsSync$1(metadataPath)) return undefined;
1211
+ try {
1212
+ const parsed = JSON.parse(readFileSync(metadataPath, "utf8"));
1213
+ if (parsed.version !== GENERATED_RELATION_REGISTRY_METADATA_VERSION || typeof parsed.fingerprint !== "string" || !parsed.snapshot || !Array.isArray(parsed.snapshot.models)) {
1214
+ getLogger("tango.schema.registry").warn(`Ignoring malformed generated relation registry metadata at '${metadataPath}'.`);
1215
+ return undefined;
1216
+ }
1217
+ return parsed;
1218
+ } catch (error) {
1219
+ getLogger("tango.schema.registry").warn(`Unable to read generated relation registry metadata at '${metadataPath}'.`, error);
1220
+ return undefined;
1221
+ }
1222
+ }
1223
+ isPartialRegistrySnapshot(liveSnapshot, expectedSnapshot) {
1224
+ const expectedModels = new Map(expectedSnapshot.models.map((model) => [model.key, model]));
1225
+ if (liveSnapshot.models.some((model) => !expectedModels.has(model.key))) return false;
1226
+ if (liveSnapshot.models.length >= expectedSnapshot.models.length) return false;
1227
+ for (const model of liveSnapshot.models) {
1228
+ const expectedModel = expectedModels.get(model.key);
1229
+ if (JSON.stringify(model.relations) !== JSON.stringify(expectedModel.relations)) return false;
1230
+ }
1231
+ return true;
1232
+ }
1080
1233
  };
1081
1234
 
1235
+ //#endregion
1236
+ //#region src/resolveSchemaModuleEntrypoint.ts
1237
+ const LOCAL_ENTRYPOINT_CANDIDATES = ["./index.ts", "./index.js"];
1238
+ function resolveSchemaModuleEntrypoint() {
1239
+ for (const relativePath of LOCAL_ENTRYPOINT_CANDIDATES) {
1240
+ const absolutePath = fileURLToPath(new URL(relativePath, import.meta.url));
1241
+ if (existsSync(absolutePath)) return absolutePath;
1242
+ }
1243
+ throw new Error(`Unable to resolve the @danceroutine/tango-schema entrypoint relative to '${fileURLToPath(import.meta.url)}'.`);
1244
+ }
1245
+ function createSchemaModuleAliases() {
1246
+ const entrypoint = resolveSchemaModuleEntrypoint();
1247
+ const packageRoot = dirname(entrypoint);
1248
+ const extension = extname(entrypoint);
1249
+ const modelEntrypoint = resolve(packageRoot, "model", `index${extension}`);
1250
+ const domainEntrypoint = resolve(packageRoot, "domain", `index${extension}`);
1251
+ if (!existsSync(modelEntrypoint) || !existsSync(domainEntrypoint)) throw new Error(`Unable to resolve the @danceroutine/tango-schema subpath entrypoints relative to '${entrypoint}'.`);
1252
+ return {
1253
+ "@danceroutine/tango-schema": entrypoint,
1254
+ "@danceroutine/tango-schema/model": modelEntrypoint,
1255
+ "@danceroutine/tango-schema/domain": domainEntrypoint,
1256
+ "@danceroutine/tango-schema/": `${packageRoot}/`
1257
+ };
1258
+ }
1259
+
1082
1260
  //#endregion
1083
1261
  //#region src/model/registry/index.ts
1084
1262
  var registry_exports = {};
1085
- __export(registry_exports, { ModelRegistry: () => ModelRegistry });
1263
+ __export(registry_exports, {
1264
+ GENERATED_RELATION_REGISTRY_DIRNAME: () => GENERATED_RELATION_REGISTRY_DIRNAME,
1265
+ GENERATED_RELATION_REGISTRY_METADATA_FILENAME: () => GENERATED_RELATION_REGISTRY_METADATA_FILENAME,
1266
+ GENERATED_RELATION_REGISTRY_METADATA_VERSION: () => GENERATED_RELATION_REGISTRY_METADATA_VERSION,
1267
+ GENERATED_RELATION_REGISTRY_TYPES_FILENAME: () => GENERATED_RELATION_REGISTRY_TYPES_FILENAME,
1268
+ ModelRegistry: () => ModelRegistry,
1269
+ ResolvedRelationGraphArtifactFactory: () => ResolvedRelationGraphArtifactFactory,
1270
+ createSchemaModuleAliases: () => createSchemaModuleAliases,
1271
+ resolveSchemaModuleEntrypoint: () => resolveSchemaModuleEntrypoint
1272
+ });
1086
1273
 
1087
1274
  //#endregion
1088
1275
  //#region src/model/relations/index.ts
@@ -1119,14 +1306,20 @@ var model_exports = {};
1119
1306
  __export(model_exports, {
1120
1307
  Constraints: () => Constraints,
1121
1308
  Decorators: () => Decorators,
1309
+ GENERATED_RELATION_REGISTRY_DIRNAME: () => GENERATED_RELATION_REGISTRY_DIRNAME,
1310
+ GENERATED_RELATION_REGISTRY_METADATA_FILENAME: () => GENERATED_RELATION_REGISTRY_METADATA_FILENAME,
1311
+ GENERATED_RELATION_REGISTRY_METADATA_VERSION: () => GENERATED_RELATION_REGISTRY_METADATA_VERSION,
1312
+ GENERATED_RELATION_REGISTRY_TYPES_FILENAME: () => GENERATED_RELATION_REGISTRY_TYPES_FILENAME,
1122
1313
  Indexes: () => Indexes,
1123
1314
  InternalDecoratedFieldKind: () => InternalDecoratedFieldKind,
1124
1315
  Meta: () => Meta,
1125
1316
  Model: () => Model,
1126
1317
  ModelRegistry: () => ModelRegistry,
1127
1318
  RelationBuilder: () => RelationBuilder,
1319
+ ResolvedRelationGraphArtifactFactory: () => ResolvedRelationGraphArtifactFactory,
1128
1320
  c: () => Constraints,
1129
1321
  constraints: () => constraints_exports,
1322
+ createSchemaModuleAliases: () => createSchemaModuleAliases,
1130
1323
  createTypedModelRef: () => createTypedModelRef,
1131
1324
  decorators: () => decorators_exports,
1132
1325
  i: () => Indexes,
@@ -1136,9 +1329,10 @@ __export(model_exports, {
1136
1329
  registerModelAugmentor: () => registerModelAugmentor,
1137
1330
  registry: () => registry_exports,
1138
1331
  relations: () => relations_exports,
1332
+ resolveSchemaModuleEntrypoint: () => resolveSchemaModuleEntrypoint,
1139
1333
  t: () => Decorators
1140
1334
  });
1141
1335
 
1142
1336
  //#endregion
1143
- export { Constraints, Decorators, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, constraints_exports, createTypedModelRef, decorators_exports, isTypedModelRef, meta_exports, model_exports, registerModelAugmentor, registry_exports, relations_exports };
1144
- //# sourceMappingURL=model-YLW1ydkV.js.map
1337
+ export { Constraints, Decorators, GENERATED_RELATION_REGISTRY_DIRNAME, GENERATED_RELATION_REGISTRY_METADATA_FILENAME, GENERATED_RELATION_REGISTRY_METADATA_VERSION, GENERATED_RELATION_REGISTRY_TYPES_FILENAME, Indexes, InternalDecoratedFieldKind, Meta, Model, ModelRegistry, RelationBuilder, ResolvedRelationGraphArtifactFactory, constraints_exports, createSchemaModuleAliases, createTypedModelRef, decorators_exports, isTypedModelRef, meta_exports, model_exports, registerModelAugmentor, registry_exports, relations_exports, resolveSchemaModuleEntrypoint };
1338
+ //# sourceMappingURL=model-BxkSqwrt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-BxkSqwrt.js","names":["schema: ZodTypeAny","meta: TangoFieldMeta","key: ModelKeyOf<TModel>","value: unknown","value: unknown","schema: T","meta: TangoFieldMeta","kind: DecoratedFieldKind","replacement: string","schemaOrUndefined: T | undefined","schema?: T","value: string | { now: true } | null","value: string","name: string","values: readonly unknown[]","text: string","map: Record<string, string>","schema: TField","config?: { name?: string; relatedName?: string }","config?: ReferentialOptions","key: ModelKeyOf<TModel>","target: ModelRef","schemaOrOptions?: T | ForeignKeyDecoratorConfig<T>","maybeOptions?: ReferentialOptions","schemaOrOptions?: T | OneToOneDecoratorConfig<T>","schemaOrConfig?: T | ManyToManyDecoratorConfig<T>","Decorators: TangoDecorators","value: boolean","value: string","fields: string[]","options?: { name?: string; where?: string }","condition: string","options?: { name?: string }","definition: { using?: string; elements: string[]; where?: string; name?: string }","on: string[]","options?: Omit<IndexDef, 'on'>","value: unknown","value: unknown","name: string","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","name: string","zodType: z.ZodType","meta: TangoFieldMeta | undefined","registry: ModelRegistry","resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string }","type: FieldType","defaultValue: Field['default']","unwrapped: z.ZodType","field: Field","target: ModelRef","explicitColumn?: string","schema: z.ZodObject<z.ZodRawShape>","options?: InferFieldsOptions","fields: Field[]","target: string","foreignKey: string","localKey?: string","sourceModelKey: string","schema: z.ZodObject<z.ZodRawShape>","descriptors: NormalizedRelationStorageDescriptor[]","candidate: RelationCandidate","sourceSchemaFieldKey: string","origin: NormalizedRelationOrigin","fieldKey: string","value: string","name: string","metadata: ModelMetadata","schema: TSchema","hooks: ModelWriteHooks<PersistedModelOutput<TSchema>> | undefined","definition: ModelDefinition<TSchema>","registry: ModelRegistry","value: unknown","model: AnySchemaModel","model: object","internals: {\n registry: ModelRegistry;\n normalizedRelations: readonly NormalizedRelationStorageDescriptor[];\n explicitFields?: readonly Field[];\n explicitRelations?: Readonly<Record<string, RelationDef>>;\n }","options: GraphBuilderOptions","graph: ResolvedRelationGraph","model: Model","sourceModel: Model","descriptor: NormalizedRelationStorageDescriptor","targetModel: Model","explicitRelations: Readonly<Record<string, RelationDef>>","descriptor: ResolvedRelationDescriptor","modelKey: string","relationName: string","target: string","cardinality: RelationCardinality","graph: ResolvedRelationGraph","value: ResolvedRelationGraph | ResolvedRelationGraphSnapshot","registry: ModelRegistry","work: () => Promise<T> | T","model: Model","models: readonly Model[]","namespace: string","name: string","key: string","ref: ModelRef","model: { metadata: { key?: string } } & object","finalized: FinalizedStorageArtifacts","model: Model | string","fields: readonly Field[]","inferredFields: readonly Field[]","explicitFields?: readonly Field[]","graph: ResolvedRelationGraph","liveSnapshot: ResolvedRelationGraphSnapshot","expectedSnapshot: ResolvedRelationGraphSnapshot","augmentor: ModelAugmentor","model: Model<TSchema, TKey>","definition: ModelDefinition<TSchema> & { namespace: TNamespace; name: TName }"],"sources":["../src/model/fields/FieldMetadataStore.ts","../src/model/decorators/domain/ModelRef.ts","../src/model/decorators/domain/DecoratedFieldKind.ts","../src/model/decorators/Decorators.ts","../src/model/decorators/index.ts","../src/model/meta/Meta.ts","../src/model/meta/index.ts","../src/model/constraints/Constraints.ts","../src/model/constraints/Indexes.ts","../src/model/constraints/index.ts","../src/domain/internal/InternalFieldType.ts","../src/domain/internal/zod/isDate.ts","../src/domain/internal/zod/hasConstructorName.ts","../src/domain/internal/zod/isZodArray.ts","../src/domain/internal/zod/isZodBoolean.ts","../src/domain/internal/zod/isZodDate.ts","../src/domain/internal/zod/isZodDefault.ts","../src/domain/internal/zod/isZodNullable.ts","../src/domain/internal/zod/isZodNumber.ts","../src/domain/internal/zod/isZodObject.ts","../src/domain/internal/zod/isZodOptional.ts","../src/domain/internal/zod/isZodString.ts","../src/model/fields/inferFieldsFromSchema.ts","../src/domain/internal/InternalRelationType.ts","../src/model/relations/RelationBuilder.ts","../src/model/relations/RelationDescriptorNormalizer.ts","../src/model/relations/SchemaNaming.ts","../src/model/internal/InternalSchemaModel.ts","../src/model/relations/RelationSpec.ts","../src/model/relations/ResolvedRelationGraphBuilder.ts","../src/model/registry/GeneratedRelationRegistryArtifact.ts","../src/model/registry/ResolvedRelationGraphArtifactFactory.ts","../src/model/registry/ModelRegistry.ts","../src/resolveSchemaModuleEntrypoint.ts","../src/model/registry/index.ts","../src/model/relations/index.ts","../src/model/ModelAugmentorRegistry.ts","../src/model/Model.ts","../src/model/index.ts"],"sourcesContent":["import type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport type { TangoFieldMeta } from '../decorators/domain/TangoFieldMeta';\n\nconst fieldMetadataStore = new WeakMap<ZodTypeAny, TangoFieldMeta>();\n\nexport function getFieldMetadata(schema: ZodTypeAny): TangoFieldMeta | undefined {\n return fieldMetadataStore.get(schema);\n}\n\nexport function setFieldMetadata(schema: ZodTypeAny, meta: TangoFieldMeta): void {\n const existing = fieldMetadataStore.get(schema);\n fieldMetadataStore.set(schema, {\n ...existing,\n ...meta,\n });\n}\n","import type { Model, ModelKeyOf } from '../../../domain';\n\n// TODO: consider async model callbacks such as `() => Promise<Model>` when Tango tackles lazy import boundaries for cyclical model graphs.\n// See the ADR: https://tangowebframework.dev/contributors/adr/deep-relation-hydration-with-generated-path-typing\ndeclare const TANGO_TYPED_MODEL_REF_TARGET: unique symbol;\n\nexport interface TypedModelRef<TModel extends Model = Model> {\n readonly key: ModelKeyOf<TModel>;\n readonly [TANGO_TYPED_MODEL_REF_TARGET]?: TModel;\n}\n\nexport type ModelRef<TModel extends Model = Model> = string | TModel | (() => TModel) | TypedModelRef<TModel>;\n\nexport type ModelRefTarget<TRef> =\n TRef extends TypedModelRef<infer TModel>\n ? TModel\n : TRef extends () => infer TModel\n ? TModel extends Model\n ? TModel\n : never\n : TRef extends Model\n ? TRef\n : never;\n\nexport function createTypedModelRef<TModel extends Model>(key: ModelKeyOf<TModel>): TypedModelRef<TModel> {\n return Object.freeze({ key }) as TypedModelRef<TModel>;\n}\n\nexport function isTypedModelRef(value: unknown): value is TypedModelRef {\n return typeof value === 'object' && value !== null && typeof (value as { key?: unknown }).key === 'string';\n}\n","export const InternalDecoratedFieldKind = {\n FOREIGN_KEY: 'foreignKey',\n ONE_TO_ONE: 'oneToOne',\n MANY_TO_MANY: 'manyToMany',\n} as const;\nexport type DecoratedFieldKind = (typeof InternalDecoratedFieldKind)[keyof typeof InternalDecoratedFieldKind];\n","import { getLogger } from '@danceroutine/tango-core';\nimport { z } from 'zod';\nimport { setFieldMetadata } from '../fields/FieldMetadataStore';\nimport type { ZodTypeAny } from './domain/ZodTypeAny';\nimport { createTypedModelRef, type ModelRef, type ModelRefTarget, type TypedModelRef } from './domain/ModelRef';\nimport type { ReferentialOptions, TangoFieldMeta } from './domain/TangoFieldMeta';\nimport type { Model, ModelKeyOf } from '../../domain';\nimport type {\n ForeignKeyDecoratorConfig,\n ManyToManyDecoratorConfig,\n OneToOneDecoratorConfig,\n} from './domain/RelationDecoratorConfig';\nimport type { RelationDecoratedSchema } from './domain/RelationDecoratedSchema';\nimport { InternalDecoratedFieldKind } from './domain/DecoratedFieldKind';\nimport type { DecoratedFieldKind } from './domain/DecoratedFieldKind';\n\nfunction isZodType(value: unknown): value is ZodTypeAny {\n return (\n !!value &&\n typeof value === 'object' &&\n 'safeParse' in value &&\n typeof (value as { safeParse?: unknown }).safeParse === 'function'\n );\n}\n\nfunction decorate<T extends ZodTypeAny>(schema: T, meta: TangoFieldMeta): T {\n setFieldMetadata(schema, meta);\n return schema;\n}\n\nconst warnedDecoratorKinds = new Set<DecoratedFieldKind>();\n\nfunction warnDeprecatedSchemaOverload(kind: DecoratedFieldKind, replacement: string): void {\n if (warnedDecoratorKinds.has(kind)) {\n return;\n }\n\n warnedDecoratorKinds.add(kind);\n getLogger('tango.schema.decorators').warn(\n `Deprecated positional schema overload used for t.${kind}(...). Prefer ${replacement} instead.`\n );\n}\n\nfunction maybeDecorator<T extends ZodTypeAny>(\n schemaOrUndefined: T | undefined,\n meta: TangoFieldMeta\n): T | ((schema: T) => T) {\n if (schemaOrUndefined) {\n return decorate(schemaOrUndefined, meta);\n }\n\n return (schema: T) => decorate(schema, meta);\n}\n\nfunction primaryKey<T extends ZodTypeAny>(schema: T): T;\nfunction primaryKey<T extends ZodTypeAny>(): (input: T) => T;\nfunction primaryKey<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { primaryKey: true, notNull: true });\n}\n\nfunction unique<T extends ZodTypeAny>(schema: T): T;\nfunction unique<T extends ZodTypeAny>(): (input: T) => T;\nfunction unique<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { unique: true });\n}\n\nfunction nullValue<T extends ZodTypeAny>(schema: T): T;\nfunction nullValue<T extends ZodTypeAny>(): (input: T) => T;\nfunction nullValue<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { notNull: false });\n}\n\nfunction notNull<T extends ZodTypeAny>(schema: T): T;\nfunction notNull<T extends ZodTypeAny>(): (input: T) => T;\nfunction notNull<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { notNull: true });\n}\n\nfunction defaultValue<T extends ZodTypeAny>(schema: T, value: string | { now: true } | null): T;\nfunction defaultValue<T extends ZodTypeAny>(schema: T, value: string | { now: true } | null): T {\n return decorate(schema, { default: value });\n}\n\nfunction dbDefault<T extends ZodTypeAny>(schema: T, value: string): T;\nfunction dbDefault<T extends ZodTypeAny>(schema: T, value: string): T {\n return decorate(schema, { dbDefault: value });\n}\n\nfunction dbColumn<T extends ZodTypeAny>(schema: T, name: string): T;\nfunction dbColumn<T extends ZodTypeAny>(schema: T, name: string): T {\n return decorate(schema, { dbColumn: name });\n}\n\nfunction dbIndex<T extends ZodTypeAny>(schema: T): T {\n return decorate(schema, { dbIndex: true });\n}\n\nfunction choices<T extends ZodTypeAny>(schema: T, values: readonly unknown[]): T;\nfunction choices<T extends ZodTypeAny>(schema: T, values: readonly unknown[]): T {\n return decorate(schema, { choices: values });\n}\n\nfunction validators<T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]): T;\nfunction validators<T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]): T {\n return decorate(schema, { validators: values });\n}\n\nfunction helpText<T extends ZodTypeAny>(schema: T, text: string): T;\nfunction helpText<T extends ZodTypeAny>(schema: T, text: string): T {\n return decorate(schema, { helpText: text });\n}\n\nfunction errorMessages<T extends ZodTypeAny>(schema: T, map: Record<string, string>): T;\nfunction errorMessages<T extends ZodTypeAny>(schema: T, map: Record<string, string>): T {\n return decorate(schema, { errorMessages: map });\n}\n\nexport interface FieldDecoratorBuilder<TField extends ZodTypeAny> {\n defaultValue(value: string | { now: true } | null): FieldDecoratorBuilder<TField>;\n dbDefault(value: string): FieldDecoratorBuilder<TField>;\n dbColumn(name: string): FieldDecoratorBuilder<TField>;\n dbIndex(): FieldDecoratorBuilder<TField>;\n choices(values: readonly unknown[]): FieldDecoratorBuilder<TField>;\n validators(...values: readonly ((value: unknown) => unknown)[]): FieldDecoratorBuilder<TField>;\n helpText(text: string): FieldDecoratorBuilder<TField>;\n errorMessages(map: Record<string, string>): FieldDecoratorBuilder<TField>;\n build(): TField;\n}\n\nclass FieldDecoratorBuilderImpl<TField extends ZodTypeAny> implements FieldDecoratorBuilder<TField> {\n constructor(private readonly schema: TField) {}\n\n defaultValue(value: string | { now: true } | null): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { default: value });\n return this;\n }\n\n dbDefault(value: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbDefault: value });\n return this;\n }\n\n dbColumn(name: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbColumn: name });\n return this;\n }\n\n dbIndex(): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbIndex: true });\n return this;\n }\n\n choices(values: readonly unknown[]): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { choices: values });\n return this;\n }\n\n validators(...values: readonly ((value: unknown) => unknown)[]): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { validators: values });\n return this;\n }\n\n helpText(text: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { helpText: text });\n return this;\n }\n\n errorMessages(map: Record<string, string>): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { errorMessages: map });\n return this;\n }\n\n build(): TField {\n return this.schema;\n }\n}\n\nfunction field<T extends ZodTypeAny>(schema: T): FieldDecoratorBuilder<T> {\n return new FieldDecoratorBuilderImpl(schema);\n}\n\nfunction applyRelationMetadata<T extends ZodTypeAny>(\n schema: T,\n meta: TangoFieldMeta,\n config?: { name?: string; relatedName?: string }\n): T {\n return decorate(schema, {\n ...meta,\n forwardName: config?.name,\n reverseName: config?.relatedName,\n });\n}\n\nfunction toReferentialOptions(config?: ReferentialOptions): ReferentialOptions | undefined {\n if (!config) {\n return undefined;\n }\n\n if (config.column === undefined && config.onDelete === undefined && config.onUpdate === undefined) {\n return undefined;\n }\n\n return {\n column: config.column,\n onDelete: config.onDelete,\n onUpdate: config.onUpdate,\n };\n}\n\ntype ConfigName<TConfig> = TConfig extends { name: infer TName extends string } ? TName : undefined;\ntype ConfigRelatedName<TConfig> = TConfig extends { relatedName: infer TRelatedName extends string }\n ? TRelatedName\n : undefined;\n\nfunction modelRef<TModel extends Model>(key: ModelKeyOf<TModel>): TypedModelRef<TModel> {\n return createTypedModelRef<TModel>(key);\n}\n\nfunction foreignKey<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends ForeignKeyDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'foreignKey', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\nfunction foreignKey<TRef extends ModelRef, const TConfig extends ForeignKeyDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<\n z.ZodNumber,\n 'foreignKey',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n>;\n/**\n * @deprecated Use `t.foreignKey(target, { field: schema, ...options })` instead.\n */\nfunction foreignKey<T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n): RelationDecoratedSchema<T, 'foreignKey'>;\nfunction foreignKey<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrOptions?: T | ForeignKeyDecoratorConfig<T>,\n maybeOptions?: ReferentialOptions\n): RelationDecoratedSchema<T, 'foreignKey'> | z.ZodNumber {\n if (isZodType(schemaOrOptions)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.FOREIGN_KEY,\n 't.foreignKey(target, { field: schema, ...options })'\n );\n return applyRelationMetadata(schemaOrOptions, {\n relationKind: InternalDecoratedFieldKind.FOREIGN_KEY,\n references: {\n target,\n options: maybeOptions,\n },\n }) as RelationDecoratedSchema<T, 'foreignKey'>;\n }\n\n const config = schemaOrOptions;\n const schema = config?.field ?? z.number().int();\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.FOREIGN_KEY,\n references: {\n target,\n options: toReferentialOptions(config),\n },\n notNull: config?.field ? undefined : true,\n },\n config\n ) as RelationDecoratedSchema<T, 'foreignKey'> | z.ZodNumber;\n}\n\nfunction oneToOne<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends OneToOneDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'oneToOne', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\nfunction oneToOne<TRef extends ModelRef, const TConfig extends OneToOneDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<\n z.ZodNumber,\n 'oneToOne',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n>;\n/**\n * @deprecated Use `t.oneToOne(target, { field: schema, ...options })` instead.\n */\nfunction oneToOne<T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n): RelationDecoratedSchema<T, 'oneToOne'>;\nfunction oneToOne<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrOptions?: T | OneToOneDecoratorConfig<T>,\n maybeOptions?: ReferentialOptions\n): RelationDecoratedSchema<T, 'oneToOne'> | z.ZodNumber {\n if (isZodType(schemaOrOptions)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.ONE_TO_ONE,\n 't.oneToOne(target, { field: schema, ...options })'\n );\n return applyRelationMetadata(schemaOrOptions, {\n relationKind: InternalDecoratedFieldKind.ONE_TO_ONE,\n unique: true,\n references: {\n target,\n options: maybeOptions,\n },\n }) as RelationDecoratedSchema<T, 'oneToOne'>;\n }\n\n const config = schemaOrOptions;\n const schema = config?.field ?? z.number().int();\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.ONE_TO_ONE,\n unique: true,\n references: {\n target,\n options: toReferentialOptions(config),\n },\n notNull: config?.field ? undefined : true,\n },\n config\n ) as RelationDecoratedSchema<T, 'oneToOne'> | z.ZodNumber;\n}\n\nfunction manyToMany<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends ManyToManyDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\nfunction manyToMany<\n TRef extends ModelRef,\n const TConfig extends ManyToManyDecoratorConfig<z.ZodArray<z.ZodNumber>> | undefined,\n>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<z.ZodArray<z.ZodNumber>, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\n/**\n * @deprecated Use `t.manyToMany(target, { field: schema, name })` instead.\n */\nfunction manyToMany<T extends ZodTypeAny>(target: ModelRef, schema: T): RelationDecoratedSchema<T, 'manyToMany'>;\nfunction manyToMany<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrConfig?: T | ManyToManyDecoratorConfig<T>\n): RelationDecoratedSchema<T, 'manyToMany'> | z.ZodArray<z.ZodNumber> {\n if (isZodType(schemaOrConfig)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.MANY_TO_MANY,\n 't.manyToMany(target, { field: schema, name })'\n );\n return applyRelationMetadata(schemaOrConfig, {\n relationKind: InternalDecoratedFieldKind.MANY_TO_MANY,\n references: {\n target,\n },\n }) as RelationDecoratedSchema<T, 'manyToMany'>;\n }\n\n if (schemaOrConfig?.relatedName !== undefined) {\n throw new Error('t.manyToMany(...) does not support relatedName yet.');\n }\n\n const config = schemaOrConfig;\n const schema = config?.field ?? z.array(z.number().int());\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.MANY_TO_MANY,\n references: {\n target,\n },\n },\n config\n ) as RelationDecoratedSchema<T, 'manyToMany'> | z.ZodArray<z.ZodNumber>;\n}\n\ntype UnaryFieldDecorator = {\n <T extends ZodTypeAny>(schema: T): T;\n <T extends ZodTypeAny>(): (input: T) => T;\n};\n\ntype RelationshipDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends ForeignKeyDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'foreignKey', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\n <TRef extends ModelRef, const TConfig extends ForeignKeyDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodNumber,\n 'foreignKey',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n >;\n /**\n * @deprecated Use `t.foreignKey(target, { field: schema, ...options })` instead.\n */\n <T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n ): RelationDecoratedSchema<T, 'foreignKey'>;\n};\n\ntype OneToOneRelationshipDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends OneToOneDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'oneToOne', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\n <TRef extends ModelRef, const TConfig extends OneToOneDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodNumber,\n 'oneToOne',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n >;\n /**\n * @deprecated Use `t.oneToOne(target, { field: schema, ...options })` instead.\n */\n <T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n ): RelationDecoratedSchema<T, 'oneToOne'>;\n};\n\ntype ManyToManyDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends ManyToManyDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\n <TRef extends ModelRef, const TConfig extends ManyToManyDecoratorConfig<z.ZodArray<z.ZodNumber>> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodArray<z.ZodNumber>,\n 'manyToMany',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n undefined\n >;\n /**\n * @deprecated Use `t.manyToMany(target, { field: schema, name })` instead.\n */\n <T extends ZodTypeAny>(target: ModelRef, schema: T): RelationDecoratedSchema<T, 'manyToMany'>;\n};\n\nexport interface TangoDecorators {\n field: <T extends ZodTypeAny>(schema: T) => FieldDecoratorBuilder<T>;\n modelRef: <TModel extends Model>(key: ModelKeyOf<TModel>) => TypedModelRef<TModel>;\n primaryKey: UnaryFieldDecorator;\n unique: UnaryFieldDecorator;\n null: UnaryFieldDecorator;\n notNull: UnaryFieldDecorator;\n default: <T extends ZodTypeAny>(schema: T, value: string | { now: true } | null) => T;\n dbDefault: <T extends ZodTypeAny>(schema: T, value: string) => T;\n dbColumn: <T extends ZodTypeAny>(schema: T, name: string) => T;\n dbIndex: <T extends ZodTypeAny>(schema: T) => T;\n choices: <T extends ZodTypeAny>(schema: T, values: readonly unknown[]) => T;\n validators: <T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]) => T;\n helpText: <T extends ZodTypeAny>(schema: T, text: string) => T;\n errorMessages: <T extends ZodTypeAny>(schema: T, map: Record<string, string>) => T;\n foreignKey: RelationshipDecorator;\n oneToOne: OneToOneRelationshipDecorator;\n manyToMany: ManyToManyDecorator;\n}\n\nexport const Decorators: TangoDecorators = {\n field,\n modelRef,\n primaryKey: primaryKey as UnaryFieldDecorator,\n unique: unique as UnaryFieldDecorator,\n null: nullValue as UnaryFieldDecorator,\n notNull: notNull as UnaryFieldDecorator,\n default: defaultValue,\n dbDefault: dbDefault,\n dbColumn: dbColumn,\n dbIndex: dbIndex,\n choices: choices,\n validators: validators,\n helpText: helpText,\n errorMessages: errorMessages,\n foreignKey: foreignKey as RelationshipDecorator,\n oneToOne: oneToOne as OneToOneRelationshipDecorator,\n manyToMany: manyToMany as ManyToManyDecorator,\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Decorators, Decorators as t } from './Decorators';\nexport type { FieldDecoratorBuilder, TangoDecorators } from './Decorators';\nexport type { ModelRef, ModelRefTarget, TypedModelRef } from './domain/ModelRef';\nexport { createTypedModelRef, isTypedModelRef } from './domain/ModelRef';\nexport type { RelationDecoratedSchema } from './domain/RelationDecoratedSchema';\nexport { InternalDecoratedFieldKind } from './domain/DecoratedFieldKind';\nexport type { DecoratedFieldKind } from './domain/DecoratedFieldKind';\nexport type {\n ForeignKeyDecoratorConfig,\n OneToOneDecoratorConfig,\n ManyToManyDecoratorConfig,\n} from './domain/RelationDecoratorConfig';\nexport type { ReferentialOptions, TangoFieldMeta } from './domain/TangoFieldMeta';\nexport type { ZodTypeAny } from './domain/ZodTypeAny';\n","import type { IndexDef } from '../../domain/index';\n\nexport type ModelConstraint = {\n kind: string;\n [key: string]: unknown;\n};\n\nexport type ModelMetaFragment = {\n ordering?: string[];\n managed?: boolean;\n defaultRelatedName?: string;\n indexes?: IndexDef[];\n constraints?: ModelConstraint[];\n};\n\nexport const Meta = {\n ordering(...fields: string[]): ModelMetaFragment {\n return { ordering: fields };\n },\n\n managed(value: boolean): ModelMetaFragment {\n return { managed: value };\n },\n\n defaultRelatedName(value: string): ModelMetaFragment {\n return { defaultRelatedName: value };\n },\n\n indexes(...indexes: IndexDef[]): ModelMetaFragment {\n return { indexes };\n },\n\n constraints(...constraints: ModelConstraint[]): ModelMetaFragment {\n return { constraints };\n },\n\n uniqueTogether(...sets: string[][]): ModelMetaFragment {\n return {\n constraints: sets.map((fields) => ({ kind: 'uniqueTogether', fields })),\n };\n },\n\n indexTogether(...sets: string[][]): ModelMetaFragment {\n return {\n indexes: sets.map((on, index) => ({\n name: `idx_${on.join('_')}_${index}`,\n on,\n })),\n };\n },\n\n merge(...fragments: readonly ModelMetaFragment[]): ModelMetaFragment {\n return fragments.reduce<ModelMetaFragment>(\n (acc, fragment) => ({\n ordering: fragment.ordering ?? acc.ordering,\n managed: fragment.managed ?? acc.managed,\n defaultRelatedName: fragment.defaultRelatedName ?? acc.defaultRelatedName,\n indexes: [...(acc.indexes ?? []), ...(fragment.indexes ?? [])],\n constraints: [...(acc.constraints ?? []), ...(fragment.constraints ?? [])],\n }),\n {}\n );\n },\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Meta, Meta as m } from './Meta';\nexport type { ModelConstraint, ModelMetaFragment } from './Meta';\n","export type ConstraintDefinition = {\n kind: string;\n [key: string]: unknown;\n};\n\nexport const Constraints = {\n unique(fields: string[], options?: { name?: string; where?: string }): ConstraintDefinition {\n return {\n kind: 'unique',\n fields,\n ...options,\n };\n },\n\n check(condition: string, options?: { name?: string }): ConstraintDefinition {\n return {\n kind: 'check',\n condition,\n ...options,\n };\n },\n\n exclusion(definition: { using?: string; elements: string[]; where?: string; name?: string }): ConstraintDefinition {\n return {\n kind: 'exclusion',\n ...definition,\n };\n },\n};\n","import type { IndexDef } from '../../domain/index';\n\nexport const Indexes = {\n index(on: string[], options?: Omit<IndexDef, 'on'>): IndexDef {\n const suffix = on.join('_');\n return {\n name: options?.name ?? `idx_${suffix}`,\n on,\n unique: options?.unique,\n where: options?.where,\n };\n },\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Constraints, Constraints as c } from './Constraints';\nexport type { ConstraintDefinition } from './Constraints';\nexport { Indexes, Indexes as i } from './Indexes';\n","export const InternalFieldType = {\n SERIAL: 'serial',\n INT: 'int',\n BIGINT: 'bigint',\n TEXT: 'text',\n BOOL: 'bool',\n TIMESTAMPTZ: 'timestamptz',\n JSONB: 'jsonb',\n UUID: 'uuid',\n} as const;\n","export function isDate(value: unknown): value is Date {\n return value !== null && value !== undefined && Object.prototype.toString.call(value) === '[object Date]';\n}\n","export function hasConstructorName(value: unknown, name: string): boolean {\n return (\n !!value &&\n typeof value === 'object' &&\n (value as { constructor?: { name?: unknown } }).constructor?.name === name\n );\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodArray(value: unknown): value is z.ZodArray<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodArray');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodBoolean(value: unknown): value is z.ZodBoolean {\n return hasConstructorName(value, 'ZodBoolean');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodDate(value: unknown): value is z.ZodDate {\n return hasConstructorName(value, 'ZodDate');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodDefault(value: unknown): value is z.ZodDefault<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodDefault');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodNullable(value: unknown): value is z.ZodNullable<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodNullable');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodNumber(value: unknown): value is z.ZodNumber {\n return hasConstructorName(value, 'ZodNumber');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodObject(value: unknown): value is z.ZodObject<z.ZodRawShape> {\n return hasConstructorName(value, 'ZodObject');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodOptional(value: unknown): value is z.ZodOptional<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodOptional');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodString(value: unknown): value is z.ZodString {\n return hasConstructorName(value, 'ZodString');\n}\n","import { z } from 'zod';\nimport type { Field, FieldType } from '../../domain/index';\nimport { InternalFieldType } from '../../domain/internal/InternalFieldType';\nimport { getFieldMetadata } from './FieldMetadataStore';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport type { ModelRef } from '../decorators/domain/ModelRef';\nimport type { TangoFieldMeta } from '../decorators/domain/TangoFieldMeta';\nimport { InternalDecoratedFieldKind } from '../decorators/domain/DecoratedFieldKind';\nimport { ModelRegistry } from '../registry/ModelRegistry';\nimport {\n isDate,\n isZodArray,\n isZodBoolean,\n isZodDate,\n isZodDefault,\n isZodNullable,\n isZodNumber,\n isZodObject,\n isZodOptional,\n isZodString,\n} from '../../domain/internal/zod/index';\n\nexport type InferFieldsOptions = {\n registry?: ModelRegistry;\n resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string };\n};\n\n/**\n * Infer one storage field from a Zod schema member plus any Tango decorator metadata.\n *\n * The registry and optional target resolver are used only when the field carries\n * reference metadata that must be translated into concrete table/primary-key names.\n */\nfunction inferField(\n name: string,\n zodType: z.ZodType,\n meta: TangoFieldMeta | undefined,\n registry: ModelRegistry,\n resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string }\n): Field | null {\n let type: FieldType;\n let notNull = true;\n let defaultValue: Field['default'] = undefined;\n\n let unwrapped: z.ZodType = zodType;\n\n if (isZodOptional(unwrapped)) {\n notNull = false;\n unwrapped = unwrapped.unwrap() as z.ZodType;\n }\n\n if (isZodNullable(unwrapped)) {\n notNull = false;\n unwrapped = unwrapped.unwrap() as z.ZodType;\n }\n\n if (isZodDefault(unwrapped)) {\n const def = unwrapped._zod.def.defaultValue;\n if (isDate(def)) {\n defaultValue = { now: true };\n } else if (typeof def === 'string' || typeof def === 'number') {\n defaultValue = String(def);\n }\n unwrapped = unwrapped.removeDefault() as z.ZodType;\n }\n\n if (isZodString(unwrapped)) {\n type = InternalFieldType.TEXT;\n } else if (isZodNumber(unwrapped)) {\n const checks = unwrapped._zod.def.checks ?? [];\n const isInt = checks.some((c) => 'format' in c._zod.def && c._zod.def.format === 'safeint');\n type = isInt ? InternalFieldType.INT : InternalFieldType.BIGINT;\n } else if (isZodBoolean(unwrapped)) {\n type = InternalFieldType.BOOL;\n } else if (isZodDate(unwrapped)) {\n type = InternalFieldType.TIMESTAMPTZ;\n } else if (isZodObject(unwrapped) || isZodArray(unwrapped)) {\n type = InternalFieldType.JSONB;\n } else {\n return null;\n }\n\n const field: Field = {\n name,\n type,\n notNull,\n default: defaultValue,\n };\n\n if (!meta) {\n return field;\n }\n\n if (meta.dbColumn) {\n field.name = meta.dbColumn;\n }\n\n if (typeof meta.notNull === 'boolean') {\n field.notNull = meta.notNull;\n }\n\n if (meta.default !== undefined) {\n field.default = meta.default;\n }\n\n if (meta.primaryKey) {\n field.primaryKey = true;\n }\n\n if (meta.unique) {\n field.unique = true;\n }\n\n // Many-to-many declarations stay on the relation side of the seam. They do\n // not correspond to a stored column on the current table.\n if (meta.relationKind === InternalDecoratedFieldKind.MANY_TO_MANY) {\n return null;\n }\n\n if (meta.references) {\n const targetMetadata = resolveReferenceTarget\n ? resolveReferenceTarget(meta.references.target)\n : resolveReferenceTargetFromRegistry(meta.references.target, registry, meta.references.options?.column);\n\n field.references = {\n table: targetMetadata.table,\n column: meta.references.options?.column ?? targetMetadata.pk,\n onDelete: meta.references.options?.onDelete,\n onUpdate: meta.references.options?.onUpdate,\n };\n }\n\n return field;\n}\n\nfunction resolveReferenceTargetFromRegistry(\n target: ModelRef,\n registry: ModelRegistry,\n explicitColumn?: string\n): { table: string; pk: string } {\n const targetModel = registry.resolveRef(target);\n const primaryKey =\n explicitColumn ?? targetModel.metadata.fields.find((candidate) => candidate.primaryKey)?.name ?? 'id';\n\n return {\n table: targetModel.metadata.table,\n pk: primaryKey,\n };\n}\n\n/**\n * Infer Tango field metadata from a Zod object schema and any attached field decorators.\n */\nexport function inferFieldsFromSchema(schema: z.ZodObject<z.ZodRawShape>, options?: InferFieldsOptions): Field[] {\n const registry = options?.registry ?? ModelRegistry.global();\n const shape = schema.shape;\n const fields: Field[] = [];\n\n for (const [name, zodType] of Object.entries(shape)) {\n const field = inferField(\n name,\n zodType as z.ZodType,\n getFieldMetadata(zodType as ZodTypeAny),\n registry,\n options?.resolveReferenceTarget\n );\n if (field) {\n fields.push(field);\n }\n }\n\n return fields;\n}\n","export const InternalRelationType = {\n HAS_MANY: 'hasMany',\n BELONGS_TO: 'belongsTo',\n HAS_ONE: 'hasOne',\n} as const;\n","import type { RelationDef } from '../../domain/index';\nimport { InternalRelationType } from '../../domain/internal/InternalRelationType';\n\n/**\n * Public authoring DSL for model-level named relations.\n *\n * This is the first stage of the relations subdomain. Application code uses it\n * inside `relations: (r) => ({ ... })` to declare stable relation names and\n * resolve ambiguity that field decorators alone cannot express.\n *\n * Later internal stages normalize these authored definitions and combine them\n * with field-authored relation metadata to build the resolved relation graph.\n */\nexport class RelationBuilder {\n /** Declare a one-to-many relation from this model to `target`. */\n hasMany(target: string, foreignKey: string): RelationDef {\n return {\n type: InternalRelationType.HAS_MANY,\n target,\n foreignKey,\n };\n }\n\n /** Declare an owning relation to a parent model. */\n belongsTo(target: string, foreignKey: string, localKey?: string): RelationDef {\n return {\n type: InternalRelationType.BELONGS_TO,\n target,\n foreignKey,\n localKey,\n };\n }\n\n /** Declare a one-to-one relation from this model to `target`. */\n hasOne(target: string, foreignKey: string): RelationDef {\n return {\n type: InternalRelationType.HAS_ONE,\n target,\n foreignKey,\n };\n }\n}\n","import { z } from 'zod';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport { InternalDecoratedFieldKind } from '../decorators/domain/DecoratedFieldKind';\nimport { getFieldMetadata } from '../fields/FieldMetadataStore';\nimport type {\n NormalizedRelationOrigin,\n NormalizedRelationStorageDescriptor,\n} from './NormalizedRelationStorageDescriptor';\n\ntype RelationCandidate = {\n sourceSchemaFieldKey: string;\n zodType: ZodTypeAny;\n};\n\n/**\n * Normalizes field-authored relation declarations from a model schema into the\n * shared descriptor shape consumed by storage and relation finalization.\n *\n * This is the normalization stage of the relations subdomain. It sits between\n * authoring and resolution:\n *\n * - authoring: decorators attach relation intent to schema fields\n * - normalization: this class converts that intent into a registry-independent\n * descriptor shape\n * - resolution: the graph builder combines those descriptors with finalized\n * storage artifacts and explicit relation names\n */\nexport class RelationDescriptorNormalizer {\n constructor(\n private readonly sourceModelKey: string,\n private readonly schema: z.ZodObject<z.ZodRawShape>\n ) {}\n\n static normalize(\n sourceModelKey: string,\n schema: z.ZodObject<z.ZodRawShape>\n ): readonly NormalizedRelationStorageDescriptor[] {\n return new RelationDescriptorNormalizer(sourceModelKey, schema).normalize();\n }\n\n /**\n * Run the field-authored relation normalization pipeline for one model\n * schema and emit descriptors that later relation stages can resolve.\n */\n normalize(): readonly NormalizedRelationStorageDescriptor[] {\n const descriptors: NormalizedRelationStorageDescriptor[] = [];\n\n for (const candidate of this.collectRelationCandidates()) {\n const descriptor = this.normalizeCandidate(candidate);\n if (descriptor) {\n descriptors.push(descriptor);\n }\n }\n\n return descriptors;\n }\n\n private collectRelationCandidates(): readonly RelationCandidate[] {\n return Object.entries(this.schema.shape).map(([sourceSchemaFieldKey, zodType]) => ({\n sourceSchemaFieldKey,\n zodType: zodType as ZodTypeAny,\n }));\n }\n\n private normalizeCandidate(candidate: RelationCandidate): NormalizedRelationStorageDescriptor | undefined {\n const meta = getFieldMetadata(candidate.zodType);\n if (!meta?.references || !meta.relationKind) {\n return undefined;\n }\n\n return {\n edgeId: this.buildEdgeId(candidate.sourceSchemaFieldKey, meta.relationKind),\n sourceModelKey: this.sourceModelKey,\n sourceSchemaFieldKey: candidate.sourceSchemaFieldKey,\n targetRef: meta.references.target,\n origin: meta.relationKind,\n localFieldName: candidate.sourceSchemaFieldKey,\n dbColumnName: meta.dbColumn ?? candidate.sourceSchemaFieldKey,\n referencedTargetColumn: meta.references.options?.column,\n onDelete: meta.references.options?.onDelete,\n onUpdate: meta.references.options?.onUpdate,\n unique: meta.unique || meta.relationKind === InternalDecoratedFieldKind.ONE_TO_ONE,\n explicitForwardName: meta.forwardName,\n explicitReverseName: meta.reverseName,\n namingHint: this.deriveNamingHint(candidate.sourceSchemaFieldKey),\n provenance: 'field-decorator',\n };\n }\n\n private buildEdgeId(sourceSchemaFieldKey: string, origin: NormalizedRelationOrigin): string {\n return `${this.sourceModelKey}:${sourceSchemaFieldKey}:${origin}`;\n }\n\n private deriveNamingHint(fieldKey: string): string {\n if (fieldKey.endsWith('Id') && fieldKey.length > 2) {\n return fieldKey.slice(0, -2);\n }\n\n if (fieldKey.endsWith('_id') && fieldKey.length > 3) {\n return fieldKey.slice(0, -3);\n }\n\n return fieldKey;\n }\n}\n","/**\n * Shared naming policy for the model and relations subdomains.\n *\n * These helpers are not an authoring or graph stage on their own. They are the\n * cross-cutting policy layer used by both model construction and relation\n * resolution when Tango derives table names, aliases, and synthesized relation\n * names in a Django-style shape.\n */\nexport function toSnakeCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\nexport function pluralize(value: string): string {\n if (/(s|x|z|ch|sh)$/.test(value)) {\n return `${value}es`;\n }\n\n if (/[^aeiou]y$/.test(value)) {\n return `${value.slice(0, -1)}ies`;\n }\n\n return `${value}s`;\n}\n\nexport function deriveTableName(name: string): string {\n return pluralize(toSnakeCase(name));\n}\n","import { z } from 'zod';\nimport type {\n Field,\n Model,\n ModelAugmentations,\n ModelMetadata,\n ModelWriteHooks,\n PersistedModelOutput,\n RelationDef,\n} from '../../domain/index';\nimport type { ModelDefinition } from '../ModelDefinition';\nimport { RelationBuilder } from '../relations/RelationBuilder';\nimport type { ModelRegistry } from '../registry/ModelRegistry';\nimport type { NormalizedRelationStorageDescriptor } from '../relations/NormalizedRelationStorageDescriptor';\nimport { RelationDescriptorNormalizer } from '../relations/RelationDescriptorNormalizer';\nimport { deriveTableName } from '../relations/SchemaNaming';\n\ntype AnySchemaModel = Model<z.ZodObject<z.ZodRawShape>>;\ntype AnyInternalSchemaModel = InternalSchemaModel<z.ZodObject<z.ZodRawShape>>;\nconst REGISTRY_OWNER_KEY = Symbol.for('tango.schema.registryOwner');\nconst NORMALIZED_RELATIONS_KEY = Symbol.for('tango.schema.normalizedRelations');\nconst EXPLICIT_FIELDS_KEY = Symbol.for('tango.schema.explicitFields');\nconst EXPLICIT_RELATIONS_KEY = Symbol.for('tango.schema.explicitRelations');\n\ntype InternalSchemaModelCarrier = object & {\n [REGISTRY_OWNER_KEY]?: ModelRegistry;\n [NORMALIZED_RELATIONS_KEY]?: readonly NormalizedRelationStorageDescriptor[];\n [EXPLICIT_FIELDS_KEY]?: readonly Field[];\n [EXPLICIT_RELATIONS_KEY]?: Readonly<Record<string, RelationDef>>;\n};\n\nexport class InternalSchemaModel<TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string = string>\n implements Model<TSchema, TKey>\n{\n static readonly BRAND = 'tango.schema.internal_schema_model' as const;\n\n readonly __tangoBrand: typeof InternalSchemaModel.BRAND = InternalSchemaModel.BRAND;\n readonly metadata: ModelMetadata;\n readonly schema: TSchema;\n readonly hooks?: ModelWriteHooks<PersistedModelOutput<TSchema>>;\n declare readonly objects: ModelAugmentations<TSchema, TKey> extends { readonly objects: infer TObject }\n ? TObject\n : never;\n\n private constructor(\n metadata: ModelMetadata,\n schema: TSchema,\n hooks: ModelWriteHooks<PersistedModelOutput<TSchema>> | undefined\n ) {\n this.metadata = metadata;\n this.schema = schema;\n this.hooks = hooks;\n }\n\n static create<TSchema extends z.ZodObject<z.ZodRawShape>>(\n definition: ModelDefinition<TSchema>,\n registry: ModelRegistry\n ): InternalSchemaModel<TSchema> {\n InternalSchemaModel.validateDefinition(definition);\n\n const builder = new RelationBuilder();\n const relations = definition.relations ? Object.freeze(definition.relations(builder)) : undefined;\n const key = `${definition.namespace}/${definition.name}`;\n const table = definition.table?.trim() || deriveTableName(definition.name);\n const normalizedRelations = RelationDescriptorNormalizer.normalize(key, definition.schema);\n\n const metadata: ModelMetadata = {\n namespace: definition.namespace,\n name: definition.name,\n key,\n table,\n fields: [] as never,\n indexes: definition.indexes,\n relations,\n ordering: definition.ordering,\n managed: definition.managed,\n defaultRelatedName: definition.defaultRelatedName,\n constraints: definition.constraints,\n };\n\n // The field view stays lazy because finalized storage metadata is registry-scoped.\n // The owning registry publishes the current finalized fields for this model\n // instead of freezing a stale one-time snapshot during construction.\n Object.defineProperty(metadata, 'fields', {\n enumerable: true,\n configurable: false,\n get: () => registry.getFinalizedFields(key) as typeof metadata.fields,\n });\n Object.freeze(metadata);\n\n const model = new InternalSchemaModel(metadata, definition.schema, definition.hooks);\n InternalSchemaModel.attachInternals(model, {\n registry,\n normalizedRelations,\n explicitFields: definition.fields,\n explicitRelations: relations,\n });\n return model;\n }\n\n static isInternalSchemaModel(value: unknown): value is AnyInternalSchemaModel {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === InternalSchemaModel.BRAND\n );\n }\n\n static getRegistryOwner(model: AnySchemaModel): ModelRegistry {\n const owner = InternalSchemaModel.carrier(model)[REGISTRY_OWNER_KEY];\n if (!owner) {\n throw new Error(`Model '${model.metadata.key}' is missing internal registry ownership metadata.`);\n }\n return owner;\n }\n\n static getNormalizedRelations(model: AnySchemaModel): readonly NormalizedRelationStorageDescriptor[] {\n return InternalSchemaModel.carrier(model)[NORMALIZED_RELATIONS_KEY] ?? [];\n }\n\n static getExplicitFields(model: AnySchemaModel): readonly Field[] | undefined {\n return InternalSchemaModel.carrier(model)[EXPLICIT_FIELDS_KEY];\n }\n\n static getExplicitRelations(model: AnySchemaModel): Readonly<Record<string, RelationDef>> | undefined {\n return InternalSchemaModel.carrier(model)[EXPLICIT_RELATIONS_KEY];\n }\n\n private static validateDefinition<TSchema extends z.ZodObject<z.ZodRawShape>>(\n definition: ModelDefinition<TSchema>\n ): void {\n if (!definition.namespace.trim()) {\n throw new Error('Model.namespace is required and cannot be empty.');\n }\n if (!definition.name.trim()) {\n throw new Error('Model.name is required and cannot be empty.');\n }\n if (definition.table !== undefined && !definition.table.trim()) {\n throw new Error('Model.table cannot be empty when provided.');\n }\n }\n\n private static require(model: AnySchemaModel): AnyInternalSchemaModel {\n if (!InternalSchemaModel.isInternalSchemaModel(model)) {\n throw new Error(`Model '${model.metadata.key}' is missing internal registry ownership metadata.`);\n }\n\n return model;\n }\n\n private static carrier(model: AnySchemaModel): InternalSchemaModelCarrier {\n return InternalSchemaModel.require(model) as unknown as InternalSchemaModelCarrier;\n }\n\n private static attachInternals(\n model: object,\n internals: {\n registry: ModelRegistry;\n normalizedRelations: readonly NormalizedRelationStorageDescriptor[];\n explicitFields?: readonly Field[];\n explicitRelations?: Readonly<Record<string, RelationDef>>;\n }\n ): void {\n const carrier = model as InternalSchemaModelCarrier;\n\n Object.defineProperties(carrier, {\n [REGISTRY_OWNER_KEY]: {\n value: internals.registry,\n enumerable: false,\n configurable: false,\n writable: false,\n },\n [NORMALIZED_RELATIONS_KEY]: {\n value: Object.freeze([...internals.normalizedRelations]),\n enumerable: false,\n configurable: false,\n writable: false,\n },\n [EXPLICIT_FIELDS_KEY]: {\n value: internals.explicitFields ? Object.freeze([...internals.explicitFields]) : undefined,\n enumerable: false,\n configurable: false,\n writable: false,\n },\n [EXPLICIT_RELATIONS_KEY]: {\n value: internals.explicitRelations,\n enumerable: false,\n configurable: false,\n writable: false,\n },\n });\n }\n}\n","// Keep these as plain string literals rather than TS enums so the runtime\n// values stay identical across package boundaries without enum emit semantics.\nexport const InternalRelationPublicKind = {\n BELONGS_TO: 'belongsTo',\n HAS_ONE: 'hasOne',\n HAS_MANY: 'hasMany',\n MANY_TO_MANY: 'manyToMany',\n} as const;\n\nexport const InternalRelationStorageStrategy = {\n REFERENCE: 'reference',\n REVERSE_REFERENCE: 'reverse_reference',\n MANY_TO_MANY: 'many_to_many',\n} as const;\n\nexport const InternalRelationCardinality = {\n SINGLE: 'single',\n MANY: 'many',\n} as const;\n\nexport const InternalRelationProvenance = {\n FIELD_DECORATOR: 'field-decorator',\n RELATIONS_API: 'relations-api',\n SYNTHESIZED_REVERSE: 'synthesized-reverse',\n} as const;\n\nexport type RelationPublicKind = (typeof InternalRelationPublicKind)[keyof typeof InternalRelationPublicKind];\nexport type RelationStorageStrategy =\n (typeof InternalRelationStorageStrategy)[keyof typeof InternalRelationStorageStrategy];\nexport type RelationCardinality = (typeof InternalRelationCardinality)[keyof typeof InternalRelationCardinality];\nexport type RelationProvenance = (typeof InternalRelationProvenance)[keyof typeof InternalRelationProvenance];\n\n/**\n * Author-time relation intent after target resolution but before full graph\n * pairing and naming.\n *\n * This type is the conceptual bridge between normalized descriptors and the\n * fully resolved graph. It exists so the relations subdomain has a stable\n * vocabulary for relation kinds, storage strategies, and provenance as the\n * pipeline becomes more sophisticated.\n */\nexport interface RelationSpec {\n edgeId: string;\n sourceModelKey: string;\n sourceSchemaFieldKey?: string;\n targetModelKey: string;\n kind: RelationPublicKind;\n storageStrategy: RelationStorageStrategy;\n localFieldName?: string;\n targetFieldName?: string;\n nameHint?: string;\n throughModelKey?: string;\n throughSourceFieldName?: string;\n throughTargetFieldName?: string;\n provenance: RelationProvenance;\n}\n","import type { Model, RelationDef } from '../../domain/index';\nimport type { FinalizedStorageArtifacts } from '../fields/FinalizedStorageArtifacts';\nimport { InternalSchemaModel } from '../internal/InternalSchemaModel';\nimport type { ResolvedRelationGraphSnapshot } from '../registry/ResolvedRelationGraphSnapshot';\nimport type { NormalizedRelationStorageDescriptor } from './NormalizedRelationStorageDescriptor';\nimport type { ResolvedRelationDescriptor, ResolvedRelationGraph } from './ResolvedRelationGraph';\nimport {\n type RelationCardinality,\n InternalRelationCardinality,\n InternalRelationPublicKind,\n InternalRelationProvenance,\n InternalRelationStorageStrategy,\n} from './RelationSpec';\nimport { pluralize, toSnakeCase } from './SchemaNaming';\n\nconst REFERENCE_CAPABILITIES = Object.freeze({\n migratable: true,\n queryable: true,\n hydratable: true,\n});\nconst MANY_TO_MANY_CAPABILITIES = Object.freeze({\n migratable: false,\n queryable: false,\n hydratable: false,\n});\nconst RELATION_NAME_SEPARATOR = ':';\n\ntype GraphBuilderOptions = {\n version: number;\n models: readonly Model[];\n storage: FinalizedStorageArtifacts;\n resolveRef: (ref: NormalizedRelationStorageDescriptor['targetRef']) => Model;\n};\n\n/**\n * Resolution-stage builder that turns normalized relation descriptors into the\n * registry-scoped resolved relation graph.\n *\n * This is the final pipeline stage in the relations subdomain. It combines:\n *\n * - normalized field-authored relation descriptors\n * - explicit model-level relation names from `RelationBuilder`\n * - finalized storage artifacts from the registry\n *\n * The result is the canonical named relation graph used by ORM-facing\n * consumers.\n */\nexport class ResolvedRelationGraphBuilder {\n private readonly byModel = new Map<string, Map<string, ResolvedRelationDescriptor>>();\n private readonly byEdgeId = new Map<string, ResolvedRelationDescriptor>();\n private readonly matchedOverrides = new Set<string>();\n\n constructor(private readonly options: GraphBuilderOptions) {}\n\n static build(options: GraphBuilderOptions): ResolvedRelationGraph {\n return new ResolvedRelationGraphBuilder(options).build();\n }\n\n /**\n * Serialize a resolved graph into the canonical snapshot shape used by\n * relation-registry code generation and fingerprinting.\n */\n static createSnapshot(graph: ResolvedRelationGraph): ResolvedRelationGraphSnapshot {\n return {\n models: Array.from(graph.byModel.entries())\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, relations]) => ({\n key,\n relations: Array.from(relations.values())\n .sort((left, right) => left.name.localeCompare(right.name))\n .map((relation) => ({\n edgeId: relation.edgeId,\n sourceModelKey: relation.sourceModelKey,\n targetModelKey: relation.targetModelKey,\n name: relation.name,\n inverseEdgeId: relation.inverseEdgeId,\n kind: relation.kind,\n storageStrategy: relation.storageStrategy,\n cardinality: relation.cardinality,\n localFieldName: relation.localFieldName,\n targetFieldName: relation.targetFieldName,\n alias: relation.alias,\n capabilities: {\n migratable: relation.capabilities.migratable,\n queryable: relation.capabilities.queryable,\n hydratable: relation.capabilities.hydratable,\n },\n })),\n })),\n };\n }\n\n /**\n * Resolve every model's normalized relation descriptors into a single\n * registry-scoped graph and fail when authoring ambiguity remains.\n */\n build(): ResolvedRelationGraph {\n for (const model of this.options.models) {\n this.addModelRelations(model);\n }\n\n for (const model of this.options.models) {\n this.assertAllOverridesMatched(model);\n }\n\n return {\n version: this.options.version,\n byModel: this.byModel,\n byEdgeId: this.byEdgeId,\n };\n }\n\n private addModelRelations(model: Model): void {\n const explicitRelations = InternalSchemaModel.getExplicitRelations(model) ?? {};\n\n for (const descriptor of InternalSchemaModel.getNormalizedRelations(model)) {\n const targetModel = this.options.resolveRef(descriptor.targetRef);\n\n if (descriptor.origin === 'manyToMany') {\n const relationName = descriptor.explicitForwardName ?? descriptor.namingHint;\n this.addResolvedRelation({\n edgeId: descriptor.edgeId,\n sourceModelKey: model.metadata.key,\n targetModelKey: targetModel.metadata.key,\n name: relationName,\n kind: InternalRelationPublicKind.MANY_TO_MANY,\n storageStrategy: InternalRelationStorageStrategy.MANY_TO_MANY,\n cardinality: InternalRelationCardinality.MANY,\n capabilities: MANY_TO_MANY_CAPABILITIES,\n provenance: InternalRelationProvenance.FIELD_DECORATOR,\n alias: `${toSnakeCase(model.metadata.name)}_${relationName}`,\n });\n continue;\n }\n\n this.addReferenceRelations(model, descriptor, targetModel, explicitRelations);\n }\n }\n\n private addReferenceRelations(\n sourceModel: Model,\n descriptor: NormalizedRelationStorageDescriptor,\n targetModel: Model,\n explicitRelations: Readonly<Record<string, RelationDef>>\n ): void {\n const forwardOverride = this.findForwardOverride(sourceModel, targetModel, descriptor, explicitRelations);\n if (forwardOverride) {\n this.markOverrideMatched(sourceModel.metadata.key, forwardOverride[0]);\n }\n\n const forwardName = forwardOverride?.[0] ?? descriptor.explicitForwardName ?? descriptor.namingHint;\n const targetPrimaryKey = this.getPrimaryKey(targetModel.metadata.key);\n this.addResolvedRelation({\n edgeId: descriptor.edgeId,\n sourceModelKey: sourceModel.metadata.key,\n targetModelKey: targetModel.metadata.key,\n name: forwardName,\n inverseEdgeId: `${descriptor.edgeId}:inverse`,\n kind: InternalRelationPublicKind.BELONGS_TO,\n storageStrategy: InternalRelationStorageStrategy.REFERENCE,\n cardinality: InternalRelationCardinality.SINGLE,\n localFieldName: descriptor.dbColumnName,\n targetFieldName: descriptor.referencedTargetColumn ?? targetPrimaryKey,\n capabilities: REFERENCE_CAPABILITIES,\n provenance: InternalRelationProvenance.FIELD_DECORATOR,\n alias: `${toSnakeCase(targetModel.metadata.name)}_${forwardName}`,\n });\n\n const reverseOverride = this.findReverseOverride(sourceModel, targetModel, descriptor);\n if (reverseOverride) {\n this.markOverrideMatched(targetModel.metadata.key, reverseOverride[0]);\n }\n\n const reverseKind = descriptor.unique\n ? InternalRelationPublicKind.HAS_ONE\n : InternalRelationPublicKind.HAS_MANY;\n const reverseCardinality = descriptor.unique\n ? InternalRelationCardinality.SINGLE\n : InternalRelationCardinality.MANY;\n const reverseName =\n reverseOverride?.[0] ??\n descriptor.explicitReverseName ??\n this.deriveReverseName(sourceModel, reverseCardinality);\n this.addResolvedRelation({\n edgeId: `${descriptor.edgeId}:inverse`,\n sourceModelKey: targetModel.metadata.key,\n targetModelKey: sourceModel.metadata.key,\n name: reverseName,\n inverseEdgeId: descriptor.edgeId,\n kind: reverseKind,\n storageStrategy: InternalRelationStorageStrategy.REVERSE_REFERENCE,\n cardinality: reverseCardinality,\n localFieldName: descriptor.dbColumnName,\n targetFieldName: descriptor.referencedTargetColumn ?? targetPrimaryKey,\n capabilities: REFERENCE_CAPABILITIES,\n provenance: reverseOverride\n ? InternalRelationProvenance.RELATIONS_API\n : InternalRelationProvenance.SYNTHESIZED_REVERSE,\n alias: `${toSnakeCase(sourceModel.metadata.name)}_${reverseName}`,\n });\n }\n\n private findForwardOverride(\n sourceModel: Model,\n targetModel: Model,\n descriptor: NormalizedRelationStorageDescriptor,\n explicitRelations: Readonly<Record<string, RelationDef>>\n ): [string, RelationDef] | undefined {\n return Object.entries(explicitRelations).find(([, relation]) => {\n const relationTargetKey = this.resolveRelationTargetKey(sourceModel, relation.target);\n return (\n relation.type === InternalRelationPublicKind.BELONGS_TO &&\n relationTargetKey === targetModel.metadata.key &&\n relation.foreignKey === descriptor.sourceSchemaFieldKey\n );\n });\n }\n\n private findReverseOverride(\n sourceModel: Model,\n targetModel: Model,\n descriptor: NormalizedRelationStorageDescriptor\n ): [string, RelationDef] | undefined {\n const reverseModelRelations = InternalSchemaModel.getExplicitRelations(targetModel) ?? {};\n const reverseKind = descriptor.unique\n ? InternalRelationPublicKind.HAS_ONE\n : InternalRelationPublicKind.HAS_MANY;\n return Object.entries(reverseModelRelations).find(([, relation]) => {\n const relationTargetKey = this.resolveRelationTargetKey(targetModel, relation.target);\n return (\n relationTargetKey === sourceModel.metadata.key &&\n relation.type === reverseKind &&\n relation.foreignKey === descriptor.sourceSchemaFieldKey\n );\n });\n }\n\n private assertAllOverridesMatched(model: Model): void {\n const explicitRelations = InternalSchemaModel.getExplicitRelations(model);\n if (!explicitRelations) {\n return;\n }\n\n for (const relationName of Object.keys(explicitRelations)) {\n const marker = this.buildOverrideMarker(model.metadata.key, relationName);\n if (!this.matchedOverrides.has(marker)) {\n throw new Error(\n `Relation override '${relationName}' on model '${model.metadata.key}' does not match a field-authored relation.`\n );\n }\n }\n }\n\n private addResolvedRelation(descriptor: ResolvedRelationDescriptor): void {\n const modelRelations =\n this.byModel.get(descriptor.sourceModelKey) ?? new Map<string, ResolvedRelationDescriptor>();\n const existing = modelRelations.get(descriptor.name);\n if (existing) {\n throw new Error(\n `Ambiguous relation name '${descriptor.name}' on model '${descriptor.sourceModelKey}'. Add an explicit relations override.`\n );\n }\n\n modelRelations.set(descriptor.name, descriptor);\n this.byModel.set(descriptor.sourceModelKey, modelRelations);\n this.byEdgeId.set(descriptor.edgeId, descriptor);\n }\n\n private getPrimaryKey(modelKey: string): string {\n return this.options.storage.byModel.get(modelKey)!.pk;\n }\n\n private markOverrideMatched(modelKey: string, relationName: string): void {\n this.matchedOverrides.add(this.buildOverrideMarker(modelKey, relationName));\n }\n\n private buildOverrideMarker(modelKey: string, relationName: string): string {\n return `${modelKey}${RELATION_NAME_SEPARATOR}${relationName}`;\n }\n\n private resolveRelationTargetKey(sourceModel: Model, target: string): string {\n if (target.includes('/')) {\n return target;\n }\n\n return `${sourceModel.metadata.namespace}/${target}`;\n }\n\n private deriveReverseName(sourceModel: Model, cardinality: RelationCardinality): string {\n if (sourceModel.metadata.defaultRelatedName) {\n return sourceModel.metadata.defaultRelatedName;\n }\n\n const snake = toSnakeCase(sourceModel.metadata.name);\n return cardinality === InternalRelationCardinality.MANY ? pluralize(snake) : snake;\n }\n}\n","import type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';\n\n// These constants define the current generated-relation artifact contract.\n// They are centralized here so codegen, runtime drift checks, and CLI commands\n// share one default location and filename scheme.\nexport const GENERATED_RELATION_REGISTRY_DIRNAME = '.tango';\nexport const GENERATED_RELATION_REGISTRY_TYPES_FILENAME = 'relations.generated.d.ts';\nexport const GENERATED_RELATION_REGISTRY_METADATA_FILENAME = 'relations.generated.json';\nexport const GENERATED_RELATION_REGISTRY_METADATA_VERSION = 1;\n\nexport type GeneratedRelationRegistryArtifact = {\n version: typeof GENERATED_RELATION_REGISTRY_METADATA_VERSION;\n fingerprint: string;\n snapshot: ResolvedRelationGraphSnapshot;\n};\n","// oxlint-disable unicorn/no-static-only-class\nimport { createHash } from 'node:crypto';\nimport type { ResolvedRelationGraph } from '../relations/ResolvedRelationGraph';\nimport { ResolvedRelationGraphBuilder } from '../relations/ResolvedRelationGraphBuilder';\nimport type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';\n\n/**\n * Build canonical serialized artifacts from a resolved relation graph.\n *\n * Generation, drift detection, and related tooling all need the same stable\n * snapshot shape and fingerprinting rules, so that work lives behind one class\n * instead of a pair of free functions.\n */\nexport class ResolvedRelationGraphArtifactFactory {\n static createSnapshot(graph: ResolvedRelationGraph): ResolvedRelationGraphSnapshot {\n return ResolvedRelationGraphBuilder.createSnapshot(graph);\n }\n\n static createFingerprint(value: ResolvedRelationGraph | ResolvedRelationGraphSnapshot): string {\n const snapshot = 'byModel' in value ? ResolvedRelationGraphArtifactFactory.createSnapshot(value) : value;\n return createHash('sha256').update(JSON.stringify(snapshot)).digest('hex');\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport { getLogger } from '@danceroutine/tango-core';\nimport type { Field, Model } from '../../domain/index';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport { isTypedModelRef, type ModelRef } from '../decorators/domain/ModelRef';\nimport { inferFieldsFromSchema } from '../fields/inferFieldsFromSchema';\nimport { getFieldMetadata } from '../fields/FieldMetadataStore';\nimport type { FinalizedStorageArtifacts, FinalizedStorageModel } from '../fields/FinalizedStorageArtifacts';\nimport { InternalSchemaModel } from '../internal/InternalSchemaModel';\nimport type { ResolvedRelationGraph } from '../relations/ResolvedRelationGraph';\nimport { ResolvedRelationGraphBuilder } from '../relations/ResolvedRelationGraphBuilder';\nimport {\n GENERATED_RELATION_REGISTRY_DIRNAME,\n GENERATED_RELATION_REGISTRY_METADATA_FILENAME,\n GENERATED_RELATION_REGISTRY_METADATA_VERSION,\n type GeneratedRelationRegistryArtifact,\n} from './GeneratedRelationRegistryArtifact';\nimport { ResolvedRelationGraphArtifactFactory } from './ResolvedRelationGraphArtifactFactory';\nimport type { ResolvedRelationGraphSnapshot } from './ResolvedRelationGraphSnapshot';\n\nconst DEFAULT_IDENTIFIER_NAME = 'id';\nconst ACTIVE_REGISTRY_STORAGE_KEY = Symbol.for('tango.schema.activeRegistryStorage');\n\ntype ModelRegistryRuntimeGlobal = typeof globalThis & {\n [ACTIVE_REGISTRY_STORAGE_KEY]?: AsyncLocalStorage<ModelRegistry>;\n};\n\n/**\n * Registry that resolves Tango models by stable identity.\n *\n * The default shared registry is convenient for application bootstrapping\n * within one schema package instance, while dedicated instances are useful in\n * tests and tooling. Explicit active-registry binding stays process-shared so\n * tooling can construct models across separate schema package copies without\n * relying on the ambient default registry.\n */\nexport class ModelRegistry {\n private static globalRegistry?: ModelRegistry;\n private readonly models = new Map<string, Model>();\n private version = 0;\n private storageCache?: FinalizedStorageArtifacts;\n private relationGraphCache?: ResolvedRelationGraph;\n private lastRelationRegistryDriftCheckVersion?: number;\n\n /**\n * Return the shared default registry used by `Model(...)` for this schema\n * package instance.\n */\n static global(): ModelRegistry {\n ModelRegistry.globalRegistry ??= new ModelRegistry();\n return ModelRegistry.globalRegistry;\n }\n\n /**\n * Return the registry currently bound to model construction work.\n *\n * This explicit binding is process-shared so code that imports separate\n * schema package copies can still participate in one construction flow.\n */\n static active(): ModelRegistry {\n return ModelRegistry.activeRegistryStorage().getStore() ?? ModelRegistry.global();\n }\n\n /**\n * Run work with a specific registry bound as the active construction target.\n */\n static async runWithRegistry<T>(registry: ModelRegistry, work: () => Promise<T> | T): Promise<T> {\n return await ModelRegistry.activeRegistryStorage().run(registry, work);\n }\n\n /**\n * Register a model on the shared global registry.\n */\n static register(model: Model): void {\n ModelRegistry.global().register(model);\n }\n\n /**\n * Register several models on the shared global registry.\n */\n static registerMany(models: readonly Model[]): void {\n ModelRegistry.global().registerMany(models);\n }\n\n /**\n * Resolve a model from the shared registry by namespace and name.\n */\n static get(namespace: string, name: string): Model | undefined {\n return ModelRegistry.global().get(namespace, name);\n }\n\n /**\n * Resolve a model from the shared registry by its `namespace/name` key.\n */\n static getByKey(key: string): Model | undefined {\n return ModelRegistry.global().getByKey(key);\n }\n\n /**\n * Resolve any supported model reference form against the shared registry.\n */\n static resolveRef(ref: ModelRef): Model {\n return ModelRegistry.global().resolveRef(ref);\n }\n\n /**\n * Clear the shared registry, which is mainly useful in tests.\n */\n static clear(): void {\n ModelRegistry.global().clear();\n }\n\n /**\n * Return the owning registry for a model.\n */\n static getOwner(model: { metadata: { key?: string } } & object): ModelRegistry {\n return InternalSchemaModel.getRegistryOwner(model as Model);\n }\n\n private static runtimeGlobal(): ModelRegistryRuntimeGlobal {\n return globalThis as ModelRegistryRuntimeGlobal;\n }\n\n private static activeRegistryStorage(): AsyncLocalStorage<ModelRegistry> {\n const runtimeGlobal = ModelRegistry.runtimeGlobal();\n\n if (!runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY]) {\n runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY] = new AsyncLocalStorage<ModelRegistry>();\n }\n\n return runtimeGlobal[ACTIVE_REGISTRY_STORAGE_KEY];\n }\n\n /**\n * Register a model on this registry instance.\n */\n register(model: Model): void {\n // A model's finalized storage and relation artifacts are registry-scoped.\n // Rejecting cross-registry reuse here prevents one model object from\n // publishing conflicting finalized views in multiple registries.\n const owner = InternalSchemaModel.getRegistryOwner(model);\n if (owner !== this) {\n throw new Error(\n `Model '${model.metadata.key}' belongs to a different registry and cannot be registered here.`\n );\n }\n\n const existing = this.models.get(model.metadata.key);\n if (existing && existing !== model) {\n throw new Error(`Model '${model.metadata.key}' is already registered in this registry.`);\n }\n\n this.models.set(model.metadata.key, model);\n this.bumpVersion();\n }\n\n /**\n * Register several models on this registry instance.\n */\n registerMany(models: readonly Model[]): void {\n for (const model of models) {\n this.register(model);\n }\n }\n\n /**\n * Resolve a model from this registry instance by namespace and name.\n */\n get(namespace: string, name: string): Model | undefined {\n return this.getByKey(`${namespace}/${name}`);\n }\n\n /**\n * Resolve a model from this registry instance by its `namespace/name` key.\n */\n getByKey(key: string): Model | undefined {\n return this.models.get(key);\n }\n\n /**\n * Resolve a string, callback, or direct model reference into a model object.\n */\n resolveRef(ref: ModelRef): Model {\n if (typeof ref === 'string' || isTypedModelRef(ref)) {\n const key = typeof ref === 'string' ? ref : ref.key;\n const model = this.getByKey(key);\n if (!model) {\n throw new Error(\n `Unable to resolve model reference '${key}'. Ensure it is registered in ModelRegistry.`\n );\n }\n return model;\n }\n\n const model = typeof ref === 'function' ? ref() : ref;\n if (InternalSchemaModel.getRegistryOwner(model) !== this) {\n throw new Error(\n `Model reference '${model.metadata.key}' belongs to a different registry and cannot be resolved here.`\n );\n }\n return model;\n }\n\n /**\n * Finalize storage-only artifacts for all models in this registry.\n */\n finalizeStorageArtifacts(): FinalizedStorageArtifacts {\n if (this.storageCache?.version === this.version) {\n return this.storageCache;\n }\n\n const primaryKeyByModel = new Map<string, string>();\n for (const model of this.models.values()) {\n primaryKeyByModel.set(model.metadata.key, this.inferPrimaryKeyName(model));\n }\n\n const byModel = new Map<string, FinalizedStorageModel>();\n for (const model of this.models.values()) {\n const explicitFields = InternalSchemaModel.getExplicitFields(model);\n const inferredFields = inferFieldsFromSchema(model.schema, {\n registry: this,\n resolveReferenceTarget: (target) => {\n const targetModel = this.resolveRef(target);\n return {\n table: targetModel.metadata.table,\n pk: primaryKeyByModel.get(targetModel.metadata.key)!,\n };\n },\n });\n const fields = this.freezeFields(this.mergeStorageFields(inferredFields, explicitFields));\n const primaryKey = fields.find((field) => field.primaryKey)?.name ?? DEFAULT_IDENTIFIER_NAME;\n\n byModel.set(model.metadata.key, {\n key: model.metadata.key,\n table: model.metadata.table,\n fields,\n pk: primaryKey,\n });\n }\n\n const finalized: FinalizedStorageArtifacts = {\n version: this.version,\n byModel,\n };\n this.storageCache = finalized;\n return finalized;\n }\n\n /**\n * Return finalized storage fields for a specific model.\n */\n getFinalizedFields(model: Model | string): readonly Field[] {\n const key = typeof model === 'string' ? model : model.metadata.key;\n const fields = this.finalizeStorageArtifacts().byModel.get(key)?.fields;\n if (!fields) {\n throw new Error(`No finalized storage fields are available for model '${key}'.`);\n }\n return fields;\n }\n\n /**\n * Resolve the registry's relation graph from finalized storage artifacts.\n */\n getResolvedRelationGraph(): ResolvedRelationGraph {\n if (this.relationGraphCache?.version === this.version) {\n return this.relationGraphCache;\n }\n\n // The registry owns cache/version orchestration. The dedicated builder owns\n // forward edge resolution, reverse synthesis, and override validation.\n const finalized = ResolvedRelationGraphBuilder.build({\n version: this.version,\n models: this.values(),\n storage: this.finalizeStorageArtifacts(),\n resolveRef: (ref) => this.resolveRef(ref),\n });\n this.relationGraphCache = finalized;\n this.warnOnGeneratedRelationRegistryDrift(finalized);\n return finalized;\n }\n\n /**\n * Return a canonical snapshot of the resolved relation graph.\n */\n getResolvedRelationGraphSnapshot(): ResolvedRelationGraphSnapshot {\n return ResolvedRelationGraphArtifactFactory.createSnapshot(this.getResolvedRelationGraph());\n }\n\n /**\n * Return a deterministic fingerprint for the resolved relation graph.\n */\n getResolvedRelationGraphFingerprint(): string {\n return ResolvedRelationGraphArtifactFactory.createFingerprint(this.getResolvedRelationGraph());\n }\n\n /**\n * Remove all registered models from this registry instance.\n */\n clear(): void {\n this.models.clear();\n this.bumpVersion();\n }\n\n /**\n * Return all registered models in insertion order.\n */\n values(): readonly Model[] {\n return Array.from(this.models.values());\n }\n\n private bumpVersion(): void {\n this.version += 1;\n this.storageCache = undefined;\n this.relationGraphCache = undefined;\n this.lastRelationRegistryDriftCheckVersion = undefined;\n }\n\n private freezeFields(fields: readonly Field[]): readonly Field[] {\n return Object.freeze(fields.map((field) => Object.freeze({ ...field })));\n }\n\n private inferPrimaryKeyName(model: Model): string {\n for (const [fieldKey, zodType] of Object.entries(model.schema.shape)) {\n const meta = getFieldMetadata(zodType as ZodTypeAny);\n if (meta?.primaryKey) {\n return meta.dbColumn ?? fieldKey;\n }\n }\n\n const explicitFields = InternalSchemaModel.getExplicitFields(model);\n if (explicitFields) {\n return explicitFields.find((field) => field.primaryKey)?.name ?? DEFAULT_IDENTIFIER_NAME;\n }\n\n return DEFAULT_IDENTIFIER_NAME;\n }\n\n private mergeStorageFields(inferredFields: readonly Field[], explicitFields?: readonly Field[]): readonly Field[] {\n if (!explicitFields?.length) {\n return inferredFields;\n }\n\n const mergedFields = new Map(inferredFields.map((field) => [field.name, field]));\n for (const explicitField of explicitFields) {\n mergedFields.set(explicitField.name, explicitField);\n }\n\n return Array.from(mergedFields.values());\n }\n\n private warnOnGeneratedRelationRegistryDrift(graph: ResolvedRelationGraph): void {\n if (\n this.lastRelationRegistryDriftCheckVersion === this.version ||\n !this.shouldCheckGeneratedRelationRegistry()\n ) {\n return;\n }\n this.lastRelationRegistryDriftCheckVersion = this.version;\n\n const expected = this.readGeneratedRelationRegistryArtifact();\n if (!expected) {\n return;\n }\n\n // Compare against the same canonical snapshot shape that code\n // generation writes so drift checks operate on one shared contract.\n const liveSnapshot = ResolvedRelationGraphArtifactFactory.createSnapshot(graph);\n if (this.isPartialRegistrySnapshot(liveSnapshot, expected.snapshot)) {\n return;\n }\n\n const liveFingerprint = ResolvedRelationGraphArtifactFactory.createFingerprint(liveSnapshot);\n if (liveFingerprint === expected.fingerprint) {\n return;\n }\n\n getLogger('tango.schema.registry').warn(\n `Generated relation registry drift detected. Run 'tango codegen relations' to refresh ${GENERATED_RELATION_REGISTRY_DIRNAME}/${GENERATED_RELATION_REGISTRY_METADATA_FILENAME}.`\n );\n }\n\n private shouldCheckGeneratedRelationRegistry(): boolean {\n return process.env.NODE_ENV === 'development' || process.env.NODE_ENV === 'test';\n }\n\n private readGeneratedRelationRegistryArtifact(): GeneratedRelationRegistryArtifact | undefined {\n const metadataPath = resolve(\n process.cwd(),\n GENERATED_RELATION_REGISTRY_DIRNAME,\n GENERATED_RELATION_REGISTRY_METADATA_FILENAME\n );\n if (!existsSync(metadataPath)) {\n return undefined;\n }\n\n try {\n const parsed = JSON.parse(readFileSync(metadataPath, 'utf8')) as Partial<GeneratedRelationRegistryArtifact>;\n if (\n parsed.version !== GENERATED_RELATION_REGISTRY_METADATA_VERSION ||\n typeof parsed.fingerprint !== 'string' ||\n !parsed.snapshot ||\n !Array.isArray(parsed.snapshot.models)\n ) {\n getLogger('tango.schema.registry').warn(\n `Ignoring malformed generated relation registry metadata at '${metadataPath}'.`\n );\n return undefined;\n }\n\n return parsed as GeneratedRelationRegistryArtifact;\n } catch (error) {\n getLogger('tango.schema.registry').warn(\n `Unable to read generated relation registry metadata at '${metadataPath}'.`,\n error\n );\n return undefined;\n }\n }\n\n private isPartialRegistrySnapshot(\n liveSnapshot: ResolvedRelationGraphSnapshot,\n expectedSnapshot: ResolvedRelationGraphSnapshot\n ): boolean {\n const expectedModels = new Map(expectedSnapshot.models.map((model) => [model.key, model]));\n if (liveSnapshot.models.some((model) => !expectedModels.has(model.key))) {\n return false;\n }\n\n if (liveSnapshot.models.length >= expectedSnapshot.models.length) {\n return false;\n }\n\n for (const model of liveSnapshot.models) {\n const expectedModel = expectedModels.get(model.key)!;\n if (JSON.stringify(model.relations) !== JSON.stringify(expectedModel.relations)) {\n return false;\n }\n }\n\n return true;\n }\n}\n","import { existsSync } from 'node:fs';\nimport { dirname, extname, resolve } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nconst LOCAL_ENTRYPOINT_CANDIDATES = ['./index.ts', './index.js'] as const;\n\n/**\n * Resolve the current package root entrypoint for `@danceroutine/tango-schema`.\n *\n * Tooling loaders alias app-side `@danceroutine/tango-schema` imports back to\n * this path so project modules reuse the same schema package instance across\n * workspace-source and published-dist environments.\n */\nexport function resolveSchemaModuleEntrypoint(): string {\n for (const relativePath of LOCAL_ENTRYPOINT_CANDIDATES) {\n const absolutePath = fileURLToPath(new URL(relativePath, import.meta.url));\n if (existsSync(absolutePath)) {\n return absolutePath;\n }\n }\n\n throw new Error(\n `Unable to resolve the @danceroutine/tango-schema entrypoint relative to '${fileURLToPath(import.meta.url)}'.`\n );\n}\n\n/**\n * Return explicit Jiti alias entries for the schema package root and its\n * public subpaths so app modules always reuse the same schema package instance.\n *\n * @internal\n * Exported for Tango tooling/framework consumption only. This helper exists so\n * Tango loaders can force app modules to reuse the active schema package\n * instance during module execution. It is not intended as a stable application\n * API, and the alias map may be more permissive than the package exports\n * surface by design.\n */\nexport function createSchemaModuleAliases(): Record<string, string> {\n const entrypoint = resolveSchemaModuleEntrypoint();\n const packageRoot = dirname(entrypoint);\n const extension = extname(entrypoint);\n const modelEntrypoint = resolve(packageRoot, 'model', `index${extension}`);\n const domainEntrypoint = resolve(packageRoot, 'domain', `index${extension}`);\n\n if (!existsSync(modelEntrypoint) || !existsSync(domainEntrypoint)) {\n throw new Error(\n `Unable to resolve the @danceroutine/tango-schema subpath entrypoints relative to '${entrypoint}'.`\n );\n }\n\n return {\n '@danceroutine/tango-schema': entrypoint,\n '@danceroutine/tango-schema/model': modelEntrypoint,\n '@danceroutine/tango-schema/domain': domainEntrypoint,\n // Deliberately permissive for tooling-time identity unification. This\n // is not intended to widen the package's supported end-user API.\n '@danceroutine/tango-schema/': `${packageRoot}/`,\n };\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { ModelRegistry } from './ModelRegistry';\nexport { createSchemaModuleAliases, resolveSchemaModuleEntrypoint } from '../../resolveSchemaModuleEntrypoint';\nexport {\n GENERATED_RELATION_REGISTRY_DIRNAME,\n GENERATED_RELATION_REGISTRY_METADATA_FILENAME,\n GENERATED_RELATION_REGISTRY_METADATA_VERSION,\n GENERATED_RELATION_REGISTRY_TYPES_FILENAME,\n type GeneratedRelationRegistryArtifact,\n} from './GeneratedRelationRegistryArtifact';\nexport { ResolvedRelationGraphArtifactFactory } from './ResolvedRelationGraphArtifactFactory';\nexport {\n type ResolvedRelationGraphSnapshot,\n type ResolvedRelationGraphSnapshotModel,\n type ResolvedRelationGraphSnapshotRelation,\n} from './ResolvedRelationGraphSnapshot';\n","/**\n * Domain boundary barrel for relation authoring.\n *\n * The relations subdomain has three internal layers:\n *\n * - authoring: `RelationBuilder`\n * - normalization: field-authored relations become normalized descriptors\n * - resolution: normalized descriptors become the registry-scoped relation graph\n *\n * Only the authoring surface is exported here. The later pipeline stages stay\n * internal until Tango intentionally publishes them as supported contracts.\n */\nexport { RelationBuilder } from './RelationBuilder';\n","import type { z } from 'zod';\nimport type { Model } from '../domain/Model';\nimport { ModelRegistry } from './registry/ModelRegistry';\n\nexport type ModelAugmentor = <TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string>(\n model: Model<TSchema, TKey>\n) => void;\n\nconst modelAugmentors = new Set<ModelAugmentor>();\n\n/**\n * Register a model augmentor that runs for existing and future models.\n */\nexport function registerModelAugmentor(augmentor: ModelAugmentor): () => void {\n modelAugmentors.add(augmentor);\n\n for (const model of ModelRegistry.global().values()) {\n augmentor(model);\n }\n\n return () => {\n modelAugmentors.delete(augmentor);\n };\n}\n\n/**\n * Apply all registered augmentors to a model before it is returned publicly.\n */\nexport function applyModelAugmentors<TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string>(\n model: Model<TSchema, TKey>\n): Model<TSchema, TKey> {\n for (const augmentor of modelAugmentors) {\n augmentor(model);\n }\n\n return model;\n}\n","import { z } from 'zod';\nimport type { Model as SchemaModel } from '../domain/Model';\nimport type { ModelDefinition } from './ModelDefinition';\nimport { applyModelAugmentors } from './ModelAugmentorRegistry';\nimport { InternalSchemaModel } from './internal/InternalSchemaModel';\nimport { ModelRegistry } from './registry/ModelRegistry';\n\n/**\n * Creates a model definition with metadata and schema validation.\n * Automatically finalizes field types through the owning model registry.\n */\nexport function Model<\n const TNamespace extends string,\n const TName extends string,\n TSchema extends z.ZodObject<z.ZodRawShape>,\n>(\n definition: ModelDefinition<TSchema> & { namespace: TNamespace; name: TName }\n): SchemaModel<TSchema, `${TNamespace}/${TName}`> {\n const registry = definition.registry ?? ModelRegistry.active();\n const model = applyModelAugmentors(\n InternalSchemaModel.create(definition, registry) as SchemaModel<TSchema, `${TNamespace}/${TName}`>\n );\n\n registry.register(model);\n return model;\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n *\n * Tango keeps both flat exports and namespaced subdomain barrels here so\n * callers can choose TS-native direct imports or Django-style drill-down\n * access through the bundled `model` namespace at the package root.\n */\n\nexport * as decorators from './decorators/index';\nexport * as meta from './meta/index';\nexport * as constraints from './constraints/index';\nexport * as registry from './registry/index';\nexport * as relations from './relations/index';\n\nexport type { ModelDefinition } from './ModelDefinition';\nexport { RelationBuilder } from './relations/index';\nexport { Model } from './Model';\nexport { registerModelAugmentor } from './ModelAugmentorRegistry';\nexport { Decorators, t } from './decorators/index';\nexport type {\n TangoDecorators,\n FieldDecoratorBuilder,\n DecoratedFieldKind,\n ModelRef,\n ModelRefTarget,\n RelationDecoratedSchema,\n TypedModelRef,\n ForeignKeyDecoratorConfig,\n OneToOneDecoratorConfig,\n ManyToManyDecoratorConfig,\n} from './decorators/index';\nexport { createTypedModelRef, InternalDecoratedFieldKind, isTypedModelRef } from './decorators/index';\nexport { Meta, m } from './meta/index';\nexport type { ModelConstraint, ModelMetaFragment } from './meta/index';\nexport { Constraints, Indexes, c, i } from './constraints/index';\nexport type { ConstraintDefinition } from './constraints/index';\nexport {\n ModelRegistry,\n createSchemaModuleAliases,\n resolveSchemaModuleEntrypoint,\n GENERATED_RELATION_REGISTRY_DIRNAME,\n GENERATED_RELATION_REGISTRY_METADATA_FILENAME,\n GENERATED_RELATION_REGISTRY_METADATA_VERSION,\n GENERATED_RELATION_REGISTRY_TYPES_FILENAME,\n ResolvedRelationGraphArtifactFactory,\n type GeneratedRelationRegistryArtifact,\n type ResolvedRelationGraphSnapshot,\n type ResolvedRelationGraphSnapshotModel,\n type ResolvedRelationGraphSnapshotRelation,\n} from './registry/index';\n"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Resolve the current package root entrypoint for `@danceroutine/tango-schema`.
3
+ *
4
+ * Tooling loaders alias app-side `@danceroutine/tango-schema` imports back to
5
+ * this path so project modules reuse the same schema package instance across
6
+ * workspace-source and published-dist environments.
7
+ */
8
+ export declare function resolveSchemaModuleEntrypoint(): string;
9
+ /**
10
+ * Return explicit Jiti alias entries for the schema package root and its
11
+ * public subpaths so app modules always reuse the same schema package instance.
12
+ *
13
+ * @internal
14
+ * Exported for Tango tooling/framework consumption only. This helper exists so
15
+ * Tango loaders can force app modules to reuse the active schema package
16
+ * instance during module execution. It is not intended as a stable application
17
+ * API, and the alias map may be more permissive than the package exports
18
+ * surface by design.
19
+ */
20
+ export declare function createSchemaModuleAliases(): Record<string, string>;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@danceroutine/tango-schema",
3
- "version": "1.4.0",
3
+ "version": "1.5.0",
4
4
  "description": "Model factory, Zod helpers, and metadata utilities for Tango",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -38,7 +38,7 @@
38
38
  },
39
39
  "dependencies": {
40
40
  "zod": "^4.0.0",
41
- "@danceroutine/tango-core": "1.4.0"
41
+ "@danceroutine/tango-core": "1.5.0"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^22.9.0",
@@ -1 +0,0 @@
1
- {"version":3,"file":"model-YLW1ydkV.js","names":["schema: ZodTypeAny","meta: TangoFieldMeta","key: ModelKeyOf<TModel>","value: unknown","value: unknown","schema: T","meta: TangoFieldMeta","kind: DecoratedFieldKind","replacement: string","schemaOrUndefined: T | undefined","schema?: T","value: string | { now: true } | null","value: string","name: string","values: readonly unknown[]","text: string","map: Record<string, string>","schema: TField","config?: { name?: string; relatedName?: string }","config?: ReferentialOptions","key: ModelKeyOf<TModel>","target: ModelRef","schemaOrOptions?: T | ForeignKeyDecoratorConfig<T>","maybeOptions?: ReferentialOptions","schemaOrOptions?: T | OneToOneDecoratorConfig<T>","schemaOrConfig?: T | ManyToManyDecoratorConfig<T>","Decorators: TangoDecorators","value: boolean","value: string","fields: string[]","options?: { name?: string; where?: string }","condition: string","options?: { name?: string }","definition: { using?: string; elements: string[]; where?: string; name?: string }","on: string[]","options?: Omit<IndexDef, 'on'>","value: unknown","value: unknown","name: string","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","value: unknown","name: string","zodType: z.ZodType","meta: TangoFieldMeta | undefined","registry: ModelRegistry","resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string }","type: FieldType","defaultValue: Field['default']","unwrapped: z.ZodType","field: Field","target: ModelRef","explicitColumn?: string","schema: z.ZodObject<z.ZodRawShape>","options?: InferFieldsOptions","fields: Field[]","target: string","foreignKey: string","localKey?: string","sourceModelKey: string","schema: z.ZodObject<z.ZodRawShape>","descriptors: NormalizedRelationStorageDescriptor[]","candidate: RelationCandidate","sourceSchemaFieldKey: string","origin: NormalizedRelationOrigin","fieldKey: string","value: string","name: string","registry: ModelRegistry","metadata: ModelMetadata","schema: TSchema","hooks: ModelWriteHooks<PersistedModelOutput<TSchema>> | undefined","normalizedRelations: readonly NormalizedRelationStorageDescriptor[]","explicitFields: readonly Field[] | undefined","explicitRelations: Readonly<Record<string, RelationDef>> | undefined","definition: ModelDefinition<TSchema>","value: unknown","model: AnySchemaModel","options: GraphBuilderOptions","model: Model","sourceModel: Model","descriptor: NormalizedRelationStorageDescriptor","targetModel: Model","explicitRelations: Readonly<Record<string, RelationDef>>","descriptor: ResolvedRelationDescriptor","modelKey: string","relationName: string","target: string","cardinality: RelationCardinality","registry: ModelRegistry","work: () => Promise<T> | T","model: Model","models: readonly Model[]","namespace: string","name: string","key: string","ref: ModelRef","finalized: FinalizedStorageArtifacts","model: Model | string","fields: readonly Field[]","inferredFields: readonly Field[]","explicitFields?: readonly Field[]","augmentor: ModelAugmentor","model: Model<TSchema, TKey>","definition: ModelDefinition<TSchema> & { namespace: TNamespace; name: TName }"],"sources":["../src/model/fields/FieldMetadataStore.ts","../src/model/decorators/domain/ModelRef.ts","../src/model/decorators/domain/DecoratedFieldKind.ts","../src/model/decorators/Decorators.ts","../src/model/decorators/index.ts","../src/model/meta/Meta.ts","../src/model/meta/index.ts","../src/model/constraints/Constraints.ts","../src/model/constraints/Indexes.ts","../src/model/constraints/index.ts","../src/domain/internal/InternalFieldType.ts","../src/domain/internal/zod/isDate.ts","../src/domain/internal/zod/hasConstructorName.ts","../src/domain/internal/zod/isZodArray.ts","../src/domain/internal/zod/isZodBoolean.ts","../src/domain/internal/zod/isZodDate.ts","../src/domain/internal/zod/isZodDefault.ts","../src/domain/internal/zod/isZodNullable.ts","../src/domain/internal/zod/isZodNumber.ts","../src/domain/internal/zod/isZodObject.ts","../src/domain/internal/zod/isZodOptional.ts","../src/domain/internal/zod/isZodString.ts","../src/model/fields/inferFieldsFromSchema.ts","../src/domain/internal/InternalRelationType.ts","../src/model/relations/RelationBuilder.ts","../src/model/relations/RelationDescriptorNormalizer.ts","../src/model/relations/SchemaNaming.ts","../src/model/internal/InternalSchemaModel.ts","../src/model/relations/RelationSpec.ts","../src/model/relations/ResolvedRelationGraphBuilder.ts","../src/model/registry/ModelRegistry.ts","../src/model/registry/index.ts","../src/model/relations/index.ts","../src/model/ModelAugmentorRegistry.ts","../src/model/Model.ts","../src/model/index.ts"],"sourcesContent":["import type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport type { TangoFieldMeta } from '../decorators/domain/TangoFieldMeta';\n\nconst fieldMetadataStore = new WeakMap<ZodTypeAny, TangoFieldMeta>();\n\nexport function getFieldMetadata(schema: ZodTypeAny): TangoFieldMeta | undefined {\n return fieldMetadataStore.get(schema);\n}\n\nexport function setFieldMetadata(schema: ZodTypeAny, meta: TangoFieldMeta): void {\n const existing = fieldMetadataStore.get(schema);\n fieldMetadataStore.set(schema, {\n ...existing,\n ...meta,\n });\n}\n","import type { Model, ModelKeyOf } from '../../../domain';\n\n// TODO: consider async model callbacks such as `() => Promise<Model>` when Tango tackles lazy import boundaries for cyclical model graphs.\n// See the ADR: https://tangowebframework.dev/contributors/adr/relation-target-typing-without-codegen\ndeclare const TANGO_TYPED_MODEL_REF_TARGET: unique symbol;\n\nexport interface TypedModelRef<TModel extends Model = Model> {\n readonly key: ModelKeyOf<TModel>;\n readonly [TANGO_TYPED_MODEL_REF_TARGET]?: TModel;\n}\n\nexport type ModelRef<TModel extends Model = Model> = string | TModel | (() => TModel) | TypedModelRef<TModel>;\n\nexport type ModelRefTarget<TRef> =\n TRef extends TypedModelRef<infer TModel>\n ? TModel\n : TRef extends () => infer TModel\n ? TModel extends Model\n ? TModel\n : never\n : TRef extends Model\n ? TRef\n : never;\n\nexport function createTypedModelRef<TModel extends Model>(key: ModelKeyOf<TModel>): TypedModelRef<TModel> {\n return Object.freeze({ key }) as TypedModelRef<TModel>;\n}\n\nexport function isTypedModelRef(value: unknown): value is TypedModelRef {\n return typeof value === 'object' && value !== null && typeof (value as { key?: unknown }).key === 'string';\n}\n","export const InternalDecoratedFieldKind = {\n FOREIGN_KEY: 'foreignKey',\n ONE_TO_ONE: 'oneToOne',\n MANY_TO_MANY: 'manyToMany',\n} as const;\nexport type DecoratedFieldKind = (typeof InternalDecoratedFieldKind)[keyof typeof InternalDecoratedFieldKind];\n","import { getLogger } from '@danceroutine/tango-core';\nimport { z } from 'zod';\nimport { setFieldMetadata } from '../fields/FieldMetadataStore';\nimport type { ZodTypeAny } from './domain/ZodTypeAny';\nimport { createTypedModelRef, type ModelRef, type ModelRefTarget, type TypedModelRef } from './domain/ModelRef';\nimport type { ReferentialOptions, TangoFieldMeta } from './domain/TangoFieldMeta';\nimport type { Model, ModelKeyOf } from '../../domain';\nimport type {\n ForeignKeyDecoratorConfig,\n ManyToManyDecoratorConfig,\n OneToOneDecoratorConfig,\n} from './domain/RelationDecoratorConfig';\nimport type { RelationDecoratedSchema } from './domain/RelationDecoratedSchema';\nimport { InternalDecoratedFieldKind } from './domain/DecoratedFieldKind';\nimport type { DecoratedFieldKind } from './domain/DecoratedFieldKind';\n\nfunction isZodType(value: unknown): value is ZodTypeAny {\n return (\n !!value &&\n typeof value === 'object' &&\n 'safeParse' in value &&\n typeof (value as { safeParse?: unknown }).safeParse === 'function'\n );\n}\n\nfunction decorate<T extends ZodTypeAny>(schema: T, meta: TangoFieldMeta): T {\n setFieldMetadata(schema, meta);\n return schema;\n}\n\nconst warnedDecoratorKinds = new Set<DecoratedFieldKind>();\n\nfunction warnDeprecatedSchemaOverload(kind: DecoratedFieldKind, replacement: string): void {\n if (warnedDecoratorKinds.has(kind)) {\n return;\n }\n\n warnedDecoratorKinds.add(kind);\n getLogger('tango.schema.decorators').warn(\n `Deprecated positional schema overload used for t.${kind}(...). Prefer ${replacement} instead.`\n );\n}\n\nfunction maybeDecorator<T extends ZodTypeAny>(\n schemaOrUndefined: T | undefined,\n meta: TangoFieldMeta\n): T | ((schema: T) => T) {\n if (schemaOrUndefined) {\n return decorate(schemaOrUndefined, meta);\n }\n\n return (schema: T) => decorate(schema, meta);\n}\n\nfunction primaryKey<T extends ZodTypeAny>(schema: T): T;\nfunction primaryKey<T extends ZodTypeAny>(): (input: T) => T;\nfunction primaryKey<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { primaryKey: true, notNull: true });\n}\n\nfunction unique<T extends ZodTypeAny>(schema: T): T;\nfunction unique<T extends ZodTypeAny>(): (input: T) => T;\nfunction unique<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { unique: true });\n}\n\nfunction nullValue<T extends ZodTypeAny>(schema: T): T;\nfunction nullValue<T extends ZodTypeAny>(): (input: T) => T;\nfunction nullValue<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { notNull: false });\n}\n\nfunction notNull<T extends ZodTypeAny>(schema: T): T;\nfunction notNull<T extends ZodTypeAny>(): (input: T) => T;\nfunction notNull<T extends ZodTypeAny>(schema?: T): T | ((input: T) => T) {\n return maybeDecorator(schema, { notNull: true });\n}\n\nfunction defaultValue<T extends ZodTypeAny>(schema: T, value: string | { now: true } | null): T;\nfunction defaultValue<T extends ZodTypeAny>(schema: T, value: string | { now: true } | null): T {\n return decorate(schema, { default: value });\n}\n\nfunction dbDefault<T extends ZodTypeAny>(schema: T, value: string): T;\nfunction dbDefault<T extends ZodTypeAny>(schema: T, value: string): T {\n return decorate(schema, { dbDefault: value });\n}\n\nfunction dbColumn<T extends ZodTypeAny>(schema: T, name: string): T;\nfunction dbColumn<T extends ZodTypeAny>(schema: T, name: string): T {\n return decorate(schema, { dbColumn: name });\n}\n\nfunction dbIndex<T extends ZodTypeAny>(schema: T): T {\n return decorate(schema, { dbIndex: true });\n}\n\nfunction choices<T extends ZodTypeAny>(schema: T, values: readonly unknown[]): T;\nfunction choices<T extends ZodTypeAny>(schema: T, values: readonly unknown[]): T {\n return decorate(schema, { choices: values });\n}\n\nfunction validators<T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]): T;\nfunction validators<T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]): T {\n return decorate(schema, { validators: values });\n}\n\nfunction helpText<T extends ZodTypeAny>(schema: T, text: string): T;\nfunction helpText<T extends ZodTypeAny>(schema: T, text: string): T {\n return decorate(schema, { helpText: text });\n}\n\nfunction errorMessages<T extends ZodTypeAny>(schema: T, map: Record<string, string>): T;\nfunction errorMessages<T extends ZodTypeAny>(schema: T, map: Record<string, string>): T {\n return decorate(schema, { errorMessages: map });\n}\n\nexport interface FieldDecoratorBuilder<TField extends ZodTypeAny> {\n defaultValue(value: string | { now: true } | null): FieldDecoratorBuilder<TField>;\n dbDefault(value: string): FieldDecoratorBuilder<TField>;\n dbColumn(name: string): FieldDecoratorBuilder<TField>;\n dbIndex(): FieldDecoratorBuilder<TField>;\n choices(values: readonly unknown[]): FieldDecoratorBuilder<TField>;\n validators(...values: readonly ((value: unknown) => unknown)[]): FieldDecoratorBuilder<TField>;\n helpText(text: string): FieldDecoratorBuilder<TField>;\n errorMessages(map: Record<string, string>): FieldDecoratorBuilder<TField>;\n build(): TField;\n}\n\nclass FieldDecoratorBuilderImpl<TField extends ZodTypeAny> implements FieldDecoratorBuilder<TField> {\n constructor(private readonly schema: TField) {}\n\n defaultValue(value: string | { now: true } | null): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { default: value });\n return this;\n }\n\n dbDefault(value: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbDefault: value });\n return this;\n }\n\n dbColumn(name: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbColumn: name });\n return this;\n }\n\n dbIndex(): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { dbIndex: true });\n return this;\n }\n\n choices(values: readonly unknown[]): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { choices: values });\n return this;\n }\n\n validators(...values: readonly ((value: unknown) => unknown)[]): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { validators: values });\n return this;\n }\n\n helpText(text: string): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { helpText: text });\n return this;\n }\n\n errorMessages(map: Record<string, string>): FieldDecoratorBuilder<TField> {\n decorate(this.schema, { errorMessages: map });\n return this;\n }\n\n build(): TField {\n return this.schema;\n }\n}\n\nfunction field<T extends ZodTypeAny>(schema: T): FieldDecoratorBuilder<T> {\n return new FieldDecoratorBuilderImpl(schema);\n}\n\nfunction applyRelationMetadata<T extends ZodTypeAny>(\n schema: T,\n meta: TangoFieldMeta,\n config?: { name?: string; relatedName?: string }\n): T {\n return decorate(schema, {\n ...meta,\n forwardName: config?.name,\n reverseName: config?.relatedName,\n });\n}\n\nfunction toReferentialOptions(config?: ReferentialOptions): ReferentialOptions | undefined {\n if (!config) {\n return undefined;\n }\n\n if (config.column === undefined && config.onDelete === undefined && config.onUpdate === undefined) {\n return undefined;\n }\n\n return {\n column: config.column,\n onDelete: config.onDelete,\n onUpdate: config.onUpdate,\n };\n}\n\ntype ConfigName<TConfig> = TConfig extends { name: infer TName extends string } ? TName : undefined;\ntype ConfigRelatedName<TConfig> = TConfig extends { relatedName: infer TRelatedName extends string }\n ? TRelatedName\n : undefined;\n\nfunction modelRef<TModel extends Model>(key: ModelKeyOf<TModel>): TypedModelRef<TModel> {\n return createTypedModelRef<TModel>(key);\n}\n\nfunction foreignKey<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends ForeignKeyDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'foreignKey', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\nfunction foreignKey<TRef extends ModelRef, const TConfig extends ForeignKeyDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<\n z.ZodNumber,\n 'foreignKey',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n>;\n/**\n * @deprecated Use `t.foreignKey(target, { field: schema, ...options })` instead.\n */\nfunction foreignKey<T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n): RelationDecoratedSchema<T, 'foreignKey'>;\nfunction foreignKey<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrOptions?: T | ForeignKeyDecoratorConfig<T>,\n maybeOptions?: ReferentialOptions\n): RelationDecoratedSchema<T, 'foreignKey'> | z.ZodNumber {\n if (isZodType(schemaOrOptions)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.FOREIGN_KEY,\n 't.foreignKey(target, { field: schema, ...options })'\n );\n return applyRelationMetadata(schemaOrOptions, {\n relationKind: InternalDecoratedFieldKind.FOREIGN_KEY,\n references: {\n target,\n options: maybeOptions,\n },\n }) as RelationDecoratedSchema<T, 'foreignKey'>;\n }\n\n const config = schemaOrOptions;\n const schema = config?.field ?? z.number().int();\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.FOREIGN_KEY,\n references: {\n target,\n options: toReferentialOptions(config),\n },\n notNull: config?.field ? undefined : true,\n },\n config\n ) as RelationDecoratedSchema<T, 'foreignKey'> | z.ZodNumber;\n}\n\nfunction oneToOne<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends OneToOneDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'oneToOne', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\nfunction oneToOne<TRef extends ModelRef, const TConfig extends OneToOneDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<\n z.ZodNumber,\n 'oneToOne',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n>;\n/**\n * @deprecated Use `t.oneToOne(target, { field: schema, ...options })` instead.\n */\nfunction oneToOne<T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n): RelationDecoratedSchema<T, 'oneToOne'>;\nfunction oneToOne<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrOptions?: T | OneToOneDecoratorConfig<T>,\n maybeOptions?: ReferentialOptions\n): RelationDecoratedSchema<T, 'oneToOne'> | z.ZodNumber {\n if (isZodType(schemaOrOptions)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.ONE_TO_ONE,\n 't.oneToOne(target, { field: schema, ...options })'\n );\n return applyRelationMetadata(schemaOrOptions, {\n relationKind: InternalDecoratedFieldKind.ONE_TO_ONE,\n unique: true,\n references: {\n target,\n options: maybeOptions,\n },\n }) as RelationDecoratedSchema<T, 'oneToOne'>;\n }\n\n const config = schemaOrOptions;\n const schema = config?.field ?? z.number().int();\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.ONE_TO_ONE,\n unique: true,\n references: {\n target,\n options: toReferentialOptions(config),\n },\n notNull: config?.field ? undefined : true,\n },\n config\n ) as RelationDecoratedSchema<T, 'oneToOne'> | z.ZodNumber;\n}\n\nfunction manyToMany<\n TRef extends ModelRef,\n T extends ZodTypeAny,\n const TConfig extends ManyToManyDecoratorConfig<T> & { field: T },\n>(\n target: TRef,\n config: TConfig\n): RelationDecoratedSchema<T, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\nfunction manyToMany<\n TRef extends ModelRef,\n const TConfig extends ManyToManyDecoratorConfig<z.ZodArray<z.ZodNumber>> | undefined,\n>(\n target: TRef,\n config?: TConfig\n): RelationDecoratedSchema<z.ZodArray<z.ZodNumber>, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\n/**\n * @deprecated Use `t.manyToMany(target, { field: schema, name })` instead.\n */\nfunction manyToMany<T extends ZodTypeAny>(target: ModelRef, schema: T): RelationDecoratedSchema<T, 'manyToMany'>;\nfunction manyToMany<T extends ZodTypeAny>(\n target: ModelRef,\n schemaOrConfig?: T | ManyToManyDecoratorConfig<T>\n): RelationDecoratedSchema<T, 'manyToMany'> | z.ZodArray<z.ZodNumber> {\n if (isZodType(schemaOrConfig)) {\n warnDeprecatedSchemaOverload(\n InternalDecoratedFieldKind.MANY_TO_MANY,\n 't.manyToMany(target, { field: schema, name })'\n );\n return applyRelationMetadata(schemaOrConfig, {\n relationKind: InternalDecoratedFieldKind.MANY_TO_MANY,\n references: {\n target,\n },\n }) as RelationDecoratedSchema<T, 'manyToMany'>;\n }\n\n if (schemaOrConfig?.relatedName !== undefined) {\n throw new Error('t.manyToMany(...) does not support relatedName yet.');\n }\n\n const config = schemaOrConfig;\n const schema = config?.field ?? z.array(z.number().int());\n return applyRelationMetadata(\n schema,\n {\n relationKind: InternalDecoratedFieldKind.MANY_TO_MANY,\n references: {\n target,\n },\n },\n config\n ) as RelationDecoratedSchema<T, 'manyToMany'> | z.ZodArray<z.ZodNumber>;\n}\n\ntype UnaryFieldDecorator = {\n <T extends ZodTypeAny>(schema: T): T;\n <T extends ZodTypeAny>(): (input: T) => T;\n};\n\ntype RelationshipDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends ForeignKeyDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'foreignKey', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\n <TRef extends ModelRef, const TConfig extends ForeignKeyDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodNumber,\n 'foreignKey',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n >;\n /**\n * @deprecated Use `t.foreignKey(target, { field: schema, ...options })` instead.\n */\n <T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n ): RelationDecoratedSchema<T, 'foreignKey'>;\n};\n\ntype OneToOneRelationshipDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends OneToOneDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'oneToOne', ModelRefTarget<TRef>, ConfigName<TConfig>, ConfigRelatedName<TConfig>>;\n <TRef extends ModelRef, const TConfig extends OneToOneDecoratorConfig<z.ZodNumber> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodNumber,\n 'oneToOne',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n ConfigRelatedName<TConfig>\n >;\n /**\n * @deprecated Use `t.oneToOne(target, { field: schema, ...options })` instead.\n */\n <T extends ZodTypeAny>(\n target: ModelRef,\n schema: T,\n options?: ReferentialOptions\n ): RelationDecoratedSchema<T, 'oneToOne'>;\n};\n\ntype ManyToManyDecorator = {\n <TRef extends ModelRef, T extends ZodTypeAny, const TConfig extends ManyToManyDecoratorConfig<T> & { field: T }>(\n target: TRef,\n config: TConfig\n ): RelationDecoratedSchema<T, 'manyToMany', ModelRefTarget<TRef>, ConfigName<TConfig>, undefined>;\n <TRef extends ModelRef, const TConfig extends ManyToManyDecoratorConfig<z.ZodArray<z.ZodNumber>> | undefined>(\n target: TRef,\n config?: TConfig\n ): RelationDecoratedSchema<\n z.ZodArray<z.ZodNumber>,\n 'manyToMany',\n ModelRefTarget<TRef>,\n ConfigName<TConfig>,\n undefined\n >;\n /**\n * @deprecated Use `t.manyToMany(target, { field: schema, name })` instead.\n */\n <T extends ZodTypeAny>(target: ModelRef, schema: T): RelationDecoratedSchema<T, 'manyToMany'>;\n};\n\nexport interface TangoDecorators {\n field: <T extends ZodTypeAny>(schema: T) => FieldDecoratorBuilder<T>;\n modelRef: <TModel extends Model>(key: ModelKeyOf<TModel>) => TypedModelRef<TModel>;\n primaryKey: UnaryFieldDecorator;\n unique: UnaryFieldDecorator;\n null: UnaryFieldDecorator;\n notNull: UnaryFieldDecorator;\n default: <T extends ZodTypeAny>(schema: T, value: string | { now: true } | null) => T;\n dbDefault: <T extends ZodTypeAny>(schema: T, value: string) => T;\n dbColumn: <T extends ZodTypeAny>(schema: T, name: string) => T;\n dbIndex: <T extends ZodTypeAny>(schema: T) => T;\n choices: <T extends ZodTypeAny>(schema: T, values: readonly unknown[]) => T;\n validators: <T extends ZodTypeAny>(schema: T, ...values: readonly ((value: unknown) => unknown)[]) => T;\n helpText: <T extends ZodTypeAny>(schema: T, text: string) => T;\n errorMessages: <T extends ZodTypeAny>(schema: T, map: Record<string, string>) => T;\n foreignKey: RelationshipDecorator;\n oneToOne: OneToOneRelationshipDecorator;\n manyToMany: ManyToManyDecorator;\n}\n\nexport const Decorators: TangoDecorators = {\n field,\n modelRef,\n primaryKey: primaryKey as UnaryFieldDecorator,\n unique: unique as UnaryFieldDecorator,\n null: nullValue as UnaryFieldDecorator,\n notNull: notNull as UnaryFieldDecorator,\n default: defaultValue,\n dbDefault: dbDefault,\n dbColumn: dbColumn,\n dbIndex: dbIndex,\n choices: choices,\n validators: validators,\n helpText: helpText,\n errorMessages: errorMessages,\n foreignKey: foreignKey as RelationshipDecorator,\n oneToOne: oneToOne as OneToOneRelationshipDecorator,\n manyToMany: manyToMany as ManyToManyDecorator,\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Decorators, Decorators as t } from './Decorators';\nexport type { FieldDecoratorBuilder, TangoDecorators } from './Decorators';\nexport type { ModelRef, ModelRefTarget, TypedModelRef } from './domain/ModelRef';\nexport { createTypedModelRef, isTypedModelRef } from './domain/ModelRef';\nexport type { RelationDecoratedSchema } from './domain/RelationDecoratedSchema';\nexport { InternalDecoratedFieldKind } from './domain/DecoratedFieldKind';\nexport type { DecoratedFieldKind } from './domain/DecoratedFieldKind';\nexport type {\n ForeignKeyDecoratorConfig,\n OneToOneDecoratorConfig,\n ManyToManyDecoratorConfig,\n} from './domain/RelationDecoratorConfig';\nexport type { ReferentialOptions, TangoFieldMeta } from './domain/TangoFieldMeta';\nexport type { ZodTypeAny } from './domain/ZodTypeAny';\n","import type { IndexDef } from '../../domain/index';\n\nexport type ModelConstraint = {\n kind: string;\n [key: string]: unknown;\n};\n\nexport type ModelMetaFragment = {\n ordering?: string[];\n managed?: boolean;\n defaultRelatedName?: string;\n indexes?: IndexDef[];\n constraints?: ModelConstraint[];\n};\n\nexport const Meta = {\n ordering(...fields: string[]): ModelMetaFragment {\n return { ordering: fields };\n },\n\n managed(value: boolean): ModelMetaFragment {\n return { managed: value };\n },\n\n defaultRelatedName(value: string): ModelMetaFragment {\n return { defaultRelatedName: value };\n },\n\n indexes(...indexes: IndexDef[]): ModelMetaFragment {\n return { indexes };\n },\n\n constraints(...constraints: ModelConstraint[]): ModelMetaFragment {\n return { constraints };\n },\n\n uniqueTogether(...sets: string[][]): ModelMetaFragment {\n return {\n constraints: sets.map((fields) => ({ kind: 'uniqueTogether', fields })),\n };\n },\n\n indexTogether(...sets: string[][]): ModelMetaFragment {\n return {\n indexes: sets.map((on, index) => ({\n name: `idx_${on.join('_')}_${index}`,\n on,\n })),\n };\n },\n\n merge(...fragments: readonly ModelMetaFragment[]): ModelMetaFragment {\n return fragments.reduce<ModelMetaFragment>(\n (acc, fragment) => ({\n ordering: fragment.ordering ?? acc.ordering,\n managed: fragment.managed ?? acc.managed,\n defaultRelatedName: fragment.defaultRelatedName ?? acc.defaultRelatedName,\n indexes: [...(acc.indexes ?? []), ...(fragment.indexes ?? [])],\n constraints: [...(acc.constraints ?? []), ...(fragment.constraints ?? [])],\n }),\n {}\n );\n },\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Meta, Meta as m } from './Meta';\nexport type { ModelConstraint, ModelMetaFragment } from './Meta';\n","export type ConstraintDefinition = {\n kind: string;\n [key: string]: unknown;\n};\n\nexport const Constraints = {\n unique(fields: string[], options?: { name?: string; where?: string }): ConstraintDefinition {\n return {\n kind: 'unique',\n fields,\n ...options,\n };\n },\n\n check(condition: string, options?: { name?: string }): ConstraintDefinition {\n return {\n kind: 'check',\n condition,\n ...options,\n };\n },\n\n exclusion(definition: { using?: string; elements: string[]; where?: string; name?: string }): ConstraintDefinition {\n return {\n kind: 'exclusion',\n ...definition,\n };\n },\n};\n","import type { IndexDef } from '../../domain/index';\n\nexport const Indexes = {\n index(on: string[], options?: Omit<IndexDef, 'on'>): IndexDef {\n const suffix = on.join('_');\n return {\n name: options?.name ?? `idx_${suffix}`,\n on,\n unique: options?.unique,\n where: options?.where,\n };\n },\n};\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { Constraints, Constraints as c } from './Constraints';\nexport type { ConstraintDefinition } from './Constraints';\nexport { Indexes, Indexes as i } from './Indexes';\n","export const InternalFieldType = {\n SERIAL: 'serial',\n INT: 'int',\n BIGINT: 'bigint',\n TEXT: 'text',\n BOOL: 'bool',\n TIMESTAMPTZ: 'timestamptz',\n JSONB: 'jsonb',\n UUID: 'uuid',\n} as const;\n","export function isDate(value: unknown): value is Date {\n return value !== null && value !== undefined && Object.prototype.toString.call(value) === '[object Date]';\n}\n","export function hasConstructorName(value: unknown, name: string): boolean {\n return (\n !!value &&\n typeof value === 'object' &&\n (value as { constructor?: { name?: unknown } }).constructor?.name === name\n );\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodArray(value: unknown): value is z.ZodArray<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodArray');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodBoolean(value: unknown): value is z.ZodBoolean {\n return hasConstructorName(value, 'ZodBoolean');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodDate(value: unknown): value is z.ZodDate {\n return hasConstructorName(value, 'ZodDate');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodDefault(value: unknown): value is z.ZodDefault<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodDefault');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodNullable(value: unknown): value is z.ZodNullable<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodNullable');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodNumber(value: unknown): value is z.ZodNumber {\n return hasConstructorName(value, 'ZodNumber');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodObject(value: unknown): value is z.ZodObject<z.ZodRawShape> {\n return hasConstructorName(value, 'ZodObject');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodOptional(value: unknown): value is z.ZodOptional<z.ZodTypeAny> {\n return hasConstructorName(value, 'ZodOptional');\n}\n","import { z } from 'zod';\nimport { hasConstructorName } from './hasConstructorName';\n\nexport function isZodString(value: unknown): value is z.ZodString {\n return hasConstructorName(value, 'ZodString');\n}\n","import { z } from 'zod';\nimport type { Field, FieldType } from '../../domain/index';\nimport { InternalFieldType } from '../../domain/internal/InternalFieldType';\nimport { getFieldMetadata } from './FieldMetadataStore';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport type { ModelRef } from '../decorators/domain/ModelRef';\nimport type { TangoFieldMeta } from '../decorators/domain/TangoFieldMeta';\nimport { InternalDecoratedFieldKind } from '../decorators/domain/DecoratedFieldKind';\nimport { ModelRegistry } from '../registry/ModelRegistry';\nimport {\n isDate,\n isZodArray,\n isZodBoolean,\n isZodDate,\n isZodDefault,\n isZodNullable,\n isZodNumber,\n isZodObject,\n isZodOptional,\n isZodString,\n} from '../../domain/internal/zod/index';\n\nexport type InferFieldsOptions = {\n registry?: ModelRegistry;\n resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string };\n};\n\n/**\n * Infer one storage field from a Zod schema member plus any Tango decorator metadata.\n *\n * The registry and optional target resolver are used only when the field carries\n * reference metadata that must be translated into concrete table/primary-key names.\n */\nfunction inferField(\n name: string,\n zodType: z.ZodType,\n meta: TangoFieldMeta | undefined,\n registry: ModelRegistry,\n resolveReferenceTarget?: (target: ModelRef) => { table: string; pk: string }\n): Field | null {\n let type: FieldType;\n let notNull = true;\n let defaultValue: Field['default'] = undefined;\n\n let unwrapped: z.ZodType = zodType;\n\n if (isZodOptional(unwrapped)) {\n notNull = false;\n unwrapped = unwrapped.unwrap() as z.ZodType;\n }\n\n if (isZodNullable(unwrapped)) {\n notNull = false;\n unwrapped = unwrapped.unwrap() as z.ZodType;\n }\n\n if (isZodDefault(unwrapped)) {\n const def = unwrapped._zod.def.defaultValue;\n if (isDate(def)) {\n defaultValue = { now: true };\n } else if (typeof def === 'string' || typeof def === 'number') {\n defaultValue = String(def);\n }\n unwrapped = unwrapped.removeDefault() as z.ZodType;\n }\n\n if (isZodString(unwrapped)) {\n type = InternalFieldType.TEXT;\n } else if (isZodNumber(unwrapped)) {\n const checks = unwrapped._zod.def.checks ?? [];\n const isInt = checks.some((c) => 'format' in c._zod.def && c._zod.def.format === 'safeint');\n type = isInt ? InternalFieldType.INT : InternalFieldType.BIGINT;\n } else if (isZodBoolean(unwrapped)) {\n type = InternalFieldType.BOOL;\n } else if (isZodDate(unwrapped)) {\n type = InternalFieldType.TIMESTAMPTZ;\n } else if (isZodObject(unwrapped) || isZodArray(unwrapped)) {\n type = InternalFieldType.JSONB;\n } else {\n return null;\n }\n\n const field: Field = {\n name,\n type,\n notNull,\n default: defaultValue,\n };\n\n if (!meta) {\n return field;\n }\n\n if (meta.dbColumn) {\n field.name = meta.dbColumn;\n }\n\n if (typeof meta.notNull === 'boolean') {\n field.notNull = meta.notNull;\n }\n\n if (meta.default !== undefined) {\n field.default = meta.default;\n }\n\n if (meta.primaryKey) {\n field.primaryKey = true;\n }\n\n if (meta.unique) {\n field.unique = true;\n }\n\n // Many-to-many declarations stay on the relation side of the seam. They do\n // not correspond to a stored column on the current table.\n if (meta.relationKind === InternalDecoratedFieldKind.MANY_TO_MANY) {\n return null;\n }\n\n if (meta.references) {\n const targetMetadata = resolveReferenceTarget\n ? resolveReferenceTarget(meta.references.target)\n : resolveReferenceTargetFromRegistry(meta.references.target, registry, meta.references.options?.column);\n\n field.references = {\n table: targetMetadata.table,\n column: meta.references.options?.column ?? targetMetadata.pk,\n onDelete: meta.references.options?.onDelete,\n onUpdate: meta.references.options?.onUpdate,\n };\n }\n\n return field;\n}\n\nfunction resolveReferenceTargetFromRegistry(\n target: ModelRef,\n registry: ModelRegistry,\n explicitColumn?: string\n): { table: string; pk: string } {\n const targetModel = registry.resolveRef(target);\n const primaryKey =\n explicitColumn ?? targetModel.metadata.fields.find((candidate) => candidate.primaryKey)?.name ?? 'id';\n\n return {\n table: targetModel.metadata.table,\n pk: primaryKey,\n };\n}\n\n/**\n * Infer Tango field metadata from a Zod object schema and any attached field decorators.\n */\nexport function inferFieldsFromSchema(schema: z.ZodObject<z.ZodRawShape>, options?: InferFieldsOptions): Field[] {\n const registry = options?.registry ?? ModelRegistry.global();\n const shape = schema.shape;\n const fields: Field[] = [];\n\n for (const [name, zodType] of Object.entries(shape)) {\n const field = inferField(\n name,\n zodType as z.ZodType,\n getFieldMetadata(zodType as ZodTypeAny),\n registry,\n options?.resolveReferenceTarget\n );\n if (field) {\n fields.push(field);\n }\n }\n\n return fields;\n}\n","export const InternalRelationType = {\n HAS_MANY: 'hasMany',\n BELONGS_TO: 'belongsTo',\n HAS_ONE: 'hasOne',\n} as const;\n","import type { RelationDef } from '../../domain/index';\nimport { InternalRelationType } from '../../domain/internal/InternalRelationType';\n\n/**\n * Public authoring DSL for model-level named relations.\n *\n * This is the first stage of the relations subdomain. Application code uses it\n * inside `relations: (r) => ({ ... })` to declare stable relation names and\n * resolve ambiguity that field decorators alone cannot express.\n *\n * Later internal stages normalize these authored definitions and combine them\n * with field-authored relation metadata to build the resolved relation graph.\n */\nexport class RelationBuilder {\n /** Declare a one-to-many relation from this model to `target`. */\n hasMany(target: string, foreignKey: string): RelationDef {\n return {\n type: InternalRelationType.HAS_MANY,\n target,\n foreignKey,\n };\n }\n\n /** Declare an owning relation to a parent model. */\n belongsTo(target: string, foreignKey: string, localKey?: string): RelationDef {\n return {\n type: InternalRelationType.BELONGS_TO,\n target,\n foreignKey,\n localKey,\n };\n }\n\n /** Declare a one-to-one relation from this model to `target`. */\n hasOne(target: string, foreignKey: string): RelationDef {\n return {\n type: InternalRelationType.HAS_ONE,\n target,\n foreignKey,\n };\n }\n}\n","import { z } from 'zod';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport { InternalDecoratedFieldKind } from '../decorators/domain/DecoratedFieldKind';\nimport { getFieldMetadata } from '../fields/FieldMetadataStore';\nimport type {\n NormalizedRelationOrigin,\n NormalizedRelationStorageDescriptor,\n} from './NormalizedRelationStorageDescriptor';\n\ntype RelationCandidate = {\n sourceSchemaFieldKey: string;\n zodType: ZodTypeAny;\n};\n\n/**\n * Normalizes field-authored relation declarations from a model schema into the\n * shared descriptor shape consumed by storage and relation finalization.\n *\n * This is the normalization stage of the relations subdomain. It sits between\n * authoring and resolution:\n *\n * - authoring: decorators attach relation intent to schema fields\n * - normalization: this class converts that intent into a registry-independent\n * descriptor shape\n * - resolution: the graph builder combines those descriptors with finalized\n * storage artifacts and explicit relation names\n */\nexport class RelationDescriptorNormalizer {\n constructor(\n private readonly sourceModelKey: string,\n private readonly schema: z.ZodObject<z.ZodRawShape>\n ) {}\n\n static normalize(\n sourceModelKey: string,\n schema: z.ZodObject<z.ZodRawShape>\n ): readonly NormalizedRelationStorageDescriptor[] {\n return new RelationDescriptorNormalizer(sourceModelKey, schema).normalize();\n }\n\n /**\n * Run the field-authored relation normalization pipeline for one model\n * schema and emit descriptors that later relation stages can resolve.\n */\n normalize(): readonly NormalizedRelationStorageDescriptor[] {\n const descriptors: NormalizedRelationStorageDescriptor[] = [];\n\n for (const candidate of this.collectRelationCandidates()) {\n const descriptor = this.normalizeCandidate(candidate);\n if (descriptor) {\n descriptors.push(descriptor);\n }\n }\n\n return descriptors;\n }\n\n private collectRelationCandidates(): readonly RelationCandidate[] {\n return Object.entries(this.schema.shape).map(([sourceSchemaFieldKey, zodType]) => ({\n sourceSchemaFieldKey,\n zodType: zodType as ZodTypeAny,\n }));\n }\n\n private normalizeCandidate(candidate: RelationCandidate): NormalizedRelationStorageDescriptor | undefined {\n const meta = getFieldMetadata(candidate.zodType);\n if (!meta?.references || !meta.relationKind) {\n return undefined;\n }\n\n return {\n edgeId: this.buildEdgeId(candidate.sourceSchemaFieldKey, meta.relationKind),\n sourceModelKey: this.sourceModelKey,\n sourceSchemaFieldKey: candidate.sourceSchemaFieldKey,\n targetRef: meta.references.target,\n origin: meta.relationKind,\n localFieldName: candidate.sourceSchemaFieldKey,\n dbColumnName: meta.dbColumn ?? candidate.sourceSchemaFieldKey,\n referencedTargetColumn: meta.references.options?.column,\n onDelete: meta.references.options?.onDelete,\n onUpdate: meta.references.options?.onUpdate,\n unique: meta.unique || meta.relationKind === InternalDecoratedFieldKind.ONE_TO_ONE,\n explicitForwardName: meta.forwardName,\n explicitReverseName: meta.reverseName,\n namingHint: this.deriveNamingHint(candidate.sourceSchemaFieldKey),\n provenance: 'field-decorator',\n };\n }\n\n private buildEdgeId(sourceSchemaFieldKey: string, origin: NormalizedRelationOrigin): string {\n return `${this.sourceModelKey}:${sourceSchemaFieldKey}:${origin}`;\n }\n\n private deriveNamingHint(fieldKey: string): string {\n if (fieldKey.endsWith('Id') && fieldKey.length > 2) {\n return fieldKey.slice(0, -2);\n }\n\n if (fieldKey.endsWith('_id') && fieldKey.length > 3) {\n return fieldKey.slice(0, -3);\n }\n\n return fieldKey;\n }\n}\n","/**\n * Shared naming policy for the model and relations subdomains.\n *\n * These helpers are not an authoring or graph stage on their own. They are the\n * cross-cutting policy layer used by both model construction and relation\n * resolution when Tango derives table names, aliases, and synthesized relation\n * names in a Django-style shape.\n */\nexport function toSnakeCase(value: string): string {\n return value\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/[\\s-]+/g, '_')\n .toLowerCase();\n}\n\nexport function pluralize(value: string): string {\n if (/(s|x|z|ch|sh)$/.test(value)) {\n return `${value}es`;\n }\n\n if (/[^aeiou]y$/.test(value)) {\n return `${value.slice(0, -1)}ies`;\n }\n\n return `${value}s`;\n}\n\nexport function deriveTableName(name: string): string {\n return pluralize(toSnakeCase(name));\n}\n","import { z } from 'zod';\nimport type {\n Field,\n Model,\n ModelAugmentations,\n ModelMetadata,\n ModelWriteHooks,\n PersistedModelOutput,\n RelationDef,\n} from '../../domain/index';\nimport type { ModelDefinition } from '../ModelDefinition';\nimport { RelationBuilder } from '../relations/RelationBuilder';\nimport type { ModelRegistry } from '../registry/ModelRegistry';\nimport type { NormalizedRelationStorageDescriptor } from '../relations/NormalizedRelationStorageDescriptor';\nimport { RelationDescriptorNormalizer } from '../relations/RelationDescriptorNormalizer';\nimport { deriveTableName } from '../relations/SchemaNaming';\n\ntype AnySchemaModel = Model<z.ZodObject<z.ZodRawShape>>;\ntype AnyInternalSchemaModel = InternalSchemaModel<z.ZodObject<z.ZodRawShape>>;\n\nexport class InternalSchemaModel<TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string = string>\n implements Model<TSchema, TKey>\n{\n static readonly BRAND = 'tango.schema.internal_schema_model' as const;\n\n readonly __tangoBrand: typeof InternalSchemaModel.BRAND = InternalSchemaModel.BRAND;\n readonly metadata: ModelMetadata;\n readonly schema: TSchema;\n readonly hooks?: ModelWriteHooks<PersistedModelOutput<TSchema>>;\n declare readonly objects: ModelAugmentations<TSchema, TKey> extends { readonly objects: infer TObject }\n ? TObject\n : never;\n\n private readonly registry: ModelRegistry;\n private readonly normalizedRelations: readonly NormalizedRelationStorageDescriptor[];\n private readonly explicitFields?: readonly Field[];\n private readonly explicitRelations?: Readonly<Record<string, RelationDef>>;\n\n private constructor(\n registry: ModelRegistry,\n metadata: ModelMetadata,\n schema: TSchema,\n hooks: ModelWriteHooks<PersistedModelOutput<TSchema>> | undefined,\n normalizedRelations: readonly NormalizedRelationStorageDescriptor[],\n explicitFields: readonly Field[] | undefined,\n explicitRelations: Readonly<Record<string, RelationDef>> | undefined\n ) {\n this.registry = registry;\n this.metadata = metadata;\n this.schema = schema;\n this.hooks = hooks;\n this.normalizedRelations = Object.freeze([...normalizedRelations]);\n this.explicitFields = explicitFields ? Object.freeze([...explicitFields]) : undefined;\n this.explicitRelations = explicitRelations;\n }\n\n static create<TSchema extends z.ZodObject<z.ZodRawShape>>(\n definition: ModelDefinition<TSchema>,\n registry: ModelRegistry\n ): InternalSchemaModel<TSchema> {\n InternalSchemaModel.validateDefinition(definition);\n\n const builder = new RelationBuilder();\n const relations = definition.relations ? Object.freeze(definition.relations(builder)) : undefined;\n const key = `${definition.namespace}/${definition.name}`;\n const table = definition.table?.trim() || deriveTableName(definition.name);\n const normalizedRelations = RelationDescriptorNormalizer.normalize(key, definition.schema);\n\n const metadata: ModelMetadata = {\n namespace: definition.namespace,\n name: definition.name,\n key,\n table,\n fields: [] as never,\n indexes: definition.indexes,\n relations,\n ordering: definition.ordering,\n managed: definition.managed,\n defaultRelatedName: definition.defaultRelatedName,\n constraints: definition.constraints,\n };\n\n // The field view stays lazy because finalized storage metadata is registry-scoped.\n // The owning registry publishes the current finalized fields for this model\n // instead of freezing a stale one-time snapshot during construction.\n Object.defineProperty(metadata, 'fields', {\n enumerable: true,\n configurable: false,\n get: () => registry.getFinalizedFields(key) as typeof metadata.fields,\n });\n Object.freeze(metadata);\n\n return new InternalSchemaModel(\n registry,\n metadata,\n definition.schema,\n definition.hooks,\n normalizedRelations,\n definition.fields,\n relations\n );\n }\n\n static isInternalSchemaModel(value: unknown): value is AnyInternalSchemaModel {\n return (\n typeof value === 'object' &&\n value !== null &&\n (value as { __tangoBrand?: unknown }).__tangoBrand === InternalSchemaModel.BRAND\n );\n }\n\n static getRegistryOwner(model: AnySchemaModel): ModelRegistry {\n return InternalSchemaModel.require(model).registry;\n }\n\n static getNormalizedRelations(model: AnySchemaModel): readonly NormalizedRelationStorageDescriptor[] {\n return InternalSchemaModel.require(model).normalizedRelations;\n }\n\n static getExplicitFields(model: AnySchemaModel): readonly Field[] | undefined {\n return InternalSchemaModel.require(model).explicitFields;\n }\n\n static getExplicitRelations(model: AnySchemaModel): Readonly<Record<string, RelationDef>> | undefined {\n return InternalSchemaModel.require(model).explicitRelations;\n }\n\n private static validateDefinition<TSchema extends z.ZodObject<z.ZodRawShape>>(\n definition: ModelDefinition<TSchema>\n ): void {\n if (!definition.namespace.trim()) {\n throw new Error('Model.namespace is required and cannot be empty.');\n }\n if (!definition.name.trim()) {\n throw new Error('Model.name is required and cannot be empty.');\n }\n if (definition.table !== undefined && !definition.table.trim()) {\n throw new Error('Model.table cannot be empty when provided.');\n }\n }\n\n private static require(model: AnySchemaModel): AnyInternalSchemaModel {\n if (!InternalSchemaModel.isInternalSchemaModel(model)) {\n throw new Error(`Model '${model.metadata.key}' is missing internal registry ownership metadata.`);\n }\n\n return model;\n }\n}\n","// Keep these as plain string literals rather than TS enums so the runtime\n// values stay identical across package boundaries without enum emit semantics.\nexport const InternalRelationPublicKind = {\n BELONGS_TO: 'belongsTo',\n HAS_ONE: 'hasOne',\n HAS_MANY: 'hasMany',\n MANY_TO_MANY: 'manyToMany',\n} as const;\n\nexport const InternalRelationStorageStrategy = {\n REFERENCE: 'reference',\n REVERSE_REFERENCE: 'reverse_reference',\n MANY_TO_MANY: 'many_to_many',\n} as const;\n\nexport const InternalRelationCardinality = {\n SINGLE: 'single',\n MANY: 'many',\n} as const;\n\nexport const InternalRelationProvenance = {\n FIELD_DECORATOR: 'field-decorator',\n RELATIONS_API: 'relations-api',\n SYNTHESIZED_REVERSE: 'synthesized-reverse',\n} as const;\n\nexport type RelationPublicKind = (typeof InternalRelationPublicKind)[keyof typeof InternalRelationPublicKind];\nexport type RelationStorageStrategy =\n (typeof InternalRelationStorageStrategy)[keyof typeof InternalRelationStorageStrategy];\nexport type RelationCardinality = (typeof InternalRelationCardinality)[keyof typeof InternalRelationCardinality];\nexport type RelationProvenance = (typeof InternalRelationProvenance)[keyof typeof InternalRelationProvenance];\n\n/**\n * Author-time relation intent after target resolution but before full graph\n * pairing and naming.\n *\n * This type is the conceptual bridge between normalized descriptors and the\n * fully resolved graph. It exists so the relations subdomain has a stable\n * vocabulary for relation kinds, storage strategies, and provenance as the\n * pipeline becomes more sophisticated.\n */\nexport interface RelationSpec {\n edgeId: string;\n sourceModelKey: string;\n sourceSchemaFieldKey?: string;\n targetModelKey: string;\n kind: RelationPublicKind;\n storageStrategy: RelationStorageStrategy;\n localFieldName?: string;\n targetFieldName?: string;\n nameHint?: string;\n throughModelKey?: string;\n throughSourceFieldName?: string;\n throughTargetFieldName?: string;\n provenance: RelationProvenance;\n}\n","import type { Model, RelationDef } from '../../domain/index';\nimport type { FinalizedStorageArtifacts } from '../fields/FinalizedStorageArtifacts';\nimport { InternalSchemaModel } from '../internal/InternalSchemaModel';\nimport type { NormalizedRelationStorageDescriptor } from './NormalizedRelationStorageDescriptor';\nimport type { ResolvedRelationDescriptor, ResolvedRelationGraph } from './ResolvedRelationGraph';\nimport {\n type RelationCardinality,\n InternalRelationCardinality,\n InternalRelationPublicKind,\n InternalRelationProvenance,\n InternalRelationStorageStrategy,\n} from './RelationSpec';\nimport { pluralize, toSnakeCase } from './SchemaNaming';\n\nconst REFERENCE_CAPABILITIES = Object.freeze({\n migratable: true,\n queryable: true,\n hydratable: true,\n});\nconst MANY_TO_MANY_CAPABILITIES = Object.freeze({\n migratable: false,\n queryable: false,\n hydratable: false,\n});\nconst RELATION_NAME_SEPARATOR = ':';\n\ntype GraphBuilderOptions = {\n version: number;\n models: readonly Model[];\n storage: FinalizedStorageArtifacts;\n resolveRef: (ref: NormalizedRelationStorageDescriptor['targetRef']) => Model;\n};\n\n/**\n * Resolution-stage builder that turns normalized relation descriptors into the\n * registry-scoped resolved relation graph.\n *\n * This is the final pipeline stage in the relations subdomain. It combines:\n *\n * - normalized field-authored relation descriptors\n * - explicit model-level relation names from `RelationBuilder`\n * - finalized storage artifacts from the registry\n *\n * The result is the canonical named relation graph used by ORM-facing\n * consumers.\n */\nexport class ResolvedRelationGraphBuilder {\n private readonly byModel = new Map<string, Map<string, ResolvedRelationDescriptor>>();\n private readonly byEdgeId = new Map<string, ResolvedRelationDescriptor>();\n private readonly matchedOverrides = new Set<string>();\n\n constructor(private readonly options: GraphBuilderOptions) {}\n\n static build(options: GraphBuilderOptions): ResolvedRelationGraph {\n return new ResolvedRelationGraphBuilder(options).build();\n }\n\n /**\n * Resolve every model's normalized relation descriptors into a single\n * registry-scoped graph and fail when authoring ambiguity remains.\n */\n build(): ResolvedRelationGraph {\n for (const model of this.options.models) {\n this.addModelRelations(model);\n }\n\n for (const model of this.options.models) {\n this.assertAllOverridesMatched(model);\n }\n\n return {\n version: this.options.version,\n byModel: this.byModel,\n byEdgeId: this.byEdgeId,\n };\n }\n\n private addModelRelations(model: Model): void {\n const explicitRelations = InternalSchemaModel.getExplicitRelations(model) ?? {};\n\n for (const descriptor of InternalSchemaModel.getNormalizedRelations(model)) {\n const targetModel = this.options.resolveRef(descriptor.targetRef);\n\n if (descriptor.origin === 'manyToMany') {\n const relationName = descriptor.explicitForwardName ?? descriptor.namingHint;\n this.addResolvedRelation({\n edgeId: descriptor.edgeId,\n sourceModelKey: model.metadata.key,\n targetModelKey: targetModel.metadata.key,\n name: relationName,\n kind: InternalRelationPublicKind.MANY_TO_MANY,\n storageStrategy: InternalRelationStorageStrategy.MANY_TO_MANY,\n cardinality: InternalRelationCardinality.MANY,\n capabilities: MANY_TO_MANY_CAPABILITIES,\n provenance: InternalRelationProvenance.FIELD_DECORATOR,\n alias: `${toSnakeCase(model.metadata.name)}_${relationName}`,\n });\n continue;\n }\n\n this.addReferenceRelations(model, descriptor, targetModel, explicitRelations);\n }\n }\n\n private addReferenceRelations(\n sourceModel: Model,\n descriptor: NormalizedRelationStorageDescriptor,\n targetModel: Model,\n explicitRelations: Readonly<Record<string, RelationDef>>\n ): void {\n const forwardOverride = this.findForwardOverride(sourceModel, targetModel, descriptor, explicitRelations);\n if (forwardOverride) {\n this.markOverrideMatched(sourceModel.metadata.key, forwardOverride[0]);\n }\n\n const forwardName = forwardOverride?.[0] ?? descriptor.explicitForwardName ?? descriptor.namingHint;\n const targetPrimaryKey = this.getPrimaryKey(targetModel.metadata.key);\n this.addResolvedRelation({\n edgeId: descriptor.edgeId,\n sourceModelKey: sourceModel.metadata.key,\n targetModelKey: targetModel.metadata.key,\n name: forwardName,\n inverseEdgeId: `${descriptor.edgeId}:inverse`,\n kind: InternalRelationPublicKind.BELONGS_TO,\n storageStrategy: InternalRelationStorageStrategy.REFERENCE,\n cardinality: InternalRelationCardinality.SINGLE,\n localFieldName: descriptor.dbColumnName,\n targetFieldName: descriptor.referencedTargetColumn ?? targetPrimaryKey,\n capabilities: REFERENCE_CAPABILITIES,\n provenance: InternalRelationProvenance.FIELD_DECORATOR,\n alias: `${toSnakeCase(targetModel.metadata.name)}_${forwardName}`,\n });\n\n const reverseOverride = this.findReverseOverride(sourceModel, targetModel, descriptor);\n if (reverseOverride) {\n this.markOverrideMatched(targetModel.metadata.key, reverseOverride[0]);\n }\n\n const reverseKind = descriptor.unique\n ? InternalRelationPublicKind.HAS_ONE\n : InternalRelationPublicKind.HAS_MANY;\n const reverseCardinality = descriptor.unique\n ? InternalRelationCardinality.SINGLE\n : InternalRelationCardinality.MANY;\n const reverseName =\n reverseOverride?.[0] ??\n descriptor.explicitReverseName ??\n this.deriveReverseName(sourceModel, reverseCardinality);\n this.addResolvedRelation({\n edgeId: `${descriptor.edgeId}:inverse`,\n sourceModelKey: targetModel.metadata.key,\n targetModelKey: sourceModel.metadata.key,\n name: reverseName,\n inverseEdgeId: descriptor.edgeId,\n kind: reverseKind,\n storageStrategy: InternalRelationStorageStrategy.REVERSE_REFERENCE,\n cardinality: reverseCardinality,\n localFieldName: descriptor.dbColumnName,\n targetFieldName: descriptor.referencedTargetColumn ?? targetPrimaryKey,\n capabilities: REFERENCE_CAPABILITIES,\n provenance: reverseOverride\n ? InternalRelationProvenance.RELATIONS_API\n : InternalRelationProvenance.SYNTHESIZED_REVERSE,\n alias: `${toSnakeCase(sourceModel.metadata.name)}_${reverseName}`,\n });\n }\n\n private findForwardOverride(\n sourceModel: Model,\n targetModel: Model,\n descriptor: NormalizedRelationStorageDescriptor,\n explicitRelations: Readonly<Record<string, RelationDef>>\n ): [string, RelationDef] | undefined {\n return Object.entries(explicitRelations).find(([, relation]) => {\n const relationTargetKey = this.resolveRelationTargetKey(sourceModel, relation.target);\n return (\n relation.type === InternalRelationPublicKind.BELONGS_TO &&\n relationTargetKey === targetModel.metadata.key &&\n relation.foreignKey === descriptor.sourceSchemaFieldKey\n );\n });\n }\n\n private findReverseOverride(\n sourceModel: Model,\n targetModel: Model,\n descriptor: NormalizedRelationStorageDescriptor\n ): [string, RelationDef] | undefined {\n const reverseModelRelations = InternalSchemaModel.getExplicitRelations(targetModel) ?? {};\n const reverseKind = descriptor.unique\n ? InternalRelationPublicKind.HAS_ONE\n : InternalRelationPublicKind.HAS_MANY;\n return Object.entries(reverseModelRelations).find(([, relation]) => {\n const relationTargetKey = this.resolveRelationTargetKey(targetModel, relation.target);\n return (\n relationTargetKey === sourceModel.metadata.key &&\n relation.type === reverseKind &&\n relation.foreignKey === descriptor.sourceSchemaFieldKey\n );\n });\n }\n\n private assertAllOverridesMatched(model: Model): void {\n const explicitRelations = InternalSchemaModel.getExplicitRelations(model);\n if (!explicitRelations) {\n return;\n }\n\n for (const relationName of Object.keys(explicitRelations)) {\n const marker = this.buildOverrideMarker(model.metadata.key, relationName);\n if (!this.matchedOverrides.has(marker)) {\n throw new Error(\n `Relation override '${relationName}' on model '${model.metadata.key}' does not match a field-authored relation.`\n );\n }\n }\n }\n\n private addResolvedRelation(descriptor: ResolvedRelationDescriptor): void {\n const modelRelations =\n this.byModel.get(descriptor.sourceModelKey) ?? new Map<string, ResolvedRelationDescriptor>();\n const existing = modelRelations.get(descriptor.name);\n if (existing) {\n throw new Error(\n `Ambiguous relation name '${descriptor.name}' on model '${descriptor.sourceModelKey}'. Add an explicit relations override.`\n );\n }\n\n modelRelations.set(descriptor.name, descriptor);\n this.byModel.set(descriptor.sourceModelKey, modelRelations);\n this.byEdgeId.set(descriptor.edgeId, descriptor);\n }\n\n private getPrimaryKey(modelKey: string): string {\n return this.options.storage.byModel.get(modelKey)!.pk;\n }\n\n private markOverrideMatched(modelKey: string, relationName: string): void {\n this.matchedOverrides.add(this.buildOverrideMarker(modelKey, relationName));\n }\n\n private buildOverrideMarker(modelKey: string, relationName: string): string {\n return `${modelKey}${RELATION_NAME_SEPARATOR}${relationName}`;\n }\n\n private resolveRelationTargetKey(sourceModel: Model, target: string): string {\n if (target.includes('/')) {\n return target;\n }\n\n return `${sourceModel.metadata.namespace}/${target}`;\n }\n\n private deriveReverseName(sourceModel: Model, cardinality: RelationCardinality): string {\n if (sourceModel.metadata.defaultRelatedName) {\n return sourceModel.metadata.defaultRelatedName;\n }\n\n const snake = toSnakeCase(sourceModel.metadata.name);\n return cardinality === InternalRelationCardinality.MANY ? pluralize(snake) : snake;\n }\n}\n","import { AsyncLocalStorage } from 'node:async_hooks';\nimport type { Field, Model } from '../../domain/index';\nimport type { ZodTypeAny } from '../decorators/domain/ZodTypeAny';\nimport { isTypedModelRef, type ModelRef } from '../decorators/domain/ModelRef';\nimport { inferFieldsFromSchema } from '../fields/inferFieldsFromSchema';\nimport { getFieldMetadata } from '../fields/FieldMetadataStore';\nimport type { FinalizedStorageArtifacts, FinalizedStorageModel } from '../fields/FinalizedStorageArtifacts';\nimport { InternalSchemaModel } from '../internal/InternalSchemaModel';\nimport type { ResolvedRelationGraph } from '../relations/ResolvedRelationGraph';\nimport { ResolvedRelationGraphBuilder } from '../relations/ResolvedRelationGraphBuilder';\n\nconst DEFAULT_IDENTIFIER_NAME = 'id';\nconst activeRegistryStorage = new AsyncLocalStorage<ModelRegistry>();\n\n/**\n * Registry that resolves Tango models by stable identity.\n *\n * The global registry is convenient for application bootstrapping, while\n * dedicated instances are useful in tests and tooling.\n */\nexport class ModelRegistry {\n private static globalRegistry?: ModelRegistry;\n private readonly models = new Map<string, Model>();\n private version = 0;\n private storageCache?: FinalizedStorageArtifacts;\n private relationGraphCache?: ResolvedRelationGraph;\n\n /**\n * Return the shared process-wide registry used by `Model(...)`.\n */\n static global(): ModelRegistry {\n if (!ModelRegistry.globalRegistry) {\n ModelRegistry.globalRegistry = new ModelRegistry();\n }\n return ModelRegistry.globalRegistry;\n }\n\n /**\n * Return the registry currently bound to model construction work.\n */\n static active(): ModelRegistry {\n return activeRegistryStorage.getStore() ?? ModelRegistry.global();\n }\n\n /**\n * Run work with a specific registry bound as the active construction target.\n */\n static async runWithRegistry<T>(registry: ModelRegistry, work: () => Promise<T> | T): Promise<T> {\n return await activeRegistryStorage.run(registry, work);\n }\n\n /**\n * Register a model on the shared global registry.\n */\n static register(model: Model): void {\n ModelRegistry.global().register(model);\n }\n\n /**\n * Register several models on the shared global registry.\n */\n static registerMany(models: readonly Model[]): void {\n ModelRegistry.global().registerMany(models);\n }\n\n /**\n * Resolve a model from the shared registry by namespace and name.\n */\n static get(namespace: string, name: string): Model | undefined {\n return ModelRegistry.global().get(namespace, name);\n }\n\n /**\n * Resolve a model from the shared registry by its `namespace/name` key.\n */\n static getByKey(key: string): Model | undefined {\n return ModelRegistry.global().getByKey(key);\n }\n\n /**\n * Resolve any supported model reference form against the shared registry.\n */\n static resolveRef(ref: ModelRef): Model {\n return ModelRegistry.global().resolveRef(ref);\n }\n\n /**\n * Clear the shared registry, which is mainly useful in tests.\n */\n static clear(): void {\n ModelRegistry.global().clear();\n }\n\n /**\n * Return the owning registry for a model.\n */\n static getOwner(model: Model): ModelRegistry {\n return InternalSchemaModel.getRegistryOwner(model);\n }\n\n /**\n * Register a model on this registry instance.\n */\n register(model: Model): void {\n // A model's finalized storage and relation artifacts are registry-scoped.\n // Rejecting cross-registry reuse here prevents one model object from\n // publishing conflicting finalized views in multiple registries.\n const owner = InternalSchemaModel.getRegistryOwner(model);\n if (owner !== this) {\n throw new Error(\n `Model '${model.metadata.key}' belongs to a different registry and cannot be registered here.`\n );\n }\n\n const existing = this.models.get(model.metadata.key);\n if (existing && existing !== model) {\n throw new Error(`Model '${model.metadata.key}' is already registered in this registry.`);\n }\n\n this.models.set(model.metadata.key, model);\n this.bumpVersion();\n }\n\n /**\n * Register several models on this registry instance.\n */\n registerMany(models: readonly Model[]): void {\n for (const model of models) {\n this.register(model);\n }\n }\n\n /**\n * Resolve a model from this registry instance by namespace and name.\n */\n get(namespace: string, name: string): Model | undefined {\n return this.getByKey(`${namespace}/${name}`);\n }\n\n /**\n * Resolve a model from this registry instance by its `namespace/name` key.\n */\n getByKey(key: string): Model | undefined {\n return this.models.get(key);\n }\n\n /**\n * Resolve a string, callback, or direct model reference into a model object.\n */\n resolveRef(ref: ModelRef): Model {\n if (typeof ref === 'string' || isTypedModelRef(ref)) {\n const key = typeof ref === 'string' ? ref : ref.key;\n const model = this.getByKey(key);\n if (!model) {\n throw new Error(\n `Unable to resolve model reference '${key}'. Ensure it is registered in ModelRegistry.`\n );\n }\n return model;\n }\n\n const model = typeof ref === 'function' ? ref() : ref;\n if (InternalSchemaModel.getRegistryOwner(model) !== this) {\n throw new Error(\n `Model reference '${model.metadata.key}' belongs to a different registry and cannot be resolved here.`\n );\n }\n return model;\n }\n\n /**\n * Finalize storage-only artifacts for all models in this registry.\n */\n finalizeStorageArtifacts(): FinalizedStorageArtifacts {\n if (this.storageCache?.version === this.version) {\n return this.storageCache;\n }\n\n const primaryKeyByModel = new Map<string, string>();\n for (const model of this.models.values()) {\n primaryKeyByModel.set(model.metadata.key, this.inferPrimaryKeyName(model));\n }\n\n const byModel = new Map<string, FinalizedStorageModel>();\n for (const model of this.models.values()) {\n const explicitFields = InternalSchemaModel.getExplicitFields(model);\n const inferredFields = inferFieldsFromSchema(model.schema, {\n registry: this,\n resolveReferenceTarget: (target) => {\n const targetModel = this.resolveRef(target);\n return {\n table: targetModel.metadata.table,\n pk: primaryKeyByModel.get(targetModel.metadata.key)!,\n };\n },\n });\n const fields = this.freezeFields(this.mergeStorageFields(inferredFields, explicitFields));\n const primaryKey = fields.find((field) => field.primaryKey)?.name ?? DEFAULT_IDENTIFIER_NAME;\n\n byModel.set(model.metadata.key, {\n key: model.metadata.key,\n table: model.metadata.table,\n fields,\n pk: primaryKey,\n });\n }\n\n const finalized: FinalizedStorageArtifacts = {\n version: this.version,\n byModel,\n };\n this.storageCache = finalized;\n return finalized;\n }\n\n /**\n * Return finalized storage fields for a specific model.\n */\n getFinalizedFields(model: Model | string): readonly Field[] {\n const key = typeof model === 'string' ? model : model.metadata.key;\n const fields = this.finalizeStorageArtifacts().byModel.get(key)?.fields;\n if (!fields) {\n throw new Error(`No finalized storage fields are available for model '${key}'.`);\n }\n return fields;\n }\n\n /**\n * Resolve the registry's relation graph from finalized storage artifacts.\n */\n getResolvedRelationGraph(): ResolvedRelationGraph {\n if (this.relationGraphCache?.version === this.version) {\n return this.relationGraphCache;\n }\n\n // The registry owns cache/version orchestration. The dedicated builder owns\n // forward edge resolution, reverse synthesis, and override validation.\n const finalized = ResolvedRelationGraphBuilder.build({\n version: this.version,\n models: this.values(),\n storage: this.finalizeStorageArtifacts(),\n resolveRef: (ref) => this.resolveRef(ref),\n });\n this.relationGraphCache = finalized;\n return finalized;\n }\n\n /**\n * Remove all registered models from this registry instance.\n */\n clear(): void {\n this.models.clear();\n this.bumpVersion();\n }\n\n /**\n * Return all registered models in insertion order.\n */\n values(): readonly Model[] {\n return Array.from(this.models.values());\n }\n\n private bumpVersion(): void {\n this.version += 1;\n this.storageCache = undefined;\n this.relationGraphCache = undefined;\n }\n\n private freezeFields(fields: readonly Field[]): readonly Field[] {\n return Object.freeze(fields.map((field) => Object.freeze({ ...field })));\n }\n\n private inferPrimaryKeyName(model: Model): string {\n for (const [fieldKey, zodType] of Object.entries(model.schema.shape)) {\n const meta = getFieldMetadata(zodType as ZodTypeAny);\n if (meta?.primaryKey) {\n return meta.dbColumn ?? fieldKey;\n }\n }\n\n const explicitFields = InternalSchemaModel.getExplicitFields(model);\n if (explicitFields) {\n return explicitFields.find((field) => field.primaryKey)?.name ?? DEFAULT_IDENTIFIER_NAME;\n }\n\n return DEFAULT_IDENTIFIER_NAME;\n }\n\n private mergeStorageFields(inferredFields: readonly Field[], explicitFields?: readonly Field[]): readonly Field[] {\n if (!explicitFields?.length) {\n return inferredFields;\n }\n\n const mergedFields = new Map(inferredFields.map((field) => [field.name, field]));\n for (const explicitField of explicitFields) {\n mergedFields.set(explicitField.name, explicitField);\n }\n\n return Array.from(mergedFields.values());\n }\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n */\nexport { ModelRegistry } from './ModelRegistry';\n","/**\n * Domain boundary barrel for relation authoring.\n *\n * The relations subdomain has three internal layers:\n *\n * - authoring: `RelationBuilder`\n * - normalization: field-authored relations become normalized descriptors\n * - resolution: normalized descriptors become the registry-scoped relation graph\n *\n * Only the authoring surface is exported here. The later pipeline stages stay\n * internal until Tango intentionally publishes them as supported contracts.\n */\nexport { RelationBuilder } from './RelationBuilder';\n","import type { z } from 'zod';\nimport type { Model } from '../domain/Model';\nimport { ModelRegistry } from './registry/ModelRegistry';\n\nexport type ModelAugmentor = <TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string>(\n model: Model<TSchema, TKey>\n) => void;\n\nconst modelAugmentors = new Set<ModelAugmentor>();\n\n/**\n * Register a model augmentor that runs for existing and future models.\n */\nexport function registerModelAugmentor(augmentor: ModelAugmentor): () => void {\n modelAugmentors.add(augmentor);\n\n for (const model of ModelRegistry.global().values()) {\n augmentor(model);\n }\n\n return () => {\n modelAugmentors.delete(augmentor);\n };\n}\n\n/**\n * Apply all registered augmentors to a model before it is returned publicly.\n */\nexport function applyModelAugmentors<TSchema extends z.ZodObject<z.ZodRawShape>, TKey extends string>(\n model: Model<TSchema, TKey>\n): Model<TSchema, TKey> {\n for (const augmentor of modelAugmentors) {\n augmentor(model);\n }\n\n return model;\n}\n","import { z } from 'zod';\nimport type { Model as SchemaModel } from '../domain/Model';\nimport type { ModelDefinition } from './ModelDefinition';\nimport { applyModelAugmentors } from './ModelAugmentorRegistry';\nimport { InternalSchemaModel } from './internal/InternalSchemaModel';\nimport { ModelRegistry } from './registry/ModelRegistry';\n\n/**\n * Creates a model definition with metadata and schema validation.\n * Automatically finalizes field types through the owning model registry.\n */\nexport function Model<\n const TNamespace extends string,\n const TName extends string,\n TSchema extends z.ZodObject<z.ZodRawShape>,\n>(\n definition: ModelDefinition<TSchema> & { namespace: TNamespace; name: TName }\n): SchemaModel<TSchema, `${TNamespace}/${TName}`> {\n const registry = definition.registry ?? ModelRegistry.active();\n const model = applyModelAugmentors(\n InternalSchemaModel.create(definition, registry) as SchemaModel<TSchema, `${TNamespace}/${TName}`>\n );\n\n registry.register(model);\n return model;\n}\n","/**\n * Domain boundary barrel: centralizes this subdomain's public contract.\n *\n * Tango keeps both flat exports and namespaced subdomain barrels here so\n * callers can choose TS-native direct imports or Django-style drill-down\n * access through the bundled `model` namespace at the package root.\n */\n\nexport * as decorators from './decorators/index';\nexport * as meta from './meta/index';\nexport * as constraints from './constraints/index';\nexport * as registry from './registry/index';\nexport * as relations from './relations/index';\n\nexport type { ModelDefinition } from './ModelDefinition';\nexport { RelationBuilder } from './relations/index';\nexport { Model } from './Model';\nexport { registerModelAugmentor } from './ModelAugmentorRegistry';\nexport { Decorators, t } from './decorators/index';\nexport type {\n TangoDecorators,\n FieldDecoratorBuilder,\n DecoratedFieldKind,\n ModelRef,\n ModelRefTarget,\n RelationDecoratedSchema,\n TypedModelRef,\n ForeignKeyDecoratorConfig,\n OneToOneDecoratorConfig,\n ManyToManyDecoratorConfig,\n} from './decorators/index';\nexport { createTypedModelRef, InternalDecoratedFieldKind, isTypedModelRef } from './decorators/index';\nexport { Meta, m } from './meta/index';\nexport type { ModelConstraint, ModelMetaFragment } from './meta/index';\nexport { Constraints, Indexes, c, i } from './constraints/index';\nexport type { ConstraintDefinition } from './constraints/index';\nexport { ModelRegistry } from './registry/index';\n"],"mappings":"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"}