@wener/utils 1.1.4 → 1.1.6

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 (130) hide show
  1. package/README.md +11 -0
  2. package/dist/cjs/_commonjsHelpers-dfec268f.js +2 -0
  3. package/dist/cjs/_commonjsHelpers-dfec268f.js.map +1 -0
  4. package/dist/cjs/api-7db97ae3.js +1085 -0
  5. package/dist/cjs/api-7db97ae3.js.map +1 -0
  6. package/dist/cjs/index-a6d1d653.js +14 -0
  7. package/dist/cjs/index-a6d1d653.js.map +1 -0
  8. package/dist/cjs/index.js +1 -1
  9. package/dist/cjs/index.js.map +1 -1
  10. package/dist/cjs/multipart-parser-141ed517.js +3 -0
  11. package/dist/cjs/multipart-parser-141ed517.js.map +1 -0
  12. package/dist/cjs/server.js +1 -1
  13. package/dist/cjs/server.js.map +1 -1
  14. package/dist/esm/_commonjsHelpers-28e086c5.js +2 -0
  15. package/dist/esm/_commonjsHelpers-28e086c5.js.map +1 -0
  16. package/dist/esm/api-3f555472.js +1085 -0
  17. package/dist/esm/api-3f555472.js.map +1 -0
  18. package/dist/esm/index-b50fef91.js +14 -0
  19. package/dist/esm/index-b50fef91.js.map +1 -0
  20. package/dist/esm/index.js +1 -1
  21. package/dist/esm/index.js.map +1 -1
  22. package/dist/esm/multipart-parser-5c1d6ee9.js +3 -0
  23. package/dist/esm/multipart-parser-5c1d6ee9.js.map +1 -0
  24. package/dist/esm/server.js +1 -1
  25. package/dist/esm/server.js.map +1 -1
  26. package/dist/system/_commonjsHelpers-07f370a7.js +2 -0
  27. package/dist/system/_commonjsHelpers-07f370a7.js.map +1 -0
  28. package/dist/system/api-dc50ebac.js +1085 -0
  29. package/dist/system/api-dc50ebac.js.map +1 -0
  30. package/dist/system/index-8f1807ba.js +14 -0
  31. package/dist/system/index-8f1807ba.js.map +1 -0
  32. package/dist/system/index.js +1 -1
  33. package/dist/system/index.js.map +1 -1
  34. package/dist/system/multipart-parser-53518ee9.js +3 -0
  35. package/dist/system/multipart-parser-53518ee9.js.map +1 -0
  36. package/dist/system/server.js +1 -1
  37. package/dist/system/server.js.map +1 -1
  38. package/lib/asyncs/createLazyPromise.js +55 -0
  39. package/lib/asyncs/createLazyPromise.js.map +1 -0
  40. package/lib/crypto/randomUUID.js +3 -5
  41. package/lib/crypto/randomUUID.js.map +1 -1
  42. package/lib/i18n/createTranslate.js +37 -0
  43. package/lib/i18n/createTranslate.js.map +1 -0
  44. package/lib/index.js +15 -7
  45. package/lib/index.js.map +1 -1
  46. package/lib/io/isBuffer.js.map +1 -1
  47. package/lib/io/isTransferable.js +23 -0
  48. package/lib/io/isTransferable.js.map +1 -0
  49. package/lib/isomorphics/structuredClone.js +70 -0
  50. package/lib/isomorphics/structuredClone.js.map +1 -0
  51. package/lib/langs/classOf.js +6 -0
  52. package/lib/langs/classOf.js.map +1 -0
  53. package/lib/{validations/dequal.js → langs/deepEqual.js} +7 -7
  54. package/lib/langs/deepEqual.js.map +1 -0
  55. package/lib/{validations/shallow.js → langs/shallowEqual.js} +3 -3
  56. package/lib/langs/shallowEqual.js.map +1 -0
  57. package/lib/modules/isModule.js.map +1 -1
  58. package/lib/modules/parseModuleId.js.map +1 -1
  59. package/lib/objects/get.js +14 -0
  60. package/lib/objects/get.js.map +1 -0
  61. package/lib/objects/parseObjectPath.js +27 -0
  62. package/lib/objects/parseObjectPath.js.map +1 -0
  63. package/lib/objects/set.js +36 -0
  64. package/lib/objects/set.js.map +1 -0
  65. package/lib/server/polyfillBrowser.js +12 -0
  66. package/lib/server/polyfillBrowser.js.map +1 -0
  67. package/lib/server/polyfillCrypto.js +10 -0
  68. package/lib/server/polyfillCrypto.js.map +1 -0
  69. package/lib/server/polyfillFetch.js +31 -0
  70. package/lib/server/polyfillFetch.js.map +1 -0
  71. package/lib/server/polyfillJsDom.js +49 -0
  72. package/lib/server/polyfillJsDom.js.map +1 -0
  73. package/lib/server.js +4 -1
  74. package/lib/server.js.map +1 -1
  75. package/lib/{formats → strings}/formatBytes.js +0 -0
  76. package/lib/{formats → strings}/formatBytes.js.map +1 -1
  77. package/lib/strings/renderTemplate.js +25 -0
  78. package/lib/strings/renderTemplate.js.map +1 -0
  79. package/lib/validations/isUUID.js +6 -0
  80. package/lib/validations/isUUID.js.map +1 -0
  81. package/package.json +14 -4
  82. package/src/asyncs/createLazyPromise.test.ts +39 -0
  83. package/src/asyncs/createLazyPromise.ts +63 -0
  84. package/src/crypto/hashing.test.ts +11 -7
  85. package/src/crypto/randomUUID.ts +3 -4
  86. package/src/i18n/createTranslate.test.ts +155 -0
  87. package/src/i18n/createTranslate.ts +52 -0
  88. package/src/index.ts +26 -9
  89. package/src/io/isBuffer.test.ts +7 -0
  90. package/src/io/isBuffer.ts +5 -1
  91. package/src/io/isTransferable.test.ts +10 -0
  92. package/src/io/isTransferable.ts +50 -0
  93. package/src/isomorphics/structuredClone.test.ts +14 -0
  94. package/src/isomorphics/structuredClone.ts +85 -0
  95. package/src/langs/classOf.ts +3 -0
  96. package/src/{validations/dequal.test.ts → langs/deepEqual.test.ts} +2 -2
  97. package/src/{validations/dequal.ts → langs/deepEqual.ts} +5 -5
  98. package/src/langs/langs.test.ts +23 -0
  99. package/src/{validations/shallow.ts → langs/shallowEqual.ts} +1 -1
  100. package/src/logging/logger.test.ts +18 -0
  101. package/src/modules/isModule.ts +8 -1
  102. package/src/modules/parseModuleId.ts +5 -0
  103. package/src/objects/get.test.ts +116 -0
  104. package/src/objects/get.ts +49 -0
  105. package/src/objects/parseObjectPath.test.ts +18 -0
  106. package/src/objects/parseObjectPath.ts +40 -0
  107. package/src/objects/set.test.ts +405 -0
  108. package/src/objects/set.ts +48 -0
  109. package/src/server/polyfillBrowser.test.ts +15 -0
  110. package/src/server/polyfillBrowser.ts +9 -0
  111. package/src/server/polyfillCrypto.ts +7 -0
  112. package/src/server/polyfillFetch.ts +29 -0
  113. package/src/server/polyfillJsDom.ts +84 -0
  114. package/src/server.ts +4 -1
  115. package/src/{formats → strings}/formatBytes.ts +0 -0
  116. package/src/strings/renderTemplate.test.ts +25 -0
  117. package/src/strings/renderTemplate.ts +34 -0
  118. package/src/validations/isUUID.ts +3 -0
  119. package/tsconfig.json +0 -4
  120. package/lib/asyncs/LazyPromise.js +0 -27
  121. package/lib/asyncs/LazyPromise.js.map +0 -1
  122. package/lib/server/polyfill.js +0 -8
  123. package/lib/server/polyfill.js.map +0 -1
  124. package/lib/strings/templates.js +0 -8
  125. package/lib/strings/templates.js.map +0 -1
  126. package/lib/validations/dequal.js.map +0 -1
  127. package/lib/validations/shallow.js.map +0 -1
  128. package/src/asyncs/LazyPromise.ts +0 -29
  129. package/src/server/polyfill.ts +0 -5
  130. package/src/strings/templates.ts +0 -13
@@ -0,0 +1,23 @@
1
+ import test from 'ava';
2
+ import { classOf } from './classOf';
3
+
4
+ test('classOf', (t) => {
5
+ for (const [k, v] of [
6
+ [0, 'Number'],
7
+ ['', 'String'],
8
+ [true, 'Boolean'],
9
+ [null, 'Null'],
10
+ [undefined, 'Undefined'],
11
+ [{}, 'Object'],
12
+ [[], 'Array'],
13
+ [new ArrayBuffer(0), 'ArrayBuffer'],
14
+ [new Map(), 'Map'],
15
+ [new Set(), 'Set'],
16
+ [new Date(), 'Date'],
17
+ [new RegExp(''), 'RegExp'],
18
+ [new DataView(new ArrayBuffer(0)), 'DataView'],
19
+ [new Int8Array(0), 'Int8Array'],
20
+ ]) {
21
+ t.is(classOf(k), v as any);
22
+ }
23
+ });
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * @see {@link https://github.com/pmndrs/zustand/blob/main/src/shallow.ts zustand/src/shallow.ts}
5
5
  */
6
- export function shallow<T, U>(objA: T, objB: U) {
6
+ export function shallowEqual<T, U>(objA: T, objB: U) {
7
7
  if (Object.is(objA, objB)) {
8
8
  return true;
9
9
  }
@@ -13,4 +13,22 @@ test('logger', (t) => {
13
13
  t.deepEqual(logs.shift(), { level: 'trace', values: ['trace'], c: 'test', m: 1 });
14
14
  }
15
15
  createChildLogger(console, { c: 'test' }).info('hello');
16
+ {
17
+ let pass = 0;
18
+ let l = createWriteLogger(
19
+ (o) => {
20
+ pass++;
21
+ t.log(`${o.level}: [${[o.m, o.c].filter(Boolean).join('.') || 'default'}]`, ...o.values);
22
+ },
23
+ {
24
+ m: 'Root',
25
+ },
26
+ );
27
+ l.info('nice');
28
+ t.is(pass, 1);
29
+ l.child({}).info('nice 2');
30
+ t.is(pass, 2);
31
+ createChildLogger(l, { m: 'Child' }).info('nice 3');
32
+ t.is(pass, 3);
33
+ }
16
34
  });
@@ -1,3 +1,10 @@
1
- export function isModule(o: any) {
1
+ export function isModule(o: any): o is Module {
2
2
  return o && o[Symbol.toStringTag] === 'Module';
3
3
  }
4
+
5
+ export interface Module {
6
+ [Symbol.toStringTag]: 'Module';
7
+ default?: any;
8
+
9
+ [k: string | symbol]: any;
10
+ }
@@ -17,6 +17,11 @@ export type ParsedModuleId = {
17
17
  }
18
18
  );
19
19
 
20
+ /**
21
+ * Parse NPM module id
22
+ *
23
+ * parseModuleId('@wener/reaction@latest/index.js') // => { id: '@wener/reaction@latest', name: '@wener/reaction', version: 'latest', range: 'latest', pkg: 'reaction', path: '/index.js', scoped: true, org: 'wener' }
24
+ */
20
25
  export function parseModuleId(s: string): ParsedModuleId | undefined {
21
26
  const groups = s.match(regModuleId)?.groups;
22
27
  if (!groups) {
@@ -0,0 +1,116 @@
1
+ import test from 'ava';
2
+ import { expectType } from 'tsd';
3
+ import { get } from './get';
4
+ import { parseObjectPath } from './parseObjectPath';
5
+
6
+ test('get typed', (t) => {
7
+ interface TestClass {
8
+ normal: string;
9
+ nested: {
10
+ a: number;
11
+ b: {
12
+ c: boolean;
13
+ };
14
+ };
15
+ arr: number[];
16
+ nestedArr: {
17
+ sum: number;
18
+ other: null;
19
+ }[];
20
+ deep: {
21
+ arr: string[];
22
+ };
23
+ deeplvl1: {
24
+ deeplvl2: {
25
+ deeplvl3: {
26
+ deeplvl4: {
27
+ value: RegExp;
28
+ };
29
+ }[];
30
+ };
31
+ }[];
32
+ }
33
+
34
+ const obj = {} as TestClass;
35
+
36
+ expectType<number>(get(obj, 'nested.a', null));
37
+ expectType<string>(get(obj, 'normal', null));
38
+ expectType<number>(get(obj, 'nested.a'));
39
+ expectType<boolean>(get(obj, 'nested.b.c'));
40
+ expectType<number[]>(get(obj, 'arr'));
41
+ expectType<number>(get(obj, 'arr[13]'));
42
+ expectType<number>(get(obj, 'arr.13'));
43
+ expectType<null>(get(obj, 'nestedArr[3].other'));
44
+ expectType<string[]>(get(obj, 'deep.deep'));
45
+ expectType<string>(get(obj, 'deep.arr[333]'));
46
+ expectType<number>(get(obj, 'deep.arr[333].length'));
47
+ expectType<boolean>(get(obj, 'nested["b"]["c"]'));
48
+ expectType<never>(get(obj, ''));
49
+ expectType<number>(get(obj, '', 3));
50
+ expectType<never>(get(obj, 'nested.asdfasdf'));
51
+ expectType<RegExp>(get(obj, 'deeplvl1[1].deeplvl2.deeplvl3[88].deeplvl4.value'));
52
+ expectType<never>(get(obj, 'deeplvl1[1].deeplvl2.deeplvl1[88].deeplvl4.value'));
53
+ expectType<TestClass>(get(obj, 'deeplvl1[1].deeplvl2.deeplvl1[88].deeplvl4.value', obj));
54
+ expectType<string>(get(obj, 'nested["dd"]', ''));
55
+ t.pass();
56
+ });
57
+
58
+ test('get', (t) => {
59
+ let obj = {
60
+ undef: undefined,
61
+ zero: 0,
62
+ one: 1,
63
+ n: null,
64
+ f: false,
65
+ a: {
66
+ two: 2,
67
+ b: {
68
+ three: 3,
69
+ c: {
70
+ four: 4,
71
+ },
72
+ },
73
+ },
74
+ arr: [5, [6, { v: 7 }]],
75
+ } as const;
76
+
77
+ function check(path: string, value: any, def?: any) {
78
+ const out = get(obj, path, def);
79
+ t.is(out, value, 'get(obj, "' + path + '") should be ' + value + ', got ' + out);
80
+ if (path) {
81
+ const arr = parseObjectPath(path);
82
+ t.is(get(obj, arr, def), value, `get(obj,${JSON.stringify(arr)}, ${def})`);
83
+ }
84
+ }
85
+
86
+ check('', undefined);
87
+ check('one', obj.one);
88
+ check('one.two', undefined);
89
+ check('a', obj.a);
90
+ check('a.two', obj.a.two);
91
+ check('a.b', obj.a.b);
92
+ check('a.b.three', obj.a.b.three);
93
+ check('a.b.c', obj.a.b.c);
94
+ check('a.b.c.four', obj.a.b.c.four);
95
+ check('n', obj.n);
96
+ check('n.badkey', undefined);
97
+ check('f', false);
98
+ check('f.badkey', undefined);
99
+
100
+ check('', 'foo', 'foo');
101
+ check('undef', 'foo', 'foo');
102
+ check('n', null, 'foo');
103
+ check('n.badkey', 'foo', 'foo');
104
+ check('zero', 0, 'foo');
105
+ check('a.badkey', 'foo', 'foo');
106
+ check('a.badkey.anotherbadkey', 'foo', 'foo');
107
+ check('f', false, 'foo');
108
+ check('f.badkey', 'foo', 'foo');
109
+
110
+ check('arr.0', 5);
111
+ check('arr.1.0', 6);
112
+ check('arr.1.1.v', 7);
113
+ check('arr[0]', 5);
114
+ check('arr[1][0]', 6);
115
+ check('arr[1][1][v]', 7);
116
+ });
@@ -0,0 +1,49 @@
1
+ import { ObjectKey, parseObjectPath } from './parseObjectPath';
2
+
3
+ /**
4
+ * get by path
5
+ *
6
+ * {@link https://github.com/developit/dlv dlv}
7
+ */
8
+ export function get<O extends object, P extends ObjectKey, OrElse extends unknown>(
9
+ obj: O,
10
+ key: P | P[],
11
+ def?: OrElse,
12
+ ): ResolveObjectPathType<O, P, OrElse> {
13
+ const undef = undefined;
14
+ const path = parseObjectPath(key);
15
+ let out: any = obj;
16
+ for (const i of path) {
17
+ out = out ? out[i] : undef;
18
+ }
19
+ return out === undef ? def : out;
20
+ }
21
+
22
+ /**
23
+ * It tries to resolve the path of the given object, otherwise it will return OrElse
24
+ *
25
+ * {@link https://github.com/Pouja/typescript-deep-path-safe typescript-deep-path-safe}
26
+ */
27
+ export type ResolveObjectPathType<
28
+ ObjectType,
29
+ Path extends string | symbol | number,
30
+ OrElse,
31
+ > = Path extends keyof ObjectType
32
+ ? ObjectType[Path]
33
+ : Path extends `${infer LeftSide}.${infer RightSide}`
34
+ ? LeftSide extends keyof ObjectType
35
+ ? ResolveObjectPathType<ObjectType[LeftSide], RightSide, OrElse>
36
+ : Path extends `${infer LeftSide}[${number}].${infer RightSide}`
37
+ ? LeftSide extends keyof ObjectType
38
+ ? ObjectType[LeftSide] extends Array<infer U>
39
+ ? ResolveObjectPathType<U, RightSide, OrElse>
40
+ : OrElse
41
+ : OrElse
42
+ : OrElse
43
+ : Path extends `${infer LeftSide}[${number}]`
44
+ ? LeftSide extends keyof ObjectType
45
+ ? ObjectType[LeftSide] extends Array<infer U>
46
+ ? U
47
+ : OrElse
48
+ : OrElse
49
+ : OrElse;
@@ -0,0 +1,18 @@
1
+ import test from 'ava';
2
+ import { parseObjectPath } from './parseObjectPath';
3
+
4
+ test('parseObjectPath', (t) => {
5
+ for (const [k, v] of [
6
+ ['a.b.c', ['a', 'b', 'c']],
7
+ ['a[1].c', ['a', '1', 'c']],
8
+ ['a.1.c', ['a', '1', 'c']],
9
+ ['a[b].c', ['a', 'b', 'c']],
10
+ ['arr[1][0]', ['arr', '1', '0']],
11
+ ['arr.2', ['arr', '2']],
12
+ ['arr[2]', ['arr', '2']],
13
+ [Symbol.toStringTag, [Symbol.toStringTag]],
14
+ [[Symbol.toStringTag], [Symbol.toStringTag]],
15
+ ]) {
16
+ t.deepEqual(parseObjectPath(k), v);
17
+ }
18
+ });
@@ -0,0 +1,40 @@
1
+ export type ObjectKey = string | symbol | number;
2
+ export type ObjectPath = Array<ObjectKey>;
3
+ export type ObjectPathLike = ObjectKey | ObjectPath;
4
+
5
+ /**
6
+ * Parse object path
7
+ *
8
+ * parseObjectPath('a.b.c') // => ['a', 'b', 'c']
9
+ * parseObjectPath('a[0].b') // => ['a', 0, 'b']
10
+ * parseObjectPath('a[0][1]') // => ['a', 0, 1]
11
+ *
12
+ */
13
+ export function parseObjectPath(s: ObjectPathLike): ObjectPath {
14
+ if (typeof s !== 'string') {
15
+ return Array.isArray(s) ? s : [s];
16
+ }
17
+ const parts = s.split('.');
18
+ // fast path
19
+ if (!s.includes('[')) {
20
+ return parts;
21
+ }
22
+
23
+ const result = [];
24
+ for (const part of parts) {
25
+ if (!part.endsWith(']')) {
26
+ result.push(part);
27
+ } else {
28
+ // a[0][1]
29
+ // try parseInt can extend to support a[-1] to use .at access
30
+ const s = part.split('[');
31
+ for (let sub of s) {
32
+ if (sub.endsWith(']')) {
33
+ sub = sub.slice(0, -1);
34
+ }
35
+ result.push(sub);
36
+ }
37
+ }
38
+ }
39
+ return result;
40
+ }