@pocket-architect/core 0.1.20 → 0.1.23

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 (51) hide show
  1. package/.eslintignore +1 -0
  2. package/build/Entity.js +4 -2
  3. package/build/Entity.js.map +1 -1
  4. package/build/Entity.spec.js +1 -1
  5. package/build/Entity.spec.js.map +1 -1
  6. package/build/EntityId.d.ts +1 -0
  7. package/build/EntityId.js +3 -0
  8. package/build/EntityId.js.map +1 -1
  9. package/build/application/Application.d.ts +10 -0
  10. package/build/application/Application.js +43 -0
  11. package/build/application/Application.js.map +1 -0
  12. package/build/application/ApplicationModule.d.ts +5 -0
  13. package/build/application/ApplicationModule.js +10 -0
  14. package/build/application/ApplicationModule.js.map +1 -0
  15. package/build/bootstrap.d.ts +14 -0
  16. package/build/bootstrap.js +88 -0
  17. package/build/bootstrap.js.map +1 -0
  18. package/build/bootstrap.spec.d.ts +1 -0
  19. package/build/bootstrap.spec.js +144 -0
  20. package/build/bootstrap.spec.js.map +1 -0
  21. package/build/eventBus/InMemoryEventBus.d.ts +1 -1
  22. package/build/eventBus/InMemoryEventBus.js +3 -2
  23. package/build/eventBus/InMemoryEventBus.js.map +1 -1
  24. package/build/helpers.js +7 -0
  25. package/build/helpers.js.map +1 -1
  26. package/build/helpers.spec.js +2 -2
  27. package/build/helpers.spec.js.map +1 -1
  28. package/build/index.d.ts +5 -1
  29. package/build/index.js +9 -1
  30. package/build/index.js.map +1 -1
  31. package/package.json +2 -1
  32. package/src/Entity.spec.ts +1 -1
  33. package/src/Entity.ts +4 -2
  34. package/src/EntityId.ts +4 -0
  35. package/src/application/Application.ts +24 -0
  36. package/src/application/ApplicationModule.ts +7 -0
  37. package/src/bootstrap.spec.ts +100 -0
  38. package/src/bootstrap.ts +87 -0
  39. package/src/eventBus/InMemoryEventBus.ts +3 -2
  40. package/src/helpers.spec.ts +5 -2
  41. package/src/helpers.ts +7 -0
  42. package/src/index.ts +11 -1
  43. package/tests/testapp/domain/test/service/TestService.d.ts +4 -0
  44. package/tests/testapp/domain/test/service/TestService.js +13 -0
  45. package/tests/testapp/domain/test/service/TestService.js.map +1 -0
  46. package/tests/testapp/domain/test/service/TestService.ts +8 -0
  47. package/tests/testapp/infra/test/providers/TestProvider.d.ts +4 -0
  48. package/tests/testapp/infra/test/providers/TestProvider.js +13 -0
  49. package/tests/testapp/infra/test/providers/TestProvider.js.map +1 -0
  50. package/tests/testapp/infra/test/providers/TestProvider.ts +8 -0
  51. package/tsconfig.json +1 -1
package/.eslintignore CHANGED
@@ -1,2 +1,3 @@
1
1
  /**/*.js
2
2
  build/*
3
+ tests/
package/build/Entity.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Entity = void 0;
4
4
  var EntityId_1 = require("./EntityId");
5
+ var helpers_1 = require("./helpers");
5
6
  var isEntity = function (v) {
6
7
  return v instanceof Entity;
7
8
  };
@@ -27,8 +28,9 @@ var Entity = /** @class */ (function () {
27
28
  }
28
29
  var diffs = {};
29
30
  var copy = JSON.parse(this._snapshot);
31
+ var snapshotObj = (0, helpers_1.createSnapshot)(this.props);
30
32
  for (var key in this.props) {
31
- if (JSON.stringify(this.props[key]) !== JSON.stringify(copy[key])) {
33
+ if (JSON.stringify(snapshotObj[key]) !== JSON.stringify(copy[key])) {
32
34
  diffs[key] = this.props[key];
33
35
  }
34
36
  }
@@ -38,7 +40,7 @@ var Entity = /** @class */ (function () {
38
40
  if (!this._snapshot) {
39
41
  return false;
40
42
  }
41
- return this._snapshot !== JSON.stringify(this.props);
43
+ return this._snapshot !== JSON.stringify((0, helpers_1.createSnapshot)(this.props));
42
44
  };
43
45
  Entity.prototype.equals = function (object) {
44
46
  if (object === null || object === undefined) {
@@ -1 +1 @@
1
- {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Entity.js","sourceRoot":"","sources":["../src/Entity.ts"],"names":[],"mappings":"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"}
@@ -55,7 +55,7 @@ describe('Entity', function () {
55
55
  var snapshot;
56
56
  return tslib_1.__generator(this, function (_a) {
57
57
  snapshot = entity.snapshot();
58
- expect(snapshot).toEqual({ name: 'test', testId: new EntityId_1.EntityId('1') });
58
+ expect(snapshot).toEqual({ name: 'test', testId: '3D4WX' });
59
59
  expect(function () {
60
60
  snapshot.name = 'changed';
61
61
  }).toThrow();
@@ -1 +1 @@
1
- {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Entity.spec.js","sourceRoot":"","sources":["../src/Entity.spec.ts"],"names":[],"mappings":"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"}
@@ -8,5 +8,6 @@ export declare class EntityId<T> {
8
8
  protected fromHash(hash: string): EntityId<T>;
9
9
  toPrimitive(): T;
10
10
  toString(): string;
11
+ toJSON(): string;
11
12
  equals(id: EntityId<T>): boolean;
12
13
  }
package/build/EntityId.js CHANGED
@@ -57,6 +57,9 @@ var EntityId = /** @class */ (function () {
57
57
  EntityId.prototype.toString = function () {
58
58
  return this._uuid;
59
59
  };
60
+ EntityId.prototype.toJSON = function () {
61
+ return this.toHash();
62
+ };
60
63
  EntityId.prototype.equals = function (id) {
61
64
  return this._uuid === id._uuid;
62
65
  };
@@ -1 +1 @@
1
- {"version":3,"file":"EntityId.js","sourceRoot":"","sources":["../src/EntityId.ts"],"names":[],"mappings":";;;;AAAA,0EAAuC;AACvC,8CAA+C;AAC/C,4DAA8B;AAC9B,+CAA4C;AAE5C;IAIE,kBAAY,QAAyB,EAAE,MAAsB,EAAE,IAAmB;QAAtE,yBAAA,EAAA,eAAyB;QAAE,uBAAA,EAAA,cAAsB;QAAE,qBAAA,EAAA,WAAmB;QAHxE,cAAS,GAAW,IAAI,CAAC;QACzB,UAAK,GAAW,IAAI,CAAC;QAG7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,6BAAU,GAAlB;QACE,IAAI,CAAC,KAAK,GAAG,IAAA,wBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAA,gBAAQ,GAAE,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,CAAC;IAED,sBAAI,iCAAW;aAAf;YACE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,yBAAM,GAAN;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAES,2BAAQ,GAAlB,UAAmB,IAAY;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,IAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,qBAAS,CAAC,uBAAgB,IAAI,CAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,GAAM,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAAW,GAAX;QACE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,yBAAM,GAAN,UAAO,EAAe;QACpB,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC;IACjC,CAAC;IACH,eAAC;AAAD,CAAC,AAvDD,IAuDC;AAvDY,4BAAQ"}
1
+ {"version":3,"file":"EntityId.js","sourceRoot":"","sources":["../src/EntityId.ts"],"names":[],"mappings":";;;;AAAA,0EAAuC;AACvC,8CAA+C;AAC/C,4DAA8B;AAC9B,+CAA4C;AAE5C;IAIE,kBAAY,QAAyB,EAAE,MAAsB,EAAE,IAAmB;QAAtE,yBAAA,EAAA,eAAyB;QAAE,uBAAA,EAAA,cAAsB;QAAE,qBAAA,EAAA,WAAmB;QAHxE,cAAS,GAAW,IAAI,CAAC;QACzB,UAAK,GAAW,IAAI,CAAC;QAG7B,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC,CAAC,CAAC,QAAa,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC,QAAQ,CAAC,QAAkB,CAAC,CAAC;QACpC,CAAC;QACD,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC;IACH,CAAC;IAEO,6BAAU,GAAlB;QACE,IAAI,CAAC,KAAK,GAAG,IAAA,wBAAU,EAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,IAAA,gBAAQ,GAAE,EAAE,IAAA,wBAAU,EAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,CAAC;IAED,sBAAI,iCAAW;aAAf;YACE,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpC,CAAC;;;OAAA;IAED,yBAAM,GAAN;QACE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,CAAC;IACvD,CAAC;IAES,2BAAQ,GAAlB,UAAmB,IAAY;QAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAM,OAAO,QAAO,iBAAO,YAAP,iBAAO,kCAAI,IAAI,CAAC,WAAW,YAAC,CAAC;QACjD,IAAM,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,MAAM,IAAI,qBAAS,CAAC,uBAAgB,IAAI,CAAE,CAAC,CAAC;QAC9C,CAAC;QACD,IAAI,CAAC,SAAS,GAAM,CAAC,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;QAChF,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAAW,GAAX;QACE,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,2BAAQ,GAAR;QACE,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,yBAAM,GAAN;QACE,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;IACvB,CAAC;IAED,yBAAM,GAAN,UAAO,EAAe;QACpB,OAAO,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,KAAK,CAAC;IACjC,CAAC;IACH,eAAC;AAAD,CAAC,AA3DD,IA2DC;AA3DY,4BAAQ"}
@@ -0,0 +1,10 @@
1
+ import { BaseBootstrapEnv } from "../bootstrap";
2
+ import type { ApplicationModule } from "./ApplicationModule";
3
+ export declare abstract class Application {
4
+ protected _modules: ApplicationModule[];
5
+ abstract initApplication(scope: BaseBootstrapEnv): Promise<void>;
6
+ prepareApplication?(scope: BaseBootstrapEnv): Promise<void>;
7
+ postInitApplication?(scope: BaseBootstrapEnv): Promise<void>;
8
+ initModules(modules: ApplicationModule[], scope: BaseBootstrapEnv): Promise<void>;
9
+ get modules(): ApplicationModule[];
10
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Application = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var Application = /** @class */ (function () {
6
+ function Application() {
7
+ this._modules = [];
8
+ }
9
+ Application.prototype.initModules = function (modules, scope) {
10
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
11
+ var _i, modules_1, module_1;
12
+ return tslib_1.__generator(this, function (_a) {
13
+ switch (_a.label) {
14
+ case 0:
15
+ _i = 0, modules_1 = modules;
16
+ _a.label = 1;
17
+ case 1:
18
+ if (!(_i < modules_1.length)) return [3 /*break*/, 4];
19
+ module_1 = modules_1[_i];
20
+ return [4 /*yield*/, module_1.initModule(this, scope)];
21
+ case 2:
22
+ _a.sent();
23
+ this._modules.push(module_1);
24
+ _a.label = 3;
25
+ case 3:
26
+ _i++;
27
+ return [3 /*break*/, 1];
28
+ case 4: return [2 /*return*/];
29
+ }
30
+ });
31
+ });
32
+ };
33
+ Object.defineProperty(Application.prototype, "modules", {
34
+ get: function () {
35
+ return this._modules;
36
+ },
37
+ enumerable: false,
38
+ configurable: true
39
+ });
40
+ return Application;
41
+ }());
42
+ exports.Application = Application;
43
+ //# sourceMappingURL=Application.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Application.js","sourceRoot":"","sources":["../../src/application/Application.ts"],"names":[],"mappings":";;;;AAGA;IAAA;QAEY,aAAQ,GAAwB,EAAE,CAAC;IAkB/C,CAAC;IAVO,iCAAW,GAAjB,UAAkB,OAA4B,EAAE,KAAuB;;;;;;8BACzC,EAAP,mBAAO;;;6BAAP,CAAA,qBAAO,CAAA;wBAAvB;wBACH,qBAAM,QAAM,CAAC,UAAU,CAAC,IAAI,EAAE,KAAK,CAAC,EAAA;;wBAApC,SAAoC,CAAC;wBACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAM,CAAC,CAAC;;;wBAFR,IAAO,CAAA;;;;;;KAI7B;IAED,sBAAI,gCAAO;aAAX;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;;;OAAA;IACH,kBAAC;AAAD,CAAC,AApBD,IAoBC;AAnBc,kCAAW"}
@@ -0,0 +1,5 @@
1
+ import { BaseBootstrapEnv } from "../bootstrap";
2
+ import { Application } from "./Application";
3
+ export declare abstract class ApplicationModule {
4
+ abstract initModule(app: Application, scope: BaseBootstrapEnv): Promise<void>;
5
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApplicationModule = void 0;
4
+ var ApplicationModule = /** @class */ (function () {
5
+ function ApplicationModule() {
6
+ }
7
+ return ApplicationModule;
8
+ }());
9
+ exports.ApplicationModule = ApplicationModule;
10
+ //# sourceMappingURL=ApplicationModule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ApplicationModule.js","sourceRoot":"","sources":["../../src/application/ApplicationModule.ts"],"names":[],"mappings":";;;AAGA;IAAA;IAGA,CAAC;IAAD,wBAAC;AAAD,CAAC,AAHD,IAGC;AAFc,8CAAiB"}
@@ -0,0 +1,14 @@
1
+ import { AwilixContainer } from 'awilix';
2
+ import { Application } from "./application/Application";
3
+ export interface BootstrapOptions {
4
+ appFolder: string;
5
+ domainsFolder: string;
6
+ infraFolder: string;
7
+ scanFolders?: string[];
8
+ }
9
+ export interface BaseBootstrapEnv {
10
+ app: Application;
11
+ env: string;
12
+ DIContainer: AwilixContainer<BaseBootstrapEnv>;
13
+ }
14
+ export declare function bootstrap(app: Application, { appFolder, domainsFolder, infraFolder, scanFolders }: BootstrapOptions, env?: string): Promise<void>;
@@ -0,0 +1,88 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.bootstrap = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var awilix_1 = require("awilix");
6
+ function bootstrap(app, _a, env) {
7
+ var appFolder = _a.appFolder, domainsFolder = _a.domainsFolder, infraFolder = _a.infraFolder, scanFolders = _a.scanFolders;
8
+ if (env === void 0) { env = 'dev'; }
9
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
10
+ function warmupSingletons(container) {
11
+ var _a;
12
+ var regs = (_a = container.registrations) !== null && _a !== void 0 ? _a : {};
13
+ var names = Object.keys(regs);
14
+ for (var _i = 0, names_1 = names; _i < names_1.length; _i++) {
15
+ var name = names_1[_i];
16
+ var r = regs[name];
17
+ // Awilix зберігає lifetime всередині resolver'а (зазвичай r.lifetime)
18
+ if ((r === null || r === void 0 ? void 0 : r.lifetime) === awilix_1.Lifetime.SINGLETON) {
19
+ // важливо: резолвимо саме з ROOT
20
+ container.resolve(name);
21
+ }
22
+ }
23
+ }
24
+ var rootContainer, scope, folders, err_1;
25
+ return tslib_1.__generator(this, function (_b) {
26
+ switch (_b.label) {
27
+ case 0:
28
+ _b.trys.push([0, 6, , 7]);
29
+ if (!appFolder) {
30
+ throw new Error('`appFolder` is required');
31
+ }
32
+ if (!domainsFolder) {
33
+ throw new Error('`domainsFolder` is required');
34
+ }
35
+ if (!infraFolder) {
36
+ throw new Error('`infraFolder` is required');
37
+ }
38
+ rootContainer = (0, awilix_1.createContainer)({
39
+ injectionMode: awilix_1.InjectionMode.PROXY
40
+ });
41
+ rootContainer.register({
42
+ app: (0, awilix_1.asValue)(app),
43
+ env: (0, awilix_1.asValue)(env),
44
+ });
45
+ scope = rootContainer.createScope();
46
+ scope.register({
47
+ DIContainer: (0, awilix_1.asValue)(scope)
48
+ });
49
+ folders = [];
50
+ // app folder
51
+ // folders.push(`${appFolder}/**/!(*.spec|*.d|index).{ts,js}`);
52
+ // domains folder
53
+ folders.push("".concat(domainsFolder, "/**/!(*.spec|*.d).{ts,js}"));
54
+ folders.push("".concat(domainsFolder, "/**/service/**/!(*.spec|*.d).{ts,js}"));
55
+ // infra folder
56
+ folders.push("".concat(infraFolder, "/**/repository/**/!(*.spec|*.d).{ts,js}"));
57
+ // провайдери реєструються у глобальному контейнері як синглтони і потім через warmupSingletons створюються одразу
58
+ // щоб перевірити чи не використовують вони залежності з transient lifetime
59
+ rootContainer.loadModules([
60
+ ["".concat(infraFolder, "/**/providers/**/!(*.spec|*.d).{ts,js}"), { lifetime: awilix_1.Lifetime.SINGLETON }]
61
+ ], { resolverOptions: {} });
62
+ scope.loadModules(tslib_1.__spreadArray(tslib_1.__spreadArray([], folders, true), (scanFolders !== null && scanFolders !== void 0 ? scanFolders : []), true), { resolverOptions: {} });
63
+ warmupSingletons(scope);
64
+ if (!app.prepareApplication) return [3 /*break*/, 2];
65
+ return [4 /*yield*/, app.prepareApplication(scope.cradle)];
66
+ case 1:
67
+ _b.sent();
68
+ _b.label = 2;
69
+ case 2: return [4 /*yield*/, app.initApplication(scope.cradle)];
70
+ case 3:
71
+ _b.sent();
72
+ if (!app.postInitApplication) return [3 /*break*/, 5];
73
+ return [4 /*yield*/, app.postInitApplication(scope.cradle)];
74
+ case 4:
75
+ _b.sent();
76
+ _b.label = 5;
77
+ case 5: return [3 /*break*/, 7];
78
+ case 6:
79
+ err_1 = _b.sent();
80
+ console.info(err_1);
81
+ throw err_1;
82
+ case 7: return [2 /*return*/];
83
+ }
84
+ });
85
+ });
86
+ }
87
+ exports.bootstrap = bootstrap;
88
+ //# sourceMappingURL=bootstrap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.js","sourceRoot":"","sources":["../src/bootstrap.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var tslib_1 = require("tslib");
4
+ var bootstrap_1 = require("./bootstrap");
5
+ var Application_1 = require("./application/Application");
6
+ var awilix_1 = require("awilix");
7
+ var ApplicationModule_1 = require("./application/ApplicationModule");
8
+ var InMemoryEventBus_1 = require("./eventBus/InMemoryEventBus");
9
+ var DomainEvent_1 = require("./DomainEvent");
10
+ var TestApplication = /** @class */ (function (_super) {
11
+ tslib_1.__extends(TestApplication, _super);
12
+ function TestApplication() {
13
+ var _this = _super !== null && _super.apply(this, arguments) || this;
14
+ _this.result = [];
15
+ return _this;
16
+ }
17
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
18
+ TestApplication.prototype.initApplication = function (_a) {
19
+ var scope = _a.DIContainer;
20
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
21
+ var provider, service, newScope;
22
+ return tslib_1.__generator(this, function (_b) {
23
+ switch (_b.label) {
24
+ case 0:
25
+ this.eventBus = new InMemoryEventBus_1.InMemoryEventBus();
26
+ provider = scope.resolve('TestProvider');
27
+ service = scope.resolve('TestService');
28
+ provider.inc();
29
+ service.inc();
30
+ newScope = scope.createScope();
31
+ provider = newScope.resolve('TestProvider');
32
+ service = newScope.resolve('TestService');
33
+ provider.inc();
34
+ service.inc();
35
+ newScope = scope.createScope();
36
+ provider = newScope.resolve('TestProvider');
37
+ service = newScope.resolve('TestService');
38
+ provider.inc();
39
+ service.inc();
40
+ this.result = [provider.value, service.value];
41
+ scope.register({
42
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
43
+ // @ts-ignore
44
+ context: (0, awilix_1.asValue)({ userId: '1' }),
45
+ TestModule: (0, awilix_1.asValue)(new TestModule())
46
+ });
47
+ this.scope = scope;
48
+ return [4 /*yield*/, this.initModules([
49
+ scope.resolve('TestModule')
50
+ ], scope.cradle)];
51
+ case 1:
52
+ _b.sent();
53
+ return [2 /*return*/];
54
+ }
55
+ });
56
+ });
57
+ };
58
+ return TestApplication;
59
+ }(Application_1.Application));
60
+ var TestModule = /** @class */ (function (_super) {
61
+ tslib_1.__extends(TestModule, _super);
62
+ function TestModule() {
63
+ var _this = _super !== null && _super.apply(this, arguments) || this;
64
+ _this.events = [];
65
+ return _this;
66
+ }
67
+ TestModule.prototype.subscribedTo = function () {
68
+ return [TestDomainEvent];
69
+ };
70
+ TestModule.prototype.on = function (domainEvent) {
71
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
72
+ return tslib_1.__generator(this, function (_a) {
73
+ this.events.push(domainEvent.test);
74
+ return [2 /*return*/];
75
+ });
76
+ });
77
+ };
78
+ TestModule.prototype.initModule = function (app) {
79
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
80
+ return tslib_1.__generator(this, function (_a) {
81
+ app.eventBus.addSubscribers(this);
82
+ return [2 /*return*/];
83
+ });
84
+ });
85
+ };
86
+ return TestModule;
87
+ }(ApplicationModule_1.ApplicationModule));
88
+ var TestDomainEvent = /** @class */ (function (_super) {
89
+ tslib_1.__extends(TestDomainEvent, _super);
90
+ function TestDomainEvent() {
91
+ return _super !== null && _super.apply(this, arguments) || this;
92
+ }
93
+ Object.defineProperty(TestDomainEvent.prototype, "test", {
94
+ get: function () {
95
+ return this.props.test;
96
+ },
97
+ enumerable: false,
98
+ configurable: true
99
+ });
100
+ return TestDomainEvent;
101
+ }(DomainEvent_1.DomainEvent));
102
+ describe('bootstrap', function () {
103
+ test('bootstrap', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
104
+ var app;
105
+ return tslib_1.__generator(this, function (_a) {
106
+ switch (_a.label) {
107
+ case 0:
108
+ app = new TestApplication();
109
+ return [4 /*yield*/, (0, bootstrap_1.bootstrap)(app, {
110
+ appFolder: "".concat(__dirname, "/../tests/testapp/app"),
111
+ domainsFolder: "".concat(__dirname, "/../tests/testapp/domain"),
112
+ infraFolder: "".concat(__dirname, "/../tests/testapp/infra"),
113
+ })];
114
+ case 1:
115
+ _a.sent();
116
+ // провайдер в інфрі синглтон, сервіс - ні
117
+ expect(app.result).toEqual([3, 1]);
118
+ return [4 /*yield*/, app.eventBus.push(new TestDomainEvent({ test: 'data' }))];
119
+ case 2:
120
+ _a.sent();
121
+ expect(app.eventBus.listenerCount('TestDomainEvent')).toBe(1);
122
+ return [4 /*yield*/, app.eventBus.publish()];
123
+ case 3:
124
+ _a.sent();
125
+ expect(app.modules[0].events).toEqual(['data']);
126
+ return [2 /*return*/];
127
+ }
128
+ });
129
+ }); });
130
+ test('bootstrap error', function () { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
131
+ return tslib_1.__generator(this, function (_a) {
132
+ switch (_a.label) {
133
+ case 0:
134
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
135
+ return [4 /*yield*/, expect(function () { return (0, bootstrap_1.bootstrap)(new TestApplication(), {}); }).rejects.toThrow('`appFolder` is required')];
136
+ case 1:
137
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
138
+ _a.sent();
139
+ return [2 /*return*/];
140
+ }
141
+ });
142
+ }); });
143
+ });
144
+ //# sourceMappingURL=bootstrap.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bootstrap.spec.js","sourceRoot":"","sources":["../src/bootstrap.spec.ts"],"names":[],"mappings":"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"}
@@ -12,5 +12,5 @@ export declare class InMemoryEventBus implements EventBus {
12
12
  publish(events?: AnyDomainEvent[]): Promise<void>;
13
13
  on(event: string, listener: (...args: never[]) => void): void;
14
14
  listenerCount(event: string): number;
15
- addSubscribers(subscribers: DomainEventSubscriber[]): void;
15
+ addSubscribers(subscribers: DomainEventSubscriber[] | DomainEventSubscriber): void;
16
16
  }
@@ -52,8 +52,9 @@ var InMemoryEventBus = /** @class */ (function () {
52
52
  };
53
53
  InMemoryEventBus.prototype.addSubscribers = function (subscribers) {
54
54
  var _a;
55
- for (var _i = 0, subscribers_1 = subscribers; _i < subscribers_1.length; _i++) {
56
- var subscriber = subscribers_1[_i];
55
+ var subsArray = Array.isArray(subscribers) ? subscribers : [subscribers];
56
+ for (var _i = 0, subsArray_1 = subsArray; _i < subsArray_1.length; _i++) {
57
+ var subscriber = subsArray_1[_i];
57
58
  var events = subscriber.subscribedTo();
58
59
  for (var _b = 0, events_2 = events; _b < events_2.length; _b++) {
59
60
  var event = events_2[_b];
@@ -1 +1 @@
1
- {"version":3,"file":"InMemoryEventBus.js","sourceRoot":"","sources":["../../src/eventBus/InMemoryEventBus.ts"],"names":[],"mappings":";;;;AAAA,iCAAsC;AAKtC;IAIE;QAHU,YAAO,GAAqB,EAAE,CAAC;QAIvC,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAY,EAAE,CAAC;IACrC,CAAC;IAEK,+BAAI,GAAV,UAAW,KAAqB;;;gBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;KAC1B;IAEK,gCAAK,GAAX;;;gBACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;;;KACnB;IAEK,kCAAO,GAAb,UAAc,MAA6B;QAA7B,uBAAA,EAAA,WAA6B;;;;;;wBACnC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;wBAC5D,WAA6B,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE,CAAC;4BAArB,KAAK;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBAC7C,CAAC;wBACD,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;;;;;KACpB;IAED,6BAAE,GAAF,UAAG,KAAa,EAAE,QAAoC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,wCAAa,GAAb,UAAc,KAAa;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,yCAAc,GAAd,UAAe,WAAoC;;QACjD,KAAyB,UAAW,EAAX,2BAAW,EAAX,yBAAW,EAAX,IAAW,EAAE,CAAC;YAAlC,IAAM,UAAU,oBAAA;YACnB,IAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,KAAoB,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,EAAE,CAAC;gBAAxB,IAAM,KAAK,eAAA;gBACd,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAxCD,IAwCC;AAxCY,4CAAgB"}
1
+ {"version":3,"file":"InMemoryEventBus.js","sourceRoot":"","sources":["../../src/eventBus/InMemoryEventBus.ts"],"names":[],"mappings":";;;;AAAA,iCAAsC;AAKtC;IAIE;QAHU,YAAO,GAAqB,EAAE,CAAC;QAIvC,IAAI,CAAC,QAAQ,GAAG,IAAI,qBAAY,EAAE,CAAC;IACrC,CAAC;IAEK,+BAAI,GAAV,UAAW,KAAqB;;;gBAC9B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;;;;KAC1B;IAEK,gCAAK,GAAX;;;gBACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAC;;;;KACnB;IAEK,kCAAO,GAAb,UAAc,MAA6B;QAA7B,uBAAA,EAAA,WAA6B;;;;;;wBACnC,SAAS,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,EAAE,CAAC,CAAC;wBAC5D,WAA6B,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE,CAAC;4BAArB,KAAK;4BACd,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;wBAC7C,CAAC;wBACD,qBAAM,IAAI,CAAC,KAAK,EAAE,EAAA;;wBAAlB,SAAkB,CAAC;;;;;KACpB;IAED,6BAAE,GAAF,UAAG,KAAa,EAAE,QAAoC;QACpD,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED,wCAAa,GAAb,UAAc,KAAa;QACzB,OAAO,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAC5C,CAAC;IAED,yCAAc,GAAd,UAAe,WAA4D;;QACzE,IAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;QAC3E,KAAyB,UAAS,EAAT,uBAAS,EAAT,uBAAS,EAAT,IAAS,EAAE,CAAC;YAAhC,IAAM,UAAU,kBAAA;YACnB,IAAM,MAAM,GAAG,UAAU,CAAC,YAAY,EAAE,CAAC;YACzC,KAAoB,UAAM,EAAN,iBAAM,EAAN,oBAAM,EAAN,IAAM,EAAE,CAAC;gBAAxB,IAAM,KAAK,eAAA;gBACd,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAA,KAAK,CAAC,UAAU,mCAAI,KAAK,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;YACnF,CAAC;QACH,CAAC;IACH,CAAC;IACH,uBAAC;AAAD,CAAC,AAzCD,IAyCC;AAzCY,4CAAgB"}
package/build/helpers.js CHANGED
@@ -13,6 +13,13 @@ function createSnapshot(obj) {
13
13
  // @ts-ignore
14
14
  return obj.toSnapshot();
15
15
  }
16
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
17
+ // @ts-ignore
18
+ if (typeof obj.toJSON === 'function') {
19
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
20
+ // @ts-ignore
21
+ return obj.toJSON();
22
+ }
16
23
  var copy = {};
17
24
  for (var key in obj) {
18
25
  if (!Object.prototype.hasOwnProperty.call(obj, key)) {
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAAA,8DAA8D;AAC9D,SAAgB,cAAc,CAAI,GAAM;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IACD,6DAA6D;IAC7D,aAAa;IACb,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACzC,6DAA6D;QAC7D,aAAa;QACb,OAAO,GAAG,CAAC,UAAU,EAAO,CAAC;IAC/B,CAAC;IACD,IAAM,IAAI,GAAK,EAAO,CAAC;IACvB,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAvBD,wCAuBC"}
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":";;;AAAA,8DAA8D;AAC9D,SAAgB,cAAc,CAAI,GAAM;IACtC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,GAAG,CAAC;IACb,CAAC;IACD,6DAA6D;IAC7D,aAAa;IACb,IAAI,OAAO,GAAG,CAAC,UAAU,KAAK,UAAU,EAAE,CAAC;QACzC,6DAA6D;QAC7D,aAAa;QACb,OAAO,GAAG,CAAC,UAAU,EAAO,CAAC;IAC/B,CAAC;IACD,6DAA6D;IAC7D,aAAa;IACb,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACrC,6DAA6D;QAC7D,aAAa;QACb,OAAO,GAAG,CAAC,MAAM,EAAO,CAAC;IAC3B,CAAC;IACD,IAAM,IAAI,GAAK,EAAO,CAAC;IACvB,KAAK,IAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC;YACpD,SAAS;QACX,CAAC;QACD,IAAI,OAAO,GAAG,CAAC,GAAG,CAAC,KAAK,QAAQ,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AA9BD,wCA8BC"}
@@ -48,12 +48,12 @@ describe('helpers', function () {
48
48
  id: new EntityId_1.EntityId('1'),
49
49
  };
50
50
  snapshot = (0, helpers_1.createSnapshot)(original);
51
- expect(snapshot).toEqual(original);
51
+ expect(snapshot).toEqual(tslib_1.__assign(tslib_1.__assign({}, original), { id: '3D4WX' }));
52
52
  expect(snapshot).not.toBe(original);
53
53
  expect(snapshot.c).not.toBe(original.c);
54
54
  expect(snapshot.c.f).not.toBe(original.c.f);
55
55
  expect(snapshot.id).not.toBe(original.id);
56
- expect(snapshot.id).toEqual(new EntityId_1.EntityId('1'));
56
+ expect(snapshot.id).toEqual('3D4WX');
57
57
  item = TestEntity.create({
58
58
  name: 'test',
59
59
  testId: new EntityId_1.EntityId('2')
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,uCAAoC;AACpC,mCAAgC;AAMhC;IAAyB,sCAA2C;IAApE;;IAmBA,CAAC;IAlBQ,iBAAM,GAAb,UAAc,KAAgB,EAAE,EAA2B;QACzD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,sBAAI,4BAAI;aAAR,UAAS,IAAY;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,CAAC;;;OAAA;IAED,sBAAI,8BAAM;aAAV,UAAW,GAAqB;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAC1B,CAAC;;;OAAA;IAED,+BAAU,GAAV;QACE,OAAO,sCACF,IAAI,CAAC,KAAK,KACb,MAAM,EAAE,SAAS,GACT,CAAC;IACb,CAAC;IACH,iBAAC;AAAD,CAAC,AAnBD,CAAyB,eAAM,GAmB9B;AAED,QAAQ,CAAC,SAAS,EAAE;IAClB,IAAI,CAAC,gBAAgB,EAAE;;;YACf,QAAQ,GAAG;gBACf,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,QAAQ;oBACX,CAAC,EAAE;wBACD,CAAC,EAAE,CAAC;qBACL;iBACF;gBACD,EAAE,EAAE,IAAI,mBAAQ,CAAS,GAAG,CAAC;aAC9B,CAAC;YACI,QAAQ,GAAG,IAAA,wBAAc,EAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YACnC,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,mBAAQ,CAAS,GAAG,CAAC,CAAC,CAAC;YAEjD,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC7B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI,mBAAQ,CAAC,GAAG,CAAC;aAC1B,EAAE,GAAG,CAAC,CAAC;YACF,YAAY,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;;;SACJ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"helpers.spec.js","sourceRoot":"","sources":["../src/helpers.spec.ts"],"names":[],"mappings":";;;AAAA,qCAAyC;AACzC,uCAAoC;AACpC,mCAAgC;AAMhC;IAAyB,sCAA2C;IAApE;;IAmBA,CAAC;IAlBQ,iBAAM,GAAb,UAAc,KAAgB,EAAE,EAA2B;QACzD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IACnC,CAAC;IAED,sBAAI,4BAAI;aAAR,UAAS,IAAY;YACnB,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;QACzB,CAAC;;;OAAA;IAED,sBAAI,8BAAM;aAAV,UAAW,GAAqB;YAC9B,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC;QAC1B,CAAC;;;OAAA;IAED,+BAAU,GAAV;QACE,OAAO,sCACF,IAAI,CAAC,KAAK,KACb,MAAM,EAAE,SAAS,GACT,CAAC;IACb,CAAC;IACH,iBAAC;AAAD,CAAC,AAnBD,CAAyB,eAAM,GAmB9B;AAED,QAAQ,CAAC,SAAS,EAAE;IAClB,IAAI,CAAC,gBAAgB,EAAE;;;YACf,QAAQ,GAAG;gBACf,CAAC,EAAE,CAAC;gBACJ,CAAC,EAAE,MAAM;gBACT,CAAC,EAAE;oBACD,CAAC,EAAE,CAAC;oBACJ,CAAC,EAAE,QAAQ;oBACX,CAAC,EAAE;wBACD,CAAC,EAAE,CAAC;qBACL;iBACF;gBACD,EAAE,EAAE,IAAI,mBAAQ,CAAS,GAAG,CAAC;aAC9B,CAAC;YACI,QAAQ,GAAG,IAAA,wBAAc,EAAC,QAAQ,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,CAAC,OAAO,uCACnB,QAAQ,KACX,EAAE,EAAE,OAAO,IACX,CAAC;YACH,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACpC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACxC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC5C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;YAC1C,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAE/B,IAAI,GAAG,UAAU,CAAC,MAAM,CAAC;gBAC7B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI,mBAAQ,CAAC,GAAG,CAAC;aAC1B,EAAE,GAAG,CAAC,CAAC;YACF,YAAY,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,CAAC;YAC1C,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC;gBAC3B,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,SAAS;aAClB,CAAC,CAAC;;;SACJ,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/build/index.d.ts CHANGED
@@ -6,4 +6,8 @@ import { HashError } from './error/HashError';
6
6
  import { DomainEvent } from './DomainEvent';
7
7
  import { DomainEventSubscriber } from './DomainEventSubscriber';
8
8
  import { EventBus } from './EventBus';
9
- export { Entity, EntityId, ValueObject, AggregateRoot, HashError, DomainEvent, DomainEventSubscriber, EventBus };
9
+ import { Eventable } from './mixins/Eventable';
10
+ import { Application } from './application/Application';
11
+ import { ApplicationModule } from './application/ApplicationModule';
12
+ import { bootstrap } from './bootstrap';
13
+ export { Entity, EntityId, ValueObject, AggregateRoot, HashError, DomainEvent, DomainEventSubscriber, EventBus, Eventable, Application, ApplicationModule, bootstrap };
package/build/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DomainEvent = exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
3
+ exports.bootstrap = exports.ApplicationModule = exports.Application = exports.Eventable = exports.DomainEvent = exports.HashError = exports.AggregateRoot = exports.ValueObject = exports.EntityId = exports.Entity = void 0;
4
4
  var Entity_1 = require("./Entity");
5
5
  Object.defineProperty(exports, "Entity", { enumerable: true, get: function () { return Entity_1.Entity; } });
6
6
  var EntityId_1 = require("./EntityId");
@@ -13,4 +13,12 @@ var HashError_1 = require("./error/HashError");
13
13
  Object.defineProperty(exports, "HashError", { enumerable: true, get: function () { return HashError_1.HashError; } });
14
14
  var DomainEvent_1 = require("./DomainEvent");
15
15
  Object.defineProperty(exports, "DomainEvent", { enumerable: true, get: function () { return DomainEvent_1.DomainEvent; } });
16
+ var Eventable_1 = require("./mixins/Eventable");
17
+ Object.defineProperty(exports, "Eventable", { enumerable: true, get: function () { return Eventable_1.Eventable; } });
18
+ var Application_1 = require("./application/Application");
19
+ Object.defineProperty(exports, "Application", { enumerable: true, get: function () { return Application_1.Application; } });
20
+ var ApplicationModule_1 = require("./application/ApplicationModule");
21
+ Object.defineProperty(exports, "ApplicationModule", { enumerable: true, get: function () { return ApplicationModule_1.ApplicationModule; } });
22
+ var bootstrap_1 = require("./bootstrap");
23
+ Object.defineProperty(exports, "bootstrap", { enumerable: true, get: function () { return bootstrap_1.bootstrap; } });
16
24
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAUhC,uFAVO,eAAM,OAUP;AATR,uCAAsC;AAUpC,yFAVO,mBAAQ,OAUP;AATV,6CAA4C;AAU1C,4FAVO,yBAAW,OAUP;AATb,iDAAgD;AAU9C,8FAVO,6BAAa,OAUP;AATf,+CAA8C;AAU5C,0FAVO,qBAAS,OAUP;AATX,6CAA4C;AAU1C,4FAVO,yBAAW,OAUP"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,mCAAkC;AAchC,uFAdO,eAAM,OAcP;AAbR,uCAAsC;AAcpC,yFAdO,mBAAQ,OAcP;AAbV,6CAA4C;AAc1C,4FAdO,yBAAW,OAcP;AAbb,iDAAgD;AAc9C,8FAdO,6BAAa,OAcP;AAbf,+CAA8C;AAc5C,0FAdO,qBAAS,OAcP;AAbX,6CAA4C;AAc1C,4FAdO,yBAAW,OAcP;AAXb,gDAA+C;AAc7C,0FAdO,qBAAS,OAcP;AAbX,yDAAwD;AAetD,4FAfO,yBAAW,OAeP;AAdb,qEAAoE;AAelE,kGAfO,qCAAiB,OAeP;AAdnB,yCAAwC;AAgBtC,0FAhBO,qBAAS,OAgBP"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pocket-architect/core",
3
- "version": "0.1.20",
3
+ "version": "0.1.23",
4
4
  "description": "",
5
5
  "main": "build/index.js",
6
6
  "scripts": {
@@ -17,6 +17,7 @@
17
17
  },
18
18
  "dependencies": {
19
19
  "@paralleldrive/cuid2": "^2.2.2",
20
+ "awilix": "^10.0.2",
20
21
  "hashids": "^2.3.0",
21
22
  "shallow-equal-object": "^1.1.1",
22
23
  "uuid-by-string": "^4.0.0"
@@ -46,7 +46,7 @@ describe('Entity', () => {
46
46
 
47
47
  test('snapshot', async () => {
48
48
  const snapshot = entity.snapshot();
49
- expect(snapshot).toEqual({ name: 'test', testId: new EntityId('1') });
49
+ expect(snapshot).toEqual({ name: 'test', testId: '3D4WX' });
50
50
 
51
51
  expect(() => {
52
52
  snapshot.name = 'changed';
package/src/Entity.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { EntityId } from './EntityId';
2
+ import {createSnapshot} from "./helpers";
2
3
 
3
4
  const isEntity = <T, E, M extends EntityId<E>>(v: Entity<T, E, M>): v is Entity<T, E, M> => {
4
5
  return v instanceof Entity
@@ -22,8 +23,9 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
22
23
  }
23
24
  const diffs: Partial<T> = {};
24
25
  const copy = JSON.parse(this._snapshot);
26
+ const snapshotObj = createSnapshot(this.props);
25
27
  for (const key in this.props) {
26
- if (JSON.stringify(this.props[key]) !== JSON.stringify(copy[key])) {
28
+ if (JSON.stringify(snapshotObj[key]) !== JSON.stringify(copy[key])) {
27
29
  diffs[key] = this.props[key];
28
30
  }
29
31
  }
@@ -34,7 +36,7 @@ export abstract class Entity<T, E, H extends EntityId<E>> {
34
36
  if (!this._snapshot) {
35
37
  return false;
36
38
  }
37
- return this._snapshot !== JSON.stringify(this.props);
39
+ return this._snapshot !== JSON.stringify(createSnapshot(this.props));
38
40
  }
39
41
 
40
42
  protected constructor(props: T, id?: H|E) {
package/src/EntityId.ts CHANGED
@@ -55,6 +55,10 @@ export class EntityId<T> {
55
55
  return this._uuid;
56
56
  }
57
57
 
58
+ toJSON(): string {
59
+ return this.toHash();
60
+ }
61
+
58
62
  equals(id: EntityId<T>): boolean {
59
63
  return this._uuid === id._uuid;
60
64
  }
@@ -0,0 +1,24 @@
1
+ import {BaseBootstrapEnv} from "../bootstrap";
2
+ import type {ApplicationModule} from "./ApplicationModule";
3
+
4
+ export
5
+ abstract class Application {
6
+ protected _modules: ApplicationModule[] = [];
7
+
8
+ abstract initApplication(scope: BaseBootstrapEnv):Promise<void>;
9
+
10
+ prepareApplication?(scope: BaseBootstrapEnv): Promise<void>;
11
+
12
+ postInitApplication?(scope: BaseBootstrapEnv): Promise<void>;
13
+
14
+ async initModules(modules: ApplicationModule[], scope: BaseBootstrapEnv): Promise<void> {
15
+ for (const module of modules) {
16
+ await module.initModule(this, scope);
17
+ this._modules.push(module);
18
+ }
19
+ }
20
+
21
+ get modules(): ApplicationModule[] {
22
+ return this._modules;
23
+ }
24
+ }
@@ -0,0 +1,7 @@
1
+ import {BaseBootstrapEnv} from "../bootstrap";
2
+ import {Application} from "./Application";
3
+
4
+ export
5
+ abstract class ApplicationModule {
6
+ abstract initModule(app: Application, scope: BaseBootstrapEnv):Promise<void>;
7
+ }
@@ -0,0 +1,100 @@
1
+ import {bootstrap, BaseBootstrapEnv} from "./bootstrap";
2
+ import {Application} from "./application/Application";
3
+ import {asValue} from "awilix";
4
+ import {ApplicationModule} from "./application/ApplicationModule";
5
+ import {InMemoryEventBus} from "./eventBus/InMemoryEventBus";
6
+ import {DomainEventSubscriber} from "./DomainEventSubscriber";
7
+ import {DomainEventClass, DomainEvent} from "./DomainEvent";
8
+
9
+ class TestApplication extends Application {
10
+ result: number[] = [];
11
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
12
+ scope: any;
13
+
14
+ eventBus: InMemoryEventBus;
15
+
16
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
+ async initApplication({DIContainer: scope}: BaseBootstrapEnv) {
18
+ this.eventBus = new InMemoryEventBus();
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ let provider: any = scope.resolve('TestProvider');
22
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
23
+ let service: any = scope.resolve('TestService');
24
+ provider.inc();
25
+ service.inc();
26
+
27
+ let newScope = scope.createScope();
28
+ provider = newScope.resolve('TestProvider')
29
+ service = newScope.resolve('TestService');
30
+ provider.inc();
31
+ service.inc();
32
+
33
+ newScope = scope.createScope();
34
+ provider = newScope.resolve('TestProvider')
35
+ service = newScope.resolve('TestService');
36
+ provider.inc();
37
+ service.inc();
38
+
39
+ this.result = [provider.value, service.value];
40
+
41
+ scope.register({
42
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
43
+ // @ts-ignore
44
+ context: asValue({userId: '1'}),
45
+ TestModule: asValue(new TestModule())
46
+ });
47
+ this.scope = scope;
48
+
49
+ await this.initModules([
50
+ scope.resolve('TestModule')
51
+ ], scope.cradle);
52
+ }
53
+ }
54
+
55
+ class TestModule extends ApplicationModule implements DomainEventSubscriber {
56
+ events:string[] = [];
57
+
58
+ subscribedTo(): DomainEventClass[] {
59
+ return [TestDomainEvent];
60
+ }
61
+
62
+ async on(domainEvent: TestDomainEvent): Promise<void> {
63
+ this.events.push(domainEvent.test);
64
+ }
65
+
66
+ async initModule(app: TestApplication) {
67
+ app.eventBus.addSubscribers(this);
68
+ }
69
+ }
70
+
71
+ class TestDomainEvent extends DomainEvent<{ test: string }> {
72
+ get test() {
73
+ return this.props.test;
74
+ }
75
+ }
76
+
77
+ describe('bootstrap', () => {
78
+ test('bootstrap', async () => {
79
+ const app = new TestApplication();
80
+ await bootstrap(app, {
81
+ appFolder: `${__dirname}/../tests/testapp/app`,
82
+ domainsFolder: `${__dirname}/../tests/testapp/domain`,
83
+ infraFolder: `${__dirname}/../tests/testapp/infra`,
84
+ });
85
+
86
+ // провайдер в інфрі синглтон, сервіс - ні
87
+ expect(app.result).toEqual([3, 1]);
88
+
89
+ await app.eventBus.push(new TestDomainEvent({test: 'data'}));
90
+ expect(app.eventBus.listenerCount('TestDomainEvent')).toBe(1);
91
+ await app.eventBus.publish();
92
+
93
+ expect((app.modules[0] as TestModule).events).toEqual(['data']);
94
+ });
95
+
96
+ test('bootstrap error', async () => {
97
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
98
+ await expect(() => bootstrap(new TestApplication(), <any>{})).rejects.toThrow('`appFolder` is required');
99
+ });
100
+ });
@@ -0,0 +1,87 @@
1
+ import {createContainer, InjectionMode, asValue, Lifetime, AwilixContainer} from 'awilix';
2
+ import {Application} from "./application/Application";
3
+
4
+ export interface BootstrapOptions {
5
+ appFolder: string;
6
+ domainsFolder: string;
7
+ infraFolder: string;
8
+ scanFolders?: string[]
9
+ }
10
+
11
+ export interface BaseBootstrapEnv {
12
+ app: Application;
13
+ env: string;
14
+ DIContainer: AwilixContainer<BaseBootstrapEnv>;
15
+ }
16
+
17
+ export
18
+ async function bootstrap(app: Application, { appFolder, domainsFolder, infraFolder, scanFolders }: BootstrapOptions, env: string = 'dev'):Promise<void> {
19
+ try {
20
+ if (!appFolder) {
21
+ throw new Error('`appFolder` is required')
22
+ }
23
+ if (!domainsFolder) {
24
+ throw new Error('`domainsFolder` is required')
25
+ }
26
+ if (!infraFolder) {
27
+ throw new Error('`infraFolder` is required')
28
+ }
29
+
30
+ const rootContainer = createContainer({
31
+ injectionMode: InjectionMode.PROXY
32
+ });
33
+ rootContainer.register({
34
+ app: asValue(app),
35
+ env: asValue(env),
36
+ });
37
+ const scope = rootContainer.createScope();
38
+ scope.register({
39
+ DIContainer: asValue(scope)
40
+ });
41
+ const folders = [];
42
+
43
+ // app folder
44
+ // folders.push(`${appFolder}/**/!(*.spec|*.d|index).{ts,js}`);
45
+
46
+ // domains folder
47
+ folders.push(`${domainsFolder}/**/!(*.spec|*.d).{ts,js}`);
48
+ folders.push(`${domainsFolder}/**/service/**/!(*.spec|*.d).{ts,js}`);
49
+
50
+ // infra folder
51
+ folders.push(`${infraFolder}/**/repository/**/!(*.spec|*.d).{ts,js}`);
52
+
53
+ // провайдери реєструються у глобальному контейнері як синглтони і потім через warmupSingletons створюються одразу
54
+ // щоб перевірити чи не використовують вони залежності з transient lifetime
55
+ rootContainer.loadModules([
56
+ [`${infraFolder}/**/providers/**/!(*.spec|*.d).{ts,js}`, { lifetime: Lifetime.SINGLETON }]
57
+ ], { resolverOptions: {} });
58
+ scope.loadModules([...folders, ...(scanFolders ?? [])], { resolverOptions: {} });
59
+
60
+ warmupSingletons(scope);
61
+ if (app.prepareApplication) {
62
+ await app.prepareApplication(scope.cradle);
63
+ }
64
+ await app.initApplication(scope.cradle);
65
+
66
+ if (app.postInitApplication) {
67
+ await app.postInitApplication(scope.cradle);
68
+ }
69
+ } catch (err) {
70
+ console.info(err);
71
+ throw err;
72
+ }
73
+
74
+ function warmupSingletons(container: AwilixContainer) {
75
+ const regs = container.registrations ?? {};
76
+ const names = Object.keys(regs);
77
+
78
+ for (const name of names) {
79
+ const r = regs[name];
80
+ // Awilix зберігає lifetime всередині resolver'а (зазвичай r.lifetime)
81
+ if (r?.lifetime === Lifetime.SINGLETON) {
82
+ // важливо: резолвимо саме з ROOT
83
+ container.resolve(name);
84
+ }
85
+ }
86
+ }
87
+ }
@@ -35,8 +35,9 @@ export class InMemoryEventBus implements EventBus {
35
35
  return this._emitter.listenerCount(event);
36
36
  }
37
37
 
38
- addSubscribers(subscribers: DomainEventSubscriber[]): void {
39
- for (const subscriber of subscribers) {
38
+ addSubscribers(subscribers: DomainEventSubscriber[] | DomainEventSubscriber): void {
39
+ const subsArray = Array.isArray(subscribers) ? subscribers : [subscribers];
40
+ for (const subscriber of subsArray) {
40
41
  const events = subscriber.subscribedTo();
41
42
  for (const event of events) {
42
43
  this._emitter.on(event.EVENT_NAME ?? event.name, subscriber.on.bind(subscriber));
@@ -42,12 +42,15 @@ describe('helpers', () => {
42
42
  id: new EntityId<string>('1'),
43
43
  };
44
44
  const snapshot = createSnapshot(original);
45
- expect(snapshot).toEqual(original);
45
+ expect(snapshot).toEqual({
46
+ ...original,
47
+ id: '3D4WX'
48
+ });
46
49
  expect(snapshot).not.toBe(original);
47
50
  expect(snapshot.c).not.toBe(original.c);
48
51
  expect(snapshot.c.f).not.toBe(original.c.f);
49
52
  expect(snapshot.id).not.toBe(original.id);
50
- expect(snapshot.id).toEqual(new EntityId<string>('1'));
53
+ expect(snapshot.id).toEqual('3D4WX');
51
54
 
52
55
  const item = TestEntity.create({
53
56
  name: 'test',
package/src/helpers.ts CHANGED
@@ -10,6 +10,13 @@ export function createSnapshot<T>(obj: T): T {
10
10
  // @ts-ignore
11
11
  return obj.toSnapshot() as T;
12
12
  }
13
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
14
+ // @ts-ignore
15
+ if (typeof obj.toJSON === 'function') {
16
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
17
+ // @ts-ignore
18
+ return obj.toJSON() as T;
19
+ }
13
20
  const copy:T = {} as T;
14
21
  for (const key in obj) {
15
22
  if (!Object.prototype.hasOwnProperty.call(obj, key)) {
package/src/index.ts CHANGED
@@ -6,6 +6,10 @@ import { HashError } from './error/HashError';
6
6
  import { DomainEvent } from './DomainEvent';
7
7
  import { DomainEventSubscriber } from './DomainEventSubscriber';
8
8
  import { EventBus } from './EventBus';
9
+ import { Eventable } from './mixins/Eventable';
10
+ import { Application } from './application/Application';
11
+ import { ApplicationModule } from './application/ApplicationModule';
12
+ import { bootstrap } from './bootstrap';
9
13
 
10
14
  export {
11
15
  Entity,
@@ -15,5 +19,11 @@ export {
15
19
  HashError,
16
20
  DomainEvent,
17
21
  DomainEventSubscriber,
18
- EventBus
22
+ EventBus,
23
+ Eventable,
24
+
25
+ Application,
26
+ ApplicationModule,
27
+
28
+ bootstrap
19
29
  }
@@ -0,0 +1,4 @@
1
+ export default class TestService {
2
+ value: number;
3
+ inc(): void;
4
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var TestService = /** @class */ (function () {
4
+ function TestService() {
5
+ this.value = 0;
6
+ }
7
+ TestService.prototype.inc = function () {
8
+ this.value += 1;
9
+ };
10
+ return TestService;
11
+ }());
12
+ exports.default = TestService;
13
+ //# sourceMappingURL=TestService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestService.js","sourceRoot":"","sources":["TestService.ts"],"names":[],"mappings":";;AAAA;IAAA;QAES,UAAK,GAAG,CAAC,CAAC;IAKnB,CAAC;IAHC,yBAAG,GAAH;QACE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAClB,CAAC;IACH,kBAAC;AAAD,CAAC,AAPD,IAOC"}
@@ -0,0 +1,8 @@
1
+ export default
2
+ class TestService {
3
+ public value = 0;
4
+
5
+ inc() {
6
+ this.value += 1;
7
+ }
8
+ }
@@ -0,0 +1,4 @@
1
+ export default class TestProvider {
2
+ value: number;
3
+ inc(): void;
4
+ }
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var TestProvider = /** @class */ (function () {
4
+ function TestProvider() {
5
+ this.value = 0;
6
+ }
7
+ TestProvider.prototype.inc = function () {
8
+ this.value += 1;
9
+ };
10
+ return TestProvider;
11
+ }());
12
+ exports.default = TestProvider;
13
+ //# sourceMappingURL=TestProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TestProvider.js","sourceRoot":"","sources":["TestProvider.ts"],"names":[],"mappings":";;AAAA;IAAA;QAES,UAAK,GAAG,CAAC,CAAC;IAKnB,CAAC;IAHC,0BAAG,GAAH;QACE,IAAI,CAAC,KAAK,IAAI,CAAC,CAAC;IAClB,CAAC;IACH,mBAAC;AAAD,CAAC,AAPD,IAOC"}
@@ -0,0 +1,8 @@
1
+ export default
2
+ class TestProvider {
3
+ public value = 0;
4
+
5
+ inc() {
6
+ this.value += 1;
7
+ }
8
+ }
package/tsconfig.json CHANGED
@@ -26,5 +26,5 @@
26
26
  "experimentalDecorators": true,
27
27
  "skipLibCheck": true
28
28
  },
29
- "include": ["**/*", "__tests__/**/*"]
29
+ "include": ["src/**/*", "__tests__/**/*"]
30
30
  }