@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.
Files changed (74) hide show
  1. package/package.json +17 -15
  2. package/src/__tests__/omni-collection.entity.spec.ts +49 -49
  3. package/src/__tests__/omni-collection.service.spec.ts +83 -83
  4. package/src/__tests__/omni-document.entity.spec.ts +55 -55
  5. package/src/__tests__/omni-document.service.spec.ts +83 -83
  6. package/src/__tests__/omni-extension-projection-constraints.spec.ts +518 -518
  7. package/src/__tests__/omni-extension-projection.registration.spec.ts +947 -946
  8. package/src/__tests__/omni-extension-projection.service.spec.ts +806 -806
  9. package/src/__tests__/omni-external-ref.entity.spec.ts +36 -36
  10. package/src/__tests__/omni-external-ref.service.spec.ts +252 -252
  11. package/src/__tests__/omni-named.entity.spec.ts +33 -33
  12. package/src/__tests__/omni-record.entity.spec.ts +32 -32
  13. package/src/__tests__/omni-record.service.spec.ts +107 -107
  14. package/src/__tests__/omni-relation-semantics.spec.ts +102 -102
  15. package/src/__tests__/omni-relation.entity.spec.ts +38 -38
  16. package/src/__tests__/omni-scope-substrate.spec.ts +81 -81
  17. package/src/__tests__/omni-scoped.backend.spec.ts +115 -115
  18. package/src/__tests__/omni-scoped.service.spec.ts +354 -354
  19. package/src/__tests__/omnikernel.diagnostics.spec.ts +94 -94
  20. package/src/__tests__/omnikernel.module.spec.ts +38 -40
  21. package/src/__tests__/omnikernel.persistence.spec.ts +154 -154
  22. package/src/__tests__/omnikernel.public-api.spec.ts +238 -238
  23. package/src/__tests__/omnikernel.query.service.spec.ts +155 -155
  24. package/src/base/omni-base.entity.ts +41 -41
  25. package/src/base/omni-external-ref.entity.ts +53 -53
  26. package/src/base/omni-named.entity.ts +16 -16
  27. package/src/base/omni-record.entity.ts +51 -51
  28. package/src/base/omni-relation.entity.ts +72 -72
  29. package/src/index.ts +49 -49
  30. package/src/omni-collection-kind.enum.ts +10 -10
  31. package/src/omni-collection.backend.ts +16 -16
  32. package/src/omni-collection.dto.ts +170 -170
  33. package/src/omni-collection.entity.ts +21 -21
  34. package/src/omni-collection.service.ts +75 -75
  35. package/src/omni-document-kind.enum.ts +12 -12
  36. package/src/omni-document.backend.ts +16 -16
  37. package/src/omni-document.dto.ts +198 -198
  38. package/src/omni-document.entity.ts +30 -30
  39. package/src/omni-document.service.ts +75 -75
  40. package/src/omni-dto.helpers.ts +21 -21
  41. package/src/omni-extension-projection.definition.ts +294 -294
  42. package/src/omni-extension-projection.resource.ts +274 -274
  43. package/src/omni-extension-projection.service.ts +452 -452
  44. package/src/omni-external-ref-binding.validator.ts +53 -53
  45. package/src/omni-external-ref-internal-type.enum.ts +11 -11
  46. package/src/omni-external-ref.backend.ts +25 -25
  47. package/src/omni-external-ref.dto.ts +128 -128
  48. package/src/omni-external-ref.service.ts +255 -255
  49. package/src/omni-migration.ts +365 -365
  50. package/src/omni-named.backend.ts +11 -11
  51. package/src/omni-named.dto.ts +86 -86
  52. package/src/omni-projection.catalog.ts +345 -345
  53. package/src/omni-projection.lifecycle.ts +53 -53
  54. package/src/omni-record-status.enum.ts +11 -11
  55. package/src/omni-record.backend.ts +19 -19
  56. package/src/omni-record.dto.ts +157 -157
  57. package/src/omni-record.service.ts +113 -113
  58. package/src/omni-relation-kind.contract.ts +49 -49
  59. package/src/omni-relation-kind.enum.ts +12 -12
  60. package/src/omni-relation-projection.definition.ts +166 -166
  61. package/src/omni-relation-projection.resource.ts +360 -360
  62. package/src/omni-relation-projection.service.ts +610 -610
  63. package/src/omni-relation-semantics.ts +52 -52
  64. package/src/omni-relation-status.enum.ts +11 -11
  65. package/src/omni-relation.backend.ts +21 -21
  66. package/src/omni-relation.dto.ts +142 -142
  67. package/src/omni-relation.service.ts +159 -159
  68. package/src/omni-scope.ts +161 -161
  69. package/src/omni-scoped.backend.ts +110 -110
  70. package/src/omni-scoped.repository.ts +34 -34
  71. package/src/omni-scoped.service.ts +338 -338
  72. package/src/omnikernel.diagnostics.ts +83 -83
  73. package/src/omnikernel.module.ts +97 -97
  74. 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
+ });