@zajno/common 2.0.9 → 2.0.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zajno/common",
3
- "version": "2.0.9",
3
+ "version": "2.0.10",
4
4
  "description": "Zajno's re-usable utilities for JS/TS projects",
5
5
  "repository": {
6
6
  "type": "git",
@@ -27,18 +27,18 @@
27
27
  "devDependencies": {
28
28
  "@faker-js/faker": "^7.6.0",
29
29
  "@types/jest": "^29.5.0",
30
- "@types/node": "^18.15.10",
30
+ "@types/node": "^18.15.11",
31
31
  "@zajno/eslint-config": "^2.3.0",
32
32
  "cpy-cli": "^4.2.0",
33
- "eslint": "^8.36.0",
33
+ "eslint": "^8.38.0",
34
34
  "fast-check": "^3.7.1",
35
35
  "jest": "^29.5.0",
36
36
  "jest-extended": "^3.2.4",
37
37
  "rimraf": "^3",
38
- "ts-jest": "^29.0.5",
38
+ "ts-jest": "^29.1.0",
39
39
  "ts-node": "^10.9.1",
40
40
  "tslib": "^2.5.0",
41
- "typescript": "^5.0.2"
41
+ "typescript": "^5.0.4"
42
42
  },
43
43
  "peerDependencies": {
44
44
  "tslib": "^2.4"
@@ -0,0 +1,30 @@
1
+ import { LazyPromise } from '../lazy/promise';
2
+ import { FunctionKeys, StringKeys } from '../types';
3
+ declare const PromiseGetter: "__promise";
4
+ type AllowedFnKeys<T> = FunctionKeys<T, any[], void>;
5
+ type PromiseProxy<T, TKeys extends StringKeys<T> = StringKeys<T>, TFnKeys = never, TWrap extends Object = {}> = {
6
+ [K in TKeys]: T[K] extends Function ? (K extends TFnKeys ? T[K] : never) : T[K];
7
+ } & {
8
+ readonly [PromiseGetter]: Promise<T>;
9
+ } & TWrap;
10
+ type ForbiddenKeys = typeof PromiseGetter;
11
+ type NoForbiddenKeys<T> = {
12
+ [K in keyof T]: K extends ForbiddenKeys ? never : T[K];
13
+ };
14
+ type Options<T, TFnKeys, TWrap, TLazy> = {
15
+ loader: () => Promise<T>;
16
+ fnKeys?: TFnKeys[];
17
+ wrap?: TWrap;
18
+ lazy?: TLazy;
19
+ };
20
+ /**
21
+ * Creates a proxy object that will be resolved to the object returned by the loader function. // Thanks CoPilot for this comment :)
22
+ *
23
+ * @param loader a function returning a promise that resolves to a proxied object
24
+ * @param fnKeys an array of keys that should be treated as functions so that they can be called before the object is resolved
25
+ * @param wrap an object that will be used as a wrapper for the proxied object. can contain any fields that will be copied to the resolved object
26
+ * @returns a proxy object that will be resolved to the object returned by the loader function
27
+ */
28
+ export declare function createPromiseProxy<T extends NoForbiddenKeys<T>, TFnKeys extends AllowedFnKeys<T> = never, TWrap extends Object = {}>(options: Options<T, TFnKeys, TWrap, typeof LazyPromise>): PromiseProxy<T, StringKeys<T>, TFnKeys, TWrap>;
29
+ export {};
30
+ //# sourceMappingURL=promiseProxy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promiseProxy.d.ts","sourceRoot":"","sources":["../../src/structures/promiseProxy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEpD,QAAA,MAAM,aAAa,aAAuB,CAAC;AAE3C,KAAK,aAAa,CAAC,CAAC,IAAI,YAAY,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;AAErD,KAAK,YAAY,CAAC,CAAC,EAAE,KAAK,SAAS,UAAU,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,GAAG,EAAG,IAAI;KAC5G,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,QAAQ,GAC7B,CAAC,CAAC,SAAS,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,GAClC,CAAC,CAAC,CAAC,CAAC;CACb,GAAG;IACA,QAAQ,CAAC,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACxC,GAAG,KAAK,CAAC;AAEV,KAAK,aAAa,GAAG,OAAO,aAAa,CAAC;AAC1C,KAAK,eAAe,CAAC,CAAC,IAAI;KACrB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,aAAa,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC;CACzD,CAAC;AAEF,KAAK,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,IAAI;IACrC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;IACnB,IAAI,CAAC,EAAE,KAAK,CAAC;IACb,IAAI,CAAC,EAAE,KAAK,CAAC;CAChB,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,SAAS,aAAa,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,KAAK,SAAS,MAAM,GAAG,EAAG,EACjI,OAAO,EAAE,OAAO,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,WAAW,CAAC,GACxD,YAAY,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAoFhD"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createPromiseProxy = void 0;
4
+ const promise_1 = require("../lazy/promise");
5
+ const PromiseGetter = '__promise';
6
+ /**
7
+ * Creates a proxy object that will be resolved to the object returned by the loader function. // Thanks CoPilot for this comment :)
8
+ *
9
+ * @param loader a function returning a promise that resolves to a proxied object
10
+ * @param fnKeys an array of keys that should be treated as functions so that they can be called before the object is resolved
11
+ * @param wrap an object that will be used as a wrapper for the proxied object. can contain any fields that will be copied to the resolved object
12
+ * @returns a proxy object that will be resolved to the object returned by the loader function
13
+ */
14
+ function createPromiseProxy(options) {
15
+ const { loader, fnKeys, wrap, lazy: TLazy = promise_1.LazyPromise } = options;
16
+ // wrapper object that will hold values temporarily while loading is in progress
17
+ const wrapper = wrap || {};
18
+ const functionCalls = new Map();
19
+ let _resolved = null;
20
+ let lazy = new TLazy(async () => {
21
+ // do the loading
22
+ const result = await loader();
23
+ // copy values from wrapper to result
24
+ Object.entries(wrapper).forEach(([key, value]) => {
25
+ if (value !== undefined && (!wrap || wrap[key] == null)) {
26
+ result[key] = value;
27
+ }
28
+ });
29
+ // call functions that were called before the object was resolved
30
+ for (const [key, args] of functionCalls) {
31
+ const fn = result[key];
32
+ fn.apply(result, args);
33
+ }
34
+ _resolved = result;
35
+ if (_resolved) {
36
+ // free up memory, we don't need the wrapper anymore
37
+ lazy = null;
38
+ }
39
+ return result;
40
+ });
41
+ const proxy = new Proxy(wrapper, {
42
+ get(target, key) {
43
+ if (key === PromiseGetter) {
44
+ return _resolved ? null : lazy.promise;
45
+ }
46
+ const current = _resolved || lazy.value;
47
+ if (current) {
48
+ if (wrap && !(key in current) && key in wrap) {
49
+ return target[key];
50
+ }
51
+ const res = current[key];
52
+ if (typeof res === 'function') {
53
+ return res.bind(current);
54
+ }
55
+ return res;
56
+ }
57
+ if (fnKeys === null || fnKeys === void 0 ? void 0 : fnKeys.includes(key)) {
58
+ return (...args) => {
59
+ functionCalls.set(key, args);
60
+ };
61
+ }
62
+ return target[key];
63
+ },
64
+ set(target, key, value) {
65
+ const current = _resolved || lazy.value;
66
+ if (current) {
67
+ current[key] = value;
68
+ }
69
+ else {
70
+ target[key] = value;
71
+ }
72
+ return true;
73
+ },
74
+ getOwnPropertyDescriptor(target, key) {
75
+ const current = _resolved || lazy.value;
76
+ if (current) {
77
+ return Object.getOwnPropertyDescriptor(current, key);
78
+ }
79
+ return Object.getOwnPropertyDescriptor(target, key);
80
+ },
81
+ ownKeys(target) {
82
+ const current = _resolved || lazy.value;
83
+ if (current) {
84
+ return Object.keys(current);
85
+ }
86
+ return Object.keys(target);
87
+ },
88
+ });
89
+ return proxy;
90
+ }
91
+ exports.createPromiseProxy = createPromiseProxy;
92
+ //# sourceMappingURL=promiseProxy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promiseProxy.js","sourceRoot":"","sources":["../../src/structures/promiseProxy.ts"],"names":[],"mappings":"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"}
package/types/index.d.ts CHANGED
@@ -5,6 +5,14 @@ export type Predicate<T> = (value: T) => boolean;
5
5
  export type TypedKeys<T extends Object, K> = {
6
6
  [P in keyof T]: T[P] extends K ? P : never;
7
7
  }[keyof T];
8
+ /** Type for extracting only string keys from T (skips number & symbol keys) */
9
+ export type StringKeys<T> = {
10
+ [K in keyof T]: K extends string ? K : never;
11
+ }[keyof T];
12
+ /** Type for extraction only keys, values of which are functions with certain args and return result */
13
+ export type FunctionKeys<T, TArgs extends any[] = any[], TRes = any> = {
14
+ [K in keyof T]: T[K] extends (...args: TArgs) => TRes ? K : never;
15
+ }[keyof T];
8
16
  export type ArrayTail<T> = T extends [any, ...infer P] ? [...P] : T;
9
17
  export type NestedPick<T, K extends any[]> = K extends Array<never> ? T : {
10
18
  [P in K[0]]: P extends keyof T ? NestedPick<T[P], ArrayTail<K>> : never;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAE7B,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;AAEjD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;KACxC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7C,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEpE,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,GAC7D,CAAC,GACD;KACG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAC1E,CAAC;AAEN,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACrB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAGF,MAAM,MAAM,WAAW,CACf,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAClB,MAAM,SAAS,CAAC,GACd,CAAC,EAAE,GACH,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GACrB,CAAC,GACD,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,cAAc,CAAC;AAE7B,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,CAAC;AAEjD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI;KACxC,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK;CAC7C,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,+EAA+E;AAC/E,MAAM,MAAM,UAAU,CAAC,CAAC,IAAI;KACvB,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,SAAS,MAAM,GAAG,CAAC,GAAG,KAAK;CAC/C,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,uGAAuG;AACvG,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,GAAG,GAAG,EAAE,EAAE,IAAI,GAAG,GAAG,IAAI;KAClE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,IAAI,GAAG,CAAC,GAAG,KAAK;CACpE,CAAC,MAAM,CAAC,CAAC,CAAC;AAEX,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;AAEpE,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,GAAG,EAAE,IAAI,CAAC,SAAS,KAAK,CAAC,KAAK,CAAC,GAC7D,CAAC,GACD;KACG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK;CAC1E,CAAC;AAEN,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;IACrB,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACjC,CAAC;AAGF,MAAM,MAAM,WAAW,CACf,CAAC,EACD,CAAC,SAAS,MAAM,EAChB,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,IAClB,MAAM,SAAS,CAAC,GACd,CAAC,EAAE,GACH,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,GACrB,CAAC,GACD,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC"}