nestjs-usecases 1.0.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.
- package/dist/command.d.ts +17 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +21 -0
- package/dist/command.js.map +1 -0
- package/dist/constants.d.ts +4 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +7 -0
- package/dist/constants.js.map +1 -0
- package/dist/decorators.d.ts +6 -0
- package/dist/decorators.d.ts.map +1 -0
- package/dist/decorators.js +55 -0
- package/dist/decorators.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/tokens.d.ts +2 -0
- package/dist/tokens.d.ts.map +1 -0
- package/dist/tokens.js +5 -0
- package/dist/tokens.js.map +1 -0
- package/dist/types.d.ts +7 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/usecase.d.ts +21 -0
- package/dist/usecase.d.ts.map +1 -0
- package/dist/usecase.js +29 -0
- package/dist/usecase.js.map +1 -0
- package/dist/usecases.module.d.ts +12 -0
- package/dist/usecases.module.d.ts.map +1 -0
- package/dist/usecases.module.js +46 -0
- package/dist/usecases.module.js.map +1 -0
- package/dist/util-types.d.ts +4 -0
- package/dist/util-types.d.ts.map +1 -0
- package/dist/util-types.js +3 -0
- package/dist/util-types.js.map +1 -0
- package/package.json +28 -0
- package/tsconfig.json +47 -0
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Command } from "@nestjs/cqrs";
|
|
2
|
+
import { Class } from "type-fest";
|
|
3
|
+
import { ClassStatic } from "./util-types";
|
|
4
|
+
export declare class UseCaseCommand<TPayload = any, TResult = any> extends Command<TResult> {
|
|
5
|
+
readonly id: string;
|
|
6
|
+
readonly timestamp: number;
|
|
7
|
+
readonly payload: TPayload;
|
|
8
|
+
readonly causationId?: string | undefined;
|
|
9
|
+
readonly correlationIds?: Record<string, string> | undefined;
|
|
10
|
+
constructor(id: string, timestamp: number, payload: TPayload, causationId?: string | undefined, correlationIds?: Record<string, string> | undefined);
|
|
11
|
+
}
|
|
12
|
+
export type InferredCommandPayload<T extends UseCaseCommand> = T extends UseCaseCommand<infer P> ? P : never;
|
|
13
|
+
export type InferredCommandResult<T extends UseCaseCommand> = T extends UseCaseCommand<any, infer R> ? R : never;
|
|
14
|
+
export type ExplicitUseCaseCommandClass<TPayload = any, TResult = any> = Class<UseCaseCommand<TPayload, TResult>, ConstructorParameters<typeof UseCaseCommand<TPayload, TResult>>> & ClassStatic<typeof UseCaseCommand<TPayload, TResult>>;
|
|
15
|
+
export type InferredUseCaseCommandClass<T extends UseCaseCommand> = ExplicitUseCaseCommandClass<InferredCommandPayload<T>, InferredCommandResult<T>>;
|
|
16
|
+
export type UseCaseCommandClass<T extends UseCaseCommand = UseCaseCommand> = InferredUseCaseCommandClass<T>;
|
|
17
|
+
//# sourceMappingURL=command.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,qBAAa,cAAc,CACzB,QAAQ,GAAG,GAAG,EACd,OAAO,GAAG,GAAG,CACb,SAAQ,OAAO,CAAC,OAAO,CAAC;aAEN,EAAE,EAAE,MAAM;aACV,SAAS,EAAE,MAAM;aACjB,OAAO,EAAE,QAAQ;aACjB,WAAW,CAAC,EAAE,MAAM;aACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;gBAJvC,EAAE,EAAE,MAAM,EACV,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,QAAQ,EACjB,WAAW,CAAC,EAAE,MAAM,YAAA,EACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,YAAA;CAI1D;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,cAAc,IACzD,CAAC,SAAS,cAAc,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEhD,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,cAAc,IACxD,CAAC,SAAS,cAAc,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAErD,MAAM,MAAM,2BAA2B,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,KAAK,CAC5E,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,EACjC,qBAAqB,CAAC,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAChE,GACC,WAAW,CAAC,OAAO,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAExD,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,cAAc,IAC9D,2BAA2B,CACzB,sBAAsB,CAAC,CAAC,CAAC,EACzB,qBAAqB,CAAC,CAAC,CAAC,CACzB,CAAC;AAEJ,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IACvE,2BAA2B,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/command.js
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UseCaseCommand = void 0;
|
|
4
|
+
const cqrs_1 = require("@nestjs/cqrs");
|
|
5
|
+
class UseCaseCommand extends cqrs_1.Command {
|
|
6
|
+
id;
|
|
7
|
+
timestamp;
|
|
8
|
+
payload;
|
|
9
|
+
causationId;
|
|
10
|
+
correlationIds;
|
|
11
|
+
constructor(id, timestamp, payload, causationId, correlationIds) {
|
|
12
|
+
super();
|
|
13
|
+
this.id = id;
|
|
14
|
+
this.timestamp = timestamp;
|
|
15
|
+
this.payload = payload;
|
|
16
|
+
this.causationId = causationId;
|
|
17
|
+
this.correlationIds = correlationIds;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
exports.UseCaseCommand = UseCaseCommand;
|
|
21
|
+
//# sourceMappingURL=command.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":";;;AAAA,uCAAuC;AAIvC,MAAa,cAGX,SAAQ,cAAgB;IAEN;IACA;IACA;IACA;IACA;IALlB,YACkB,EAAU,EACV,SAAiB,EACjB,OAAiB,EACjB,WAAoB,EACpB,cAAuC;QAEvD,KAAK,EAAE,CAAC;QANQ,OAAE,GAAF,EAAE,CAAQ;QACV,cAAS,GAAT,SAAS,CAAQ;QACjB,YAAO,GAAP,OAAO,CAAU;QACjB,gBAAW,GAAX,WAAW,CAAS;QACpB,mBAAc,GAAd,cAAc,CAAyB;IAGzD,CAAC;CACF;AAbD,wCAaC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AACvE,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AACvE,eAAO,MAAM,uBAAuB,eAAoC,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.USE_CASE_HANDLER_METHOD = exports.USE_CASE_HANDLER_CLASS = exports.USE_CASE_COMMAND_CLASS = void 0;
|
|
4
|
+
exports.USE_CASE_COMMAND_CLASS = Symbol("USE_CASE_COMMAND_CLASS");
|
|
5
|
+
exports.USE_CASE_HANDLER_CLASS = Symbol("USE_CASE_HANDLER_CLASS");
|
|
6
|
+
exports.USE_CASE_HANDLER_METHOD = Symbol("USE_CASE_HANDLER_METHOD");
|
|
7
|
+
//# sourceMappingURL=constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,uBAAuB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { ExplicitUseCaseClass, InferredUseCasePayload, InferredUseCaseResult, UseCase, UseCaseHandlerFn } from "./usecase";
|
|
3
|
+
export declare const RegisterUseCase: <TPayload, TResult>(target: ExplicitUseCaseClass<TPayload, TResult>) => void;
|
|
4
|
+
export declare const UseCaseHandler: <T extends UseCase>(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor<UseCaseHandlerFn<InferredUseCasePayload<T>, InferredUseCaseResult<T>>>) => void;
|
|
5
|
+
export declare const InjectUseCaseCommandBus: () => PropertyDecorator & ParameterDecorator;
|
|
6
|
+
//# sourceMappingURL=decorators.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.d.ts","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":"AAEA,OAAO,kBAAkB,CAAC;AAQ1B,OAAO,EACL,oBAAoB,EACpB,sBAAsB,EACtB,qBAAqB,EACrB,OAAO,EACP,gBAAgB,EACjB,MAAM,WAAW,CAAC;AAEnB,eAAO,MAAM,eAAe,GAAI,QAAQ,EAAE,OAAO,EAC/C,QAAQ,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,SAmChD,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,OAAO,EAC9C,QAAQ,GAAG,EACX,aAAa,MAAM,EACnB,YAAY,uBAAuB,CACjC,gBAAgB,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,CACtE,SAGF,CAAC;AAEF,eAAO,MAAM,uBAAuB,8CAA4B,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.InjectUseCaseCommandBus = exports.UseCaseHandler = exports.RegisterUseCase = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const cqrs_1 = require("@nestjs/cqrs");
|
|
18
|
+
require("reflect-metadata");
|
|
19
|
+
const command_1 = require("./command");
|
|
20
|
+
const constants_1 = require("./constants");
|
|
21
|
+
const tokens_1 = require("./tokens");
|
|
22
|
+
const RegisterUseCase = (target) => {
|
|
23
|
+
class GeneratedUseCaseCommand extends command_1.UseCaseCommand {
|
|
24
|
+
}
|
|
25
|
+
let GeneratedUseCaseCommandHandler = class GeneratedUseCaseCommandHandler {
|
|
26
|
+
useCase;
|
|
27
|
+
constructor(useCase) {
|
|
28
|
+
this.useCase = useCase;
|
|
29
|
+
}
|
|
30
|
+
execute(command) {
|
|
31
|
+
const { payload } = command;
|
|
32
|
+
// Use getMetadata instead of getOwnMetadata, so we can have hierarchical effect
|
|
33
|
+
const handler = Reflect.getMetadata(constants_1.USE_CASE_HANDLER_METHOD, target.prototype);
|
|
34
|
+
if (!handler)
|
|
35
|
+
throw new Error("Handler method is not defined");
|
|
36
|
+
return handler.call(this.useCase, payload);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
GeneratedUseCaseCommandHandler = __decorate([
|
|
40
|
+
(0, cqrs_1.CommandHandler)(GeneratedUseCaseCommand),
|
|
41
|
+
__param(0, (0, common_1.Inject)(target)),
|
|
42
|
+
__metadata("design:paramtypes", [void 0])
|
|
43
|
+
], GeneratedUseCaseCommandHandler);
|
|
44
|
+
Reflect.defineMetadata(constants_1.USE_CASE_COMMAND_CLASS, GeneratedUseCaseCommand, target);
|
|
45
|
+
Reflect.defineMetadata(constants_1.USE_CASE_HANDLER_CLASS, GeneratedUseCaseCommandHandler, target);
|
|
46
|
+
(0, common_1.Injectable)()(target);
|
|
47
|
+
};
|
|
48
|
+
exports.RegisterUseCase = RegisterUseCase;
|
|
49
|
+
const UseCaseHandler = (target, propertyKey, descriptor) => {
|
|
50
|
+
Reflect.defineMetadata(constants_1.USE_CASE_HANDLER_METHOD, descriptor.value, target);
|
|
51
|
+
};
|
|
52
|
+
exports.UseCaseHandler = UseCaseHandler;
|
|
53
|
+
const InjectUseCaseCommandBus = () => (0, common_1.Inject)(tokens_1.COMMAND_BUS);
|
|
54
|
+
exports.InjectUseCaseCommandBus = InjectUseCaseCommandBus;
|
|
55
|
+
//# sourceMappingURL=decorators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"decorators.js","sourceRoot":"","sources":["../src/decorators.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,uCAA+D;AAC/D,4BAA0B;AAC1B,uCAA2C;AAC3C,2CAIqB;AACrB,qCAAuC;AAShC,MAAM,eAAe,GAAG,CAC7B,MAA+C,EAC/C,EAAE;IACF,MAAM,uBAAwB,SAAQ,wBAAiC;KAAG;IAE1E,IACM,8BAA8B,GADpC,MACM,8BAA8B;QACE;QAApC,YAAoC,OAAoC;YAApC,YAAO,GAAP,OAAO,CAA6B;QAAG,CAAC;QAE5E,OAAO,CAAC,OAAgC;YACtC,MAAM,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;YAE5B,gFAAgF;YAChF,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CACjC,mCAAuB,EACvB,MAAM,CAAC,SAAS,CACkC,CAAC;YAErD,IAAI,CAAC,OAAO;gBAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAE/D,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC7C,CAAC;KACF,CAAA;IAhBK,8BAA8B;QADnC,IAAA,qBAAc,EAAC,uBAAuB,CAAC;QAEzB,WAAA,IAAA,eAAM,EAAC,MAAM,CAAC,CAAA;;OADvB,8BAA8B,CAgBnC;IAED,OAAO,CAAC,cAAc,CACpB,kCAAsB,EACtB,uBAAuB,EACvB,MAAM,CACP,CAAC;IACF,OAAO,CAAC,cAAc,CACpB,kCAAsB,EACtB,8BAA8B,EAC9B,MAAM,CACP,CAAC;IAEF,IAAA,mBAAU,GAAE,CAAC,MAAM,CAAC,CAAC;AACvB,CAAC,CAAC;AApCW,QAAA,eAAe,mBAoC1B;AAEK,MAAM,cAAc,GAAG,CAC5B,MAAW,EACX,WAAmB,EACnB,UAEC,EACD,EAAE;IACF,OAAO,CAAC,cAAc,CAAC,mCAAuB,EAAE,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;AAC5E,CAAC,CAAC;AARW,QAAA,cAAc,kBAQzB;AAEK,MAAM,uBAAuB,GAAG,GAAG,EAAE,CAAC,IAAA,eAAM,EAAC,oBAAW,CAAC,CAAC;AAApD,QAAA,uBAAuB,2BAA6B"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC;AAC7B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,WAAW,CAAC;AAC1B,cAAc,mBAAmB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
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("./command"), exports);
|
|
18
|
+
__exportStar(require("./decorators"), exports);
|
|
19
|
+
__exportStar(require("./tokens"), exports);
|
|
20
|
+
__exportStar(require("./types"), exports);
|
|
21
|
+
__exportStar(require("./usecase"), exports);
|
|
22
|
+
__exportStar(require("./usecases.module"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,+CAA6B;AAC7B,2CAAyB;AACzB,0CAAwB;AACxB,4CAA0B;AAC1B,oDAAkC"}
|
package/dist/tokens.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,WAAW,eAAwB,CAAC"}
|
package/dist/tokens.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../src/tokens.ts"],"names":[],"mappings":";;;AAAa,QAAA,WAAW,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { ICommandHandler } from "@nestjs/cqrs";
|
|
2
|
+
import { InferredCommandPayload, InferredCommandResult, UseCaseCommand } from "./command";
|
|
3
|
+
import { Class } from "type-fest";
|
|
4
|
+
export type ExplicitUseCaseHandlerClass<TPayload = any, TResult = any> = Class<ICommandHandler<UseCaseCommand<TPayload, TResult>>>;
|
|
5
|
+
export type InferredUseCaseHandlerClass<T extends UseCaseCommand> = ExplicitUseCaseHandlerClass<InferredCommandPayload<T>, InferredCommandResult<T>>;
|
|
6
|
+
export type UseCaseHandlerClass<T extends UseCaseCommand = UseCaseCommand> = InferredUseCaseHandlerClass<T>;
|
|
7
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,sBAAsB,EACtB,qBAAqB,EACrB,cAAc,EACf,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,MAAM,2BAA2B,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,KAAK,CAC5E,eAAe,CAAC,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CACnD,CAAC;AAEF,MAAM,MAAM,2BAA2B,CAAC,CAAC,SAAS,cAAc,IAC9D,2BAA2B,CACzB,sBAAsB,CAAC,CAAC,CAAC,EACzB,qBAAqB,CAAC,CAAC,CAAC,CACzB,CAAC;AAEJ,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,cAAc,GAAG,cAAc,IACvE,2BAA2B,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Class } from "type-fest";
|
|
2
|
+
import { ExplicitUseCaseHandlerClass } from "./types";
|
|
3
|
+
import { ExplicitUseCaseCommandClass } from "./command";
|
|
4
|
+
import { ClassStatic } from "./util-types";
|
|
5
|
+
declare const PAYLOAD_TYPE_SYMBOL: unique symbol;
|
|
6
|
+
declare const RESULT_TYPE_SYMBOL: unique symbol;
|
|
7
|
+
export type UseCaseHandlerFn<TPayload = any, TResult = any> = (payload: TPayload) => Promise<TResult>;
|
|
8
|
+
export declare class UseCase<TPayload = any, TResult = any> {
|
|
9
|
+
readonly [PAYLOAD_TYPE_SYMBOL]: TPayload;
|
|
10
|
+
readonly [RESULT_TYPE_SYMBOL]: TResult;
|
|
11
|
+
static Command<TPayload = any, TResult = any>(this: ExplicitUseCaseClass<TPayload, TResult>): ExplicitUseCaseCommandClass<TPayload, TResult>;
|
|
12
|
+
static Handler<TPayload = any, TResult = any>(this: ExplicitUseCaseClass<TPayload, TResult>): ExplicitUseCaseHandlerClass<TPayload, TResult>;
|
|
13
|
+
static newCommand<TPayload = any, TResult = any>(this: ExplicitUseCaseClass<TPayload, TResult>, payload: TPayload, id?: string, causationId?: string, correlationIds?: Record<string, string>): import("./command").UseCaseCommand<TPayload, TResult>;
|
|
14
|
+
}
|
|
15
|
+
export type InferredUseCasePayload<T extends UseCase> = T extends UseCase<infer P> ? P : never;
|
|
16
|
+
export type InferredUseCaseResult<T extends UseCase> = T extends UseCase<any, infer R> ? R : never;
|
|
17
|
+
export type ExplicitUseCaseClass<TPayload = any, TResult = any> = Class<UseCase<TPayload, TResult>> & ClassStatic<typeof UseCase<TPayload, TResult>>;
|
|
18
|
+
export type InferredUseCaseClass<T extends UseCase> = ExplicitUseCaseClass<InferredUseCasePayload<T>, InferredUseCaseResult<T>>;
|
|
19
|
+
export type UseCaseClass<T extends UseCase = UseCase> = InferredUseCaseClass<T>;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=usecase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.d.ts","sourceRoot":"","sources":["../src/usecase.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,OAAO,EAAE,2BAA2B,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,2BAA2B,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,QAAA,MAAM,mBAAmB,eAAyB,CAAC;AACnD,QAAA,MAAM,kBAAkB,eAAwB,CAAC;AAEjD,MAAM,MAAM,gBAAgB,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,CAC5D,OAAO,EAAE,QAAQ,KACd,OAAO,CAAC,OAAO,CAAC,CAAC;AAEtB,qBAAa,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;IAChD,QAAQ,CAAC,CAAC,mBAAmB,CAAC,EAAE,QAAQ,CAAC;IACzC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAEvC,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAC1C,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAC5C,2BAA2B,CAAC,QAAQ,EAAE,OAAO,CAAC;IAQjD,MAAM,CAAC,OAAO,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAC1C,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAC5C,2BAA2B,CAAC,QAAQ,EAAE,OAAO,CAAC;IAWjD,MAAM,CAAC,UAAU,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,EAC7C,IAAI,EAAE,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAC7C,OAAO,EAAE,QAAQ,EACjB,EAAE,CAAC,EAAE,MAAM,EACX,WAAW,CAAC,EAAE,MAAM,EACpB,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAY1C;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,OAAO,IAClD,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEzC,MAAM,MAAM,qBAAqB,CAAC,CAAC,SAAS,OAAO,IACjD,CAAC,SAAS,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAE9C,MAAM,MAAM,oBAAoB,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,KAAK,CACrE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAC3B,GACC,WAAW,CAAC,OAAO,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;AAEjD,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,OAAO,IAAI,oBAAoB,CACxE,sBAAsB,CAAC,CAAC,CAAC,EACzB,qBAAqB,CAAC,CAAC,CAAC,CACzB,CAAC;AAEF,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC"}
|
package/dist/usecase.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UseCase = void 0;
|
|
4
|
+
const constants_1 = require("./constants");
|
|
5
|
+
const uuid_1 = require("uuid");
|
|
6
|
+
const PAYLOAD_TYPE_SYMBOL = Symbol("PAYLOAD_TYPE");
|
|
7
|
+
const RESULT_TYPE_SYMBOL = Symbol("RESULT_TYPE");
|
|
8
|
+
class UseCase {
|
|
9
|
+
[PAYLOAD_TYPE_SYMBOL];
|
|
10
|
+
[RESULT_TYPE_SYMBOL];
|
|
11
|
+
static Command() {
|
|
12
|
+
const commandType = Reflect.getOwnMetadata(constants_1.USE_CASE_COMMAND_CLASS, this);
|
|
13
|
+
if (!commandType)
|
|
14
|
+
throw new Error("Command class not found");
|
|
15
|
+
return commandType;
|
|
16
|
+
}
|
|
17
|
+
static Handler() {
|
|
18
|
+
const commandHandlerType = Reflect.getOwnMetadata(constants_1.USE_CASE_HANDLER_CLASS, this);
|
|
19
|
+
if (!commandHandlerType)
|
|
20
|
+
throw new Error("Command handler class not found");
|
|
21
|
+
return commandHandlerType;
|
|
22
|
+
}
|
|
23
|
+
static newCommand(payload, id, causationId, correlationIds) {
|
|
24
|
+
const commandClass = this.Command();
|
|
25
|
+
return new commandClass(id ?? (0, uuid_1.v4)(), Date.now(), payload, causationId, correlationIds);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
exports.UseCase = UseCase;
|
|
29
|
+
//# sourceMappingURL=usecase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecase.js","sourceRoot":"","sources":["../src/usecase.ts"],"names":[],"mappings":";;;AACA,2CAA6E;AAI7E,+BAA0B;AAE1B,MAAM,mBAAmB,GAAG,MAAM,CAAC,cAAc,CAAC,CAAC;AACnD,MAAM,kBAAkB,GAAG,MAAM,CAAC,aAAa,CAAC,CAAC;AAMjD,MAAa,OAAO;IACT,CAAC,mBAAmB,CAAC,CAAW;IAChC,CAAC,kBAAkB,CAAC,CAAU;IAEvC,MAAM,CAAC,OAAO;QAGZ,MAAM,WAAW,GAAG,OAAO,CAAC,cAAc,CAAC,kCAAsB,EAAE,IAAI,CAAC,CAAC;QAEzE,IAAI,CAAC,WAAW;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAE7D,OAAO,WAAW,CAAC;IACrB,CAAC;IAED,MAAM,CAAC,OAAO;QAGZ,MAAM,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAC/C,kCAAsB,EACtB,IAAI,CACL,CAAC;QAEF,IAAI,CAAC,kBAAkB;YAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAE5E,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,MAAM,CAAC,UAAU,CAEf,OAAiB,EACjB,EAAW,EACX,WAAoB,EACpB,cAAuC;QAEvC,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAEpC,OAAO,IAAI,YAAY,CACrB,EAAE,IAAI,IAAA,SAAE,GAAE,EACV,IAAI,CAAC,GAAG,EAAE,EACV,OAAO,EACP,WAAW,EACX,cAAc,CACf,CAAC;IACJ,CAAC;CACF;AA5CD,0BA4CC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DynamicModule, ModuleMetadata } from "@nestjs/common";
|
|
2
|
+
import { ICommandPublisher } from "@nestjs/cqrs";
|
|
3
|
+
import { UseCaseClass } from "./usecase";
|
|
4
|
+
export type UseCasesModuleOptions = Pick<ModuleMetadata, "imports" | "providers" | "exports"> & {
|
|
5
|
+
useCaseClasses?: UseCaseClass[];
|
|
6
|
+
commandPublisher?: ICommandPublisher;
|
|
7
|
+
global?: boolean;
|
|
8
|
+
};
|
|
9
|
+
export declare class UseCasesModule {
|
|
10
|
+
static forRoot(options: UseCasesModuleOptions): DynamicModule;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=usecases.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecases.module.d.ts","sourceRoot":"","sources":["../src/usecases.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAEb,cAAc,EAEf,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAA0B,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,cAAc,EACd,SAAS,GAAG,WAAW,GAAG,SAAS,CACpC,GAAG;IACF,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC;IACrC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB,CAAC;AAEF,qBACa,cAAc;IACzB,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,qBAAqB,GAAG,aAAa;CAoC9D"}
|
|
@@ -0,0 +1,46 @@
|
|
|
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 UseCasesModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.UseCasesModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const cqrs_1 = require("@nestjs/cqrs");
|
|
13
|
+
const tokens_1 = require("./tokens");
|
|
14
|
+
let UseCasesModule = UseCasesModule_1 = class UseCasesModule {
|
|
15
|
+
static forRoot(options) {
|
|
16
|
+
const { imports, providers, exports, useCaseClasses, commandPublisher, global, } = options;
|
|
17
|
+
const useCaseProviders = useCaseClasses?.flatMap((useCase) => [useCase, useCase.Handler()]) ?? [];
|
|
18
|
+
return {
|
|
19
|
+
module: UseCasesModule_1,
|
|
20
|
+
imports: [
|
|
21
|
+
...(imports ?? []),
|
|
22
|
+
{
|
|
23
|
+
...cqrs_1.CqrsModule.forRoot({
|
|
24
|
+
commandPublisher,
|
|
25
|
+
}),
|
|
26
|
+
global: false,
|
|
27
|
+
},
|
|
28
|
+
],
|
|
29
|
+
providers: [
|
|
30
|
+
...(providers ?? []),
|
|
31
|
+
...useCaseProviders,
|
|
32
|
+
{
|
|
33
|
+
provide: tokens_1.COMMAND_BUS,
|
|
34
|
+
useExisting: cqrs_1.CommandBus,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
exports: [tokens_1.COMMAND_BUS, ...useCaseProviders, ...(exports ?? [])],
|
|
38
|
+
global,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
exports.UseCasesModule = UseCasesModule;
|
|
43
|
+
exports.UseCasesModule = UseCasesModule = UseCasesModule_1 = __decorate([
|
|
44
|
+
(0, common_1.Module)({})
|
|
45
|
+
], UseCasesModule);
|
|
46
|
+
//# sourceMappingURL=usecases.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"usecases.module.js","sourceRoot":"","sources":["../src/usecases.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAKwB;AACxB,uCAAyE;AACzE,qCAAuC;AAahC,IAAM,cAAc,sBAApB,MAAM,cAAc;IACzB,MAAM,CAAC,OAAO,CAAC,OAA8B;QAC3C,MAAM,EACJ,OAAO,EACP,SAAS,EACT,OAAO,EACP,cAAc,EACd,gBAAgB,EAChB,MAAM,GACP,GAAG,OAAO,CAAC;QAEZ,MAAM,gBAAgB,GACpB,cAAc,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3E,OAAO;YACL,MAAM,EAAE,gBAAc;YACtB,OAAO,EAAE;gBACP,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC;gBAClB;oBACE,GAAG,iBAAU,CAAC,OAAO,CAAC;wBACpB,gBAAgB;qBACjB,CAAC;oBACF,MAAM,EAAE,KAAK;iBACd;aACF;YACD,SAAS,EAAE;gBACT,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC;gBACpB,GAAG,gBAAgB;gBACnB;oBACE,OAAO,EAAE,oBAAW;oBACpB,WAAW,EAAE,iBAAU;iBACxB;aACF;YACD,OAAO,EAAE,CAAC,oBAAW,EAAE,GAAG,gBAAgB,EAAE,GAAG,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC;YAC/D,MAAM;SACP,CAAC;IACJ,CAAC;CACF,CAAA;AArCY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,cAAc,CAqC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util-types.d.ts","sourceRoot":"","sources":["../src/util-types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,MAAM,QAAQ,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAE5D,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CACrD,CAAC,EACD,aAAa,GAAG,WAAW,CAC5B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util-types.js","sourceRoot":"","sources":["../src/util-types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "nestjs-usecases",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "rm -rf ./dist && tsc",
|
|
8
|
+
"typecheck": "tsc --noEmit"
|
|
9
|
+
},
|
|
10
|
+
"keywords": [],
|
|
11
|
+
"author": "",
|
|
12
|
+
"license": "ISC",
|
|
13
|
+
"type": "commonjs",
|
|
14
|
+
"devDependencies": {
|
|
15
|
+
"@types/uuid": "^10.0.0",
|
|
16
|
+
"ts-node": "^10.9.2",
|
|
17
|
+
"type-fest": "^5.4.4",
|
|
18
|
+
"typescript": "^5.9.3"
|
|
19
|
+
},
|
|
20
|
+
"peerDependencies": {
|
|
21
|
+
"@nestjs/common": "^11.1.13",
|
|
22
|
+
"@nestjs/cqrs": "^11.0.3"
|
|
23
|
+
},
|
|
24
|
+
"dependencies": {
|
|
25
|
+
"reflect-metadata": "^0.2.2",
|
|
26
|
+
"uuid": "^13.0.0"
|
|
27
|
+
}
|
|
28
|
+
}
|
package/tsconfig.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
// Visit https://aka.ms/tsconfig to read more about this file
|
|
3
|
+
"compilerOptions": {
|
|
4
|
+
// File Layout
|
|
5
|
+
// "rootDir": "./src",
|
|
6
|
+
"outDir": "./dist",
|
|
7
|
+
|
|
8
|
+
// Environment Settings
|
|
9
|
+
// See also https://aka.ms/tsconfig/module
|
|
10
|
+
"module": "nodenext",
|
|
11
|
+
"target": "esnext",
|
|
12
|
+
"types": [],
|
|
13
|
+
// For nodejs:
|
|
14
|
+
// "lib": ["esnext"],
|
|
15
|
+
// "types": ["node"],
|
|
16
|
+
"experimentalDecorators": true,
|
|
17
|
+
"emitDecoratorMetadata": true,
|
|
18
|
+
// and npm install -D @types/node
|
|
19
|
+
|
|
20
|
+
// Other Outputs
|
|
21
|
+
"sourceMap": true,
|
|
22
|
+
"declaration": true,
|
|
23
|
+
"declarationMap": true,
|
|
24
|
+
|
|
25
|
+
// Stricter Typechecking Options
|
|
26
|
+
"noUncheckedIndexedAccess": true,
|
|
27
|
+
// "exactOptionalPropertyTypes": true,
|
|
28
|
+
|
|
29
|
+
// Style Options
|
|
30
|
+
// "noImplicitReturns": true,
|
|
31
|
+
// "noImplicitOverride": true,
|
|
32
|
+
// "noUnusedLocals": true,
|
|
33
|
+
// "noUnusedParameters": true,
|
|
34
|
+
// "noFallthroughCasesInSwitch": true,
|
|
35
|
+
// "noPropertyAccessFromIndexSignature": true,
|
|
36
|
+
|
|
37
|
+
// Recommended Options
|
|
38
|
+
"strict": true,
|
|
39
|
+
"jsx": "react-jsx",
|
|
40
|
+
"strictPropertyInitialization": false,
|
|
41
|
+
// "verbatimModuleSyntax": true,
|
|
42
|
+
"isolatedModules": true,
|
|
43
|
+
"noUncheckedSideEffectImports": true,
|
|
44
|
+
"moduleDetection": "force",
|
|
45
|
+
"skipLibCheck": true
|
|
46
|
+
}
|
|
47
|
+
}
|