composed-di 0.2.8 → 0.2.9

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/index.d.ts CHANGED
@@ -1,6 +1,6 @@
1
- export * from './ServiceKey';
2
- export * from './ServiceModule';
3
- export * from './ServiceFactory';
4
- export * from './ServiceScope';
1
+ export * from './serviceKey';
2
+ export * from './serviceModule';
3
+ export * from './serviceFactory';
4
+ export * from './serviceScope';
5
5
  export * from './utils';
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,SAAS,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC"}
package/dist/index.js CHANGED
@@ -14,9 +14,9 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./ServiceKey"), exports);
18
- __exportStar(require("./ServiceModule"), exports);
19
- __exportStar(require("./ServiceFactory"), exports);
20
- __exportStar(require("./ServiceScope"), exports);
17
+ __exportStar(require("./serviceKey"), exports);
18
+ __exportStar(require("./serviceModule"), exports);
19
+ __exportStar(require("./serviceFactory"), exports);
20
+ __exportStar(require("./serviceScope"), exports);
21
21
  __exportStar(require("./utils"), exports);
22
22
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,kDAAgC;AAChC,mDAAiC;AACjC,iDAA8B;AAC9B,0CAAuB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,+CAA6B;AAC7B,kDAAgC;AAChC,mDAAiC;AACjC,iDAA+B;AAC/B,0CAAwB"}
@@ -1,5 +1,5 @@
1
- import { ServiceKey } from './ServiceKey';
2
- import { ServiceScope } from './ServiceScope';
1
+ import { ServiceKey } from './serviceKey';
2
+ import { ServiceScope } from './serviceScope';
3
3
  type ServiceType<T> = T extends ServiceKey<infer U> ? U : never;
4
4
  type DependencyTypes<T extends readonly ServiceKey<unknown>[]> = {
5
5
  [K in keyof T]: ServiceType<T[K]>;
@@ -32,4 +32,4 @@ export declare abstract class ServiceFactory<const T, const D extends readonly S
32
32
  }): ServiceFactory<T, D>;
33
33
  }
34
34
  export {};
35
- //# sourceMappingURL=ServiceFactory.d.ts.map
35
+ //# sourceMappingURL=serviceFactory.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceFactory.d.ts","sourceRoot":"","sources":["../src/ServiceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAGhE,KAAK,eAAe,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC9D,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,8BAAsB,cAAc,CAClC,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;IAEnD,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE9B;;;OAGG;IACH,MAAM,CAAC,SAAS,CACd,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EACnD,EACA,KAAK,EACL,QAAQ,EACR,SAA8B,EAC9B,UAAU,EACV,OAAkB,GACnB,EAAE;QACD,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;KACjC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAuBxB;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAC3E,QAAQ,EACR,SAAS,EACT,UAAU,GACX,EAAE;QACD,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,SAAS,EAAE,CAAC,CAAC;QACb,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;KACrE,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;CAOzB"}
1
+ {"version":3,"file":"serviceFactory.d.ts","sourceRoot":"","sources":["../src/serviceFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,KAAK,WAAW,CAAC,CAAC,IAAI,CAAC,SAAS,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAGhE,KAAK,eAAe,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI;KAC9D,CAAC,IAAI,MAAM,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAClC,CAAC;AAEF,8BAAsB,cAAc,CAClC,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE;IAEnD,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;IACtB,QAAQ,CAAC,KAAK,CAAC,EAAE,YAAY,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IAE9B;;;OAGG;IACH,MAAM,CAAC,SAAS,CACd,KAAK,CAAC,CAAC,EACP,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EACnD,EACA,KAAK,EACL,QAAQ,EACR,SAA8B,EAC9B,UAAU,EACV,OAAkB,GACnB,EAAE;QACD,KAAK,CAAC,EAAE,YAAY,CAAC;QACrB,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,SAAS,CAAC,EAAE,CAAC,CAAC;QACd,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACpE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,CAAC,KAAK,IAAI,CAAC;KACjC,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAuBxB;;;OAGG;IACH,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,SAAS,SAAS,UAAU,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,EAAE,EAC3E,QAAQ,EACR,SAAS,EACT,UAAU,GACX,EAAE;QACD,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC;QACxB,SAAS,EAAE,CAAC,CAAC;QACb,UAAU,EAAE,CAAC,GAAG,YAAY,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;KACrE,GAAG,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;CAOzB"}
@@ -50,4 +50,4 @@ class ServiceFactory {
50
50
  }
51
51
  }
52
52
  exports.ServiceFactory = ServiceFactory;
53
- //# sourceMappingURL=ServiceFactory.js.map
53
+ //# sourceMappingURL=serviceFactory.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceFactory.js","sourceRoot":"","sources":["../src/ServiceFactory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAWA,MAAsB,cAAc;IAUlC;;;OAGG;IACH,MAAM,CAAC,SAAS,CAGd,EACA,KAAK,EACL,QAAQ,EACR,SAAS,GAAG,EAAkB,EAC9B,UAAU,EACV,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,GAOnB;QACC,IAAI,QAAuB,CAAC;QAE5B,OAAO;YACL,KAAK;YACL,QAAQ;YACR,SAAS;YACH,UAAU,CAAC,GAAG,YAAgC;;oBAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC3B,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,YAAY,CAAC,CAAC;oBAC/C,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;aAAA;YACD,OAAO;gBACL,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAClB,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,CAA+D,EAC3E,QAAQ,EACR,SAAS,EACT,UAAU,GAKX;QACC,OAAO;YACL,QAAQ;YACR,SAAS;YACT,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AAvED,wCAuEC"}
1
+ {"version":3,"file":"serviceFactory.js","sourceRoot":"","sources":["../src/serviceFactory.ts"],"names":[],"mappings":";;;;;;;;;;;;AAWA,MAAsB,cAAc;IAUlC;;;OAGG;IACH,MAAM,CAAC,SAAS,CAGd,EACA,KAAK,EACL,QAAQ,EACR,SAAS,GAAG,EAAkB,EAC9B,UAAU,EACV,OAAO,GAAG,GAAG,EAAE,GAAE,CAAC,GAOnB;QACC,IAAI,QAAuB,CAAC;QAE5B,OAAO;YACL,KAAK;YACL,QAAQ;YACR,SAAS;YACH,UAAU,CAAC,GAAG,YAAgC;;oBAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;wBAC3B,QAAQ,GAAG,MAAM,UAAU,CAAC,GAAG,YAAY,CAAC,CAAC;oBAC/C,CAAC;oBAED,OAAO,QAAQ,CAAC;gBAClB,CAAC;aAAA;YACD,OAAO;gBACL,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC;oBAClB,QAAQ,GAAG,SAAS,CAAC;gBACvB,CAAC;YACH,CAAC;SACF,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,OAAO,CAA+D,EAC3E,QAAQ,EACR,SAAS,EACT,UAAU,GAKX;QACC,OAAO;YACL,QAAQ;YACR,SAAS;YACT,UAAU;SACX,CAAC;IACJ,CAAC;CACF;AAvED,wCAuEC"}
@@ -3,4 +3,4 @@ export declare class ServiceKey<T> {
3
3
  readonly symbol: symbol;
4
4
  constructor(name: string);
5
5
  }
6
- //# sourceMappingURL=ServiceKey.d.ts.map
6
+ //# sourceMappingURL=serviceKey.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceKey.d.ts","sourceRoot":"","sources":["../src/ServiceKey.ts"],"names":[],"mappings":"AACA,qBAAa,UAAU,CAAC,CAAC;aAGK,IAAI,EAAE,MAAM;IAFxC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM;CAGzC"}
1
+ {"version":3,"file":"serviceKey.d.ts","sourceRoot":"","sources":["../src/serviceKey.ts"],"names":[],"mappings":"AACA,qBAAa,UAAU,CAAC,CAAC;aAGK,IAAI,EAAE,MAAM;IAFxC,SAAgB,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM;CAGzC"}
@@ -9,4 +9,4 @@ class ServiceKey {
9
9
  }
10
10
  }
11
11
  exports.ServiceKey = ServiceKey;
12
- //# sourceMappingURL=ServiceKey.js.map
12
+ //# sourceMappingURL=serviceKey.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceKey.js","sourceRoot":"","sources":["../src/ServiceKey.ts"],"names":[],"mappings":";;;AAAA,aAAa;AACb,MAAa,UAAU;IAGrB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,gCAMC"}
1
+ {"version":3,"file":"serviceKey.js","sourceRoot":"","sources":["../src/serviceKey.ts"],"names":[],"mappings":";;;AAAA,aAAa;AACb,MAAa,UAAU;IAGrB,YAA4B,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,gCAMC"}
@@ -1,6 +1,6 @@
1
- import { ServiceKey } from './ServiceKey';
2
- import { ServiceFactory } from './ServiceFactory';
3
- import { ServiceScope } from './ServiceScope';
1
+ import { ServiceKey } from './serviceKey';
2
+ import { ServiceFactory } from './serviceFactory';
3
+ import { ServiceScope } from './serviceScope';
4
4
  type GenericFactory = ServiceFactory<unknown, readonly ServiceKey<any>[]>;
5
5
  export declare class ServiceModule {
6
6
  readonly factories: GenericFactory[];
@@ -30,4 +30,4 @@ export declare class ServiceModule {
30
30
  static from(entries: (ServiceModule | GenericFactory)[]): ServiceModule;
31
31
  }
32
32
  export {};
33
- //# sourceMappingURL=ServiceModule.d.ts.map
33
+ //# sourceMappingURL=serviceModule.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceModule.d.ts","sourceRoot":"","sources":["../src/ServiceModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,KAAK,cAAc,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAG1E,qBAAa,aAAa;IACJ,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE;IAAxD,OAAO;IAOM,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBnD;;;;;;;;;OASG;IACI,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY;IAQnC;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,GAAG,cAAc,CAAC,EAAE,GAAG,aAAa;CAcxE"}
1
+ {"version":3,"file":"serviceModule.d.ts","sourceRoot":"","sources":["../src/serviceModule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,KAAK,cAAc,GAAG,cAAc,CAAC,OAAO,EAAE,SAAS,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAG1E,qBAAa,aAAa;IACJ,QAAQ,CAAC,SAAS,EAAE,cAAc,EAAE;IAAxD,OAAO;IAOM,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,UAAU,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAqBnD;;;;;;;;;OASG;IACI,OAAO,CAAC,KAAK,CAAC,EAAE,YAAY;IAQnC;;;;;;;;;OASG;IACH,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,aAAa,GAAG,cAAc,CAAC,EAAE,GAAG,aAAa;CAcxE"}
@@ -100,4 +100,4 @@ function isSuitable(key, factory) {
100
100
  var _a;
101
101
  return ((_a = factory === null || factory === void 0 ? void 0 : factory.provides) === null || _a === void 0 ? void 0 : _a.symbol) === (key === null || key === void 0 ? void 0 : key.symbol);
102
102
  }
103
- //# sourceMappingURL=ServiceModule.js.map
103
+ //# sourceMappingURL=serviceModule.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ServiceModule.js","sourceRoot":"","sources":["../src/ServiceModule.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"serviceModule.js","sourceRoot":"","sources":["../src/serviceModule.ts"],"names":[],"mappings":"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"}
@@ -3,4 +3,4 @@ export declare class ServiceScope {
3
3
  readonly symbol: symbol;
4
4
  constructor(name: string);
5
5
  }
6
- //# sourceMappingURL=ServiceScope.d.ts.map
6
+ //# sourceMappingURL=serviceScope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceScope.d.ts","sourceRoot":"","sources":["../src/serviceScope.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAGX,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM;CAGlC"}
@@ -8,4 +8,4 @@ class ServiceScope {
8
8
  }
9
9
  }
10
10
  exports.ServiceScope = ServiceScope;
11
- //# sourceMappingURL=ServiceScope.js.map
11
+ //# sourceMappingURL=serviceScope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serviceScope.js","sourceRoot":"","sources":["../src/serviceScope.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IAGvB,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,oCAMC"}
package/dist/utils.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { ServiceModule } from './ServiceModule';
1
+ import { ServiceModule } from './serviceModule';
2
2
  export interface DotGraphOptions {
3
3
  /** Graph direction: 'TB' (top-bottom), 'LR' (left-right), 'BT' (bottom-top), 'RL' (right-left) */
4
4
  direction?: 'TB' | 'LR' | 'BT' | 'RL';
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "composed-di",
3
3
  "private": false,
4
- "version": "0.2.8",
4
+ "version": "0.2.9",
5
5
  "author": "Juan Herrera juanhr454@gmail.com",
6
6
  "type": "commonjs",
7
7
  "main": "./dist/index.js",
@@ -29,6 +29,7 @@
29
29
  },
30
30
  "scripts": {
31
31
  "build": "tsc --build",
32
+ "clean": "tsc --build --clean",
32
33
  "prepublishOnly": "npm run build"
33
34
  },
34
35
  "devDependencies": {
package/src/index.ts CHANGED
@@ -1,5 +1,5 @@
1
- export * from './ServiceKey';
2
- export * from './ServiceModule';
3
- export * from './ServiceFactory';
4
- export * from './ServiceScope'
5
- export * from './utils'
1
+ export * from './serviceKey';
2
+ export * from './serviceModule';
3
+ export * from './serviceFactory';
4
+ export * from './serviceScope';
5
+ export * from './utils';
@@ -1,83 +1,83 @@
1
- import { ServiceKey } from './ServiceKey';
2
- import { ServiceScope } from './ServiceScope';
3
-
4
- // Helper types to extract the type from ServiceKey
5
- type ServiceType<T> = T extends ServiceKey<infer U> ? U : never;
6
-
7
- // Helper types to convert an array/tuple of ServiceKey to tuple of their types
8
- type DependencyTypes<T extends readonly ServiceKey<unknown>[]> = {
9
- [K in keyof T]: ServiceType<T[K]>;
10
- };
11
-
12
- export abstract class ServiceFactory<
13
- const T,
14
- const D extends readonly ServiceKey<unknown>[] = [],
15
- > {
16
- abstract provides: ServiceKey<T>;
17
- abstract dependsOn: D;
18
- abstract scope?: ServiceScope;
19
- abstract initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
20
- abstract dispose?: () => void;
21
-
22
- /**
23
- * Creates a singleton service factory that ensures a single instance of the provided service is initialized
24
- * and used throughout the scope lifecycle.
25
- */
26
- static singleton<
27
- const T,
28
- const D extends readonly ServiceKey<unknown>[] = [],
29
- >({
30
- scope,
31
- provides,
32
- dependsOn = [] as unknown as D,
33
- initialize,
34
- dispose = () => {},
35
- }: {
36
- scope?: ServiceScope;
37
- provides: ServiceKey<T>;
38
- dependsOn?: D;
39
- initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
40
- dispose?: (instance: T) => void;
41
- }): ServiceFactory<T, D> {
42
- let instance: T | undefined;
43
-
44
- return {
45
- scope,
46
- provides,
47
- dependsOn,
48
- async initialize(...dependencies: DependencyTypes<D>): Promise<T> {
49
- if (instance === undefined) {
50
- instance = await initialize(...dependencies);
51
- }
52
-
53
- return instance;
54
- },
55
- dispose(): void {
56
- if (instance !== undefined) {
57
- dispose(instance);
58
- instance = undefined;
59
- }
60
- },
61
- };
62
- }
63
-
64
- /**
65
- * Creates a one-shot service factory that initializes a new instance of the provided service
66
- * every time it is requested.
67
- */
68
- static oneShot<const T, const D extends readonly ServiceKey<unknown>[] = []>({
69
- provides,
70
- dependsOn,
71
- initialize,
72
- }: {
73
- provides: ServiceKey<T>;
74
- dependsOn: D;
75
- initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
76
- }): ServiceFactory<T, D> {
77
- return {
78
- provides,
79
- dependsOn,
80
- initialize,
81
- };
82
- }
83
- }
1
+ import { ServiceKey } from './serviceKey';
2
+ import { ServiceScope } from './serviceScope';
3
+
4
+ // Helper types to extract the type from ServiceKey
5
+ type ServiceType<T> = T extends ServiceKey<infer U> ? U : never;
6
+
7
+ // Helper types to convert an array/tuple of ServiceKey to tuple of their types
8
+ type DependencyTypes<T extends readonly ServiceKey<unknown>[]> = {
9
+ [K in keyof T]: ServiceType<T[K]>;
10
+ };
11
+
12
+ export abstract class ServiceFactory<
13
+ const T,
14
+ const D extends readonly ServiceKey<unknown>[] = [],
15
+ > {
16
+ abstract provides: ServiceKey<T>;
17
+ abstract dependsOn: D;
18
+ abstract scope?: ServiceScope;
19
+ abstract initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
20
+ abstract dispose?: () => void;
21
+
22
+ /**
23
+ * Creates a singleton service factory that ensures a single instance of the provided service is initialized
24
+ * and used throughout the scope lifecycle.
25
+ */
26
+ static singleton<
27
+ const T,
28
+ const D extends readonly ServiceKey<unknown>[] = [],
29
+ >({
30
+ scope,
31
+ provides,
32
+ dependsOn = [] as unknown as D,
33
+ initialize,
34
+ dispose = () => {},
35
+ }: {
36
+ scope?: ServiceScope;
37
+ provides: ServiceKey<T>;
38
+ dependsOn?: D;
39
+ initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
40
+ dispose?: (instance: T) => void;
41
+ }): ServiceFactory<T, D> {
42
+ let instance: T | undefined;
43
+
44
+ return {
45
+ scope,
46
+ provides,
47
+ dependsOn,
48
+ async initialize(...dependencies: DependencyTypes<D>): Promise<T> {
49
+ if (instance === undefined) {
50
+ instance = await initialize(...dependencies);
51
+ }
52
+
53
+ return instance;
54
+ },
55
+ dispose(): void {
56
+ if (instance !== undefined) {
57
+ dispose(instance);
58
+ instance = undefined;
59
+ }
60
+ },
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Creates a one-shot service factory that initializes a new instance of the provided service
66
+ * every time it is requested.
67
+ */
68
+ static oneShot<const T, const D extends readonly ServiceKey<unknown>[] = []>({
69
+ provides,
70
+ dependsOn,
71
+ initialize,
72
+ }: {
73
+ provides: ServiceKey<T>;
74
+ dependsOn: D;
75
+ initialize: (...dependencies: DependencyTypes<D>) => T | Promise<T>;
76
+ }): ServiceFactory<T, D> {
77
+ return {
78
+ provides,
79
+ dependsOn,
80
+ initialize,
81
+ };
82
+ }
83
+ }
@@ -1,123 +1,123 @@
1
- import { ServiceKey } from './ServiceKey';
2
- import { ServiceFactory } from './ServiceFactory';
3
- import { ServiceScope } from './ServiceScope';
4
-
5
- type GenericFactory = ServiceFactory<unknown, readonly ServiceKey<any>[]>;
6
- type GenericKey = ServiceKey<any>;
7
-
8
- export class ServiceModule {
9
- private constructor(readonly factories: GenericFactory[]) {
10
- factories.forEach((factory) => {
11
- checkRecursiveDependencies(factory);
12
- checkMissingDependencies(factory, this.factories);
13
- });
14
- }
15
-
16
- public async get<T>(key: ServiceKey<T>): Promise<T> {
17
- const factory = this.factories.find((factory: GenericFactory) => {
18
- return isSuitable(key, factory);
19
- });
20
-
21
- // Check if a factory to supply the requested key was not found
22
- if (!factory) {
23
- throw new Error(`Could not find a suitable factory for ${key.name}`);
24
- }
25
-
26
- // Resolve all dependencies first
27
- const dependencies = await Promise.all(
28
- factory.dependsOn.map((dependencyKey: ServiceKey<unknown>) => {
29
- return this.get(dependencyKey);
30
- }),
31
- );
32
-
33
- // Call the factory to retrieve the dependency
34
- return factory.initialize(...dependencies);
35
- }
36
-
37
- /**
38
- * Disposes of service factories within the specified scope or all factories if no scope is provided.
39
- *
40
- * This method is useful for cleaning up resources and instances held by service factories,
41
- * such as singleton factories, as they may hold database connections or other resources that need to be released.
42
- *
43
- * @param {ServiceScope} [scope] The scope to filter the factories to be disposed.
44
- * If not provided, all factories are disposed of.
45
- * @return {void} No return value.
46
- */
47
- public dispose(scope?: ServiceScope) {
48
- const factories = scope
49
- ? this.factories.filter((f) => f.scope === scope)
50
- : this.factories;
51
-
52
- factories.forEach((factory) => factory.dispose?.());
53
- }
54
-
55
- /**
56
- * Creates a new ServiceModule instance by aggregating and deduplicating a list of
57
- * ServiceModule or GenericFactory instances.
58
- * If multiple factories provide the same
59
- * ServiceKey, the last one in the list takes precedence.
60
- *
61
- * @param {Array<ServiceModule | GenericFactory>} entries - An array of ServiceModule or GenericFactory
62
- * instances to be processed into a single ServiceModule.
63
- * @return {ServiceModule} A new ServiceModule containing the deduplicated factories.
64
- */
65
- static from(entries: (ServiceModule | GenericFactory)[]): ServiceModule {
66
- // Flatten entries and keep only the last factory for each ServiceKey
67
- const flattened = entries.flatMap((e) =>
68
- e instanceof ServiceModule ? e.factories : [e],
69
- );
70
-
71
- const byKey = new Map<symbol, GenericFactory>();
72
- // Later factories overwrite earlier ones (last-wins)
73
- for (const f of flattened) {
74
- byKey.set(f.provides.symbol, f);
75
- }
76
-
77
- return new ServiceModule(Array.from(byKey.values()));
78
- }
79
- }
80
-
81
- function checkRecursiveDependencies(factory: GenericFactory) {
82
- const recursive = factory.dependsOn.some((dependencyKey) => {
83
- return dependencyKey === factory.provides;
84
- });
85
-
86
- if (recursive) {
87
- throw new Error(
88
- 'Recursive dependency detected on: ' + factory.provides.name,
89
- );
90
- }
91
- }
92
-
93
- function checkMissingDependencies(
94
- factory: GenericFactory,
95
- factories: GenericFactory[],
96
- ) {
97
- const missingDependencies = factory.dependsOn.filter(
98
- (dependencyKey: GenericKey) => {
99
- return !isRegistered(dependencyKey, factories);
100
- },
101
- );
102
- if (missingDependencies.length === 0) {
103
- return;
104
- }
105
-
106
- const dependencyList = missingDependencies
107
- .map((dependencyKey) => ` -> ${dependencyKey.name}`)
108
- .join('\n');
109
- throw new Error(
110
- `${factory.provides.name} will fail because it depends on:\n ${dependencyList}`,
111
- );
112
- }
113
-
114
- function isRegistered(key: GenericKey, factories: GenericFactory[]) {
115
- return factories.some((factory) => factory.provides?.symbol === key?.symbol);
116
- }
117
-
118
- function isSuitable<T, D extends readonly ServiceKey<any>[]>(
119
- key: ServiceKey<T>,
120
- factory: ServiceFactory<any, D>,
121
- ): factory is ServiceFactory<T, D> {
122
- return factory?.provides?.symbol === key?.symbol;
123
- }
1
+ import { ServiceKey } from './serviceKey';
2
+ import { ServiceFactory } from './serviceFactory';
3
+ import { ServiceScope } from './serviceScope';
4
+
5
+ type GenericFactory = ServiceFactory<unknown, readonly ServiceKey<any>[]>;
6
+ type GenericKey = ServiceKey<any>;
7
+
8
+ export class ServiceModule {
9
+ private constructor(readonly factories: GenericFactory[]) {
10
+ factories.forEach((factory) => {
11
+ checkRecursiveDependencies(factory);
12
+ checkMissingDependencies(factory, this.factories);
13
+ });
14
+ }
15
+
16
+ public async get<T>(key: ServiceKey<T>): Promise<T> {
17
+ const factory = this.factories.find((factory: GenericFactory) => {
18
+ return isSuitable(key, factory);
19
+ });
20
+
21
+ // Check if a factory to supply the requested key was not found
22
+ if (!factory) {
23
+ throw new Error(`Could not find a suitable factory for ${key.name}`);
24
+ }
25
+
26
+ // Resolve all dependencies first
27
+ const dependencies = await Promise.all(
28
+ factory.dependsOn.map((dependencyKey: ServiceKey<unknown>) => {
29
+ return this.get(dependencyKey);
30
+ }),
31
+ );
32
+
33
+ // Call the factory to retrieve the dependency
34
+ return factory.initialize(...dependencies);
35
+ }
36
+
37
+ /**
38
+ * Disposes of service factories within the specified scope or all factories if no scope is provided.
39
+ *
40
+ * This method is useful for cleaning up resources and instances held by service factories,
41
+ * such as singleton factories, as they may hold database connections or other resources that need to be released.
42
+ *
43
+ * @param {ServiceScope} [scope] The scope to filter the factories to be disposed.
44
+ * If not provided, all factories are disposed of.
45
+ * @return {void} No return value.
46
+ */
47
+ public dispose(scope?: ServiceScope) {
48
+ const factories = scope
49
+ ? this.factories.filter((f) => f.scope === scope)
50
+ : this.factories;
51
+
52
+ factories.forEach((factory) => factory.dispose?.());
53
+ }
54
+
55
+ /**
56
+ * Creates a new ServiceModule instance by aggregating and deduplicating a list of
57
+ * ServiceModule or GenericFactory instances.
58
+ * If multiple factories provide the same
59
+ * ServiceKey, the last one in the list takes precedence.
60
+ *
61
+ * @param {Array<ServiceModule | GenericFactory>} entries - An array of ServiceModule or GenericFactory
62
+ * instances to be processed into a single ServiceModule.
63
+ * @return {ServiceModule} A new ServiceModule containing the deduplicated factories.
64
+ */
65
+ static from(entries: (ServiceModule | GenericFactory)[]): ServiceModule {
66
+ // Flatten entries and keep only the last factory for each ServiceKey
67
+ const flattened = entries.flatMap((e) =>
68
+ e instanceof ServiceModule ? e.factories : [e],
69
+ );
70
+
71
+ const byKey = new Map<symbol, GenericFactory>();
72
+ // Later factories overwrite earlier ones (last-wins)
73
+ for (const f of flattened) {
74
+ byKey.set(f.provides.symbol, f);
75
+ }
76
+
77
+ return new ServiceModule(Array.from(byKey.values()));
78
+ }
79
+ }
80
+
81
+ function checkRecursiveDependencies(factory: GenericFactory) {
82
+ const recursive = factory.dependsOn.some((dependencyKey) => {
83
+ return dependencyKey === factory.provides;
84
+ });
85
+
86
+ if (recursive) {
87
+ throw new Error(
88
+ 'Recursive dependency detected on: ' + factory.provides.name,
89
+ );
90
+ }
91
+ }
92
+
93
+ function checkMissingDependencies(
94
+ factory: GenericFactory,
95
+ factories: GenericFactory[],
96
+ ) {
97
+ const missingDependencies = factory.dependsOn.filter(
98
+ (dependencyKey: GenericKey) => {
99
+ return !isRegistered(dependencyKey, factories);
100
+ },
101
+ );
102
+ if (missingDependencies.length === 0) {
103
+ return;
104
+ }
105
+
106
+ const dependencyList = missingDependencies
107
+ .map((dependencyKey) => ` -> ${dependencyKey.name}`)
108
+ .join('\n');
109
+ throw new Error(
110
+ `${factory.provides.name} will fail because it depends on:\n ${dependencyList}`,
111
+ );
112
+ }
113
+
114
+ function isRegistered(key: GenericKey, factories: GenericFactory[]) {
115
+ return factories.some((factory) => factory.provides?.symbol === key?.symbol);
116
+ }
117
+
118
+ function isSuitable<T, D extends readonly ServiceKey<any>[]>(
119
+ key: ServiceKey<T>,
120
+ factory: ServiceFactory<any, D>,
121
+ ): factory is ServiceFactory<T, D> {
122
+ return factory?.provides?.symbol === key?.symbol;
123
+ }
@@ -1,7 +1,7 @@
1
- export class ServiceScope {
2
- readonly symbol: symbol;
3
-
4
- constructor(readonly name: string) {
5
- this.symbol = Symbol(name);
6
- }
7
- }
1
+ export class ServiceScope {
2
+ readonly symbol: symbol;
3
+
4
+ constructor(readonly name: string) {
5
+ this.symbol = Symbol(name);
6
+ }
7
+ }
package/src/utils.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { ServiceModule } from './ServiceModule';
2
- import { ServiceKey } from './ServiceKey';
1
+ import { ServiceModule } from './serviceModule';
2
+ import { ServiceKey } from './serviceKey';
3
3
 
4
4
  export interface DotGraphOptions {
5
5
  /** Graph direction: 'TB' (top-bottom), 'LR' (left-right), 'BT' (bottom-top), 'RL' (right-left) */
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServiceScope.d.ts","sourceRoot":"","sources":["../src/ServiceScope.ts"],"names":[],"mappings":"AAAA,qBAAa,YAAY;IAGX,QAAQ,CAAC,IAAI,EAAE,MAAM;IAFjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEH,IAAI,EAAE,MAAM;CAGlC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ServiceScope.js","sourceRoot":"","sources":["../src/ServiceScope.ts"],"names":[],"mappings":";;;AAAA,MAAa,YAAY;IAGvB,YAAqB,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,oCAMC"}
File without changes