@kirill.konshin/utils 0.0.7 → 0.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/.ctirc +10 -0
  2. package/.storybook/main.ts +21 -0
  3. package/.storybook/preview.ts +17 -0
  4. package/.turbo/turbo-build.log +67 -0
  5. package/.turbo/turbo-test.log +118 -0
  6. package/CHANGELOG.md +12 -0
  7. package/README.md +59 -0
  8. package/builders/.swcrc +18 -0
  9. package/builders/build.config.ts +11 -0
  10. package/builders/bun.build.js +23 -0
  11. package/builders/package.json +209 -0
  12. package/builders/perf.mjs +63 -0
  13. package/builders/rollup.config.mjs +50 -0
  14. package/builders/rslib.config.ts +26 -0
  15. package/builders/tsconfig.json +21 -0
  16. package/builders/tsup.config.ts +20 -0
  17. package/builders/turbo.json +24 -0
  18. package/builders/vite.config.ts +37 -0
  19. package/demo/cache-demo.ts +2 -1
  20. package/package.json +166 -21
  21. package/src/bootstrap/adaptiveContainer.tsx +12 -0
  22. package/src/bootstrap/controls.stories.tsx +62 -0
  23. package/src/bootstrap/controls.tsx +119 -0
  24. package/src/bootstrap/error.stories.tsx +34 -0
  25. package/src/bootstrap/error.tsx +40 -0
  26. package/src/bootstrap/field.stories.tsx +42 -0
  27. package/src/bootstrap/field.tsx +35 -0
  28. package/src/bootstrap/footer.tsx +49 -0
  29. package/src/bootstrap/globalLoading.stories.tsx +25 -0
  30. package/src/bootstrap/globalLoading.tsx +17 -0
  31. package/src/bootstrap/index.ts +12 -0
  32. package/src/bootstrap/loading.stories.tsx +35 -0
  33. package/src/bootstrap/loading.tsx +22 -0
  34. package/src/bootstrap/main.scss +86 -0
  35. package/src/bootstrap/responsiveHelper.tsx +50 -0
  36. package/src/bootstrap/screen.stories.tsx +160 -0
  37. package/src/bootstrap/screen.tsx +144 -0
  38. package/src/bootstrap/toaster.stories.tsx +32 -0
  39. package/src/bootstrap/toaster.tsx +38 -0
  40. package/src/bootstrap/useModal.stories.tsx +51 -0
  41. package/src/bootstrap/useModal.tsx +88 -0
  42. package/src/bootstrap/useWrappedForm.ts +40 -0
  43. package/src/core/cache.test.ts +121 -0
  44. package/src/{cache.ts → core/cache.ts} +29 -10
  45. package/src/electron/README.md +13 -0
  46. package/src/electron/createWindow.ts +234 -0
  47. package/src/electron/index.ts +2 -0
  48. package/src/electron/updater.ts +54 -0
  49. package/src/electron-builder/builder.ts +150 -0
  50. package/src/electron-builder/images.ts +33 -0
  51. package/src/electron-builder/index.ts +2 -0
  52. package/src/mui/README.md +3 -0
  53. package/src/mui/formControlFieldset.stories.tsx +71 -0
  54. package/src/mui/formControlFieldset.tsx +26 -0
  55. package/src/mui/formLabelLegend.tsx +11 -0
  56. package/src/mui/genericControl.tsx +20 -0
  57. package/src/mui/index.ts +4 -0
  58. package/src/mui/readOnly.tsx +6 -0
  59. package/src/next/appLink.tsx +39 -0
  60. package/src/next/index.ts +5 -0
  61. package/src/next/measure.ts +7 -0
  62. package/src/next/noSSR.tsx +17 -0
  63. package/src/next/redirect.tsx +13 -0
  64. package/src/next/useIsInner.ts +13 -0
  65. package/src/react/apiCall.ts +25 -0
  66. package/src/react/form/client.tsx +62 -0
  67. package/src/react/form/form.tsx +109 -0
  68. package/src/react/form/index.ts +2 -0
  69. package/src/react/index.ts +4 -0
  70. package/src/react/useFetch.ts +29 -0
  71. package/src/react/useFetcher.ts +49 -0
  72. package/src/react-native/index.ts +3 -0
  73. package/src/react-native/share.ts +31 -0
  74. package/src/react-native/update.tsx +40 -0
  75. package/src/react-native/useAppState.ts +18 -0
  76. package/src/tailwind/fullpage.tsx +11 -0
  77. package/src/tailwind/index.ts +2 -0
  78. package/src/tailwind/responsiveHelper.tsx +16 -0
  79. package/src-todo/auth0.tsx +177 -0
  80. package/tsconfig.json +15 -18
  81. package/turbo.json +2 -11
  82. package/vite.config.ts +47 -0
  83. package/vite.exports.ts +121 -0
  84. package/build/cache.d.ts +0 -119
  85. package/build/cache.js +0 -176
  86. package/build/errors.d.ts +0 -1
  87. package/build/errors.js +0 -14
  88. package/build/index.d.ts +0 -5
  89. package/build/index.js +0 -5
  90. package/build/measure.d.ts +0 -34
  91. package/build/measure.js +0 -48
  92. package/build/mutex.d.ts +0 -5
  93. package/build/mutex.js +0 -23
  94. package/build/worker.d.ts +0 -83
  95. package/build/worker.js +0 -250
  96. package/tsconfig.tsbuildinfo +0 -1
  97. package/src/{errors.ts → core/errors.ts} +0 -0
  98. package/src/{index.ts → core/index.ts} +1 -1
  99. /package/src/{measure.ts → core/measure.ts} +0 -0
  100. /package/src/{mutex.ts → core/mutex.ts} +0 -0
  101. /package/src/{worker.ts → core/worker.ts} +0 -0
@@ -0,0 +1,121 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as process from 'node:process';
4
+ import { globSync } from 'glob';
5
+ import { execSync } from 'node:child_process';
6
+
7
+ export const pkgPath = path.join(process.cwd(), 'package.json');
8
+
9
+ export const distDir = './dist';
10
+
11
+ //TODO Re-read in fixExports
12
+ // import pkg from './package.json' assert { type: 'json' };
13
+ // export { pkg };
14
+ export const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
15
+
16
+ export const rootPkg = JSON.parse(fs.readFileSync(path.resolve('../../package.json'), 'utf-8'));
17
+
18
+ export const formats = {
19
+ // cjs: ['require', 'js', 'd.ts'],
20
+ esm: ['import', 'mjs', 'd.ts'],
21
+ };
22
+
23
+ export const entryGlob = 'src/*/index.ts';
24
+ export const excludeGlob = 'src/**/*.{stories,test}.{ts,tsx}';
25
+ export const includeGlob = 'src/**/!(*.stories|*.test).{ts,tsx}';
26
+ export const foldersGlob = 'src/*/';
27
+
28
+ export const external = [
29
+ ...[...Object.keys(pkg.dependencies), ...Object.keys(pkg.devDependencies)].map(
30
+ (dep) => new RegExp(`^${dep}(/.*)?`),
31
+ ),
32
+ /node_modules/,
33
+ /^node:.*/,
34
+ /builder-util-runtime/,
35
+ ];
36
+
37
+ export const entry = globSync(entryGlob);
38
+
39
+ export async function fixExports() {
40
+ const modules = globSync(foldersGlob).map((file) => path.basename(file));
41
+
42
+ // Exports
43
+
44
+ pkg.exports = {};
45
+
46
+ // https://johnnyreilly.com/dual-publishing-esm-cjs-modules-with-tsup-and-are-the-types-wrong
47
+ // https://www.npmjs.com/package/@arethetypeswrong/cli
48
+ // FIXME https://github.com/andrewbranch/example-subpath-exports-ts-compat
49
+ for (const entry of modules) {
50
+ const key = `./${entry}`;
51
+
52
+ pkg.exports[key] = {};
53
+
54
+ for (const [format, ext, type] of Object.values(formats)) {
55
+ const fileName = `${distDir}/${entry}/index`;
56
+
57
+ pkg.exports[key][format] = {
58
+ [format]: `${fileName}.${ext}`,
59
+ types: `${fileName}.${type}`,
60
+ };
61
+ }
62
+ }
63
+
64
+ const core = pkg.exports['./core'];
65
+
66
+ pkg.exports['.'] = core;
67
+
68
+ // Main
69
+
70
+ pkg.type = 'module';
71
+ pkg.main = pkg.module = core.import.import;
72
+ pkg.types = core.import.types;
73
+
74
+ // Author & License
75
+
76
+ // TODO Move to root build + set private=true for demos + set react version
77
+ pkg.publishConfig = { access: 'public' };
78
+ pkg.author = 'Kirill Konshin <kirill@konshin.org> (https://konshin.org)';
79
+ pkg.license = 'MIT';
80
+
81
+ // Scripts
82
+
83
+ // pkg.scripts.clean = 'rm -rf dist .tscache tsconfig.tsbuildinfo';
84
+ // pkg.scripts.build = 'vite build';
85
+ // pkg.scripts.start = 'yarn build --watch';
86
+ pkg.scripts.wait = `wait-on ${core.import.import}`;
87
+
88
+ // Ensure peer deps are correct & meta is set
89
+
90
+ pkg.peerDependenciesMeta = {};
91
+
92
+ for (const [key, _] of Object.entries(pkg.peerDependencies)) {
93
+ const root = rootPkg.devDependencies[key]; // lifted to root
94
+ const srcPkg = root ? rootPkg : pkg;
95
+
96
+ if (!srcPkg.devDependencies[key]) throw new Error(`Key ${key} not found in dependencies`);
97
+
98
+ pkg.peerDependenciesMeta[key] = { optional: true };
99
+
100
+ const version = srcPkg.devDependencies[key].split('.');
101
+
102
+ pkg.peerDependencies[key] = version[0] === '^0' ? `${version[0]}.${version[1]}` : version[0];
103
+ }
104
+
105
+ // Write
106
+
107
+ fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2));
108
+
109
+ console.log('Updated package.json with exports');
110
+ // console.log(pkg);
111
+ // console.log(pkg.exports);
112
+ }
113
+
114
+ export async function generateIndex() {
115
+ execSync(`yarn build:index`, { stdio: 'inherit' }); // programmatic call
116
+ //FIXME https://github.com/imjuni/create-ts-index/issues/70
117
+ // import { TypeScritIndexWriter } from 'create-ts-index';
118
+ // const tsiw = new TypeScritIndexWriter();
119
+ // const options = TypeScritIndexWriter.getDefaultOption('./src');
120
+ // await tsiw.createEntrypoint(option);
121
+ }
package/build/cache.d.ts DELETED
@@ -1,119 +0,0 @@
1
- export type MaybePromise<T> = T | Promise<T>;
2
- export declare const shallowCompare: (prev: any, next: any) => boolean;
3
- export declare const equal: (prev: any, next: any) => boolean;
4
- export declare function createTracker<Dep = any>(whenDifferent: (next: Dep, prev: Dep) => boolean, shallow?: boolean): (dependency: Dep) => boolean;
5
- /**
6
- * https://github.com/futpib/deep-weak-map
7
- * https://github.com/fregante/many-keys-map
8
- * https://github.com/fregante/many-keys-weakmap
9
- * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments
10
- *
11
- * ```ts
12
- * const memoized = memo(
13
- * (file, options, ...args) => { ... },
14
- * {
15
- * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],
16
- * invalidate: (bitmap) => !bitmap.width,
17
- * dispose: (bitmap) => bitmap.close(),
18
- * }
19
- * );
20
- * ```
21
- */
22
- export declare function memo<Key extends any[], Val, SerializedKey extends any[] = Key>(fn: (...args: Key) => MaybePromise<Val>, { key, invalidate, dispose, }?: {
23
- key?: (...key: Key) => SerializedKey;
24
- invalidate?: (prev: Val, ...key: SerializedKey) => boolean;
25
- dispose?: (prev: Val, ...key: SerializedKey) => void;
26
- }): {
27
- (...args: Key): Promise<{
28
- value: Val | undefined;
29
- hit: boolean;
30
- }>;
31
- clear: () => void;
32
- size: () => number;
33
- };
34
- /**
35
- * Allows to memoize values by key and invalidate them based on the previous value.
36
- *
37
- * This makes possible to implement various one-off and subsequent transformations.
38
- *
39
- * 1. `write`: Before writing to cache, called only once if cache is present and valid
40
- * 2. `read`: After it's read from cache, always called if cache is valid
41
- * TODO Better names: once, folloing
42
- * TODO Better names: memoize, recover
43
- * TODO Better names: writeTransformer, readTransformer
44
- * TODO Better names: writeModifier, readModifier
45
- * TODO Better names: write, read
46
- *
47
- * Both should return same type or null.
48
- *
49
- * If newValue is null, old is returned, and no cache is set.
50
- *
51
- * ```ts
52
- * class InputCache extends TypedCache<string, ImageBitmap> {
53
- * dispose(bitmap: ImageBitmap, key: string) {
54
- * bitmap.close();
55
- * }
56
- * }
57
- *
58
- * const cache = new InputCache('input');
59
- *
60
- * // Cache provided OffscreenCanvas by name and create context once per canvas
61
- *
62
- * class CanvasCache extends TypedCache<string, OffscreenCanvas> {
63
- * protected write(key: string, canvas: OffscreenCanvas): OffscreenCanvas {
64
- * const canvas = newValue.getContext('2d');
65
- * canvas.ctx = canvas;
66
- * return canvas;
67
- * }
68
- * }
69
- *
70
- * // Transfer control to offscreen canvas and track removal of original
71
- * // When called again, always return null, because canvas is handed to worker, and never returned to main
72
- *
73
- * class CanvasCache extends TypedCache<HTMLCanvasElement, OffscreenCanvas> {
74
- *
75
- * protected write(canvas: HTMLCanvasElement): OffscreenCanvas {
76
- * let l;
77
- * canvas.addEventListener(
78
- * 'remove',
79
- * (l = () => {
80
- * console.log('Removing canvas from cache', key);
81
- * this.delete(canvas);
82
- * key.removeEventListener('remove', l);
83
- * }),
84
- * );
85
- * return canvas.transferControlToOffscreen();
86
- * }
87
- *
88
- * protected read() {
89
- * return null;
90
- * }
91
- * }
92
- *
93
- * // Create bitmap from file and check if was used, return null if used
94
- * // Since bitmaps are also cached in worker, used bitmaps are not sent
95
- *
96
- * class BitmapCache extends TypedCache<File, ImageBitmap, File> {
97
- * protected async write(file: File): Promise<ImageBitmap> {
98
- * return await createImageBitmap(file);
99
- * }
100
- *
101
- * protected read(bitmap: ImageBitmap): Promise<ImageBitmap> | ImageBitmap {
102
- * if (!bitmap.width) return null;
103
- * return bitmap;
104
- * }
105
- * }
106
- *
107
- * ```
108
- */
109
- export declare abstract class TransformerMap<Key, Val = Key> extends Map<Key, Val> {
110
- protected readonly name: string;
111
- constructor(name: string);
112
- protected write(key: Key, newValue?: Val, oldValue?: Val): MaybePromise<Val>;
113
- protected read(oldValue: Val, key: Key): MaybePromise<Val>;
114
- delete(key: Key): boolean;
115
- protected dispose(value: Val, key: Key): void;
116
- clear(): void;
117
- set(key: Key, value: Val): this;
118
- memo(key: Key, newValue?: Val): Promise<Val>;
119
- }
package/build/cache.js DELETED
@@ -1,176 +0,0 @@
1
- import ManyKeysMap from 'many-keys-map';
2
- export const shallowCompare = (prev, next) => Array.from(new Set([...Object.keys(prev), ...Object.keys(next)])).every((key) => prev[key] === next[key]);
3
- export const equal = (prev, next) => prev === next;
4
- export function createTracker(whenDifferent, shallow = false) {
5
- let lastDependency = null;
6
- const comparator = shallow ? shallowCompare : equal;
7
- return function tracker(dependency) {
8
- if (!lastDependency || !dependency || comparator(lastDependency, dependency)) {
9
- // console.log('RETAINED cache', this.name, 'last', this.lastObj, 'new', obj);
10
- return false;
11
- }
12
- // console.log('INVALIDATED cache', this.name, 'last', this.lastObj, 'new', obj);
13
- lastDependency = dependency;
14
- return whenDifferent(dependency, lastDependency) || true;
15
- };
16
- }
17
- /**
18
- * https://github.com/futpib/deep-weak-map
19
- * https://github.com/fregante/many-keys-map
20
- * https://github.com/fregante/many-keys-weakmap
21
- * https://github.com/sindresorhus/memoize?tab=readme-ov-file#example-multiple-non-serializable-arguments
22
- *
23
- * ```ts
24
- * const memoized = memo(
25
- * (file, options, ...args) => { ... },
26
- * {
27
- * key: (file, options, ...args) => [file, JSON.stringify(options), ...args],
28
- * invalidate: (bitmap) => !bitmap.width,
29
- * dispose: (bitmap) => bitmap.close(),
30
- * }
31
- * );
32
- * ```
33
- */
34
- export function memo(fn, { key = (...k) => k, invalidate, dispose, } = {}) {
35
- const map = new ManyKeysMap();
36
- const clear = () => {
37
- if (dispose) {
38
- map.forEach((value, key) => dispose(value, ...key));
39
- }
40
- map.clear();
41
- };
42
- const size = () => map.size;
43
- async function memoized(...args) {
44
- const k = key(...args);
45
- const has = map.has(k);
46
- const old = map.get(k);
47
- if (has && !(invalidate === null || invalidate === void 0 ? void 0 : invalidate(old, ...k))) {
48
- return { value: map.get(k), hit: true };
49
- }
50
- const value = await fn(...args);
51
- map.set(k, value);
52
- return { hit: false, value };
53
- }
54
- memoized.clear = clear;
55
- memoized.size = size;
56
- //TODO return mimic-function(memorized, fn);
57
- return memoized;
58
- }
59
- /**
60
- * Allows to memoize values by key and invalidate them based on the previous value.
61
- *
62
- * This makes possible to implement various one-off and subsequent transformations.
63
- *
64
- * 1. `write`: Before writing to cache, called only once if cache is present and valid
65
- * 2. `read`: After it's read from cache, always called if cache is valid
66
- * TODO Better names: once, folloing
67
- * TODO Better names: memoize, recover
68
- * TODO Better names: writeTransformer, readTransformer
69
- * TODO Better names: writeModifier, readModifier
70
- * TODO Better names: write, read
71
- *
72
- * Both should return same type or null.
73
- *
74
- * If newValue is null, old is returned, and no cache is set.
75
- *
76
- * ```ts
77
- * class InputCache extends TypedCache<string, ImageBitmap> {
78
- * dispose(bitmap: ImageBitmap, key: string) {
79
- * bitmap.close();
80
- * }
81
- * }
82
- *
83
- * const cache = new InputCache('input');
84
- *
85
- * // Cache provided OffscreenCanvas by name and create context once per canvas
86
- *
87
- * class CanvasCache extends TypedCache<string, OffscreenCanvas> {
88
- * protected write(key: string, canvas: OffscreenCanvas): OffscreenCanvas {
89
- * const canvas = newValue.getContext('2d');
90
- * canvas.ctx = canvas;
91
- * return canvas;
92
- * }
93
- * }
94
- *
95
- * // Transfer control to offscreen canvas and track removal of original
96
- * // When called again, always return null, because canvas is handed to worker, and never returned to main
97
- *
98
- * class CanvasCache extends TypedCache<HTMLCanvasElement, OffscreenCanvas> {
99
- *
100
- * protected write(canvas: HTMLCanvasElement): OffscreenCanvas {
101
- * let l;
102
- * canvas.addEventListener(
103
- * 'remove',
104
- * (l = () => {
105
- * console.log('Removing canvas from cache', key);
106
- * this.delete(canvas);
107
- * key.removeEventListener('remove', l);
108
- * }),
109
- * );
110
- * return canvas.transferControlToOffscreen();
111
- * }
112
- *
113
- * protected read() {
114
- * return null;
115
- * }
116
- * }
117
- *
118
- * // Create bitmap from file and check if was used, return null if used
119
- * // Since bitmaps are also cached in worker, used bitmaps are not sent
120
- *
121
- * class BitmapCache extends TypedCache<File, ImageBitmap, File> {
122
- * protected async write(file: File): Promise<ImageBitmap> {
123
- * return await createImageBitmap(file);
124
- * }
125
- *
126
- * protected read(bitmap: ImageBitmap): Promise<ImageBitmap> | ImageBitmap {
127
- * if (!bitmap.width) return null;
128
- * return bitmap;
129
- * }
130
- * }
131
- *
132
- * ```
133
- */
134
- export class TransformerMap extends Map {
135
- constructor(name) {
136
- super();
137
- this.name = name;
138
- }
139
- write(key, newValue, oldValue) {
140
- return newValue;
141
- }
142
- read(oldValue, key) {
143
- return oldValue;
144
- }
145
- delete(key) {
146
- const has = this.has(key);
147
- if (has)
148
- this.dispose(this.get(key), key);
149
- super.delete(key);
150
- return has;
151
- }
152
- // do something with the value and key before removing it
153
- dispose(value, key) { }
154
- clear() {
155
- console.log('CLEAR cache', this.name);
156
- this.forEach(this.dispose);
157
- super.clear();
158
- }
159
- set(key, value) {
160
- throw new Error('Use memo() method instead');
161
- }
162
- async memo(key, newValue) {
163
- var _a;
164
- const oldValue = this.get(key);
165
- if (!!oldValue && (!newValue || newValue === oldValue)) {
166
- // console.log('FROM cache', this.name, key, 'old value', oldValue);
167
- return (_a = this.read) === null || _a === void 0 ? void 0 : _a.call(this, oldValue, key);
168
- }
169
- if (this.has(key))
170
- this.delete(key);
171
- const value = await this.write(key, newValue, oldValue);
172
- super.set(key, value);
173
- // console.log('INVALIDATED KEY cache', this.name, key, 'has', has, 'invalidate', invalidate, 'new value', value);
174
- return value;
175
- }
176
- }
package/build/errors.d.ts DELETED
@@ -1 +0,0 @@
1
- export declare function catchErrors<T, E extends Error = Error>(promise: Promise<T>, errors?: E[]): Promise<any[] | (T | undefined)[]>;
package/build/errors.js DELETED
@@ -1,14 +0,0 @@
1
- // @see https://www.youtube.com/watch?v=AdmGHwvgaVs
2
- export function catchErrors(promise, errors) {
3
- return promise
4
- .then((data) => [undefined, data])
5
- .catch((error) => {
6
- if (!(errors === null || errors === void 0 ? void 0 : errors.length)) {
7
- return [error];
8
- }
9
- if (errors.some((e) => e instanceof error)) {
10
- return [error];
11
- }
12
- throw error;
13
- });
14
- }
package/build/index.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export * from './cache';
2
- export * from './measure';
3
- export * from './mutex';
4
- export * from './worker';
5
- export * from './errors';
package/build/index.js DELETED
@@ -1,5 +0,0 @@
1
- export * from './cache';
2
- export * from './measure';
3
- export * from './mutex';
4
- export * from './worker';
5
- export * from './errors';
@@ -1,34 +0,0 @@
1
- import { bold, magenta, cyan, yellow, red, green } from 'colors/safe';
2
- export declare const colored: {
3
- important: typeof bold;
4
- subject: typeof magenta;
5
- arg: typeof cyan;
6
- sup: typeof yellow;
7
- err: typeof red;
8
- ok: typeof green;
9
- };
10
- export declare const uncolored: {
11
- important: (str: any) => any;
12
- subject: (str: any) => any;
13
- arg: (str: any) => any;
14
- sup: (str: any) => any;
15
- err: (str: any) => any;
16
- ok: (str: any) => any;
17
- };
18
- export declare function createMeasurer({ colors, prepend, padding }: {
19
- colors?: boolean | undefined;
20
- prepend?: string | undefined;
21
- padding?: number | undefined;
22
- }): {
23
- measure: (what: string, step: string, supplemental?: string, ...args: any[]) => {
24
- done: (result?: string, ...args2: any[]) => void;
25
- fail: (result?: string, ...args2: any[]) => void;
26
- log: (...args2: any[]) => void;
27
- };
28
- important: (str: any) => any;
29
- subject: (str: any) => any;
30
- arg: (str: any) => any;
31
- sup: (str: any) => any;
32
- ok: (str: any) => any;
33
- err: (str: any) => any;
34
- };
package/build/measure.js DELETED
@@ -1,48 +0,0 @@
1
- import { bold, magenta, cyan, yellow, red, green } from 'colors/safe';
2
- export const colored = {
3
- important: bold,
4
- subject: magenta,
5
- arg: cyan,
6
- sup: yellow,
7
- err: red,
8
- ok: green,
9
- };
10
- const noColor = (str) => str;
11
- export const uncolored = {
12
- important: noColor,
13
- subject: noColor,
14
- arg: noColor,
15
- sup: noColor,
16
- err: noColor,
17
- ok: noColor,
18
- };
19
- export function createMeasurer({ colors = true, prepend = 'LOG', padding = 10 }) {
20
- const { important, subject, arg, sup, ok, err } = colors ? colored : uncolored;
21
- function measure(what, step, supplemental = '', ...args) {
22
- const time = performance.now();
23
- const prefix = [
24
- prepend,
25
- important(subject(what.substring(0, padding).padStart(padding, ' '))),
26
- arg(step),
27
- sup(supplemental),
28
- ...args,
29
- ];
30
- const done = (result = ok('DONE'), ...args2) => {
31
- console.log(...[
32
- ...prefix,
33
- important(result),
34
- ...args2,
35
- 'in',
36
- important((performance.now() - time).toFixed(0)),
37
- 'ms',
38
- ].filter(Boolean));
39
- console.groupEnd();
40
- };
41
- const fail = (result = err('FAIL'), ...args2) => done(result, ...args2);
42
- const log = (...args2) => {
43
- console.log(...prefix, ...args2);
44
- };
45
- return { done, fail, log };
46
- }
47
- return { measure, important, subject, arg, sup, ok, err };
48
- }
package/build/mutex.d.ts DELETED
@@ -1,5 +0,0 @@
1
- export declare class Mutex {
2
- private promise;
3
- exec(fn: (...args: any) => any): ReturnType<typeof fn>;
4
- wrap(fn: (...args: any) => any): ReturnType<typeof fn>;
5
- }
package/build/mutex.js DELETED
@@ -1,23 +0,0 @@
1
- //TODO Implement queue with ranking & sorting
2
- //TODO https://github.com/sindresorhus/p-queue
3
- export class Mutex {
4
- constructor() {
5
- this.promise = Promise.resolve();
6
- }
7
- exec(fn) {
8
- return new Promise((resolve, reject) => {
9
- // wrap in always successful function
10
- this.promise = this.promise.then(async () => {
11
- try {
12
- resolve(await fn());
13
- }
14
- catch (e) {
15
- reject(e);
16
- }
17
- });
18
- });
19
- }
20
- wrap(fn) {
21
- return (...args) => this.exec(() => fn(...args));
22
- }
23
- }
package/build/worker.d.ts DELETED
@@ -1,83 +0,0 @@
1
- export declare function isTransferable(obj: any): boolean;
2
- type WebWorker = Worker | (Window & typeof globalThis) | (WorkerGlobalScope & typeof globalThis);
3
- type MethodReturn<R, M extends keyof R> = R[M] extends (...args: any[]) => any ? Partial<Awaited<ReturnType<R[M]>>> : never;
4
- type MethodArg<R, M extends keyof R> = R[M] extends (arg: infer A, ...args: any[]) => any ? Partial<A> : never;
5
- export type Ctx<R, K extends keyof R> = {
6
- id: string;
7
- parentId?: string;
8
- message: K;
9
- };
10
- type Data<R, M extends keyof R> = MethodReturn<R, M> | MethodArg<R, M> | Error;
11
- type Event<R, M extends keyof R> = MessageEvent<{
12
- data: Data<R, M>;
13
- ctx: Ctx<R, M>;
14
- }>;
15
- type Listener<R, M extends keyof R, D extends Data<R, M> = Data<R, M>, S extends Context<R, M> = Context<R, M>> = (data: D, self: S, event: Event<R, M>) => void | Promise<void>;
16
- export declare class WorkerDialog<R extends RespondersBase<any>> {
17
- worker: WebWorker;
18
- responders: R;
19
- name: string;
20
- readonly contexts: Set<Context<R, keyof R>>;
21
- protected closed: boolean;
22
- constructor(worker: WebWorker, responders: R, name: string);
23
- close(): void;
24
- withMessage<M extends keyof R>(message: M): RequestContext<R, M>;
25
- }
26
- export declare class RespondersBase<R> {
27
- create<M extends keyof R, F extends (input: any, context: ResponseContext<R, M>) => any>(message: M, responder: F): F;
28
- }
29
- declare abstract class Context<R, M extends keyof R> {
30
- protected readonly dialog: WorkerDialog<any>;
31
- message: M;
32
- id: string | undefined;
33
- parent: Context<R, keyof R> | undefined | null;
34
- protected readonly unsub: Set<() => void>;
35
- protected closed: boolean;
36
- constructor(dialog: WorkerDialog<any>, message: M, id: string | undefined, parent?: Context<R, keyof R> | undefined | null);
37
- abstract withMessage<M2 extends keyof R>(message: M2, id?: string): Context<R, M2>;
38
- close(reason?: string): void;
39
- get info(): string;
40
- protected postMessage(data?: Data<R, M>): Data<R, M> | undefined;
41
- send(data?: Data<R, M>): Data<R, M> | undefined;
42
- /**
43
- * Does not automatically close, assumes consumer will close
44
- *
45
- * ```ts
46
- * dialog.request('x').fetch((c) => {
47
- * c.response('x').listen(() => { ... }); // listens to "x", will be closed by upper level fetch
48
- * c.request('x').fetcH(y, (c) => { ... }); // closes
49
- * }) // closes
50
- *
51
- * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'
52
- * un(); // closes
53
- *
54
- * const un = dialog.context('x').listen((e) => { ... }); // listens to 'x'
55
- * un(); // closes
56
- * ```
57
- */
58
- listen(callback: Listener<R, M>): () => void;
59
- }
60
- declare class RequestContext<R, M extends keyof R> extends Context<R, M> {
61
- withMessage<M2 extends keyof R>(message: M2, id?: string): RequestContext<R, M2>;
62
- send(data?: MethodArg<R, M>): MethodArg<R, M>;
63
- listen(callback: Listener<R, M, MethodReturn<R, M>, RequestContext<R, M>>): () => void;
64
- /**
65
- * Returns response
66
- * If you need to work with ctx, use callback
67
- * Closed automatically on response
68
- *
69
- * dialog.fetch('x', (c) => {
70
- * c.listen(() => { ... }); // will be closed by upper level fetch
71
- * c.fetcH(y, (c) => { ... }); // closes c
72
- * c.context().fetcH(y, (c) => { ... }); // closes sub, not closes c, will be closed by upper level fetch
73
- * })
74
- */
75
- fetch(data?: MethodArg<R, M>, callback?: (context: RequestContext<R, M>) => void): Promise<MethodReturn<R, M>>;
76
- protected expect(): Promise<MethodReturn<R, M>>;
77
- }
78
- declare class ResponseContext<R, M extends keyof R> extends Context<R, M> {
79
- withMessage<M2 extends keyof R>(message: M2, id?: string): ResponseContext<R, M2>;
80
- listen(callback: Listener<R, M, MethodArg<R, M>, ResponseContext<R, M>>): () => void;
81
- send(data?: MethodReturn<R, M>): MethodReturn<R, M>;
82
- }
83
- export {};