@mahmoud-auth/model-climbers 0.0.0-stage → 0.1.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.
Files changed (103) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +8 -2
  3. package/dist/base-resource-field/compiler.d.ts +8 -0
  4. package/dist/base-resource-field/compiler.js +33 -0
  5. package/dist/base-resource-field/index.d.ts +3 -0
  6. package/dist/base-resource-field/index.js +19 -0
  7. package/dist/base-resource-field/registry.d.ts +10 -0
  8. package/dist/base-resource-field/registry.js +25 -0
  9. package/dist/base-resource-field/scanner.d.ts +8 -0
  10. package/dist/base-resource-field/scanner.js +14 -0
  11. package/dist/base-resource-field/type.d.ts +6 -0
  12. package/dist/base-resource-field/type.js +2 -0
  13. package/dist/errors/index.d.ts +3 -0
  14. package/dist/errors/index.js +19 -0
  15. package/dist/errors/invalid-resource-provider.exception.d.ts +4 -0
  16. package/dist/errors/invalid-resource-provider.exception.js +11 -0
  17. package/dist/errors/missing-resource-provider.exception.d.ts +4 -0
  18. package/dist/errors/missing-resource-provider.exception.js +10 -0
  19. package/dist/errors/missing-transition.exception.d.ts +4 -0
  20. package/dist/errors/missing-transition.exception.js +10 -0
  21. package/dist/index.d.ts +4 -0
  22. package/dist/index.js +20 -0
  23. package/dist/relations/index.d.ts +4 -0
  24. package/dist/relations/index.js +20 -0
  25. package/dist/relations/module.d.ts +4 -0
  26. package/dist/relations/module.js +33 -0
  27. package/dist/relations/resource-provider/compiler.d.ts +9 -0
  28. package/dist/relations/resource-provider/compiler.js +47 -0
  29. package/dist/relations/resource-provider/decorator.d.ts +9 -0
  30. package/dist/relations/resource-provider/decorator.js +12 -0
  31. package/dist/relations/resource-provider/index.d.ts +4 -0
  32. package/dist/relations/resource-provider/index.js +20 -0
  33. package/dist/relations/resource-provider/module.d.ts +7 -0
  34. package/dist/relations/resource-provider/module.js +39 -0
  35. package/dist/relations/resource-provider/registry.d.ts +8 -0
  36. package/dist/relations/resource-provider/registry.js +31 -0
  37. package/dist/relations/resource-provider/scanner.d.ts +9 -0
  38. package/dist/relations/resource-provider/scanner.js +52 -0
  39. package/dist/relations/resource-provider/type.d.ts +7 -0
  40. package/dist/relations/resource-provider/type.js +2 -0
  41. package/dist/relations/resource-reference/compiler.d.ts +9 -0
  42. package/dist/relations/resource-reference/compiler.js +34 -0
  43. package/dist/relations/resource-reference/decorator.d.ts +7 -0
  44. package/dist/relations/resource-reference/decorator.js +10 -0
  45. package/dist/relations/resource-reference/index.d.ts +4 -0
  46. package/dist/relations/resource-reference/index.js +20 -0
  47. package/dist/relations/resource-reference/module.d.ts +8 -0
  48. package/dist/relations/resource-reference/module.js +46 -0
  49. package/dist/relations/resource-reference/registry.d.ts +4 -0
  50. package/dist/relations/resource-reference/registry.js +24 -0
  51. package/dist/relations/resource-reference/scanner.d.ts +10 -0
  52. package/dist/relations/resource-reference/scanner.js +46 -0
  53. package/dist/relations/resource-reference/type.d.ts +6 -0
  54. package/dist/relations/resource-reference/type.js +2 -0
  55. package/dist/relations/resource-resolver.service.d.ts +20 -0
  56. package/dist/relations/resource-resolver.service.js +137 -0
  57. package/dist/resource/index.d.ts +1 -0
  58. package/dist/resource/index.js +17 -0
  59. package/dist/resource/token.d.ts +4 -0
  60. package/dist/resource/token.js +12 -0
  61. package/dist/resource-cascade/base/base-cascade-helper.repository.d.ts +17 -0
  62. package/dist/resource-cascade/base/base-cascade-helper.repository.js +2 -0
  63. package/dist/resource-cascade/base/base-model.d.ts +13 -0
  64. package/dist/resource-cascade/base/base-model.js +42 -0
  65. package/dist/resource-cascade/base/base-service.d.ts +12 -0
  66. package/dist/resource-cascade/base/base-service.js +82 -0
  67. package/dist/resource-cascade/base/repository-registry.d.ts +7 -0
  68. package/dist/resource-cascade/base/repository-registry.js +13 -0
  69. package/dist/resource-cascade/compiler.d.ts +9 -0
  70. package/dist/resource-cascade/compiler.js +34 -0
  71. package/dist/resource-cascade/decorator.d.ts +10 -0
  72. package/dist/resource-cascade/decorator.js +20 -0
  73. package/dist/resource-cascade/enum.d.ts +4 -0
  74. package/dist/resource-cascade/enum.js +8 -0
  75. package/dist/resource-cascade/index.d.ts +9 -0
  76. package/dist/resource-cascade/index.js +25 -0
  77. package/dist/resource-cascade/module.d.ts +13 -0
  78. package/dist/resource-cascade/module.js +102 -0
  79. package/dist/resource-cascade/mongo/mongo-cascade-helper.repository.d.ts +13 -0
  80. package/dist/resource-cascade/mongo/mongo-cascade-helper.repository.js +50 -0
  81. package/dist/resource-cascade/registry.d.ts +8 -0
  82. package/dist/resource-cascade/registry.js +32 -0
  83. package/dist/resource-cascade/scanner.d.ts +10 -0
  84. package/dist/resource-cascade/scanner.js +43 -0
  85. package/dist/resource-cascade/token.d.ts +4 -0
  86. package/dist/resource-cascade/token.js +10 -0
  87. package/dist/resource-cascade/type.d.ts +8 -0
  88. package/dist/resource-cascade/type.js +2 -0
  89. package/dist/transition/compiler.d.ts +8 -0
  90. package/dist/transition/compiler.js +35 -0
  91. package/dist/transition/decorator.d.ts +3 -0
  92. package/dist/transition/decorator.js +12 -0
  93. package/dist/transition/index.d.ts +2 -0
  94. package/dist/transition/index.js +18 -0
  95. package/dist/transition/module.d.ts +7 -0
  96. package/dist/transition/module.js +35 -0
  97. package/dist/transition/registry.d.ts +8 -0
  98. package/dist/transition/registry.js +34 -0
  99. package/dist/transition/scanner.d.ts +8 -0
  100. package/dist/transition/scanner.js +50 -0
  101. package/dist/transition/type.d.ts +8 -0
  102. package/dist/transition/type.js +2 -0
  103. package/package.json +41 -4
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CascadeRepositoryRegistry = void 0;
4
+ class CascadeRepositoryRegistry {
5
+ repositories;
6
+ constructor(repositories) {
7
+ this.repositories = repositories;
8
+ }
9
+ get(type) {
10
+ return this.repositories.get(type);
11
+ }
12
+ }
13
+ exports.CascadeRepositoryRegistry = CascadeRepositoryRegistry;
@@ -0,0 +1,9 @@
1
+ import { ResourceCascadeRegistry } from "./registry";
2
+ import { ResourceCascadeScanner } from "./scanner";
3
+ import { ResourceFieldCompiler } from "../base-resource-field/compiler";
4
+ export declare class ResourceCascadeCompiler extends ResourceFieldCompiler {
5
+ private readonly cascadeScanner;
6
+ private readonly cascadeRegistry;
7
+ constructor(cascadeScanner: ResourceCascadeScanner, cascadeRegistry: ResourceCascadeRegistry);
8
+ compileCascades(): void;
9
+ }
@@ -0,0 +1,34 @@
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
+ exports.ResourceCascadeCompiler = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const registry_1 = require("./registry");
15
+ const scanner_1 = require("./scanner");
16
+ const compiler_1 = require("../base-resource-field/compiler");
17
+ let ResourceCascadeCompiler = class ResourceCascadeCompiler extends compiler_1.ResourceFieldCompiler {
18
+ cascadeScanner;
19
+ cascadeRegistry;
20
+ constructor(cascadeScanner, cascadeRegistry) {
21
+ super(cascadeScanner, cascadeRegistry);
22
+ this.cascadeScanner = cascadeScanner;
23
+ this.cascadeRegistry = cascadeRegistry;
24
+ }
25
+ compileCascades() {
26
+ super.compileFields();
27
+ }
28
+ };
29
+ exports.ResourceCascadeCompiler = ResourceCascadeCompiler;
30
+ exports.ResourceCascadeCompiler = ResourceCascadeCompiler = __decorate([
31
+ (0, common_1.Injectable)(),
32
+ __metadata("design:paramtypes", [scanner_1.ResourceCascadeScanner,
33
+ registry_1.ResourceCascadeRegistry])
34
+ ], ResourceCascadeCompiler);
@@ -0,0 +1,10 @@
1
+ import { Type } from "@nestjs/common";
2
+ import { CascadeType } from "./enum";
3
+ export interface ResourceCascadeMetadata<K = unknown> {
4
+ propertyKey: string;
5
+ targetModel: () => Type<K>;
6
+ type: CascadeType;
7
+ }
8
+ export declare const RESOURCE_CASCADE_METADATA: unique symbol;
9
+ export declare const getResourceCascadeModels: () => Type[];
10
+ export declare const ResourceCascade: (targetModelFunction: () => Type, type: CascadeType) => PropertyDecorator;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ResourceCascade = exports.getResourceCascadeModels = exports.RESOURCE_CASCADE_METADATA = void 0;
4
+ exports.RESOURCE_CASCADE_METADATA = Symbol('RESOURCE_CASCADE');
5
+ const resourceCascadeModels = new Set();
6
+ const getResourceCascadeModels = () => Array.from(resourceCascadeModels);
7
+ exports.getResourceCascadeModels = getResourceCascadeModels;
8
+ const ResourceCascade = (targetModelFunction, type) => (prototype, propertyKey) => {
9
+ resourceCascadeModels.add(prototype.constructor);
10
+ const existing = [
11
+ ...(Reflect.getOwnMetadata(exports.RESOURCE_CASCADE_METADATA, prototype.constructor) || []),
12
+ ];
13
+ existing.push({
14
+ propertyKey: propertyKey.toString(),
15
+ targetModel: targetModelFunction,
16
+ type
17
+ });
18
+ Reflect.defineMetadata(exports.RESOURCE_CASCADE_METADATA, existing, prototype.constructor);
19
+ };
20
+ exports.ResourceCascade = ResourceCascade;
@@ -0,0 +1,4 @@
1
+ export declare enum CascadeType {
2
+ NULL = "null",
3
+ DELETE = "delete"
4
+ }
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CascadeType = void 0;
4
+ var CascadeType;
5
+ (function (CascadeType) {
6
+ CascadeType["NULL"] = "null";
7
+ CascadeType["DELETE"] = "delete";
8
+ })(CascadeType || (exports.CascadeType = CascadeType = {}));
@@ -0,0 +1,9 @@
1
+ export * from './decorator';
2
+ export * from './enum';
3
+ export * from './type';
4
+ export * from './module';
5
+ export * from './registry';
6
+ export * from './base/base-model';
7
+ export * from './base/base-cascade-helper.repository';
8
+ export * from './base/base-service';
9
+ export * from './token';
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./decorator"), exports);
18
+ __exportStar(require("./enum"), exports);
19
+ __exportStar(require("./type"), exports);
20
+ __exportStar(require("./module"), exports);
21
+ __exportStar(require("./registry"), exports);
22
+ __exportStar(require("./base/base-model"), exports);
23
+ __exportStar(require("./base/base-cascade-helper.repository"), exports);
24
+ __exportStar(require("./base/base-service"), exports);
25
+ __exportStar(require("./token"), exports);
@@ -0,0 +1,13 @@
1
+ import { DynamicModule, OnModuleInit, Type } from '@nestjs/common';
2
+ import { ModelDefinition } from '@nestjs/mongoose';
3
+ import { ResourceCascadeCompiler } from './compiler';
4
+ export interface CascadeModelDefinition<T = unknown> extends ModelDefinition {
5
+ type: Type<T>;
6
+ }
7
+ export declare class ResourceCascadeModule implements OnModuleInit {
8
+ private readonly resourceCascadeCompiler?;
9
+ constructor(resourceCascadeCompiler?: ResourceCascadeCompiler | undefined);
10
+ onModuleInit(): void;
11
+ static forRoot(resources: CascadeModelDefinition[], connectionName?: string): DynamicModule;
12
+ static forFeature<T>(...resources: Type<T>[]): DynamicModule;
13
+ }
@@ -0,0 +1,102 @@
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
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ var ResourceCascadeModule_1;
15
+ Object.defineProperty(exports, "__esModule", { value: true });
16
+ exports.ResourceCascadeModule = void 0;
17
+ const common_1 = require("@nestjs/common");
18
+ const core_1 = require("@nestjs/core");
19
+ const mongoose_1 = require("@nestjs/mongoose");
20
+ const utils_1 = require("@mahmoud-auth/utils");
21
+ const base_model_1 = require("./base/base-model");
22
+ const base_service_1 = require("./base/base-service");
23
+ const repository_registry_1 = require("./base/repository-registry");
24
+ const compiler_1 = require("./compiler");
25
+ const mongo_cascade_helper_repository_1 = require("./mongo/mongo-cascade-helper.repository");
26
+ const registry_1 = require("./registry");
27
+ const scanner_1 = require("./scanner");
28
+ const token_1 = require("./token");
29
+ let ResourceCascadeModule = ResourceCascadeModule_1 = class ResourceCascadeModule {
30
+ resourceCascadeCompiler;
31
+ constructor(resourceCascadeCompiler) {
32
+ this.resourceCascadeCompiler = resourceCascadeCompiler;
33
+ }
34
+ onModuleInit() {
35
+ this.resourceCascadeCompiler?.compileCascades();
36
+ }
37
+ static forRoot(resources, connectionName) {
38
+ if (resources.length === 0) {
39
+ throw new Error('ResourceCascadeModule.forRoot requires at least one model');
40
+ }
41
+ const resourceTypes = new Set(resources.map(({ type }) => type));
42
+ if (resourceTypes.size !== resources.length) {
43
+ throw new Error('ResourceCascadeModule.forRoot cannot register the same resource type more than once');
44
+ }
45
+ const resourceTypeNames = new Set(resources.map(({ type }) => type.name));
46
+ if (resourceTypeNames.size !== resources.length) {
47
+ throw new Error('ResourceCascadeModule.forRoot requires unique resource class names');
48
+ }
49
+ const modelNames = new Set(resources.map(({ name }) => name));
50
+ if (modelNames.size !== resources.length) {
51
+ throw new Error('ResourceCascadeModule.forRoot cannot register the same Mongoose model name more than once');
52
+ }
53
+ const modelTokens = resources.map(({ name }) => (0, mongoose_1.getModelToken)(name, connectionName));
54
+ const cascadeModelTokens = resources.map(({ type }) => (0, token_1.getCascadeMongooseModelToken)(type));
55
+ const modelAliases = resources.map(({ type }, index) => (0, utils_1.useFactory)(cascadeModelTokens[index], (model) => model, { inject: [modelTokens[index]] }));
56
+ return {
57
+ module: ResourceCascadeModule_1,
58
+ global: true,
59
+ imports: [
60
+ core_1.DiscoveryModule,
61
+ mongoose_1.MongooseModule.forFeature(resources.map(({ type: _type, ...definition }) => definition), connectionName),
62
+ ],
63
+ providers: [
64
+ (0, utils_1.useValue)(registry_1.ResourceCascadeRegistry, new registry_1.ResourceCascadeRegistry()),
65
+ scanner_1.ResourceCascadeScanner,
66
+ compiler_1.ResourceCascadeCompiler,
67
+ (0, utils_1.useFactory)(repository_registry_1.CascadeRepositoryRegistry, (...models) => {
68
+ const repositories = models.map(model => new mongo_cascade_helper_repository_1.MongoCascadeHelperRepository(model));
69
+ return new repository_registry_1.CascadeRepositoryRegistry((0, utils_1.getClassInstanceMapByKey)(repositories, (_repository, index) => resources[index].type));
70
+ }, { inject: modelTokens }),
71
+ (0, utils_1.useFactory)(base_service_1.CascadeService, (registry, repositories) => new base_service_1.CascadeService(registry, repositories), { inject: [registry_1.ResourceCascadeRegistry, repository_registry_1.CascadeRepositoryRegistry] }),
72
+ ...modelAliases,
73
+ ],
74
+ exports: [
75
+ base_service_1.CascadeService,
76
+ registry_1.ResourceCascadeRegistry,
77
+ repository_registry_1.CascadeRepositoryRegistry,
78
+ ...cascadeModelTokens,
79
+ ],
80
+ };
81
+ }
82
+ static forFeature(...resources) {
83
+ if (resources.length === 0) {
84
+ throw new Error('ResourceCascadeModule.forFeature requires at least one resource type');
85
+ }
86
+ if (new Set(resources).size !== resources.length) {
87
+ throw new Error('ResourceCascadeModule.forFeature cannot register the same resource type more than once');
88
+ }
89
+ const cascadeModelTokens = resources.map(resource => (0, token_1.getCascadeModelToken)(resource.name));
90
+ return {
91
+ module: ResourceCascadeModule_1,
92
+ providers: resources.map((type, index) => (0, utils_1.useFactory)(cascadeModelTokens[index], (model, cascadeService) => new base_model_1.CascadeModel(model, cascadeService, type), { inject: [(0, token_1.getCascadeMongooseModelToken)(type), base_service_1.CascadeService] })),
93
+ exports: cascadeModelTokens,
94
+ };
95
+ }
96
+ };
97
+ exports.ResourceCascadeModule = ResourceCascadeModule;
98
+ exports.ResourceCascadeModule = ResourceCascadeModule = ResourceCascadeModule_1 = __decorate([
99
+ (0, common_1.Module)({}),
100
+ __param(0, (0, common_1.Optional)()),
101
+ __metadata("design:paramtypes", [compiler_1.ResourceCascadeCompiler])
102
+ ], ResourceCascadeModule);
@@ -0,0 +1,13 @@
1
+ import { Model, RootFilterQuery } from "mongoose";
2
+ import { CascadeDeleteOptions } from '../base/base-cascade-helper.repository';
3
+ import { ICascadeHelperRepository } from "../base/base-cascade-helper.repository";
4
+ export declare class MongoCascadeHelperRepository<T> implements ICascadeHelperRepository<T> {
5
+ private readonly model;
6
+ constructor(model: Model<T>);
7
+ getIdKey(id: unknown): string;
8
+ findIds(filter: RootFilterQuery<T>, options?: CascadeDeleteOptions): Promise<unknown[]>;
9
+ findIdsByField(field: string, value: unknown, options?: CascadeDeleteOptions): Promise<unknown[]>;
10
+ findIdByField(field: string, value: unknown): Promise<unknown>;
11
+ nullifyByField(field: string, value: unknown, options?: CascadeDeleteOptions): Promise<void>;
12
+ deleteById(id: unknown, options?: CascadeDeleteOptions): Promise<unknown | null>;
13
+ }
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MongoCascadeHelperRepository = void 0;
4
+ class MongoCascadeHelperRepository {
5
+ model;
6
+ constructor(model) {
7
+ this.model = model;
8
+ }
9
+ getIdKey(id) {
10
+ if (id && typeof id === 'object' && 'toHexString' in id && typeof id.toHexString === 'function') {
11
+ return id.toHexString();
12
+ }
13
+ return String(id);
14
+ }
15
+ async findIds(filter, options) {
16
+ const query = options
17
+ ? this.model.find(filter, { _id: 1 }, options)
18
+ : this.model.find(filter, { _id: 1 });
19
+ const documents = await query.lean();
20
+ return documents.map(({ _id }) => _id);
21
+ }
22
+ async findIdsByField(field, value, options) {
23
+ const filter = { [field]: value };
24
+ const query = options
25
+ ? this.model.find(filter, { _id: 1 }, options)
26
+ : this.model.find(filter, { _id: 1 });
27
+ const documents = await query.lean();
28
+ return documents.map(({ _id }) => _id);
29
+ }
30
+ async findIdByField(field, value) {
31
+ const document = await this.model.findOne({ [field]: value }, { _id: 1 }).lean();
32
+ return document?._id;
33
+ }
34
+ async nullifyByField(field, value, options) {
35
+ const filter = { [field]: value };
36
+ const update = { $set: { [field]: null } };
37
+ if (options) {
38
+ await this.model.updateMany(filter, update, options);
39
+ return;
40
+ }
41
+ await this.model.updateMany(filter, update);
42
+ }
43
+ async deleteById(id, options) {
44
+ if (options) {
45
+ return this.model.findByIdAndDelete(id, options);
46
+ }
47
+ return this.model.findByIdAndDelete(id);
48
+ }
49
+ }
50
+ exports.MongoCascadeHelperRepository = MongoCascadeHelperRepository;
@@ -0,0 +1,8 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { ResourceFieldRegistry } from '../base-resource-field';
3
+ import { IResourceCascade } from './type';
4
+ export declare class ResourceCascadeRegistry extends ResourceFieldRegistry {
5
+ constructor();
6
+ register<T, K>(resourceCascade: IResourceCascade<T, K>): void;
7
+ getReferencing<T>(targetModel: Type<T>): IResourceCascade<unknown, T>[];
8
+ }
@@ -0,0 +1,32 @@
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
+ exports.ResourceCascadeRegistry = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const base_resource_field_1 = require("../base-resource-field");
15
+ let ResourceCascadeRegistry = class ResourceCascadeRegistry extends base_resource_field_1.ResourceFieldRegistry {
16
+ constructor() {
17
+ super(new Map());
18
+ }
19
+ register(resourceCascade) {
20
+ super.register(resourceCascade);
21
+ }
22
+ getReferencing(targetModel) {
23
+ return Array.from(this.entries.values())
24
+ .flat()
25
+ .filter(cascade => cascade.targetModel === targetModel);
26
+ }
27
+ };
28
+ exports.ResourceCascadeRegistry = ResourceCascadeRegistry;
29
+ exports.ResourceCascadeRegistry = ResourceCascadeRegistry = __decorate([
30
+ (0, common_1.Injectable)(),
31
+ __metadata("design:paramtypes", [])
32
+ ], ResourceCascadeRegistry);
@@ -0,0 +1,10 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { Reflector } from '@nestjs/core';
3
+ import { ResourceFieldScanner } from '../base-resource-field';
4
+ import { IResourceCascade } from './type';
5
+ export declare class ResourceCascadeScanner extends ResourceFieldScanner {
6
+ private readonly reflector;
7
+ constructor(reflector: Reflector);
8
+ lookupFields(): IResourceCascade<unknown, unknown>[];
9
+ protected getMetadata<T>(target: Type<T>): IResourceCascade<T, unknown>[];
10
+ }
@@ -0,0 +1,43 @@
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
+ exports.ResourceCascadeScanner = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const base_resource_field_1 = require("../base-resource-field");
16
+ const decorator_1 = require("./decorator");
17
+ let ResourceCascadeScanner = class ResourceCascadeScanner extends base_resource_field_1.ResourceFieldScanner {
18
+ reflector;
19
+ constructor(reflector) {
20
+ super((0, decorator_1.getResourceCascadeModels)());
21
+ this.reflector = reflector;
22
+ }
23
+ lookupFields() {
24
+ return super.lookupFields();
25
+ }
26
+ getMetadata(target) {
27
+ const cascades = this.reflector.get(decorator_1.RESOURCE_CASCADE_METADATA, target);
28
+ if (!cascades) {
29
+ return [];
30
+ }
31
+ return cascades.map(({ targetModel, propertyKey, type }) => ({
32
+ sourceModel: target,
33
+ targetModel: targetModel(),
34
+ propertyKey,
35
+ type
36
+ }));
37
+ }
38
+ };
39
+ exports.ResourceCascadeScanner = ResourceCascadeScanner;
40
+ exports.ResourceCascadeScanner = ResourceCascadeScanner = __decorate([
41
+ (0, common_1.Injectable)(),
42
+ __metadata("design:paramtypes", [core_1.Reflector])
43
+ ], ResourceCascadeScanner);
@@ -0,0 +1,4 @@
1
+ import { Type } from "@nestjs/common";
2
+ export declare const getCascadeModelToken: (name: string) => string;
3
+ export declare const InjectCascadeModel: (name: string) => PropertyDecorator & ParameterDecorator;
4
+ export declare const getCascadeMongooseModelToken: (type: Type) => string;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getCascadeMongooseModelToken = exports.InjectCascadeModel = exports.getCascadeModelToken = void 0;
4
+ const common_1 = require("@nestjs/common");
5
+ const getCascadeModelToken = (name) => `CASCADE_MODEL(${name})`;
6
+ exports.getCascadeModelToken = getCascadeModelToken;
7
+ const InjectCascadeModel = (name) => (0, common_1.Inject)((0, exports.getCascadeModelToken)(name));
8
+ exports.InjectCascadeModel = InjectCascadeModel;
9
+ const getCascadeMongooseModelToken = (type) => `CASCADE_MONGOOSE_MODEL(${type.name})`;
10
+ exports.getCascadeMongooseModelToken = getCascadeMongooseModelToken;
@@ -0,0 +1,8 @@
1
+ import { Type } from "@nestjs/common";
2
+ import { CascadeType } from "./enum";
3
+ export interface IResourceCascade<T, K> {
4
+ sourceModel: Type<T>;
5
+ targetModel: Type<K>;
6
+ propertyKey: string;
7
+ type: CascadeType;
8
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,8 @@
1
+ import { TransitionScanner } from "./scanner";
2
+ import { TransitionRegistry } from "./registry";
3
+ export declare class TransitionCompiler {
4
+ private readonly scanner;
5
+ private readonly registry;
6
+ constructor(scanner: TransitionScanner, registry: TransitionRegistry);
7
+ compileTransitions(): void;
8
+ }
@@ -0,0 +1,35 @@
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
+ exports.TransitionCompiler = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const scanner_1 = require("./scanner");
15
+ const registry_1 = require("./registry");
16
+ let TransitionCompiler = class TransitionCompiler {
17
+ scanner;
18
+ registry;
19
+ constructor(scanner, registry) {
20
+ this.scanner = scanner;
21
+ this.registry = registry;
22
+ }
23
+ compileTransitions() {
24
+ this.scanner
25
+ .lookupTransitions()
26
+ .forEach(transition => this.registry.registryEntry(transition));
27
+ this.registry.freeze();
28
+ }
29
+ };
30
+ exports.TransitionCompiler = TransitionCompiler;
31
+ exports.TransitionCompiler = TransitionCompiler = __decorate([
32
+ (0, common_1.Injectable)(),
33
+ __metadata("design:paramtypes", [scanner_1.TransitionScanner,
34
+ registry_1.TransitionRegistry])
35
+ ], TransitionCompiler);
@@ -0,0 +1,3 @@
1
+ import { Type } from '@nestjs/common';
2
+ export declare const TRANSITION_METADATA: unique symbol;
3
+ export declare function Transition<T, K>(from: Type<T>, to: Type<K>): import("@nestjs/common").CustomDecorator<typeof TRANSITION_METADATA>;
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TRANSITION_METADATA = void 0;
4
+ exports.Transition = Transition;
5
+ const common_1 = require("@nestjs/common");
6
+ exports.TRANSITION_METADATA = Symbol('TRANSITION');
7
+ function Transition(from, to) {
8
+ return (0, common_1.SetMetadata)(exports.TRANSITION_METADATA, {
9
+ from,
10
+ to
11
+ });
12
+ }
@@ -0,0 +1,2 @@
1
+ export * from './registry';
2
+ export * from './module';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./registry"), exports);
18
+ __exportStar(require("./module"), exports);
@@ -0,0 +1,7 @@
1
+ import { OnModuleInit } from "@nestjs/common";
2
+ import { TransitionCompiler } from "./compiler";
3
+ export declare class TransitionModule implements OnModuleInit {
4
+ private readonly transitionCompiler;
5
+ constructor(transitionCompiler: TransitionCompiler);
6
+ onModuleInit(): void;
7
+ }
@@ -0,0 +1,35 @@
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
+ exports.TransitionModule = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const core_1 = require("@nestjs/core");
15
+ const compiler_1 = require("./compiler");
16
+ const registry_1 = require("./registry");
17
+ const scanner_1 = require("./scanner");
18
+ let TransitionModule = class TransitionModule {
19
+ transitionCompiler;
20
+ constructor(transitionCompiler) {
21
+ this.transitionCompiler = transitionCompiler;
22
+ }
23
+ onModuleInit() {
24
+ this.transitionCompiler.compileTransitions();
25
+ }
26
+ };
27
+ exports.TransitionModule = TransitionModule;
28
+ exports.TransitionModule = TransitionModule = __decorate([
29
+ (0, common_1.Module)({
30
+ imports: [core_1.DiscoveryModule],
31
+ providers: [registry_1.TransitionRegistry, scanner_1.TransitionScanner, compiler_1.TransitionCompiler],
32
+ exports: [registry_1.TransitionRegistry]
33
+ }),
34
+ __metadata("design:paramtypes", [compiler_1.TransitionCompiler])
35
+ ], TransitionModule);
@@ -0,0 +1,8 @@
1
+ import { Type } from '@nestjs/common';
2
+ import { BaseMahmoudRegistry } from '@mahmoud-auth/base-registry';
3
+ import { ResourceTransition } from './type';
4
+ export declare class TransitionRegistry extends BaseMahmoudRegistry<string, ResourceTransition<any, any>> {
5
+ constructor();
6
+ registryEntry<T, K>(transition: ResourceTransition<T, K>): void;
7
+ get<From, To>(from: Type, to: Type): ResourceTransition<From, To> | undefined;
8
+ }
@@ -0,0 +1,34 @@
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
+ exports.TransitionRegistry = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const base_registry_1 = require("@mahmoud-auth/base-registry");
15
+ const key = (from, to) => {
16
+ return `${from.name}->${to.name}`;
17
+ };
18
+ let TransitionRegistry = class TransitionRegistry extends base_registry_1.BaseMahmoudRegistry {
19
+ constructor() {
20
+ super(new Map());
21
+ }
22
+ registryEntry(transition) {
23
+ this.checkIsFrozen(this.constructor.name);
24
+ this.entries.set(key(transition.from, transition.to), transition);
25
+ }
26
+ get(from, to) {
27
+ return this.entries.get(key(from, to));
28
+ }
29
+ };
30
+ exports.TransitionRegistry = TransitionRegistry;
31
+ exports.TransitionRegistry = TransitionRegistry = __decorate([
32
+ (0, common_1.Injectable)(),
33
+ __metadata("design:paramtypes", [])
34
+ ], TransitionRegistry);