@nest-yalc-2/omnikernel-module 2.2.2 → 2.2.6
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,110 +1,110 @@
|
|
|
1
|
-
import {
|
|
2
|
-
Scope,
|
|
3
|
-
type FactoryProvider,
|
|
4
|
-
type InjectionToken,
|
|
5
|
-
type Provider,
|
|
6
|
-
} from '@nestjs/common';
|
|
7
|
-
import { getRepositoryToken } from '@nestjs/typeorm';
|
|
8
|
-
import { getProviderToken } from '@nest-yalc-2/crud-gen/crud-gen.helpers.js';
|
|
9
|
-
import {
|
|
10
|
-
getServiceToken,
|
|
11
|
-
type GenericService,
|
|
12
|
-
} from '@nest-yalc-2/crud-gen/typeorm/generic.service.js';
|
|
13
|
-
import { CGExtendedRepositoryFactory } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
14
|
-
import {
|
|
15
|
-
GQLDataLoader,
|
|
16
|
-
getDataloaderToken,
|
|
17
|
-
getFn,
|
|
18
|
-
} from '@nest-yalc-2/data-loader';
|
|
19
|
-
import type { ClassType } from '@node-yalc/types/globals.js';
|
|
20
|
-
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
21
|
-
import type { ObjectLiteral } from 'typeorm';
|
|
22
|
-
import type { GenericTypeORMRepository } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
23
|
-
import {
|
|
24
|
-
OMNI_KERNEL_OPTIONS,
|
|
25
|
-
OmniScopeContext,
|
|
26
|
-
normalizeOmniKernelRegistrationOptions,
|
|
27
|
-
} from './omni-scope.js';
|
|
28
|
-
|
|
29
|
-
export interface OmniScopedBackendFactoryOptions<Entity extends ObjectLiteral> {
|
|
30
|
-
entityModel: ClassType<Entity>;
|
|
31
|
-
dbConnection: string;
|
|
32
|
-
serviceToken?: string;
|
|
33
|
-
serviceProvider?: InjectionToken;
|
|
34
|
-
additionalInject?: readonly InjectionToken[];
|
|
35
|
-
createService: (
|
|
36
|
-
repository: GenericTypeORMRepository<Entity>,
|
|
37
|
-
scope: OmniScopeContext,
|
|
38
|
-
options: ReturnType<typeof normalizeOmniKernelRegistrationOptions>,
|
|
39
|
-
...additionalDependencies: unknown[]
|
|
40
|
-
) => GenericService<Entity>;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
export interface OmniScopedBackendFactoryResult<Entity extends ObjectLiteral> {
|
|
44
|
-
providers: Provider[];
|
|
45
|
-
repository: ClassType<GenericTypeORMRepository<Entity>>;
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/**
|
|
49
|
-
* Builds the normal CrudGen service/loader provider shape with a request
|
|
50
|
-
* scope. The loader cache key carries the same scope as the service query.
|
|
51
|
-
*/
|
|
52
|
-
export function omniScopedBackendProvidersFactory<Entity extends ObjectLiteral>(
|
|
53
|
-
options: OmniScopedBackendFactoryOptions<Entity>,
|
|
54
|
-
): OmniScopedBackendFactoryResult<Entity> {
|
|
55
|
-
const serviceToken =
|
|
56
|
-
options.serviceToken ?? getServiceToken(options.entityModel);
|
|
57
|
-
const serviceProviderToken = options.serviceProvider ?? serviceToken;
|
|
58
|
-
const additionalInject = options.additionalInject ?? [];
|
|
59
|
-
const serviceProvider: FactoryProvider = {
|
|
60
|
-
provide: serviceProviderToken,
|
|
61
|
-
scope: Scope.REQUEST,
|
|
62
|
-
useFactory: (
|
|
63
|
-
repository: GenericTypeORMRepository<Entity>,
|
|
64
|
-
scope: OmniScopeContext,
|
|
65
|
-
moduleOptions: ReturnType<typeof normalizeOmniKernelRegistrationOptions>,
|
|
66
|
-
...additionalDependencies: unknown[]
|
|
67
|
-
) =>
|
|
68
|
-
options.createService(
|
|
69
|
-
repository,
|
|
70
|
-
scope,
|
|
71
|
-
moduleOptions,
|
|
72
|
-
...additionalDependencies,
|
|
73
|
-
),
|
|
74
|
-
inject: [
|
|
75
|
-
getRepositoryToken(options.entityModel, options.dbConnection),
|
|
76
|
-
OmniScopeContext,
|
|
77
|
-
OMNI_KERNEL_OPTIONS,
|
|
78
|
-
...additionalInject,
|
|
79
|
-
],
|
|
80
|
-
};
|
|
81
|
-
const loaderProvider: FactoryProvider = {
|
|
82
|
-
provide: getDataloaderToken(options.entityModel),
|
|
83
|
-
scope: Scope.REQUEST,
|
|
84
|
-
useFactory: (
|
|
85
|
-
service: GenericService<Entity>,
|
|
86
|
-
scope: OmniScopeContext,
|
|
87
|
-
events: EventEmitter2,
|
|
88
|
-
) =>
|
|
89
|
-
new GQLDataLoader(getFn(service), 'guid' as keyof Entity, events, {
|
|
90
|
-
cacheKeyFn: (key) => scope.cacheKey(key),
|
|
91
|
-
}),
|
|
92
|
-
inject: [serviceToken, OmniScopeContext, EventEmitter2],
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
const serviceAlias: Provider[] =
|
|
96
|
-
serviceProviderToken === serviceToken
|
|
97
|
-
? []
|
|
98
|
-
: [{ provide: serviceToken, useExisting: serviceProviderToken }];
|
|
99
|
-
|
|
100
|
-
return {
|
|
101
|
-
providers: [serviceProvider, ...serviceAlias, loaderProvider],
|
|
102
|
-
repository: CGExtendedRepositoryFactory(options.entityModel),
|
|
103
|
-
};
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export function omniBackendServiceToken(
|
|
107
|
-
provider: Parameters<typeof getProviderToken>[0],
|
|
108
|
-
): string {
|
|
109
|
-
return getProviderToken(provider);
|
|
110
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
Scope,
|
|
3
|
+
type FactoryProvider,
|
|
4
|
+
type InjectionToken,
|
|
5
|
+
type Provider,
|
|
6
|
+
} from '@nestjs/common';
|
|
7
|
+
import { getRepositoryToken } from '@nestjs/typeorm';
|
|
8
|
+
import { getProviderToken } from '@nest-yalc-2/crud-gen/crud-gen.helpers.js';
|
|
9
|
+
import {
|
|
10
|
+
getServiceToken,
|
|
11
|
+
type GenericService,
|
|
12
|
+
} from '@nest-yalc-2/crud-gen/typeorm/generic.service.js';
|
|
13
|
+
import { CGExtendedRepositoryFactory } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
14
|
+
import {
|
|
15
|
+
GQLDataLoader,
|
|
16
|
+
getDataloaderToken,
|
|
17
|
+
getFn,
|
|
18
|
+
} from '@nest-yalc-2/data-loader';
|
|
19
|
+
import type { ClassType } from '@node-yalc/types/globals.js';
|
|
20
|
+
import { EventEmitter2 } from '@nestjs/event-emitter';
|
|
21
|
+
import type { ObjectLiteral } from 'typeorm';
|
|
22
|
+
import type { GenericTypeORMRepository } from '@nest-yalc-2/crud-gen/typeorm/generic.repository.js';
|
|
23
|
+
import {
|
|
24
|
+
OMNI_KERNEL_OPTIONS,
|
|
25
|
+
OmniScopeContext,
|
|
26
|
+
normalizeOmniKernelRegistrationOptions,
|
|
27
|
+
} from './omni-scope.js';
|
|
28
|
+
|
|
29
|
+
export interface OmniScopedBackendFactoryOptions<Entity extends ObjectLiteral> {
|
|
30
|
+
entityModel: ClassType<Entity>;
|
|
31
|
+
dbConnection: string;
|
|
32
|
+
serviceToken?: string;
|
|
33
|
+
serviceProvider?: InjectionToken;
|
|
34
|
+
additionalInject?: readonly InjectionToken[];
|
|
35
|
+
createService: (
|
|
36
|
+
repository: GenericTypeORMRepository<Entity>,
|
|
37
|
+
scope: OmniScopeContext,
|
|
38
|
+
options: ReturnType<typeof normalizeOmniKernelRegistrationOptions>,
|
|
39
|
+
...additionalDependencies: unknown[]
|
|
40
|
+
) => GenericService<Entity>;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export interface OmniScopedBackendFactoryResult<Entity extends ObjectLiteral> {
|
|
44
|
+
providers: Provider[];
|
|
45
|
+
repository: ClassType<GenericTypeORMRepository<Entity>>;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Builds the normal CrudGen service/loader provider shape with a request
|
|
50
|
+
* scope. The loader cache key carries the same scope as the service query.
|
|
51
|
+
*/
|
|
52
|
+
export function omniScopedBackendProvidersFactory<Entity extends ObjectLiteral>(
|
|
53
|
+
options: OmniScopedBackendFactoryOptions<Entity>,
|
|
54
|
+
): OmniScopedBackendFactoryResult<Entity> {
|
|
55
|
+
const serviceToken =
|
|
56
|
+
options.serviceToken ?? getServiceToken(options.entityModel);
|
|
57
|
+
const serviceProviderToken = options.serviceProvider ?? serviceToken;
|
|
58
|
+
const additionalInject = options.additionalInject ?? [];
|
|
59
|
+
const serviceProvider: FactoryProvider = {
|
|
60
|
+
provide: serviceProviderToken,
|
|
61
|
+
scope: Scope.REQUEST,
|
|
62
|
+
useFactory: (
|
|
63
|
+
repository: GenericTypeORMRepository<Entity>,
|
|
64
|
+
scope: OmniScopeContext,
|
|
65
|
+
moduleOptions: ReturnType<typeof normalizeOmniKernelRegistrationOptions>,
|
|
66
|
+
...additionalDependencies: unknown[]
|
|
67
|
+
) =>
|
|
68
|
+
options.createService(
|
|
69
|
+
repository,
|
|
70
|
+
scope,
|
|
71
|
+
moduleOptions,
|
|
72
|
+
...additionalDependencies,
|
|
73
|
+
),
|
|
74
|
+
inject: [
|
|
75
|
+
getRepositoryToken(options.entityModel, options.dbConnection),
|
|
76
|
+
OmniScopeContext,
|
|
77
|
+
OMNI_KERNEL_OPTIONS,
|
|
78
|
+
...additionalInject,
|
|
79
|
+
],
|
|
80
|
+
};
|
|
81
|
+
const loaderProvider: FactoryProvider = {
|
|
82
|
+
provide: getDataloaderToken(options.entityModel),
|
|
83
|
+
scope: Scope.REQUEST,
|
|
84
|
+
useFactory: (
|
|
85
|
+
service: GenericService<Entity>,
|
|
86
|
+
scope: OmniScopeContext,
|
|
87
|
+
events: EventEmitter2,
|
|
88
|
+
) =>
|
|
89
|
+
new GQLDataLoader(getFn(service), 'guid' as keyof Entity, events, {
|
|
90
|
+
cacheKeyFn: (key) => scope.cacheKey(key),
|
|
91
|
+
}),
|
|
92
|
+
inject: [serviceToken, OmniScopeContext, EventEmitter2],
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
const serviceAlias: Provider[] =
|
|
96
|
+
serviceProviderToken === serviceToken
|
|
97
|
+
? []
|
|
98
|
+
: [{ provide: serviceToken, useExisting: serviceProviderToken }];
|
|
99
|
+
|
|
100
|
+
return {
|
|
101
|
+
providers: [serviceProvider, ...serviceAlias, loaderProvider],
|
|
102
|
+
repository: CGExtendedRepositoryFactory(options.entityModel),
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export function omniBackendServiceToken(
|
|
107
|
+
provider: Parameters<typeof getProviderToken>[0],
|
|
108
|
+
): string {
|
|
109
|
+
return getProviderToken(provider);
|
|
110
|
+
}
|
|
@@ -1,34 +1,34 @@
|
|
|
1
|
-
import type { FindOptionsWhere, ObjectLiteral, Repository } from 'typeorm';
|
|
2
|
-
import type { OmniScope } from './omni-scope.js';
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Small repository facade for normal Omni lookups. It mechanically adds the
|
|
6
|
-
* current scope and is the supported lower-level alternative to passing raw
|
|
7
|
-
* repositories between application layers.
|
|
8
|
-
*/
|
|
9
|
-
export class OmniScopedRepository<Entity extends ObjectLiteral> {
|
|
10
|
-
constructor(
|
|
11
|
-
private readonly repository: Repository<Entity>,
|
|
12
|
-
private readonly scope: OmniScope,
|
|
13
|
-
) {}
|
|
14
|
-
|
|
15
|
-
where(
|
|
16
|
-
where: FindOptionsWhere<Entity> = {} as FindOptionsWhere<Entity>,
|
|
17
|
-
): FindOptionsWhere<Entity> {
|
|
18
|
-
if ('scopeId' in (where as object)) {
|
|
19
|
-
throw new TypeError('Omni scopeId is derived from server context.');
|
|
20
|
-
}
|
|
21
|
-
return {
|
|
22
|
-
...(where as object),
|
|
23
|
-
scopeId: this.scope.scopeId,
|
|
24
|
-
} as unknown as FindOptionsWhere<Entity>;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
findOneByGuid(guid: string): Promise<Entity | null> {
|
|
28
|
-
return this.repository.findOne({ where: this.where({ guid } as never) });
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
find(where: FindOptionsWhere<Entity> = {} as FindOptionsWhere<Entity>) {
|
|
32
|
-
return this.repository.find({ where: this.where(where) });
|
|
33
|
-
}
|
|
34
|
-
}
|
|
1
|
+
import type { FindOptionsWhere, ObjectLiteral, Repository } from 'typeorm';
|
|
2
|
+
import type { OmniScope } from './omni-scope.js';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Small repository facade for normal Omni lookups. It mechanically adds the
|
|
6
|
+
* current scope and is the supported lower-level alternative to passing raw
|
|
7
|
+
* repositories between application layers.
|
|
8
|
+
*/
|
|
9
|
+
export class OmniScopedRepository<Entity extends ObjectLiteral> {
|
|
10
|
+
constructor(
|
|
11
|
+
private readonly repository: Repository<Entity>,
|
|
12
|
+
private readonly scope: OmniScope,
|
|
13
|
+
) {}
|
|
14
|
+
|
|
15
|
+
where(
|
|
16
|
+
where: FindOptionsWhere<Entity> = {} as FindOptionsWhere<Entity>,
|
|
17
|
+
): FindOptionsWhere<Entity> {
|
|
18
|
+
if ('scopeId' in (where as object)) {
|
|
19
|
+
throw new TypeError('Omni scopeId is derived from server context.');
|
|
20
|
+
}
|
|
21
|
+
return {
|
|
22
|
+
...(where as object),
|
|
23
|
+
scopeId: this.scope.scopeId,
|
|
24
|
+
} as unknown as FindOptionsWhere<Entity>;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
findOneByGuid(guid: string): Promise<Entity | null> {
|
|
28
|
+
return this.repository.findOne({ where: this.where({ guid } as never) });
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
find(where: FindOptionsWhere<Entity> = {} as FindOptionsWhere<Entity>) {
|
|
32
|
+
return this.repository.find({ where: this.where(where) });
|
|
33
|
+
}
|
|
34
|
+
}
|