@microphi/json-db 2.2.0 → 2.5.1
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/LICENSE +21 -0
- package/README.md +52 -3
- package/lib/index.d.ts +1 -1
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +4 -2
- package/lib/lib/storage/json-storage.d.ts +43 -0
- package/lib/lib/storage/json-storage.d.ts.map +1 -0
- package/lib/lib/storage/json-storage.js +200 -0
- package/package.json +14 -4
- package/lib/index.js.map +0 -1
- package/lib/lib/aspects/after.decorator.d.ts +0 -35
- package/lib/lib/aspects/after.decorator.d.ts.map +0 -1
- package/lib/lib/aspects/after.decorator.js +0 -45
- package/lib/lib/aspects/after.decorator.js.map +0 -1
- package/lib/lib/aspects/before.decorator.d.ts +0 -28
- package/lib/lib/aspects/before.decorator.d.ts.map +0 -1
- package/lib/lib/aspects/before.decorator.js +0 -46
- package/lib/lib/aspects/before.decorator.js.map +0 -1
- package/lib/lib/container/bootstrap.d.ts +0 -3
- package/lib/lib/container/bootstrap.d.ts.map +0 -1
- package/lib/lib/container/bootstrap.js +0 -15
- package/lib/lib/container/bootstrap.js.map +0 -1
- package/lib/lib/container/di.decorator.d.ts +0 -10
- package/lib/lib/container/di.decorator.d.ts.map +0 -1
- package/lib/lib/container/di.decorator.js +0 -15
- package/lib/lib/container/di.decorator.js.map +0 -1
- package/lib/lib/container/graph.d.ts +0 -171
- package/lib/lib/container/graph.d.ts.map +0 -1
- package/lib/lib/container/graph.js +0 -429
- package/lib/lib/container/graph.js.map +0 -1
- package/lib/lib/injctable/inject.decorator.d.ts +0 -7
- package/lib/lib/injctable/inject.decorator.d.ts.map +0 -1
- package/lib/lib/injctable/inject.decorator.js +0 -31
- package/lib/lib/injctable/inject.decorator.js.map +0 -1
- package/lib/lib/injctable/injectable.decorator.d.ts +0 -16
- package/lib/lib/injctable/injectable.decorator.d.ts.map +0 -1
- package/lib/lib/injctable/injectable.decorator.js +0 -52
- package/lib/lib/injctable/injectable.decorator.js.map +0 -1
- package/lib/lib/injctable/injector.d.ts +0 -4
- package/lib/lib/injctable/injector.d.ts.map +0 -1
- package/lib/lib/injctable/injector.js +0 -25
- package/lib/lib/injctable/injector.js.map +0 -1
- package/lib/lib/list/list.d.ts +0 -28
- package/lib/lib/list/list.d.ts.map +0 -1
- package/lib/lib/list/list.js +0 -94
- package/lib/lib/list/list.js.map +0 -1
- package/lib/lib/provider/providers.d.ts +0 -15
- package/lib/lib/provider/providers.d.ts.map +0 -1
- package/lib/lib/provider/providers.js +0 -80
- package/lib/lib/provider/providers.js.map +0 -1
- package/lib/lib/scan.d.ts +0 -3
- package/lib/lib/scan.d.ts.map +0 -1
- package/lib/lib/scan.js +0 -19
- package/lib/lib/scan.js.map +0 -1
- package/lib/lib/testing/mocked.d.ts +0 -9
- package/lib/lib/testing/mocked.d.ts.map +0 -1
- package/lib/lib/testing/mocked.js +0 -58
- package/lib/lib/testing/mocked.js.map +0 -1
- package/lib/lib/testing/test-bed.d.ts +0 -7
- package/lib/lib/testing/test-bed.d.ts.map +0 -1
- package/lib/lib/testing/test-bed.js +0 -20
- package/lib/lib/testing/test-bed.js.map +0 -1
- package/lib/lib/types.d.ts +0 -10
- package/lib/lib/types.d.ts.map +0 -1
- package/lib/lib/types.js +0 -4
- 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 +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"]}
|
package/lib/lib/list/list.d.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
import { $Keys, FunctionKeys } from 'utility-types';
|
|
3
|
-
export interface Operation {
|
|
4
|
-
op: FunctionKeys<List<any>>;
|
|
5
|
-
payload?: unknown;
|
|
6
|
-
timestamp: Date;
|
|
7
|
-
}
|
|
8
|
-
export declare class List<EntityType extends object> implements Iterable<EntityType> {
|
|
9
|
-
private IDField;
|
|
10
|
-
operations$: Subject<Operation>;
|
|
11
|
-
readonly entities: Map<string, EntityType>;
|
|
12
|
-
/**
|
|
13
|
-
* maps entities position from the original array to their ids
|
|
14
|
-
*/
|
|
15
|
-
private readonly ids;
|
|
16
|
-
get size(): number;
|
|
17
|
-
has(id: string): boolean;
|
|
18
|
-
get(id: string): EntityType | undefined;
|
|
19
|
-
private getId;
|
|
20
|
-
constructor(IDField: $Keys<EntityType>, entities?: EntityType[]);
|
|
21
|
-
[Symbol.iterator](): IterableIterator<EntityType>;
|
|
22
|
-
upsert(...entities: EntityType[]): void;
|
|
23
|
-
prepend(...entities: EntityType[]): void;
|
|
24
|
-
clear(): void;
|
|
25
|
-
delete(...entities: EntityType[]): void;
|
|
26
|
-
append(...entities: EntityType[]): void;
|
|
27
|
-
}
|
|
28
|
-
//# sourceMappingURL=list.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../../src/lib/list/list.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAGpD,MAAM,WAAW,SAAS;IAExB,EAAE,EAAE,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,qBAAa,IAAI,CAAC,UAAU,SAAS,MAAM,CAAE,YAAW,QAAQ,CAAC,UAAU,CAAC;IAgC9D,OAAO,CAAC,OAAO;IA9BpB,WAAW,qBAA4B;IAE9C,SAAgB,QAAQ,0BAAiC;IAEzD;;OAEG;IACH,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAgB;IAEpC,IAAW,IAAI,WAOd;IAEM,GAAG,CAAC,EAAE,EAAE,MAAM;IAId,GAAG,CAAC,EAAE,EAAE,MAAM;IAIrB,OAAO,CAAC,KAAK;gBAIO,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,QAAQ,GAAE,UAAU,EAAO;IAW1E,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,gBAAgB,CAAC,UAAU,CAAC;IAa3C,MAAM,CAAC,GAAG,QAAQ,EAAE,UAAU,EAAE;IAehC,OAAO,CAAC,GAAG,QAAQ,EAAE,UAAU,EAAE;IAgBjC,KAAK;IAQL,MAAM,CAAC,GAAG,QAAQ,EAAE,UAAU,EAAE;IAehC,MAAM,CAAC,GAAG,QAAQ,EAAE,UAAU,EAAE;CAgBxC"}
|
package/lib/lib/list/list.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import { Subject } from 'rxjs';
|
|
2
|
-
export class List {
|
|
3
|
-
get size() {
|
|
4
|
-
if (this.ids.length !== this.entities.size) {
|
|
5
|
-
throw new Error(`Size Mismatch ${this.ids.length} !== ${this.entities.size}`);
|
|
6
|
-
}
|
|
7
|
-
return this.entities.size;
|
|
8
|
-
}
|
|
9
|
-
has(id) {
|
|
10
|
-
return this.entities.has(id);
|
|
11
|
-
}
|
|
12
|
-
get(id) {
|
|
13
|
-
return this.entities.get(id);
|
|
14
|
-
}
|
|
15
|
-
getId(entity) {
|
|
16
|
-
return entity[this.IDField];
|
|
17
|
-
}
|
|
18
|
-
constructor(IDField, entities = []) {
|
|
19
|
-
this.IDField = IDField;
|
|
20
|
-
this.operations$ = new Subject();
|
|
21
|
-
this.entities = new Map();
|
|
22
|
-
/**
|
|
23
|
-
* maps entities position from the original array to their ids
|
|
24
|
-
*/
|
|
25
|
-
this.ids = [];
|
|
26
|
-
this.ids = entities.map((e) => this.getId(e));
|
|
27
|
-
entities
|
|
28
|
-
.forEach((item) => {
|
|
29
|
-
const id = this.getId(item);
|
|
30
|
-
this.entities.set(id, item);
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
*[Symbol.iterator]() {
|
|
34
|
-
for (const idx in this.ids) {
|
|
35
|
-
const id = this.ids[idx];
|
|
36
|
-
const entity = this.entities.get(id);
|
|
37
|
-
if (entity) {
|
|
38
|
-
yield entity;
|
|
39
|
-
}
|
|
40
|
-
else {
|
|
41
|
-
throw new Error(`Cannot get entity with id ${id}`);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
upsert(...entities) {
|
|
46
|
-
entities.forEach((e) => {
|
|
47
|
-
const id = this.getId(e);
|
|
48
|
-
if (!this.entities.has(id)) {
|
|
49
|
-
this.ids.push(id);
|
|
50
|
-
}
|
|
51
|
-
this.entities.set(id, e);
|
|
52
|
-
});
|
|
53
|
-
this.operations$.next({ op: 'upsert', payload: entities, timestamp: new Date() });
|
|
54
|
-
}
|
|
55
|
-
prepend(...entities) {
|
|
56
|
-
entities.reverse().forEach((e) => {
|
|
57
|
-
const id = this.getId(e);
|
|
58
|
-
if (this.entities.has(id)) {
|
|
59
|
-
this.delete(e);
|
|
60
|
-
}
|
|
61
|
-
this.ids.unshift(id);
|
|
62
|
-
this.entities.set(id, e);
|
|
63
|
-
});
|
|
64
|
-
this.operations$.next({ op: 'prepend', payload: entities, timestamp: new Date() });
|
|
65
|
-
}
|
|
66
|
-
clear() {
|
|
67
|
-
this.ids.length = 0;
|
|
68
|
-
this.entities.clear();
|
|
69
|
-
this.operations$.next({ op: 'clear', timestamp: new Date() });
|
|
70
|
-
}
|
|
71
|
-
delete(...entities) {
|
|
72
|
-
entities.forEach((e) => {
|
|
73
|
-
const id = this.getId(e);
|
|
74
|
-
const indexOfId = this.ids.findIndex((_id) => _id === id);
|
|
75
|
-
if (indexOfId >= 0) {
|
|
76
|
-
this.ids.splice(indexOfId, 1);
|
|
77
|
-
this.entities.delete(id);
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
this.operations$.next({ op: 'delete', payload: entities, timestamp: new Date() });
|
|
81
|
-
}
|
|
82
|
-
append(...entities) {
|
|
83
|
-
entities.forEach((e) => {
|
|
84
|
-
const id = this.getId(e);
|
|
85
|
-
if (this.entities.has(id)) {
|
|
86
|
-
this.delete(e);
|
|
87
|
-
}
|
|
88
|
-
this.ids.push(id);
|
|
89
|
-
this.entities.set(id, e);
|
|
90
|
-
});
|
|
91
|
-
this.operations$.next({ op: 'append', payload: entities, timestamp: new Date() });
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=list.js.map
|
package/lib/lib/list/list.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../../src/lib/list/list.ts"],"names":[],"mappings":"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","sourcesContent":["import { Subject } from 'rxjs';\nimport { $Keys, FunctionKeys } from 'utility-types';\n\n\nexport interface Operation {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n op: FunctionKeys<List<any>>;\n payload?: unknown;\n timestamp: Date;\n}\n\nexport class List<EntityType extends object> implements Iterable<EntityType> {\n\n public operations$ = new Subject<Operation>();\n\n public readonly entities = new Map<string, EntityType>();\n\n /**\n * maps entities position from the original array to their ids\n */\n private readonly ids: string[] = [];\n\n public get size() {\n if (this.ids.length !== this.entities.size) {\n\n throw new Error(`Size Mismatch ${this.ids.length} !== ${this.entities.size}`);\n }\n\n return this.entities.size;\n }\n\n public has(id: string) {\n return this.entities.has(id);\n }\n\n public get(id: string) {\n return this.entities.get(id);\n }\n\n private getId(entity: EntityType): string {\n return entity[this.IDField] as string;\n }\n\n constructor(private IDField: $Keys<EntityType>, entities: EntityType[] = []) {\n\n this.ids = entities.map((e) => this.getId(e));\n\n entities\n .forEach((item) => {\n const id = this.getId(item);\n this.entities.set(id, item);\n });\n }\n\n *[Symbol.iterator](): IterableIterator<EntityType> {\n for (const idx in this.ids) {\n const id = this.ids[idx];\n\n const entity = this.entities.get(id);\n if (entity) {\n yield entity;\n } else {\n throw new Error(`Cannot get entity with id ${id}`);\n }\n }\n }\n\n public upsert(...entities: EntityType[]) {\n entities.forEach((e) => {\n const id = this.getId(e);\n\n if (!this.entities.has(id)) {\n this.ids.push(id);\n }\n\n this.entities.set(id, e);\n\n });\n\n this.operations$.next({ op: 'upsert', payload: entities, timestamp: new Date() });\n }\n\n public prepend(...entities: EntityType[]) {\n entities.reverse().forEach((e) => {\n const id = this.getId(e);\n\n if (this.entities.has(id)) {\n this.delete(e);\n }\n\n this.ids.unshift(id);\n\n this.entities.set(id, e);\n\n });\n this.operations$.next({ op: 'prepend', payload: entities, timestamp: new Date() });\n }\n\n public clear() {\n\n this.ids.length = 0;\n this.entities.clear();\n this.operations$.next({ op: 'clear', timestamp: new Date() });\n\n }\n\n public delete(...entities: EntityType[]) {\n\n entities.forEach((e) => {\n const id = this.getId(e);\n const indexOfId = this.ids.findIndex((_id) => _id === id);\n\n if (indexOfId >= 0) {\n this.ids.splice(indexOfId, 1);\n this.entities.delete(id);\n }\n });\n\n this.operations$.next({ op: 'delete', payload: entities, timestamp: new Date() });\n }\n\n public append(...entities: EntityType[]) {\n entities.forEach((e) => {\n const id = this.getId(e);\n\n if (this.entities.has(id)) {\n this.delete(e);\n }\n\n this.ids.push(id);\n this.entities.set(id, e);\n });\n\n this.operations$.next({ op: 'append', payload: entities, timestamp: new Date() });\n }\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
package/lib/lib/scan.d.ts.map
DELETED
|
@@ -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
|
package/lib/lib/scan.js.map
DELETED
|
@@ -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 +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"]}
|
package/lib/lib/types.d.ts
DELETED
|
@@ -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
|
package/lib/lib/types.d.ts.map
DELETED
|
@@ -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
package/lib/lib/types.js.map
DELETED
|
@@ -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"]}
|