@nest-yalc-2/omnikernel-module 2.2.2 → 2.2.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/package.json +17 -15
- package/src/__tests__/omni-collection.entity.spec.ts +49 -49
- package/src/__tests__/omni-collection.service.spec.ts +83 -83
- package/src/__tests__/omni-document.entity.spec.ts +55 -55
- package/src/__tests__/omni-document.service.spec.ts +83 -83
- package/src/__tests__/omni-extension-projection-constraints.spec.ts +518 -518
- package/src/__tests__/omni-extension-projection.registration.spec.ts +947 -946
- package/src/__tests__/omni-extension-projection.service.spec.ts +806 -806
- package/src/__tests__/omni-external-ref.entity.spec.ts +36 -36
- package/src/__tests__/omni-external-ref.service.spec.ts +252 -252
- package/src/__tests__/omni-named.entity.spec.ts +33 -33
- package/src/__tests__/omni-record.entity.spec.ts +32 -32
- package/src/__tests__/omni-record.service.spec.ts +107 -107
- package/src/__tests__/omni-relation-semantics.spec.ts +102 -102
- package/src/__tests__/omni-relation.entity.spec.ts +38 -38
- package/src/__tests__/omni-scope-substrate.spec.ts +81 -81
- package/src/__tests__/omni-scoped.backend.spec.ts +115 -115
- package/src/__tests__/omni-scoped.service.spec.ts +354 -354
- package/src/__tests__/omnikernel.diagnostics.spec.ts +94 -94
- package/src/__tests__/omnikernel.module.spec.ts +38 -40
- package/src/__tests__/omnikernel.persistence.spec.ts +154 -154
- package/src/__tests__/omnikernel.public-api.spec.ts +238 -238
- package/src/__tests__/omnikernel.query.service.spec.ts +155 -155
- package/src/base/omni-base.entity.ts +41 -41
- package/src/base/omni-external-ref.entity.ts +53 -53
- package/src/base/omni-named.entity.ts +16 -16
- package/src/base/omni-record.entity.ts +51 -51
- package/src/base/omni-relation.entity.ts +72 -72
- package/src/index.ts +49 -49
- package/src/omni-collection-kind.enum.ts +10 -10
- package/src/omni-collection.backend.ts +16 -16
- package/src/omni-collection.dto.ts +170 -170
- package/src/omni-collection.entity.ts +21 -21
- package/src/omni-collection.service.ts +75 -75
- package/src/omni-document-kind.enum.ts +12 -12
- package/src/omni-document.backend.ts +16 -16
- package/src/omni-document.dto.ts +198 -198
- package/src/omni-document.entity.ts +30 -30
- package/src/omni-document.service.ts +75 -75
- package/src/omni-dto.helpers.ts +21 -21
- package/src/omni-extension-projection.definition.ts +294 -294
- package/src/omni-extension-projection.resource.ts +274 -274
- package/src/omni-extension-projection.service.ts +452 -452
- package/src/omni-external-ref-binding.validator.ts +53 -53
- package/src/omni-external-ref-internal-type.enum.ts +11 -11
- package/src/omni-external-ref.backend.ts +25 -25
- package/src/omni-external-ref.dto.ts +128 -128
- package/src/omni-external-ref.service.ts +255 -255
- package/src/omni-migration.ts +365 -365
- package/src/omni-named.backend.ts +11 -11
- package/src/omni-named.dto.ts +86 -86
- package/src/omni-projection.catalog.ts +345 -345
- package/src/omni-projection.lifecycle.ts +53 -53
- package/src/omni-record-status.enum.ts +11 -11
- package/src/omni-record.backend.ts +19 -19
- package/src/omni-record.dto.ts +157 -157
- package/src/omni-record.service.ts +113 -113
- package/src/omni-relation-kind.contract.ts +49 -49
- package/src/omni-relation-kind.enum.ts +12 -12
- package/src/omni-relation-projection.definition.ts +166 -166
- package/src/omni-relation-projection.resource.ts +360 -360
- package/src/omni-relation-projection.service.ts +610 -610
- package/src/omni-relation-semantics.ts +52 -52
- package/src/omni-relation-status.enum.ts +11 -11
- package/src/omni-relation.backend.ts +21 -21
- package/src/omni-relation.dto.ts +142 -142
- package/src/omni-relation.service.ts +159 -159
- package/src/omni-scope.ts +161 -161
- package/src/omni-scoped.backend.ts +110 -110
- package/src/omni-scoped.repository.ts +34 -34
- package/src/omni-scoped.service.ts +338 -338
- package/src/omnikernel.diagnostics.ts +83 -83
- package/src/omnikernel.module.ts +97 -97
- package/src/omnikernel.query.service.ts +108 -108
|
@@ -1,113 +1,113 @@
|
|
|
1
|
-
import { BadRequestException } from '@nestjs/common';
|
|
2
|
-
import type { CrudGenFindManyOptions } from '@nest-yalc-2/crud-gen/api-graphql/crud-gen-gql.interface.js';
|
|
3
|
-
import type { GenericTypeORMRepository } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
4
|
-
import { In, Not, type DeepPartial, type FindOptionsWhere } from 'typeorm';
|
|
5
|
-
import { OmniRecordEntity } from './base/omni-record.entity.js';
|
|
6
|
-
import type { OmniDeletePolicy, OmniScope } from './omni-scope.js';
|
|
7
|
-
import { OmniScopedService } from './omni-scoped.service.js';
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Raw Omni record CRUD with a mechanical boundary around extension-owned
|
|
11
|
-
* kinds. A registered extension is the only writer for its owner lifecycle;
|
|
12
|
-
* mounting a generic record transport cannot turn another record into that
|
|
13
|
-
* kind or mutate/delete an existing owner.
|
|
14
|
-
*/
|
|
15
|
-
export class OmniRecordService extends OmniScopedService<OmniRecordEntity> {
|
|
16
|
-
private readonly reservedKinds: ReadonlySet<string>;
|
|
17
|
-
|
|
18
|
-
constructor(
|
|
19
|
-
repository: GenericTypeORMRepository<OmniRecordEntity>,
|
|
20
|
-
scopeOrRepositoryWrite?:
|
|
21
|
-
OmniScope | GenericTypeORMRepository<OmniRecordEntity>,
|
|
22
|
-
deletion: OmniDeletePolicy = 'tombstone',
|
|
23
|
-
reservedRecordKinds: readonly string[] = [],
|
|
24
|
-
) {
|
|
25
|
-
super(repository, scopeOrRepositoryWrite, deletion);
|
|
26
|
-
this.reservedKinds = new Set(reservedRecordKinds);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
override async createEntity(
|
|
30
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
31
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
32
|
-
returnEntity?: true,
|
|
33
|
-
): Promise<OmniRecordEntity>;
|
|
34
|
-
override async createEntity(
|
|
35
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
36
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
37
|
-
returnEntity?: boolean,
|
|
38
|
-
): Promise<OmniRecordEntity | boolean>;
|
|
39
|
-
override async createEntity(
|
|
40
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
41
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
42
|
-
returnEntity = true,
|
|
43
|
-
): Promise<OmniRecordEntity | boolean> {
|
|
44
|
-
this.rejectReservedKind(input.kind);
|
|
45
|
-
return super.createEntity(input, findOptions, returnEntity);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
override async updateEntity(
|
|
49
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
50
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
51
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
52
|
-
returnEntity?: true,
|
|
53
|
-
): Promise<OmniRecordEntity>;
|
|
54
|
-
override async updateEntity(
|
|
55
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
56
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
57
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
58
|
-
returnEntity?: boolean,
|
|
59
|
-
): Promise<OmniRecordEntity | boolean>;
|
|
60
|
-
override async updateEntity(
|
|
61
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
62
|
-
input: DeepPartial<OmniRecordEntity>,
|
|
63
|
-
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
64
|
-
returnEntity = true,
|
|
65
|
-
): Promise<OmniRecordEntity | boolean> {
|
|
66
|
-
this.rejectReservedKind(input.kind);
|
|
67
|
-
await this.assertExistingRecordIsNotReserved(conditions);
|
|
68
|
-
return super.updateEntity(
|
|
69
|
-
this.nonReservedConditions(conditions),
|
|
70
|
-
input,
|
|
71
|
-
findOptions,
|
|
72
|
-
returnEntity,
|
|
73
|
-
);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
override async deleteEntity(
|
|
77
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
78
|
-
): Promise<boolean> {
|
|
79
|
-
await this.assertExistingRecordIsNotReserved(conditions);
|
|
80
|
-
return super.deleteEntity(this.nonReservedConditions(conditions));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
private async assertExistingRecordIsNotReserved(
|
|
84
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
85
|
-
): Promise<void> {
|
|
86
|
-
const record = await super.getEntity(
|
|
87
|
-
conditions,
|
|
88
|
-
undefined,
|
|
89
|
-
undefined,
|
|
90
|
-
undefined,
|
|
91
|
-
{ failOnNull: false },
|
|
92
|
-
);
|
|
93
|
-
if (record) this.rejectReservedKind(record.kind);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
private nonReservedConditions(
|
|
97
|
-
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
98
|
-
): FindOptionsWhere<OmniRecordEntity> {
|
|
99
|
-
if (this.reservedKinds.size === 0) return conditions;
|
|
100
|
-
return {
|
|
101
|
-
...conditions,
|
|
102
|
-
kind: Not(In([...this.reservedKinds])),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
private rejectReservedKind(kind: unknown): void {
|
|
107
|
-
if (typeof kind === 'string' && this.reservedKinds.has(kind)) {
|
|
108
|
-
throw new BadRequestException(
|
|
109
|
-
'This record kind is owned by a registered extension projection.',
|
|
110
|
-
);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
1
|
+
import { BadRequestException } from '@nestjs/common';
|
|
2
|
+
import type { CrudGenFindManyOptions } from '@nest-yalc-2/crud-gen/api-graphql/crud-gen-gql.interface.js';
|
|
3
|
+
import type { GenericTypeORMRepository } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
4
|
+
import { In, Not, type DeepPartial, type FindOptionsWhere } from 'typeorm';
|
|
5
|
+
import { OmniRecordEntity } from './base/omni-record.entity.js';
|
|
6
|
+
import type { OmniDeletePolicy, OmniScope } from './omni-scope.js';
|
|
7
|
+
import { OmniScopedService } from './omni-scoped.service.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Raw Omni record CRUD with a mechanical boundary around extension-owned
|
|
11
|
+
* kinds. A registered extension is the only writer for its owner lifecycle;
|
|
12
|
+
* mounting a generic record transport cannot turn another record into that
|
|
13
|
+
* kind or mutate/delete an existing owner.
|
|
14
|
+
*/
|
|
15
|
+
export class OmniRecordService extends OmniScopedService<OmniRecordEntity> {
|
|
16
|
+
private readonly reservedKinds: ReadonlySet<string>;
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
repository: GenericTypeORMRepository<OmniRecordEntity>,
|
|
20
|
+
scopeOrRepositoryWrite?:
|
|
21
|
+
OmniScope | GenericTypeORMRepository<OmniRecordEntity>,
|
|
22
|
+
deletion: OmniDeletePolicy = 'tombstone',
|
|
23
|
+
reservedRecordKinds: readonly string[] = [],
|
|
24
|
+
) {
|
|
25
|
+
super(repository, scopeOrRepositoryWrite, deletion);
|
|
26
|
+
this.reservedKinds = new Set(reservedRecordKinds);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
override async createEntity(
|
|
30
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
31
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
32
|
+
returnEntity?: true,
|
|
33
|
+
): Promise<OmniRecordEntity>;
|
|
34
|
+
override async createEntity(
|
|
35
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
36
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
37
|
+
returnEntity?: boolean,
|
|
38
|
+
): Promise<OmniRecordEntity | boolean>;
|
|
39
|
+
override async createEntity(
|
|
40
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
41
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
42
|
+
returnEntity = true,
|
|
43
|
+
): Promise<OmniRecordEntity | boolean> {
|
|
44
|
+
this.rejectReservedKind(input.kind);
|
|
45
|
+
return super.createEntity(input, findOptions, returnEntity);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
override async updateEntity(
|
|
49
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
50
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
51
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
52
|
+
returnEntity?: true,
|
|
53
|
+
): Promise<OmniRecordEntity>;
|
|
54
|
+
override async updateEntity(
|
|
55
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
56
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
57
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
58
|
+
returnEntity?: boolean,
|
|
59
|
+
): Promise<OmniRecordEntity | boolean>;
|
|
60
|
+
override async updateEntity(
|
|
61
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
62
|
+
input: DeepPartial<OmniRecordEntity>,
|
|
63
|
+
findOptions?: CrudGenFindManyOptions<OmniRecordEntity>,
|
|
64
|
+
returnEntity = true,
|
|
65
|
+
): Promise<OmniRecordEntity | boolean> {
|
|
66
|
+
this.rejectReservedKind(input.kind);
|
|
67
|
+
await this.assertExistingRecordIsNotReserved(conditions);
|
|
68
|
+
return super.updateEntity(
|
|
69
|
+
this.nonReservedConditions(conditions),
|
|
70
|
+
input,
|
|
71
|
+
findOptions,
|
|
72
|
+
returnEntity,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
override async deleteEntity(
|
|
77
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
78
|
+
): Promise<boolean> {
|
|
79
|
+
await this.assertExistingRecordIsNotReserved(conditions);
|
|
80
|
+
return super.deleteEntity(this.nonReservedConditions(conditions));
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private async assertExistingRecordIsNotReserved(
|
|
84
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
85
|
+
): Promise<void> {
|
|
86
|
+
const record = await super.getEntity(
|
|
87
|
+
conditions,
|
|
88
|
+
undefined,
|
|
89
|
+
undefined,
|
|
90
|
+
undefined,
|
|
91
|
+
{ failOnNull: false },
|
|
92
|
+
);
|
|
93
|
+
if (record) this.rejectReservedKind(record.kind);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private nonReservedConditions(
|
|
97
|
+
conditions: FindOptionsWhere<OmniRecordEntity>,
|
|
98
|
+
): FindOptionsWhere<OmniRecordEntity> {
|
|
99
|
+
if (this.reservedKinds.size === 0) return conditions;
|
|
100
|
+
return {
|
|
101
|
+
...conditions,
|
|
102
|
+
kind: Not(In([...this.reservedKinds])),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
private rejectReservedKind(kind: unknown): void {
|
|
107
|
+
if (typeof kind === 'string' && this.reservedKinds.has(kind)) {
|
|
108
|
+
throw new BadRequestException(
|
|
109
|
+
'This record kind is owned by a registered extension projection.',
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -1,49 +1,49 @@
|
|
|
1
|
-
import { OmniRelationKind } from './omni-relation-kind.enum.js';
|
|
2
|
-
|
|
3
|
-
export const omniRelationKindPattern = /^[a-z][a-z0-9_]{0,63}$/;
|
|
4
|
-
|
|
5
|
-
export const canonicalOmniRelationKinds = Object.freeze([
|
|
6
|
-
OmniRelationKind.Contains,
|
|
7
|
-
OmniRelationKind.References,
|
|
8
|
-
OmniRelationKind.RelatedTo,
|
|
9
|
-
OmniRelationKind.DerivedFrom,
|
|
10
|
-
] as const);
|
|
11
|
-
|
|
12
|
-
export interface OmniRelationKindContract {
|
|
13
|
-
readonly kinds: ReadonlySet<string>;
|
|
14
|
-
assert(kind: unknown): asserts kind is string;
|
|
15
|
-
has(kind: string): boolean;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Canonical kinds are stable exports. Applications may register additional
|
|
20
|
-
* syntactically portable kinds at module composition time without changing
|
|
21
|
-
* OmniKernel or turning arbitrary strings into valid graph semantics.
|
|
22
|
-
*/
|
|
23
|
-
export function createOmniRelationKindContract(
|
|
24
|
-
additionalKinds: readonly string[] = [],
|
|
25
|
-
): OmniRelationKindContract {
|
|
26
|
-
const kinds = new Set<string>(canonicalOmniRelationKinds);
|
|
27
|
-
for (const kind of additionalKinds) {
|
|
28
|
-
if (typeof kind !== 'string' || !omniRelationKindPattern.test(kind)) {
|
|
29
|
-
throw new TypeError(
|
|
30
|
-
'Omni relation kinds must use lowercase letters, digits, and underscores.',
|
|
31
|
-
);
|
|
32
|
-
}
|
|
33
|
-
kinds.add(kind);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
return Object.freeze({
|
|
37
|
-
kinds,
|
|
38
|
-
assert(kind: unknown): asserts kind is string {
|
|
39
|
-
if (typeof kind !== 'string' || !kinds.has(kind)) {
|
|
40
|
-
throw new TypeError(
|
|
41
|
-
'Omni relation kind is not registered for this module.',
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
},
|
|
45
|
-
has(kind: string): boolean {
|
|
46
|
-
return kinds.has(kind);
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
}
|
|
1
|
+
import { OmniRelationKind } from './omni-relation-kind.enum.js';
|
|
2
|
+
|
|
3
|
+
export const omniRelationKindPattern = /^[a-z][a-z0-9_]{0,63}$/;
|
|
4
|
+
|
|
5
|
+
export const canonicalOmniRelationKinds = Object.freeze([
|
|
6
|
+
OmniRelationKind.Contains,
|
|
7
|
+
OmniRelationKind.References,
|
|
8
|
+
OmniRelationKind.RelatedTo,
|
|
9
|
+
OmniRelationKind.DerivedFrom,
|
|
10
|
+
] as const);
|
|
11
|
+
|
|
12
|
+
export interface OmniRelationKindContract {
|
|
13
|
+
readonly kinds: ReadonlySet<string>;
|
|
14
|
+
assert(kind: unknown): asserts kind is string;
|
|
15
|
+
has(kind: string): boolean;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Canonical kinds are stable exports. Applications may register additional
|
|
20
|
+
* syntactically portable kinds at module composition time without changing
|
|
21
|
+
* OmniKernel or turning arbitrary strings into valid graph semantics.
|
|
22
|
+
*/
|
|
23
|
+
export function createOmniRelationKindContract(
|
|
24
|
+
additionalKinds: readonly string[] = [],
|
|
25
|
+
): OmniRelationKindContract {
|
|
26
|
+
const kinds = new Set<string>(canonicalOmniRelationKinds);
|
|
27
|
+
for (const kind of additionalKinds) {
|
|
28
|
+
if (typeof kind !== 'string' || !omniRelationKindPattern.test(kind)) {
|
|
29
|
+
throw new TypeError(
|
|
30
|
+
'Omni relation kinds must use lowercase letters, digits, and underscores.',
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
kinds.add(kind);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return Object.freeze({
|
|
37
|
+
kinds,
|
|
38
|
+
assert(kind: unknown): asserts kind is string {
|
|
39
|
+
if (typeof kind !== 'string' || !kinds.has(kind)) {
|
|
40
|
+
throw new TypeError(
|
|
41
|
+
'Omni relation kind is not registered for this module.',
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
has(kind: string): boolean {
|
|
46
|
+
return kinds.has(kind);
|
|
47
|
+
},
|
|
48
|
+
});
|
|
49
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { registerEnumType } from '@nestjs/graphql';
|
|
2
|
-
|
|
3
|
-
export enum OmniRelationKind {
|
|
4
|
-
Contains = 'contains',
|
|
5
|
-
References = 'references',
|
|
6
|
-
RelatedTo = 'related_to',
|
|
7
|
-
DerivedFrom = 'derived_from',
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
registerEnumType(OmniRelationKind, {
|
|
11
|
-
name: 'OmniRelationKind',
|
|
12
|
-
});
|
|
1
|
+
import { registerEnumType } from '@nestjs/graphql';
|
|
2
|
+
|
|
3
|
+
export enum OmniRelationKind {
|
|
4
|
+
Contains = 'contains',
|
|
5
|
+
References = 'references',
|
|
6
|
+
RelatedTo = 'related_to',
|
|
7
|
+
DerivedFrom = 'derived_from',
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
registerEnumType(OmniRelationKind, {
|
|
11
|
+
name: 'OmniRelationKind',
|
|
12
|
+
});
|