@microphi/json-db 2.2.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 (62) hide show
  1. package/README.md +12 -0
  2. package/lib/index.d.ts +2 -0
  3. package/lib/index.d.ts.map +1 -0
  4. package/lib/index.js +2 -0
  5. package/lib/index.js.map +1 -0
  6. package/lib/lib/aspects/after.decorator.d.ts +35 -0
  7. package/lib/lib/aspects/after.decorator.d.ts.map +1 -0
  8. package/lib/lib/aspects/after.decorator.js +45 -0
  9. package/lib/lib/aspects/after.decorator.js.map +1 -0
  10. package/lib/lib/aspects/before.decorator.d.ts +28 -0
  11. package/lib/lib/aspects/before.decorator.d.ts.map +1 -0
  12. package/lib/lib/aspects/before.decorator.js +46 -0
  13. package/lib/lib/aspects/before.decorator.js.map +1 -0
  14. package/lib/lib/container/bootstrap.d.ts +3 -0
  15. package/lib/lib/container/bootstrap.d.ts.map +1 -0
  16. package/lib/lib/container/bootstrap.js +15 -0
  17. package/lib/lib/container/bootstrap.js.map +1 -0
  18. package/lib/lib/container/di.decorator.d.ts +10 -0
  19. package/lib/lib/container/di.decorator.d.ts.map +1 -0
  20. package/lib/lib/container/di.decorator.js +15 -0
  21. package/lib/lib/container/di.decorator.js.map +1 -0
  22. package/lib/lib/container/graph.d.ts +171 -0
  23. package/lib/lib/container/graph.d.ts.map +1 -0
  24. package/lib/lib/container/graph.js +429 -0
  25. package/lib/lib/container/graph.js.map +1 -0
  26. package/lib/lib/injctable/inject.decorator.d.ts +7 -0
  27. package/lib/lib/injctable/inject.decorator.d.ts.map +1 -0
  28. package/lib/lib/injctable/inject.decorator.js +31 -0
  29. package/lib/lib/injctable/inject.decorator.js.map +1 -0
  30. package/lib/lib/injctable/injectable.decorator.d.ts +16 -0
  31. package/lib/lib/injctable/injectable.decorator.d.ts.map +1 -0
  32. package/lib/lib/injctable/injectable.decorator.js +52 -0
  33. package/lib/lib/injctable/injectable.decorator.js.map +1 -0
  34. package/lib/lib/injctable/injector.d.ts +4 -0
  35. package/lib/lib/injctable/injector.d.ts.map +1 -0
  36. package/lib/lib/injctable/injector.js +25 -0
  37. package/lib/lib/injctable/injector.js.map +1 -0
  38. package/lib/lib/list/list.d.ts +28 -0
  39. package/lib/lib/list/list.d.ts.map +1 -0
  40. package/lib/lib/list/list.js +94 -0
  41. package/lib/lib/list/list.js.map +1 -0
  42. package/lib/lib/provider/providers.d.ts +15 -0
  43. package/lib/lib/provider/providers.d.ts.map +1 -0
  44. package/lib/lib/provider/providers.js +80 -0
  45. package/lib/lib/provider/providers.js.map +1 -0
  46. package/lib/lib/scan.d.ts +3 -0
  47. package/lib/lib/scan.d.ts.map +1 -0
  48. package/lib/lib/scan.js +19 -0
  49. package/lib/lib/scan.js.map +1 -0
  50. package/lib/lib/testing/mocked.d.ts +9 -0
  51. package/lib/lib/testing/mocked.d.ts.map +1 -0
  52. package/lib/lib/testing/mocked.js +58 -0
  53. package/lib/lib/testing/mocked.js.map +1 -0
  54. package/lib/lib/testing/test-bed.d.ts +7 -0
  55. package/lib/lib/testing/test-bed.d.ts.map +1 -0
  56. package/lib/lib/testing/test-bed.js +20 -0
  57. package/lib/lib/testing/test-bed.js.map +1 -0
  58. package/lib/lib/types.d.ts +10 -0
  59. package/lib/lib/types.d.ts.map +1 -0
  60. package/lib/lib/types.js +4 -0
  61. package/lib/lib/types.js.map +1 -0
  62. package/package.json +37 -0
@@ -0,0 +1,28 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,94 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,15 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,80 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,3 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,19 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,9 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,58 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,7 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,20 @@
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
@@ -0,0 +1 @@
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"]}
@@ -0,0 +1,10 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,4 @@
1
+ export function isSingletonDefinition(c) {
2
+ return 'provide' in c && 'useClass' in c;
3
+ }
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
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"]}
package/package.json ADDED
@@ -0,0 +1,37 @@
1
+ {
2
+ "name": "@microphi/json-db",
3
+ "version": "2.2.0",
4
+ "description": "Small, fast and simple file based json-db",
5
+ "main": "lib/index.js",
6
+ "typings": "lib/index.d.ts",
7
+ "module": "lib/index.js",
8
+ "directories": {
9
+ "lib": "lib"
10
+ },
11
+ "files": [
12
+ "lib"
13
+ ],
14
+ "license": "MIT",
15
+ "keywords": [
16
+ "json-db"
17
+ ],
18
+ "author": {
19
+ "email": "cavaliere.davide@gmail.com",
20
+ "name": "Davide Cavaliere",
21
+ "url": "www.dcsoftware.io"
22
+ },
23
+ "homepage": "https://github.com/microph1/microphi",
24
+ "scripts": {
25
+ "build": "tsc -b tsconfig.build.json",
26
+ "build:ci": "yarn build",
27
+ "test:ci": "jest --coverage --ci",
28
+ "prepack": "yarn build",
29
+ "lint": "eslint ./src"
30
+ },
31
+ "dependencies": {
32
+ "@microphi/debug": "^2.2.0"
33
+ },
34
+ "devDependencies": {
35
+ "@babel/plugin-transform-modules-commonjs": "^7.23.3"
36
+ }
37
+ }