@antelopejs/interface-database-decorators 0.1.3 → 0.1.4

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
@@ -3,5 +3,6 @@ export * from "./common";
3
3
  export * from "./database";
4
4
  export * from "./model";
5
5
  export * from "./modifiers";
6
+ export * from "./relation";
6
7
  export * from "./schema";
7
8
  export * from "./table";
package/dist/index.js CHANGED
@@ -19,6 +19,7 @@ __exportStar(require("./common"), exports);
19
19
  __exportStar(require("./database"), exports);
20
20
  __exportStar(require("./model"), exports);
21
21
  __exportStar(require("./modifiers"), exports);
22
+ __exportStar(require("./relation"), exports);
22
23
  __exportStar(require("./schema"), exports);
23
24
  __exportStar(require("./table"), exports);
24
25
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,8CAA4B;AAC5B,2CAAyB;AACzB,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4BAA0B;AAE1B,2CAAyB;AACzB,6CAA2B;AAC3B,0CAAwB;AACxB,8CAA4B;AAC5B,6CAA2B;AAC3B,2CAAyB;AACzB,0CAAwB"}
@@ -0,0 +1,42 @@
1
+ import type { Table } from "./table";
2
+ /**
3
+ * Options for the {@link Relation} decorator.
4
+ */
5
+ export interface RelationOptions {
6
+ /**
7
+ * Thunk returning the target Table class (lazy to allow forward references).
8
+ */
9
+ to: () => typeof Table;
10
+ /**
11
+ * Field on the target table the relation points to. Defaults to the target
12
+ * table's primary key.
13
+ */
14
+ toField?: string;
15
+ /**
16
+ * The decorated field holds multiple target keys (many targets per source
17
+ * record).
18
+ */
19
+ many?: boolean;
20
+ }
21
+ /**
22
+ * Relation Metadata.
23
+ */
24
+ export declare class RelationStaticMetadata {
25
+ static key: symbol;
26
+ readonly relations: Record<string, RelationOptions>;
27
+ }
28
+ /**
29
+ * Database Table Relation decorator.
30
+ *
31
+ * Declarative metadata only: database implementations do not enforce it (no
32
+ * foreign key constraint, no referential validation). It is consumed by
33
+ * introspection tooling to expose the links between tables.
34
+ *
35
+ * Available options:
36
+ * - `to`: Thunk returning the target Table class.
37
+ * - `toField`: Target field name (defaults to the target's primary key).
38
+ * - `many`: Whether the field holds multiple target keys.
39
+ *
40
+ * @param options Options
41
+ */
42
+ export declare const Relation: (options: RelationOptions) => import("@antelopejs/interface-core/decorators").PropertyDecorator;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Relation = exports.RelationStaticMetadata = void 0;
4
+ const decorators_1 = require("@antelopejs/interface-core/decorators");
5
+ const common_1 = require("./common");
6
+ /**
7
+ * Relation Metadata.
8
+ */
9
+ class RelationStaticMetadata {
10
+ static key = Symbol();
11
+ relations = {};
12
+ }
13
+ exports.RelationStaticMetadata = RelationStaticMetadata;
14
+ /**
15
+ * Database Table Relation decorator.
16
+ *
17
+ * Declarative metadata only: database implementations do not enforce it (no
18
+ * foreign key constraint, no referential validation). It is consumed by
19
+ * introspection tooling to expose the links between tables.
20
+ *
21
+ * Available options:
22
+ * - `to`: Thunk returning the target Table class.
23
+ * - `toField`: Target field name (defaults to the target's primary key).
24
+ * - `many`: Whether the field holds multiple target keys.
25
+ *
26
+ * @param options Options
27
+ */
28
+ exports.Relation = (0, decorators_1.MakePropertyDecorator)((target, propertyKey, options) => {
29
+ const metadata = (0, common_1.getMetadata)(target.constructor, RelationStaticMetadata);
30
+ metadata.relations[String(propertyKey)] = options;
31
+ });
32
+ //# sourceMappingURL=relation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.js","sourceRoot":"","sources":["../src/relation.ts"],"names":[],"mappings":";;;AAAA,sEAA8E;AAC9E,qCAAuC;AAuBvC;;GAEG;AACH,MAAa,sBAAsB;IAC1B,MAAM,CAAC,GAAG,GAAG,MAAM,EAAE,CAAC;IAEb,SAAS,GAAoC,EAAE,CAAC;;AAHlE,wDAIC;AAED;;;;;;;;;;;;;GAaG;AACU,QAAA,QAAQ,GAAG,IAAA,kCAAqB,EAC3C,CAAC,MAAM,EAAE,WAAW,EAAE,OAAwB,EAAE,EAAE;IAChD,MAAM,QAAQ,GAAG,IAAA,oBAAW,EAAC,MAAM,CAAC,WAAW,EAAE,sBAAsB,CAAC,CAAC;IACzE,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,OAAO,CAAC;AACpD,CAAC,CACF,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,112 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ const common_1 = require("@antelopejs/interface-database-decorators/common");
13
+ const relation_1 = require("@antelopejs/interface-database-decorators/relation");
14
+ const table_1 = require("@antelopejs/interface-database-decorators/table");
15
+ const chai_1 = require("chai");
16
+ describe("Relation - Relation decorator", () => {
17
+ it("stores relation options in metadata", async () => StoreRelationOptionsInMetadataTest());
18
+ it("stores toField and many options", async () => StoreToFieldAndManyOptionsTest());
19
+ it("supports multiple relations on one class", async () => SupportMultipleRelationsOnOneClassTest());
20
+ it("resolves forward references through the thunk", async () => ResolveForwardReferencesThroughThunkTest());
21
+ it("keeps metadata separate between classes", async () => KeepMetadataSeparateBetweenClassesTest());
22
+ });
23
+ async function StoreRelationOptionsInMetadataTest() {
24
+ class TargetTable extends table_1.Table {
25
+ name;
26
+ }
27
+ class SourceTable extends table_1.Table {
28
+ target;
29
+ }
30
+ __decorate([
31
+ (0, relation_1.Relation)({ to: () => TargetTable }),
32
+ __metadata("design:type", String)
33
+ ], SourceTable.prototype, "target", void 0);
34
+ const metadata = (0, common_1.getMetadata)(SourceTable, relation_1.RelationStaticMetadata);
35
+ (0, chai_1.expect)(metadata.relations).to.have.property("target");
36
+ (0, chai_1.expect)(metadata.relations.target.to()).to.equal(TargetTable);
37
+ (0, chai_1.expect)(metadata.relations.target.toField).to.equal(undefined);
38
+ (0, chai_1.expect)(metadata.relations.target.many).to.equal(undefined);
39
+ }
40
+ async function StoreToFieldAndManyOptionsTest() {
41
+ class TargetTable extends table_1.Table {
42
+ code;
43
+ }
44
+ class SourceTable extends table_1.Table {
45
+ targets;
46
+ }
47
+ __decorate([
48
+ (0, relation_1.Relation)({ to: () => TargetTable, toField: "code", many: true }),
49
+ __metadata("design:type", Array)
50
+ ], SourceTable.prototype, "targets", void 0);
51
+ const metadata = (0, common_1.getMetadata)(SourceTable, relation_1.RelationStaticMetadata);
52
+ (0, chai_1.expect)(metadata.relations.targets.toField).to.equal("code");
53
+ (0, chai_1.expect)(metadata.relations.targets.many).to.equal(true);
54
+ }
55
+ async function SupportMultipleRelationsOnOneClassTest() {
56
+ class UserTable extends table_1.Table {
57
+ name;
58
+ }
59
+ class RoleTable extends table_1.Table {
60
+ label;
61
+ }
62
+ class SourceTable extends table_1.Table {
63
+ owner;
64
+ roles;
65
+ }
66
+ __decorate([
67
+ (0, relation_1.Relation)({ to: () => UserTable }),
68
+ __metadata("design:type", String)
69
+ ], SourceTable.prototype, "owner", void 0);
70
+ __decorate([
71
+ (0, relation_1.Relation)({ to: () => RoleTable, many: true }),
72
+ __metadata("design:type", Array)
73
+ ], SourceTable.prototype, "roles", void 0);
74
+ const metadata = (0, common_1.getMetadata)(SourceTable, relation_1.RelationStaticMetadata);
75
+ (0, chai_1.expect)(Object.keys(metadata.relations)).to.have.members(["owner", "roles"]);
76
+ (0, chai_1.expect)(metadata.relations.owner.to()).to.equal(UserTable);
77
+ (0, chai_1.expect)(metadata.relations.roles.to()).to.equal(RoleTable);
78
+ }
79
+ async function ResolveForwardReferencesThroughThunkTest() {
80
+ class SourceTable extends table_1.Table {
81
+ later;
82
+ }
83
+ __decorate([
84
+ (0, relation_1.Relation)({ to: () => LaterTable }),
85
+ __metadata("design:type", String)
86
+ ], SourceTable.prototype, "later", void 0);
87
+ class LaterTable extends table_1.Table {
88
+ name;
89
+ }
90
+ const metadata = (0, common_1.getMetadata)(SourceTable, relation_1.RelationStaticMetadata);
91
+ (0, chai_1.expect)(metadata.relations.later.to()).to.equal(LaterTable);
92
+ }
93
+ async function KeepMetadataSeparateBetweenClassesTest() {
94
+ class TargetTable extends table_1.Table {
95
+ name;
96
+ }
97
+ class FirstTable extends table_1.Table {
98
+ target;
99
+ }
100
+ __decorate([
101
+ (0, relation_1.Relation)({ to: () => TargetTable }),
102
+ __metadata("design:type", String)
103
+ ], FirstTable.prototype, "target", void 0);
104
+ class SecondTable extends table_1.Table {
105
+ other;
106
+ }
107
+ const firstMetadata = (0, common_1.getMetadata)(FirstTable, relation_1.RelationStaticMetadata);
108
+ const secondMetadata = (0, common_1.getMetadata)(SecondTable, relation_1.RelationStaticMetadata);
109
+ (0, chai_1.expect)(firstMetadata.relations).to.have.property("target");
110
+ (0, chai_1.expect)(secondMetadata.relations).to.not.have.property("target");
111
+ }
112
+ //# sourceMappingURL=relation.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"relation.test.js","sourceRoot":"","sources":["../../src/tests/relation.test.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@antelopejs/interface-database-decorators",
3
- "version": "0.1.3",
3
+ "version": "0.1.4",
4
4
  "description": "AntelopeJS interface for database schema decorators and model definitions",
5
5
  "keywords": [
6
6
  "antelopejs",
@@ -37,6 +37,10 @@
37
37
  "types": "./dist/model.d.ts",
38
38
  "default": "./dist/model.js"
39
39
  },
40
+ "./relation": {
41
+ "types": "./dist/relation.d.ts",
42
+ "default": "./dist/relation.js"
43
+ },
40
44
  "./schema": {
41
45
  "types": "./dist/schema.d.ts",
42
46
  "default": "./dist/schema.js"
@@ -112,6 +116,9 @@
112
116
  "model": [
113
117
  "dist/model.d.ts"
114
118
  ],
119
+ "relation": [
120
+ "dist/relation.d.ts"
121
+ ],
115
122
  "schema": [
116
123
  "dist/schema.d.ts"
117
124
  ],