@microphi/json-db 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -2
  3. package/lib/index.d.ts +1 -0
  4. package/lib/index.d.ts.map +1 -1
  5. package/lib/index.js +1 -0
  6. package/lib/index.js.map +1 -1
  7. package/lib/lib/storage/json-storage.d.ts +43 -0
  8. package/lib/lib/storage/json-storage.d.ts.map +1 -0
  9. package/lib/lib/storage/json-storage.js +197 -0
  10. package/lib/lib/storage/json-storage.js.map +1 -0
  11. package/package.json +13 -4
  12. package/lib/lib/aspects/after.decorator.d.ts +0 -35
  13. package/lib/lib/aspects/after.decorator.d.ts.map +0 -1
  14. package/lib/lib/aspects/after.decorator.js +0 -45
  15. package/lib/lib/aspects/after.decorator.js.map +0 -1
  16. package/lib/lib/aspects/before.decorator.d.ts +0 -28
  17. package/lib/lib/aspects/before.decorator.d.ts.map +0 -1
  18. package/lib/lib/aspects/before.decorator.js +0 -46
  19. package/lib/lib/aspects/before.decorator.js.map +0 -1
  20. package/lib/lib/container/bootstrap.d.ts +0 -3
  21. package/lib/lib/container/bootstrap.d.ts.map +0 -1
  22. package/lib/lib/container/bootstrap.js +0 -15
  23. package/lib/lib/container/bootstrap.js.map +0 -1
  24. package/lib/lib/container/di.decorator.d.ts +0 -10
  25. package/lib/lib/container/di.decorator.d.ts.map +0 -1
  26. package/lib/lib/container/di.decorator.js +0 -15
  27. package/lib/lib/container/di.decorator.js.map +0 -1
  28. package/lib/lib/container/graph.d.ts +0 -171
  29. package/lib/lib/container/graph.d.ts.map +0 -1
  30. package/lib/lib/container/graph.js +0 -429
  31. package/lib/lib/container/graph.js.map +0 -1
  32. package/lib/lib/injctable/inject.decorator.d.ts +0 -7
  33. package/lib/lib/injctable/inject.decorator.d.ts.map +0 -1
  34. package/lib/lib/injctable/inject.decorator.js +0 -31
  35. package/lib/lib/injctable/inject.decorator.js.map +0 -1
  36. package/lib/lib/injctable/injectable.decorator.d.ts +0 -16
  37. package/lib/lib/injctable/injectable.decorator.d.ts.map +0 -1
  38. package/lib/lib/injctable/injectable.decorator.js +0 -52
  39. package/lib/lib/injctable/injectable.decorator.js.map +0 -1
  40. package/lib/lib/injctable/injector.d.ts +0 -4
  41. package/lib/lib/injctable/injector.d.ts.map +0 -1
  42. package/lib/lib/injctable/injector.js +0 -25
  43. package/lib/lib/injctable/injector.js.map +0 -1
  44. package/lib/lib/provider/providers.d.ts +0 -15
  45. package/lib/lib/provider/providers.d.ts.map +0 -1
  46. package/lib/lib/provider/providers.js +0 -80
  47. package/lib/lib/provider/providers.js.map +0 -1
  48. package/lib/lib/scan.d.ts +0 -3
  49. package/lib/lib/scan.d.ts.map +0 -1
  50. package/lib/lib/scan.js +0 -19
  51. package/lib/lib/scan.js.map +0 -1
  52. package/lib/lib/testing/mocked.d.ts +0 -9
  53. package/lib/lib/testing/mocked.d.ts.map +0 -1
  54. package/lib/lib/testing/mocked.js +0 -58
  55. package/lib/lib/testing/mocked.js.map +0 -1
  56. package/lib/lib/testing/test-bed.d.ts +0 -7
  57. package/lib/lib/testing/test-bed.d.ts.map +0 -1
  58. package/lib/lib/testing/test-bed.js +0 -20
  59. package/lib/lib/testing/test-bed.js.map +0 -1
  60. package/lib/lib/types.d.ts +0 -10
  61. package/lib/lib/types.d.ts.map +0 -1
  62. package/lib/lib/types.js +0 -4
  63. package/lib/lib/types.js.map +0 -1
@@ -1,31 +0,0 @@
1
- import { Graph } from '../container/graph';
2
- import { getDebugger } from '@microphi/debug';
3
- import { ClassNameSymbol } from './injectable.decorator';
4
- const d = getDebugger('microphi:di:inject.decorator');
5
- const dependencies = new Graph();
6
- const InjectSymbol = Symbol.for('@Inject');
7
- export function Inject(klass) {
8
- return (target, propertyKey, parameterIndex) => {
9
- const targetClassName = target['name'];
10
- d('class', targetClassName, 'depends on', klass[ClassNameSymbol]);
11
- const originalClassName = klass[ClassNameSymbol];
12
- dependencies.addEdge(originalClassName, targetClassName);
13
- d('are there cycles?', dependencies.hasCycle());
14
- if (dependencies.hasCycle()) {
15
- console.error(dependencies.serialize());
16
- throw new Error(`Cycle dependency found ${originalClassName}`);
17
- }
18
- d('dependencies', dependencies.serialize());
19
- const deps = getInjectMetadata(target);
20
- deps.push({
21
- parameterIndex,
22
- klass
23
- });
24
- d('defined deps', deps);
25
- return Reflect.metadata(InjectSymbol, deps)(target);
26
- };
27
- }
28
- export function getInjectMetadata(target) {
29
- return Reflect.getMetadata(InjectSymbol, target) || [];
30
- }
31
- //# sourceMappingURL=inject.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"inject.decorator.js","sourceRoot":"","sources":["../../../src/lib/injctable/inject.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAE3C,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,GAAG,WAAW,CAAC,8BAA8B,CAAC,CAAC;AAEtD,MAAM,YAAY,GAAG,IAAI,KAAK,EAAE,CAAC;AAEjC,MAAM,YAAY,GAAG,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;AAE3C,MAAM,UAAU,MAAM,CAA2B,KAAQ;IAEvD,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE;QAE7C,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;QAEvC,CAAC,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,EAAE,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QAElE,MAAM,iBAAiB,GAAG,KAAK,CAAC,eAAe,CAAC,CAAC;QAEjD,YAAY,CAAC,OAAO,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAGzD,CAAC,CAAC,mBAAmB,EAAE,YAAY,CAAC,QAAQ,EAAE,CAAC,CAAC;QAEhD,IAAI,YAAY,CAAC,QAAQ,EAAE,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;YACxC,MAAM,IAAI,KAAK,CAAC,0BAA0B,iBAAiB,EAAE,CAAC,CAAC;QACjE,CAAC;QAED,CAAC,CAAC,cAAc,EAAE,YAAY,CAAC,SAAS,EAAE,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,CAAC,IAAI,CAAC;YACR,cAAc;YACd,KAAK;SACN,CAAC,CAAC;QACH,CAAC,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QAExB,OAAO,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,MAAa,CAAC,CAAC;IAC7D,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAW;IAC3C,OAAO,OAAO,CAAC,WAAW,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC","sourcesContent":["import { Graph } from '../container/graph';\nimport { Class } from 'utility-types';\nimport { getDebugger } from '@microphi/debug';\nimport { ClassNameSymbol } from './injectable.decorator';\n\nconst d = getDebugger('microphi:di:inject.decorator');\n\nconst dependencies = new Graph();\n\nconst InjectSymbol = Symbol.for('@Inject');\n\nexport function Inject<K extends Class<unknown>>(klass: K): ParameterDecorator {\n\n return (target, propertyKey, parameterIndex) => {\n\n const targetClassName = target['name'];\n\n d('class', targetClassName, 'depends on', klass[ClassNameSymbol]);\n\n const originalClassName = klass[ClassNameSymbol];\n\n dependencies.addEdge(originalClassName, targetClassName);\n\n\n d('are there cycles?', dependencies.hasCycle());\n\n if (dependencies.hasCycle()) {\n console.error(dependencies.serialize());\n throw new Error(`Cycle dependency found ${originalClassName}`);\n }\n\n d('dependencies', dependencies.serialize());\n\n const deps = getInjectMetadata(target);\n deps.push({\n parameterIndex,\n klass\n });\n d('defined deps', deps);\n\n return Reflect.metadata(InjectSymbol, deps)(target as any);\n };\n}\n\nexport function getInjectMetadata(target: any): {parameterIndex: number, klass: Class<unknown>}[] {\n return Reflect.getMetadata(InjectSymbol, target) || [];\n}\n"]}
@@ -1,16 +0,0 @@
1
- import 'reflect-metadata';
2
- import { Klass } from '../types';
3
- export declare const ClassNameSymbol: unique symbol;
4
- /**
5
- * Annotate a Class to be part of the DI system
6
- * @constructor
7
- */
8
- export declare function Injectable(): (target: any) => any;
9
- export declare function InjectableDecorator<T extends {
10
- new (...args: any[]): {};
11
- }>(klass: T): {
12
- new (...args: any[]): {};
13
- [ClassNameSymbol]: string;
14
- } & T;
15
- export declare function getInjectableMetadata(klass: Klass): string;
16
- //# sourceMappingURL=injectable.decorator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injectable.decorator.d.ts","sourceRoot":"","sources":["../../../src/lib/injctable/injectable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAI1B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAKjC,eAAO,MAAM,eAAe,eAAsB,CAAC;AAEnD;;;GAGG;AACH,wBAAgB,UAAU,yBAKzB;AAGD,wBAAgB,mBAAmB,CAAC,CAAC,SAAS;IAAC,KAAI,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,CAAA;CAAC,EAAE,KAAK,EAAE,CAAC;kBAkBxD,GAAG,EAAE;;MAiB7B;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,CAE1D"}
@@ -1,52 +0,0 @@
1
- import 'reflect-metadata';
2
- import { getDebugger } from '@microphi/debug';
3
- import { injector } from './injector';
4
- import { getInjectMetadata } from './inject.decorator';
5
- const d = getDebugger('microphi:di:injectable.decorator');
6
- export const ClassNameSymbol = Symbol('ClassName');
7
- /**
8
- * Annotate a Class to be part of the DI system
9
- * @constructor
10
- */
11
- export function Injectable() {
12
- return target => {
13
- d('annotating', target.name);
14
- return InjectableDecorator(target);
15
- };
16
- }
17
- // eslint-disable-next-line @typescript-eslint/ban-types
18
- export function InjectableDecorator(klass) {
19
- var _a, _b;
20
- // this is needed because minified code can have different classes with the same name
21
- // leading to a dependency cycle error which is not really there
22
- // appending a random number will fix this problem
23
- // TODO ideally this should be collision free hashing
24
- const suffix = (Math.random() * 10000).toFixed(0).toString();
25
- Reflect.metadata(ClassNameSymbol, klass)(klass);
26
- const injectMetadata = getInjectMetadata(klass);
27
- return _b = class extends klass {
28
- constructor(...args) {
29
- d(args);
30
- d({ injectMetadata });
31
- for (const { parameterIndex, klass } of injectMetadata) {
32
- // TODO implement a factory
33
- // factory should be configurable from the @DI container so that
34
- // dependencies can be passed
35
- args[parameterIndex] = injector(klass);
36
- }
37
- super(...args);
38
- // d('class name', this[ClassNameSymbol]);
39
- }
40
- },
41
- _a = ClassNameSymbol,
42
- _b[_a] = `${klass.name}_${suffix}`,
43
- (() => {
44
- d('this is the static portion of', klass.name + suffix);
45
- d('here symbol has been set');
46
- })(),
47
- _b;
48
- }
49
- export function getInjectableMetadata(klass) {
50
- return Reflect.getMetadata(ClassNameSymbol, klass);
51
- }
52
- //# sourceMappingURL=injectable.decorator.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injectable.decorator.js","sourceRoot":"","sources":["../../../src/lib/injctable/injectable.decorator.ts"],"names":[],"mappings":"AAAA,OAAO,kBAAkB,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAGvD,MAAM,CAAC,GAAG,WAAW,CAAC,kCAAkC,CAAC,CAAC;AAG1D,MAAM,CAAC,MAAM,eAAe,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;AAEnD;;;GAGG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,MAAM,CAAC,EAAE;QACd,CAAC,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7B,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC;AACJ,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,mBAAmB,CAAsC,KAAQ;;IAC/E,qFAAqF;IACrF,gEAAgE;IAChE,kDAAkD;IAClD,qDAAqD;IACrD,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAE9D,OAAO,CAAC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAEhD,YAAO,KAAM,SAAQ,KAAK;YAQxB,YAAY,GAAG,IAAW;gBACxB,CAAC,CAAC,IAAI,CAAC,CAAC;gBACR,CAAC,CAAC,EAAE,cAAc,EAAE,CAAC,CAAC;gBAEtB,KAAK,MAAM,EAAC,cAAc,EAAE,KAAK,EAAC,IAAI,cAAc,EAAE,CAAC;oBACrD,2BAA2B;oBAC3B,gEAAgE;oBAChE,6BAA6B;oBAC7B,IAAI,CAAC,cAAc,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACzC,CAAC;gBAED,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;gBAEf,0CAA0C;YAE5C,CAAC;SACF;aAvBS,eAAe;QAAhB,MAAiB,GAAG,GAAG,KAAK,CAAC,IAAI,IAAI,MAAM,EAAG;QAErD;YACE,CAAC,CAAC,+BAA+B,EAAE,KAAK,CAAC,IAAI,GAAG,MAAM,CAAC,CAAC;YACxD,CAAC,CAAC,0BAA0B,CAAC,CAAC;QAChC,CAAC,GAAA;WAkBD;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,KAAY;IAChD,OAAO,OAAO,CAAC,WAAW,CAAC,eAAe,EAAE,KAAK,CAAC,CAAC;AACrD,CAAC","sourcesContent":["import 'reflect-metadata';\nimport { getDebugger } from '@microphi/debug';\nimport { injector } from './injector';\nimport { getInjectMetadata } from './inject.decorator';\nimport { Klass } from '../types';\n\nconst d = getDebugger('microphi:di:injectable.decorator');\n\n\nexport const ClassNameSymbol = Symbol('ClassName');\n\n/**\n * Annotate a Class to be part of the DI system\n * @constructor\n */\nexport function Injectable() {\n return target => {\n d('annotating', target.name);\n return InjectableDecorator(target);\n };\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function InjectableDecorator<T extends {new(...args: any[]): {}}>(klass: T) {\n // this is needed because minified code can have different classes with the same name\n // leading to a dependency cycle error which is not really there\n // appending a random number will fix this problem\n // TODO ideally this should be collision free hashing\n const suffix = (Math.random() * 10_000).toFixed(0).toString();\n\n Reflect.metadata(ClassNameSymbol, klass)(klass);\n const injectMetadata = getInjectMetadata(klass);\n\n return class extends klass {\n static [ClassNameSymbol] = `${klass.name}_${suffix}`;\n\n static {\n d('this is the static portion of', klass.name + suffix);\n d('here symbol has been set');\n }\n\n constructor(...args: any[]) {\n d(args);\n d({ injectMetadata });\n\n for (const {parameterIndex, klass} of injectMetadata) {\n // TODO implement a factory\n // factory should be configurable from the @DI container so that\n // dependencies can be passed\n args[parameterIndex] = injector(klass);\n }\n\n super(...args);\n\n // d('class name', this[ClassNameSymbol]);\n\n }\n };\n}\n\nexport function getInjectableMetadata(klass: Klass): string {\n return Reflect.getMetadata(ClassNameSymbol, klass);\n}\n"]}
@@ -1,4 +0,0 @@
1
- import { Class } from 'utility-types';
2
- import 'reflect-metadata';
3
- export declare function injector<K extends Class<any>>(klass: K): InstanceType<K>;
4
- //# sourceMappingURL=injector.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injector.d.ts","sourceRoot":"","sources":["../../../src/lib/injctable/injector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAItC,OAAO,kBAAkB,CAAC;AAI1B,wBAAgB,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAoBxE"}
@@ -1,25 +0,0 @@
1
- import { getDebugger } from '@microphi/debug';
2
- import { ClassNameSymbol } from './injectable.decorator';
3
- import { providers } from '../container/di.decorator';
4
- import 'reflect-metadata';
5
- const d = getDebugger('microphi:di:injector');
6
- export function injector(klass) {
7
- d('searching singleton for', klass);
8
- // here class is the @Injectable() version so we need to get original class name
9
- if (providers.hasInjectable(klass)) {
10
- return providers.getInstance(klass);
11
- }
12
- else {
13
- // what happens here is that `klass` may not be available for injection for
14
- // two reasons:
15
- // 1 - is annotated with `@Injectable` but is not "provided" in the DI container
16
- // 2 - it is not annotated
17
- if (ClassNameSymbol in klass) {
18
- throw Error(`Did you forgot to add ${klass[ClassNameSymbol]} to the list of providers`);
19
- }
20
- else {
21
- throw Error(`Is ${klass.name} annotated with @Injectable()`);
22
- }
23
- }
24
- }
25
- //# sourceMappingURL=injector.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"injector.js","sourceRoot":"","sources":["../../../src/lib/injctable/injector.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,kBAAkB,CAAC;AAE1B,MAAM,CAAC,GAAG,WAAW,CAAC,sBAAsB,CAAC,CAAC;AAE9C,MAAM,UAAU,QAAQ,CAAuB,KAAQ;IACrD,CAAC,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;IACpC,gFAAgF;IAGhF,IAAI,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;SAAM,CAAC;QAEN,2EAA2E;QAC3E,eAAe;QACf,gFAAgF;QAChF,0BAA0B;QAC1B,IAAI,eAAe,IAAI,KAAK,EAAE,CAAC;YAC7B,MAAM,KAAK,CAAC,yBAAyB,KAAK,CAAC,eAAe,CAAC,2BAA2B,CAAC,CAAC;QAC1F,CAAC;aAAM,CAAC;YAEN,MAAM,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,+BAA+B,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;AACH,CAAC","sourcesContent":["import { Class } from 'utility-types';\nimport { getDebugger } from '@microphi/debug';\nimport { ClassNameSymbol } from './injectable.decorator';\nimport { providers } from '../container/di.decorator';\nimport 'reflect-metadata';\n\nconst d = getDebugger('microphi:di:injector');\n\nexport function injector<K extends Class<any>>(klass: K): InstanceType<K> {\n d('searching singleton for', klass);\n // here class is the @Injectable() version so we need to get original class name\n\n\n if (providers.hasInjectable(klass)) {\n return providers.getInstance(klass);\n } else {\n\n // what happens here is that `klass` may not be available for injection for\n // two reasons:\n // 1 - is annotated with `@Injectable` but is not \"provided\" in the DI container\n // 2 - it is not annotated\n if (ClassNameSymbol in klass) {\n throw Error(`Did you forgot to add ${klass[ClassNameSymbol]} to the list of providers`);\n } else {\n\n throw Error(`Is ${klass.name} annotated with @Injectable()`);\n }\n }\n}\n"]}
@@ -1,15 +0,0 @@
1
- import { Klass, Provider } from '../types';
2
- export declare class Providers {
3
- private providers;
4
- private useClass;
5
- private instances;
6
- addInjectable(provider: Provider): void;
7
- hasInjectable(klass: Klass): boolean;
8
- hasInstance(klass: Klass): boolean;
9
- getInstance(klass: Klass): any;
10
- hasUseClass(klass: Klass): boolean;
11
- getUseClass(klass: Klass): Klass | undefined;
12
- private static getName;
13
- reset(): void;
14
- }
15
- //# sourceMappingURL=providers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../../src/lib/provider/providers.ts"],"names":[],"mappings":"AACA,OAAO,EAAmC,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAM5E,qBAAa,SAAS;IACpB,OAAO,CAAC,SAAS,CAAkC;IACnD,OAAO,CAAC,QAAQ,CAAkC;IAClD,OAAO,CAAC,SAAS,CAAqC;IAGtD,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAwBvC,aAAa,CAAC,KAAK,EAAE,KAAK;IAQ1B,WAAW,CAAC,KAAK,EAAE,KAAK;IAIxB,WAAW,CAAC,KAAK,EAAE,KAAK;IA8BxB,WAAW,CAAC,KAAK,EAAE,KAAK;IAIxB,WAAW,CAAC,KAAK,EAAE,KAAK;IAIxB,OAAO,CAAC,MAAM,CAAC,OAAO;IAItB,KAAK;CAKN"}
@@ -1,80 +0,0 @@
1
- import { ClassNameSymbol, getInjectableMetadata, } from '../injctable/injectable.decorator';
2
- import { isSingletonDefinition } from '../types';
3
- import { providers } from '../container/di.decorator';
4
- import { getDebugger } from '@microphi/debug';
5
- const d = getDebugger('microphi:di:providers');
6
- export class Providers {
7
- constructor() {
8
- this.providers = new Map();
9
- this.useClass = new Map();
10
- this.instances = new Map();
11
- }
12
- addInjectable(provider) {
13
- if (isSingletonDefinition(provider)) {
14
- d('adding injectable', provider.provide);
15
- if (!(ClassNameSymbol in provider.provide)) {
16
- throw Error(`Is ${provider.provide.name} annotated with @Injectable()?`);
17
- }
18
- this.providers.set(provider.provide[ClassNameSymbol], provider.provide);
19
- this.useClass.set(provider.provide[ClassNameSymbol], provider.useClass);
20
- }
21
- else {
22
- d('adding injectable', provider);
23
- if (!(ClassNameSymbol in provider)) {
24
- throw Error(`Is ${provider.name} annotated with @Injectable()?`);
25
- }
26
- this.providers.set(provider[ClassNameSymbol], provider);
27
- d('injectables', this.providers.entries());
28
- }
29
- }
30
- hasInjectable(klass) {
31
- const name = Providers.getName(klass);
32
- d('checking provider for', name);
33
- d(providers.providers.entries());
34
- return this.providers.has(name);
35
- }
36
- hasInstance(klass) {
37
- return this.instances.has(Providers.getName(klass));
38
- }
39
- getInstance(klass) {
40
- // TODO optimization needed
41
- const className = Providers.getName(klass);
42
- if (this.instances.has(className)) {
43
- d(`found instance for ${className}`);
44
- return this.instances.get(className);
45
- }
46
- if (this.useClass.has(className)) {
47
- d(`${className} has a provided implementation`);
48
- const k = this.useClass.get(className);
49
- if (!k) {
50
- throw new Error('Unable to instantiat class');
51
- }
52
- const instance = new k();
53
- this.instances.set(className, instance);
54
- return instance;
55
- }
56
- d(`instantiating ${className}`);
57
- const k = this.providers.get(className);
58
- if (!k) {
59
- throw new Error('Unable to instantiat class');
60
- }
61
- const instance = new k();
62
- this.instances.set(className, instance);
63
- return instance;
64
- }
65
- hasUseClass(klass) {
66
- return this.useClass.has(Providers.getName(klass));
67
- }
68
- getUseClass(klass) {
69
- return this.useClass.get(Providers.getName(klass));
70
- }
71
- static getName(klass) {
72
- return ClassNameSymbol in klass ? klass[ClassNameSymbol] : getInjectableMetadata(klass);
73
- }
74
- reset() {
75
- this.providers.clear();
76
- this.useClass.clear();
77
- this.instances.clear();
78
- }
79
- }
80
- //# sourceMappingURL=providers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"providers.js","sourceRoot":"","sources":["../../../src/lib/provider/providers.ts"],"names":[],"mappings":"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","sourcesContent":["import { ClassNameSymbol, getInjectableMetadata, } from '../injctable/injectable.decorator';\nimport { Instance, isSingletonDefinition, Klass, Provider } from '../types';\nimport { providers } from '../container/di.decorator';\nimport { getDebugger } from '@microphi/debug';\n\nconst d = getDebugger('microphi:di:providers');\n\nexport class Providers {\n private providers: Map<unknown, Klass> = new Map();\n private useClass: Map<unknown, Klass> = new Map();\n private instances: Map<unknown, Instance> = new Map();\n\n\n addInjectable(provider: Provider): void {\n\n if (isSingletonDefinition(provider)) {\n d('adding injectable', provider.provide);\n\n if (!(ClassNameSymbol in provider.provide)) {\n throw Error(`Is ${provider.provide.name} annotated with @Injectable()?`);\n }\n\n this.providers.set(provider.provide[ClassNameSymbol], provider.provide);\n this.useClass.set(provider.provide[ClassNameSymbol], provider.useClass);\n\n } else {\n d('adding injectable', provider);\n\n if (!(ClassNameSymbol in provider)) {\n throw Error(`Is ${provider.name} annotated with @Injectable()?`);\n }\n\n this.providers.set(provider[ClassNameSymbol], provider);\n d('injectables', this.providers.entries());\n }\n }\n\n hasInjectable(klass: Klass) {\n const name = Providers.getName(klass);\n\n d('checking provider for', name);\n d(providers.providers.entries());\n return this.providers.has(name);\n }\n\n hasInstance(klass: Klass) {\n return this.instances.has(Providers.getName(klass));\n }\n\n getInstance(klass: Klass) {\n // TODO optimization needed\n const className = Providers.getName(klass);\n if (this.instances.has(className)) {\n d(`found instance for ${className}`);\n return this.instances.get(className);\n }\n\n if (this.useClass.has(className)) {\n d(`${className} has a provided implementation`);\n const k = this.useClass.get(className);\n if (!k) {\n throw new Error('Unable to instantiat class');\n }\n const instance = new k();\n this.instances.set(className, instance);\n return instance;\n }\n\n d(`instantiating ${className}`);\n const k = this.providers.get(className);\n if (!k) {\n throw new Error('Unable to instantiat class');\n }\n const instance = new k();\n this.instances.set(className, instance);\n return instance;\n\n }\n\n hasUseClass(klass: Klass) {\n return this.useClass.has(Providers.getName(klass));\n }\n\n getUseClass(klass: Klass) {\n return this.useClass.get(Providers.getName(klass));\n }\n\n private static getName(klass: Klass) {\n return ClassNameSymbol in klass ? klass[ClassNameSymbol] : getInjectableMetadata(klass);\n }\n\n reset() {\n this.providers.clear();\n this.useClass.clear();\n this.instances.clear();\n }\n}\n"]}
package/lib/lib/scan.d.ts DELETED
@@ -1,3 +0,0 @@
1
- import { Class } from 'utility-types';
2
- export declare function scan<T extends object>(instance: T, cb: (proto: Class<T>, key: string) => void): void;
3
- //# sourceMappingURL=scan.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.d.ts","sourceRoot":"","sources":["../../src/lib/scan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAItC,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,QAqB7F"}
package/lib/lib/scan.js DELETED
@@ -1,19 +0,0 @@
1
- const builtInMethods = Object.keys(Object.getOwnPropertyDescriptors(Object.getPrototypeOf({})));
2
- export function scan(instance, cb) {
3
- let proto = Object.getPrototypeOf(instance);
4
- while (proto) {
5
- const descriptors = Object.getOwnPropertyDescriptors(proto);
6
- Object.keys(descriptors)
7
- .filter((k) => {
8
- return !builtInMethods.includes(k);
9
- })
10
- .forEach((key) => cb(proto, key));
11
- try {
12
- proto = Object.getPrototypeOf(proto);
13
- }
14
- catch (e) {
15
- proto = null;
16
- }
17
- }
18
- }
19
- //# sourceMappingURL=scan.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"scan.js","sourceRoot":"","sources":["../../src/lib/scan.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,yBAAyB,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AAEhG,MAAM,UAAU,IAAI,CAAmB,QAAW,EAAE,EAA0C;IAE5F,IAAI,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAE5C,OAAO,KAAK,EAAE,CAAC;QAEb,MAAM,WAAW,GAAG,MAAM,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;QAE5D,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACZ,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC;aACD,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAEpC,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,KAAK,GAAG,IAAI,CAAC;QACf,CAAC;IACH,CAAC;AAEH,CAAC","sourcesContent":["import { Class } from 'utility-types';\n\nconst builtInMethods = Object.keys(Object.getOwnPropertyDescriptors(Object.getPrototypeOf({})));\n\nexport function scan<T extends object>(instance: T, cb: (proto: Class<T>, key: string) => void) {\n\n let proto = Object.getPrototypeOf(instance);\n\n while (proto) {\n\n const descriptors = Object.getOwnPropertyDescriptors(proto);\n\n Object.keys(descriptors)\n .filter((k) => {\n return !builtInMethods.includes(k);\n })\n .forEach((key) => cb(proto, key));\n\n try {\n proto = Object.getPrototypeOf(proto);\n } catch (e) {\n proto = null;\n }\n }\n\n}\n"]}
@@ -1,9 +0,0 @@
1
- /// <reference types="jest" />
2
- import Mock = jest.Mock;
3
- import FunctionPropertyNames = jest.FunctionPropertyNames;
4
- import { FunctionKeys } from 'utility-types';
5
- import { Klass } from '../types';
6
- export type MockedOptions<InstanceType extends object> = Partial<Record<FunctionKeys<InstanceType>, Mock | 'NO_MOCK'>>;
7
- export declare const Mocked: <BaseClass extends Klass, K extends object = InstanceType<BaseClass>>(base: BaseClass, options?: MockedOptions<K>) => BaseClass;
8
- export type WithMock<T> = T & Record<FunctionPropertyNames<T>, Mock>;
9
- //# sourceMappingURL=mocked.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mocked.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/mocked.ts"],"names":[],"mappings":";AAAA,OAAO,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;AACxB,OAAO,qBAAqB,GAAG,IAAI,CAAC,qBAAqB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAY,KAAK,EAAE,MAAM,UAAU,CAAC;AAM3C,MAAM,MAAM,aAAa,CAAC,YAAY,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,IAAI,GAAC,SAAS,CAAC,CAAC,CAAC;AAErH,eAAO,MAAM,MAAM,8EACX,SAAS,YACN,cAAc,CAAC,CAAC,KACxB,SA8Ba,CAAC;AAEjB,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC"}
@@ -1,58 +0,0 @@
1
- import { getDebugger } from '@microphi/debug';
2
- const d = getDebugger('microphi:di:mocked');
3
- const MockedSymbol = Symbol('Mocked');
4
- export const Mocked = (base, options = {}) => {
5
- var _a, _b;
6
- return _b = class {
7
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
8
- constructor(...ops) {
9
- this[_a] = true;
10
- d({ options });
11
- const methods = [...getPropertyNames(base.prototype)];
12
- d('methods', methods);
13
- methods
14
- .forEach((m) => {
15
- if (m in options) {
16
- if (options[m] === 'NO_MOCK') {
17
- this[m] = base.prototype[m];
18
- }
19
- if (options[m] !== 'NO_MOCK' && typeof options[m] === 'function') {
20
- this[m] = options[m];
21
- d('mocking method', m, 'with custom implementation');
22
- }
23
- }
24
- else {
25
- d('mocking method', m, 'with spy fn');
26
- this[m] = jest.fn();
27
- }
28
- });
29
- }
30
- },
31
- _a = MockedSymbol,
32
- _b;
33
- };
34
- function* getPropertyNames(instance) {
35
- const internals = ['constructor', '__defineGetter__',
36
- '__defineSetter__',
37
- 'hasOwnProperty',
38
- '__lookupGetter__',
39
- '__lookupSetter__',
40
- 'isPrototypeOf',
41
- 'propertyIsEnumerable',
42
- 'toString',
43
- 'valueOf',
44
- 'toLocaleString'
45
- ];
46
- while (instance) {
47
- const methods = Object.getOwnPropertyNames(instance)
48
- .filter((property) => {
49
- return typeof instance[property] === 'function';
50
- })
51
- .filter((p) => !internals.includes(p));
52
- for (const method of methods) {
53
- yield method;
54
- }
55
- instance = Object.getPrototypeOf(instance);
56
- }
57
- }
58
- //# sourceMappingURL=mocked.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"mocked.js","sourceRoot":"","sources":["../../../src/lib/testing/mocked.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAI9C,MAAM,CAAC,GAAG,WAAW,CAAC,oBAAoB,CAAC,CAAC;AAE5C,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;AAItC,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,IAAe,EACf,UAA4B,EAAE,EACnB,EAAE;;IAEb,OAAA,KAAA;YAGE,6DAA6D;YAC7D,YAAY,GAAG,GAAU;gBAHzB,QAAc,GAAG,IAAI,CAAC;gBAKpB,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC;gBAEf,MAAM,OAAO,GAAG,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;gBACtD,CAAC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;gBAEtB,OAAO;qBACJ,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;oBACb,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;wBACjB,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;4BAC7B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;wBAC9B,CAAC;wBAED,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,OAAO,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,EAAE,CAAC;4BACjE,IAAI,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;4BACrB,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAAE,4BAA4B,CAAC,CAAC;wBACvD,CAAC;oBACH,CAAC;yBAAM,CAAC;wBACN,CAAC,CAAC,gBAAgB,EAAE,CAAC,EAAE,aAAa,CAAC,CAAC;wBACtC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,EAAE,EAAE,CAAC;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAC;YACP,CAAC;SACF;aA3BE,YAAY;UA2BD,CAAA;CAAA,CAAC;AAKjB,QAAS,CAAC,CAAA,gBAAgB,CAAC,QAAkB;IAC3C,MAAM,SAAS,GAAG,CAAC,aAAa,EAAE,kBAAkB;QAClD,kBAAkB;QAClB,gBAAgB;QAChB,kBAAkB;QAClB,kBAAkB;QAClB,eAAe;QACf,sBAAsB;QACtB,UAAU;QACV,SAAS;QACT,gBAAgB;KACjB,CAAC;IAEF,OAAO,QAAQ,EAAE,CAAC;QAEhB,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC;aACjD,MAAM,CAAC,CAAC,QAAQ,EAAE,EAAE;YACnB,OAAO,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,UAAU,CAAC;QAClD,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAEzC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,MAAM,CAAC;QACf,CAAC;QAED,QAAQ,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC","sourcesContent":["import Mock = jest.Mock;\nimport FunctionPropertyNames = jest.FunctionPropertyNames;\nimport { getDebugger } from '@microphi/debug';\nimport { FunctionKeys } from 'utility-types';\nimport { Instance, Klass } from '../types';\n\nconst d = getDebugger('microphi:di:mocked');\n\nconst MockedSymbol = Symbol('Mocked');\n\nexport type MockedOptions<InstanceType extends object> = Partial<Record<FunctionKeys<InstanceType>, Mock|'NO_MOCK'>>;\n\nexport const Mocked = <BaseClass extends Klass, K extends object = InstanceType<BaseClass>>(\n base: BaseClass,\n options: MockedOptions<K> = {},\n): BaseClass =>\n\n class {\n [MockedSymbol] = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n constructor(...ops: any[]) {\n\n d({ options });\n\n const methods = [...getPropertyNames(base.prototype)];\n d('methods', methods);\n\n methods\n .forEach((m) => {\n if (m in options) {\n if (options[m] === 'NO_MOCK') {\n this[m] = base.prototype[m];\n }\n\n if (options[m] !== 'NO_MOCK' && typeof options[m] === 'function') {\n this[m] = options[m];\n d('mocking method', m, 'with custom implementation');\n }\n } else {\n d('mocking method', m, 'with spy fn');\n this[m] = jest.fn();\n }\n });\n }\n } as BaseClass;\n\nexport type WithMock<T> = T & Record<FunctionPropertyNames<T>, Mock>;\n\n\nfunction *getPropertyNames(instance: Instance) {\n const internals = ['constructor', '__defineGetter__',\n '__defineSetter__',\n 'hasOwnProperty',\n '__lookupGetter__',\n '__lookupSetter__',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toString',\n 'valueOf',\n 'toLocaleString'\n ];\n\n while (instance) {\n\n const methods = Object.getOwnPropertyNames(instance)\n .filter((property) => {\n return typeof instance[property] === 'function';\n })\n .filter((p) => !internals.includes(p));\n\n for (const method of methods) {\n yield method;\n }\n\n instance = Object.getPrototypeOf(instance);\n }\n}\n"]}
@@ -1,7 +0,0 @@
1
- import { DIOptions } from '../container/di.decorator';
2
- import { Klass } from '../types';
3
- export declare class TestBed {
4
- static configure(config: DIOptions): void;
5
- static inject(klass: Klass): any;
6
- }
7
- //# sourceMappingURL=test-bed.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-bed.d.ts","sourceRoot":"","sources":["../../../src/lib/testing/test-bed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAM,SAAS,EAAa,MAAM,2BAA2B,CAAC;AACrE,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGjC,qBAAa,OAAO;IAElB,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI;IAYzC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK;CAI3B"}
@@ -1,20 +0,0 @@
1
- import { __decorate } from "tslib";
2
- import { DI, providers } from '../container/di.decorator';
3
- import { bootstrap } from '../container/bootstrap';
4
- export class TestBed {
5
- static configure(config) {
6
- // we want to have fresh instances every time configure is called
7
- // usually in `beforeEach` section
8
- providers.reset();
9
- let App = class App {
10
- };
11
- App = __decorate([
12
- DI(config)
13
- ], App);
14
- bootstrap(App);
15
- }
16
- static inject(klass) {
17
- return providers.getInstance(klass);
18
- }
19
- }
20
- //# sourceMappingURL=test-bed.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"test-bed.js","sourceRoot":"","sources":["../../../src/lib/testing/test-bed.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,EAAE,EAAa,SAAS,EAAE,MAAM,2BAA2B,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AAEnD,MAAM,OAAO,OAAO;IAEX,AAAP,MAAM,CAAC,SAAS,CAAC,MAAiB;QAChC,iEAAiE;QACjE,kCAAkC;QAClC,SAAS,CAAC,KAAK,EAAE,CAAC;QAIlB,IAAM,GAAG,GAAT,MAAM,GAAG;SAAG,CAAA;QAAN,GAAG;YADR,EAAE,CAAC,MAAM,CAAC;WACL,GAAG,CAAG;QAEZ,SAAS,CAAC,GAAG,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,KAAY;QACxB,OAAO,SAAS,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IACtC,CAAC;CAEF","sourcesContent":["import { DI, DIOptions, providers } from '../container/di.decorator';\nimport { Klass } from '../types';\nimport { bootstrap } from '../container/bootstrap';\n\nexport class TestBed {\n\n static configure(config: DIOptions): void {\n // we want to have fresh instances every time configure is called\n // usually in `beforeEach` section\n providers.reset();\n\n\n @DI(config)\n class App {}\n\n bootstrap(App);\n }\n\n static inject(klass: Klass) {\n return providers.getInstance(klass);\n }\n\n}\n"]}
@@ -1,10 +0,0 @@
1
- import { Class } from 'utility-types';
2
- export type Klass<T = any> = Class<T>;
3
- export type Instance<T extends Class<any> = any> = InstanceType<T>;
4
- export interface ProviderDefinition {
5
- provide: Klass;
6
- useClass: Klass;
7
- }
8
- export declare function isSingletonDefinition(c: ProviderDefinition | Klass): c is ProviderDefinition;
9
- export type Provider = ProviderDefinition | Klass;
10
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAEtC,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;AAEtC,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,CAAC;AAEnE,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,KAAK,CAAC;IACf,QAAQ,EAAE,KAAK,CAAA;CAChB;AAED,wBAAgB,qBAAqB,CAAC,CAAC,EAAE,kBAAkB,GAAG,KAAK,GAAG,CAAC,IAAI,kBAAkB,CAE5F;AAED,MAAM,MAAM,QAAQ,GAAG,kBAAkB,GAAG,KAAK,CAAC"}
package/lib/lib/types.js DELETED
@@ -1,4 +0,0 @@
1
- export function isSingletonDefinition(c) {
2
- return 'provide' in c && 'useClass' in c;
3
- }
4
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":"AAWA,MAAM,UAAU,qBAAqB,CAAC,CAA6B;IACjE,OAAO,SAAS,IAAI,CAAC,IAAI,UAAU,IAAI,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import { Class } from 'utility-types';\n\nexport type Klass<T = any> = Class<T>;\n\nexport type Instance<T extends Class<any> = any> = InstanceType<T>;\n\nexport interface ProviderDefinition {\n provide: Klass,\n useClass: Klass\n}\n\nexport function isSingletonDefinition(c: ProviderDefinition | Klass): c is ProviderDefinition {\n return 'provide' in c && 'useClass' in c;\n}\n\nexport type Provider = ProviderDefinition | Klass;\n"]}