@wener/utils 1.1.2 → 1.1.4

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 (153) hide show
  1. package/dist/cjs/index.js +1 -578
  2. package/dist/cjs/index.js.map +1 -1
  3. package/dist/cjs/server.js +2 -0
  4. package/dist/cjs/server.js.map +1 -0
  5. package/dist/esm/index.js +2 -0
  6. package/dist/esm/index.js.map +1 -0
  7. package/dist/esm/server.js +2 -0
  8. package/dist/esm/server.js.map +1 -0
  9. package/dist/system/index.js +2 -0
  10. package/dist/system/index.js.map +1 -0
  11. package/dist/system/server.js +2 -0
  12. package/dist/system/server.js.map +1 -0
  13. package/index.ts +1 -0
  14. package/lib/arrays/MaybeArray.js +30 -0
  15. package/lib/arrays/MaybeArray.js.map +1 -0
  16. package/lib/asyncs/AsyncInterval.js +15 -0
  17. package/lib/asyncs/AsyncInterval.js.map +1 -0
  18. package/lib/asyncs/LazyPromise.js +27 -0
  19. package/lib/asyncs/LazyPromise.js.map +1 -0
  20. package/lib/asyncs/isPromise.js +6 -0
  21. package/lib/asyncs/isPromise.js.map +1 -0
  22. package/lib/{esm/asyncs/sleep.mjs → asyncs/sleep.js} +1 -1
  23. package/lib/asyncs/sleep.js.map +1 -0
  24. package/lib/asyncs/timeout.js +27 -0
  25. package/lib/asyncs/timeout.js.map +1 -0
  26. package/lib/browsers/copy.js +51 -0
  27. package/lib/browsers/copy.js.map +1 -0
  28. package/lib/browsers/download.js +28 -0
  29. package/lib/browsers/download.js.map +1 -0
  30. package/lib/browsers/getFileFromDataTransfer.js +31 -0
  31. package/lib/browsers/getFileFromDataTransfer.js.map +1 -0
  32. package/lib/browsers/loaders.js +50 -0
  33. package/lib/browsers/loaders.js.map +1 -0
  34. package/lib/crypto/hashing.js +24 -0
  35. package/lib/crypto/hashing.js.map +1 -0
  36. package/lib/crypto/hex.js +6 -0
  37. package/lib/crypto/hex.js.map +1 -0
  38. package/lib/crypto/randomUUID.js +13 -0
  39. package/lib/crypto/randomUUID.js.map +1 -0
  40. package/lib/formats/formatBytes.js +17 -0
  41. package/lib/formats/formatBytes.js.map +1 -0
  42. package/lib/index.js +31 -0
  43. package/lib/index.js.map +1 -0
  44. package/lib/io/isBuffer.js +6 -0
  45. package/lib/io/isBuffer.js.map +1 -0
  46. package/lib/isomorphics/getGlobalThis.js +14 -0
  47. package/lib/isomorphics/getGlobalThis.js.map +1 -0
  48. package/lib/logging/createChildLogger.js +18 -0
  49. package/lib/logging/createChildLogger.js.map +1 -0
  50. package/lib/logging/createNoopLogger.js +14 -0
  51. package/lib/logging/createNoopLogger.js.map +1 -0
  52. package/lib/logging/createWriteLogger.js +13 -0
  53. package/lib/logging/createWriteLogger.js.map +1 -0
  54. package/lib/maths/random.js +17 -0
  55. package/lib/maths/random.js.map +1 -0
  56. package/lib/modules/isModule.js +6 -0
  57. package/lib/modules/isModule.js.map +1 -0
  58. package/lib/modules/parseModuleId.js +31 -0
  59. package/lib/modules/parseModuleId.js.map +1 -0
  60. package/lib/server/polyfill.js +8 -0
  61. package/lib/server/polyfill.js.map +1 -0
  62. package/lib/server.js +2 -0
  63. package/lib/server.js.map +1 -0
  64. package/lib/shim/urljoin.js +51 -0
  65. package/lib/shim/urljoin.js.map +1 -0
  66. package/lib/strings/camelCase.js +56 -0
  67. package/lib/strings/camelCase.js.map +1 -0
  68. package/lib/strings/templates.js +8 -0
  69. package/lib/strings/templates.js.map +1 -0
  70. package/lib/validations/dequal.js +95 -0
  71. package/lib/validations/dequal.js.map +1 -0
  72. package/lib/validations/isClass.js +6 -0
  73. package/lib/validations/isClass.js.map +1 -0
  74. package/lib/validations/isDefined.js +6 -0
  75. package/lib/validations/isDefined.js.map +1 -0
  76. package/lib/validations/isEmptyObject.js +9 -0
  77. package/lib/validations/isEmptyObject.js.map +1 -0
  78. package/lib/validations/shallow.js +21 -0
  79. package/lib/validations/shallow.js.map +1 -0
  80. package/package.json +37 -34
  81. package/server.ts +1 -0
  82. package/src/arrays/MaybeArray.ts +8 -4
  83. package/src/crypto/randomUUID.ts +3 -0
  84. package/src/index.ts +20 -1
  85. package/src/logging/Logger.ts +19 -0
  86. package/src/logging/createChildLogger.ts +16 -0
  87. package/src/logging/createNoopLogger.ts +13 -0
  88. package/src/logging/createWriteLogger.ts +15 -0
  89. package/src/logging/logger.test.ts +16 -0
  90. package/src/modules/isModule.ts +3 -0
  91. package/src/modules/parseModuleId.test.ts +68 -0
  92. package/src/modules/parseModuleId.ts +46 -0
  93. package/src/server/polyfill.ts +5 -0
  94. package/src/server.ts +1 -0
  95. package/src/shim/urljoin.test.ts +1 -1
  96. package/src/validations/dequal.test.ts +17 -0
  97. package/src/validations/dequal.ts +105 -0
  98. package/src/validations/shallow.ts +26 -0
  99. package/dist/esm/index.development.js +0 -545
  100. package/dist/esm/index.development.js.map +0 -1
  101. package/dist/esm/index.min.js +0 -2
  102. package/dist/esm/index.min.js.map +0 -1
  103. package/dist/system/index.development.js +0 -585
  104. package/dist/system/index.development.js.map +0 -1
  105. package/dist/system/index.min.js +0 -2
  106. package/dist/system/index.min.js.map +0 -1
  107. package/lib/esm/arrays/MaybeArray.mjs +0 -30
  108. package/lib/esm/arrays/MaybeArray.mjs.map +0 -1
  109. package/lib/esm/asyncs/AsyncInterval.mjs +0 -15
  110. package/lib/esm/asyncs/AsyncInterval.mjs.map +0 -1
  111. package/lib/esm/asyncs/LazyPromise.mjs +0 -24
  112. package/lib/esm/asyncs/LazyPromise.mjs.map +0 -1
  113. package/lib/esm/asyncs/isPromise.mjs +0 -6
  114. package/lib/esm/asyncs/isPromise.mjs.map +0 -1
  115. package/lib/esm/asyncs/sleep.mjs.map +0 -1
  116. package/lib/esm/asyncs/timeout.mjs +0 -24
  117. package/lib/esm/asyncs/timeout.mjs.map +0 -1
  118. package/lib/esm/browsers/copy.mjs +0 -57
  119. package/lib/esm/browsers/copy.mjs.map +0 -1
  120. package/lib/esm/browsers/download.mjs +0 -40
  121. package/lib/esm/browsers/download.mjs.map +0 -1
  122. package/lib/esm/browsers/getFileFromDataTransfer.mjs +0 -39
  123. package/lib/esm/browsers/getFileFromDataTransfer.mjs.map +0 -1
  124. package/lib/esm/browsers/loaders.mjs +0 -52
  125. package/lib/esm/browsers/loaders.mjs.map +0 -1
  126. package/lib/esm/crypto/hashing.mjs +0 -25
  127. package/lib/esm/crypto/hashing.mjs.map +0 -1
  128. package/lib/esm/crypto/hex.mjs +0 -8
  129. package/lib/esm/crypto/hex.mjs.map +0 -1
  130. package/lib/esm/crypto/randomUUID.mjs +0 -13
  131. package/lib/esm/crypto/randomUUID.mjs.map +0 -1
  132. package/lib/esm/formats/formatBytes.mjs +0 -29
  133. package/lib/esm/formats/formatBytes.mjs.map +0 -1
  134. package/lib/esm/index.mjs +0 -24
  135. package/lib/esm/index.mjs.map +0 -1
  136. package/lib/esm/io/isBuffer.mjs +0 -10
  137. package/lib/esm/io/isBuffer.mjs.map +0 -1
  138. package/lib/esm/isomorphics/getGlobalThis.mjs +0 -23
  139. package/lib/esm/isomorphics/getGlobalThis.mjs.map +0 -1
  140. package/lib/esm/maths/random.mjs +0 -18
  141. package/lib/esm/maths/random.mjs.map +0 -1
  142. package/lib/esm/shim/urljoin.mjs +0 -65
  143. package/lib/esm/shim/urljoin.mjs.map +0 -1
  144. package/lib/esm/strings/camelCase.mjs +0 -70
  145. package/lib/esm/strings/camelCase.mjs.map +0 -1
  146. package/lib/esm/strings/templates.mjs +0 -16
  147. package/lib/esm/strings/templates.mjs.map +0 -1
  148. package/lib/esm/validations/isClass.mjs +0 -6
  149. package/lib/esm/validations/isClass.mjs.map +0 -1
  150. package/lib/esm/validations/isDefined.mjs +0 -6
  151. package/lib/esm/validations/isDefined.mjs.map +0 -1
  152. package/lib/esm/validations/isEmptyObject.mjs +0 -9
  153. package/lib/esm/validations/isEmptyObject.mjs.map +0 -1
@@ -0,0 +1,56 @@
1
+ function preserveCamelCase(string) {
2
+ let isLastCharLower = false;
3
+ let isLastCharUpper = false;
4
+ let isLastLastCharUpper = false;
5
+ for (let i = 0; i < string.length; i++) {
6
+ const character = string[i];
7
+ if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {
8
+ string = string.slice(0, i) + "-" + string.slice(i);
9
+ isLastCharLower = false;
10
+ isLastLastCharUpper = isLastCharUpper;
11
+ isLastCharUpper = true;
12
+ i++;
13
+ } else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {
14
+ string = string.slice(0, i - 1) + "-" + string.slice(i - 1);
15
+ isLastLastCharUpper = isLastCharUpper;
16
+ isLastCharUpper = false;
17
+ isLastCharLower = true;
18
+ } else {
19
+ isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;
20
+ isLastLastCharUpper = isLastCharUpper;
21
+ isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;
22
+ }
23
+ }
24
+ return string;
25
+ }
26
+ function pascalCase(input) {
27
+ return camelCase(input, { pascalCase: true });
28
+ }
29
+ function camelCase(input, options = {
30
+ pascalCase: false
31
+ }) {
32
+ if (!(typeof input === "string" || Array.isArray(input))) {
33
+ throw new TypeError("Expected the input to be `string | string[]`");
34
+ }
35
+ const postProcess = (x) => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;
36
+ if (Array.isArray(input)) {
37
+ input = input.map((x) => x.trim()).filter((x) => x.length).join("-");
38
+ } else {
39
+ input = input.trim();
40
+ }
41
+ if (input.length === 0) {
42
+ return "";
43
+ }
44
+ if (input.length === 1) {
45
+ return options.pascalCase ? input.toUpperCase() : input.toLowerCase();
46
+ }
47
+ const hasUpperCase = input !== input.toLowerCase();
48
+ if (hasUpperCase) {
49
+ input = preserveCamelCase(input);
50
+ }
51
+ input = input.replace(/^[_.\- ]+/, "").toLowerCase().replace(/[_.\- ]+(\w|$)/g, (_, p1) => p1.toUpperCase()).replace(/\d+(\w|$)/g, (m) => m.toUpperCase());
52
+ return postProcess(input);
53
+ }
54
+
55
+ export { camelCase, pascalCase };
56
+ //# sourceMappingURL=camelCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camelCase.js","sources":["../../src/strings/camelCase.ts"],"sourcesContent":["// https://github.com/sindresorhus/camelcase/blob/master/index.js\n\nfunction preserveCamelCase(string: string) {\n let isLastCharLower = false;\n let isLastCharUpper = false;\n let isLastLastCharUpper = false;\n\n for (let i = 0; i < string.length; i++) {\n const character = string[i];\n\n if (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {\n string = string.slice(0, i) + '-' + string.slice(i);\n isLastCharLower = false;\n isLastLastCharUpper = isLastCharUpper;\n isLastCharUpper = true;\n i++;\n } else if (\n isLastCharUpper &&\n isLastLastCharUpper &&\n /[a-zA-Z]/.test(character) &&\n character.toLowerCase() === character\n ) {\n string = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n isLastLastCharUpper = isLastCharUpper;\n isLastCharUpper = false;\n isLastCharLower = true;\n } else {\n isLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;\n isLastLastCharUpper = isLastCharUpper;\n isLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;\n }\n }\n\n return string;\n}\n\nexport function pascalCase(input: string | string[]) {\n return camelCase(input, { pascalCase: true });\n}\n\nexport function camelCase(\n input: string | string[],\n options: { pascalCase: boolean } = {\n pascalCase: false,\n },\n) {\n if (!(typeof input === 'string' || Array.isArray(input))) {\n throw new TypeError('Expected the input to be `string | string[]`');\n }\n\n const postProcess = (x: string) => (options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x);\n\n if (Array.isArray(input)) {\n input = input\n .map((x) => x.trim())\n .filter((x) => x.length)\n .join('-');\n } else {\n input = input.trim();\n }\n\n if (input.length === 0) {\n return '';\n }\n\n if (input.length === 1) {\n return options.pascalCase ? input.toUpperCase() : input.toLowerCase();\n }\n\n const hasUpperCase = input !== input.toLowerCase();\n\n if (hasUpperCase) {\n input = preserveCamelCase(input);\n }\n\n input = input\n .replace(/^[_.\\- ]+/, '')\n .toLowerCase()\n .replace(/[_.\\- ]+(\\w|$)/g, (_, p1) => p1.toUpperCase())\n .replace(/\\d+(\\w|$)/g, (m) => m.toUpperCase());\n\n return postProcess(input);\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ function templateString(template, getter) {
2
+ return template.replace(/\${(.*?)}/g, (_, g) => {
3
+ return getter(g.trim());
4
+ });
5
+ }
6
+
7
+ export { templateString };
8
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sources":["../../src/strings/templates.ts"],"sourcesContent":["/**\n * 替换类似于 JS 的模板字符串\n *\n * @example\n * templateString('My name is ${name}',{name:'wener'})\n */\nexport function templateString(template: string, getter: (v: string) => any) {\n return template.replace(/\\${(.*?)}/g, (_, g) => {\n // variables[g.trim()]\n // 支持路径 - 例如 a.b[0]\n return getter(g.trim());\n });\n}\n"],"names":[],"mappings":"AAMgB,SAAA,cAAA,CAAe,UAAkB,MAA4B,EAAA;AAC3E,EAAA,OAAO,QAAS,CAAA,OAAA,CAAQ,YAAc,EAAA,CAAC,GAAG,CAAM,KAAA;AAG9C,IAAO,OAAA,MAAA,CAAO,CAAE,CAAA,IAAA,EAAM,CAAA,CAAA;AAAA,GACvB,CAAA,CAAA;AACH;;;;"}
@@ -0,0 +1,95 @@
1
+ const has = Object.prototype.hasOwnProperty;
2
+ const hasElementType = typeof Element !== "undefined";
3
+ function find(iter, tar, key) {
4
+ for (key of iter.keys()) {
5
+ if (dequal(key, tar))
6
+ return key;
7
+ }
8
+ }
9
+ function dequal(foo, bar) {
10
+ let ctor, len, tmp;
11
+ if (foo === bar)
12
+ return true;
13
+ if (foo && bar && (ctor = foo.constructor) === bar.constructor) {
14
+ if (ctor === Date)
15
+ return foo.getTime() === bar.getTime();
16
+ if (ctor === RegExp)
17
+ return foo.toString() === bar.toString();
18
+ if (ctor === Array) {
19
+ if ((len = foo.length) === bar.length) {
20
+ while (len-- && dequal(foo[len], bar[len]))
21
+ ;
22
+ }
23
+ return len === -1;
24
+ }
25
+ if (ctor === Set) {
26
+ if (foo.size !== bar.size) {
27
+ return false;
28
+ }
29
+ for (len of foo) {
30
+ tmp = len;
31
+ if (tmp && typeof tmp === "object") {
32
+ tmp = find(bar, tmp);
33
+ if (!tmp)
34
+ return false;
35
+ }
36
+ if (!bar.has(tmp))
37
+ return false;
38
+ }
39
+ return true;
40
+ }
41
+ if (ctor === Map) {
42
+ if (foo.size !== bar.size) {
43
+ return false;
44
+ }
45
+ for (len of foo) {
46
+ tmp = len[0];
47
+ if (tmp && typeof tmp === "object") {
48
+ tmp = find(bar, tmp);
49
+ if (!tmp)
50
+ return false;
51
+ }
52
+ if (!dequal(len[1], bar.get(tmp))) {
53
+ return false;
54
+ }
55
+ }
56
+ return true;
57
+ }
58
+ if (ctor === ArrayBuffer) {
59
+ foo = new Uint8Array(foo);
60
+ bar = new Uint8Array(bar);
61
+ } else if (ctor === DataView) {
62
+ if ((len = foo.byteLength) === bar.byteLength) {
63
+ while (len-- && foo.getInt8(len) === bar.getInt8(len))
64
+ ;
65
+ }
66
+ return len === -1;
67
+ }
68
+ if (ArrayBuffer.isView(foo)) {
69
+ if ((len = foo.byteLength) === bar.byteLength) {
70
+ while (len-- && foo[len] === bar[len])
71
+ ;
72
+ }
73
+ return len === -1;
74
+ }
75
+ if (hasElementType && foo instanceof Element)
76
+ return false;
77
+ if (!ctor || typeof foo === "object") {
78
+ len = 0;
79
+ for (ctor in foo) {
80
+ if ((ctor === "_owner" || ctor === "__v" || ctor === "__o") && foo.$$typeof) {
81
+ continue;
82
+ }
83
+ if (has.call(foo, ctor) && ++len && !has.call(bar, ctor))
84
+ return false;
85
+ if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor]))
86
+ return false;
87
+ }
88
+ return Object.keys(bar).length === len;
89
+ }
90
+ }
91
+ return foo !== foo && bar !== bar;
92
+ }
93
+
94
+ export { dequal };
95
+ //# sourceMappingURL=dequal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dequal.js","sources":["../../src/validations/dequal.ts"],"sourcesContent":["const has = Object.prototype.hasOwnProperty;\nconst hasElementType = typeof Element !== 'undefined';\n\nfunction find(iter: any, tar: any, key?: any) {\n for (key of iter.keys()) {\n if (dequal(key, tar)) return key;\n }\n}\n\n/**\n * deep equal - support react, dom, Date, RegExp, Array, ArrayBuffer, Set, Map, Object\n * @see {@link https://github.com/lukeed/dequal/blob/master/src/lite.js dequal/src/lite.js}\n * @see {@link https://github.com/FormidableLabs/react-fast-compare/blob/master/index.js react-fast-compare/index.js}\n */\nexport function dequal(foo: any, bar: any) {\n let ctor, len, tmp;\n if (foo === bar) return true;\n\n if (foo && bar && (ctor = foo.constructor) === bar.constructor) {\n if (ctor === Date) return foo.getTime() === bar.getTime();\n if (ctor === RegExp) return foo.toString() === bar.toString();\n\n if (ctor === Array) {\n if ((len = foo.length) === bar.length) {\n while (len-- && dequal(foo[len], bar[len]));\n }\n return len === -1;\n }\n\n if (ctor === Set) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len;\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!bar.has(tmp)) return false;\n }\n return true;\n }\n\n if (ctor === Map) {\n if (foo.size !== bar.size) {\n return false;\n }\n for (len of foo) {\n tmp = len[0];\n if (tmp && typeof tmp === 'object') {\n tmp = find(bar, tmp);\n if (!tmp) return false;\n }\n if (!dequal(len[1], bar.get(tmp))) {\n return false;\n }\n }\n return true;\n }\n\n if (ctor === ArrayBuffer) {\n foo = new Uint8Array(foo);\n bar = new Uint8Array(bar);\n } else if (ctor === DataView) {\n if ((len = foo.byteLength) === bar.byteLength) {\n while (len-- && foo.getInt8(len) === bar.getInt8(len));\n }\n return len === -1;\n }\n\n if (ArrayBuffer.isView(foo)) {\n if ((len = foo.byteLength) === bar.byteLength) {\n while (len-- && (foo as any)[len] === bar[len]);\n }\n return len === -1;\n }\n\n // react & dom\n if (hasElementType && foo instanceof Element) return false;\n\n if (!ctor || typeof foo === 'object') {\n len = 0;\n for (ctor in foo) {\n if ((ctor === '_owner' || ctor === '__v' || ctor === '__o') && foo.$$typeof) {\n // React-specific: avoid traversing React elements' _owner\n // Preact-specific: avoid traversing Preact elements' __v and __o\n // __v = $_original / $_vnode\n // __o = $_owner\n // These properties contain circular references and are not needed when\n // comparing the actual elements (and not their owners)\n // .$$typeof and ._store on just reasonable markers of elements\n\n continue;\n }\n\n if (has.call(foo, ctor) && ++len && !has.call(bar, ctor)) return false;\n if (!(ctor in bar) || !dequal(foo[ctor], bar[ctor])) return false;\n }\n return Object.keys(bar).length === len;\n }\n }\n\n return foo !== foo && bar !== bar;\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ function isClass(func) {
2
+ return typeof func === "function" && /^class\s/.test(Function.prototype.toString.call(func));
3
+ }
4
+
5
+ export { isClass };
6
+ //# sourceMappingURL=isClass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isClass.js","sources":["../../src/validations/isClass.ts"],"sourcesContent":["export function isClass(func: any) {\n return typeof func === 'function' && /^class\\s/.test(Function.prototype.toString.call(func));\n}\n"],"names":[],"mappings":"AAAO,SAAS,QAAQ,IAAW,EAAA;AACjC,EAAO,OAAA,OAAO,IAAS,KAAA,UAAA,IAAc,UAAW,CAAA,IAAA,CAAK,SAAS,SAAU,CAAA,QAAA,CAAS,IAAK,CAAA,IAAI,CAAC,CAAA,CAAA;AAC7F;;;;"}
@@ -0,0 +1,6 @@
1
+ function isDefined(v) {
2
+ return v !== null && v !== void 0;
3
+ }
4
+
5
+ export { isDefined };
6
+ //# sourceMappingURL=isDefined.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isDefined.js","sources":["../../src/validations/isDefined.ts"],"sourcesContent":["export function isDefined<T = any>(v: T): v is NonNullable<T> {\n return v !== null && v !== undefined;\n}\n"],"names":[],"mappings":"AAAO,SAAS,UAAmB,CAA2B,EAAA;AAC5D,EAAO,OAAA,CAAA,KAAM,QAAQ,CAAM,KAAA,KAAA,CAAA,CAAA;AAC7B;;;;"}
@@ -0,0 +1,9 @@
1
+ function isEmptyObject(o) {
2
+ if (o === null || o === void 0) {
3
+ return true;
4
+ }
5
+ return o.constructor === Object && Object.keys(o).length === 0;
6
+ }
7
+
8
+ export { isEmptyObject };
9
+ //# sourceMappingURL=isEmptyObject.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"isEmptyObject.js","sources":["../../src/validations/isEmptyObject.ts"],"sourcesContent":["export function isEmptyObject(o: any) {\n if (o === null || o === undefined) {\n return true;\n }\n return o.constructor === Object && Object.keys(o).length === 0;\n}\n"],"names":[],"mappings":"AAAO,SAAS,cAAc,CAAQ,EAAA;AACpC,EAAI,IAAA,CAAA,KAAM,IAAQ,IAAA,CAAA,KAAM,KAAW,CAAA,EAAA;AACjC,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAA,OAAO,EAAE,WAAgB,KAAA,MAAA,IAAU,OAAO,IAAK,CAAA,CAAC,EAAE,MAAW,KAAA,CAAA,CAAA;AAC/D;;;;"}
@@ -0,0 +1,21 @@
1
+ function shallow(objA, objB) {
2
+ if (Object.is(objA, objB)) {
3
+ return true;
4
+ }
5
+ if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
6
+ return false;
7
+ }
8
+ const keysA = Object.keys(objA);
9
+ if (keysA.length !== Object.keys(objB).length) {
10
+ return false;
11
+ }
12
+ for (let i = 0; i < keysA.length; i++) {
13
+ if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
14
+ return false;
15
+ }
16
+ }
17
+ return true;
18
+ }
19
+
20
+ export { shallow };
21
+ //# sourceMappingURL=shallow.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shallow.js","sources":["../../src/validations/shallow.ts"],"sourcesContent":["/**\n * shallow compare - support object, array\n *\n * @see {@link https://github.com/pmndrs/zustand/blob/main/src/shallow.ts zustand/src/shallow.ts}\n */\nexport function shallow<T, U>(objA: T, objB: U) {\n if (Object.is(objA, objB)) {\n return true;\n }\n if (typeof objA !== 'object' || objA === null || typeof objB !== 'object' || objB === null) {\n return false;\n }\n const keysA = Object.keys(objA);\n if (keysA.length !== Object.keys(objB).length) {\n return false;\n }\n for (let i = 0; i < keysA.length; i++) {\n if (\n !Object.prototype.hasOwnProperty.call(objB, keysA[i] as string) ||\n !Object.is(objA[keysA[i] as keyof T], objB[keysA[i] as keyof U])\n ) {\n return false;\n }\n }\n return true;\n}\n"],"names":[],"mappings":"AAKgB,SAAA,OAAA,CAAc,MAAS,IAAS,EAAA;AAC9C,EAAA,IAAI,MAAO,CAAA,EAAA,CAAG,IAAM,EAAA,IAAI,CAAG,EAAA;AACzB,IAAO,OAAA,IAAA,CAAA;AAAA,GACT;AACA,EAAI,IAAA,OAAO,SAAS,QAAY,IAAA,IAAA,KAAS,QAAQ,OAAO,IAAA,KAAS,QAAY,IAAA,IAAA,KAAS,IAAM,EAAA;AAC1F,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAM,MAAA,KAAA,GAAQ,MAAO,CAAA,IAAA,CAAK,IAAI,CAAA,CAAA;AAC9B,EAAA,IAAI,MAAM,MAAW,KAAA,MAAA,CAAO,IAAK,CAAA,IAAI,EAAE,MAAQ,EAAA;AAC7C,IAAO,OAAA,KAAA,CAAA;AAAA,GACT;AACA,EAAA,KAAA,IAAS,CAAI,GAAA,CAAA,EAAG,CAAI,GAAA,KAAA,CAAM,QAAQ,CAAK,EAAA,EAAA;AACrC,IAAA,IACE,CAAC,MAAO,CAAA,SAAA,CAAU,eAAe,IAAK,CAAA,IAAA,EAAM,MAAM,CAAY,CAAA,CAAA,IAC9D,CAAC,MAAA,CAAO,GAAG,IAAK,CAAA,KAAA,CAAM,KAAgB,IAAK,CAAA,KAAA,CAAM,GAAc,CAC/D,EAAA;AACA,MAAO,OAAA,KAAA,CAAA;AAAA,KACT;AAAA,GACF;AACA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
package/package.json CHANGED
@@ -1,71 +1,68 @@
1
1
  {
2
2
  "name": "@wener/utils",
3
- "version": "1.1.2",
4
- "description": "Utils for daily use",
3
+ "version": "1.1.4",
5
4
  "type": "module",
6
- "sideEffects": false,
7
- "keywords": [
8
- "utils",
9
- "core library",
10
- "helper"
11
- ],
5
+ "description": "Utils for daily use",
12
6
  "repository": {
13
7
  "type": "git",
14
8
  "url": "git+https://github.com/wener/wode.git"
15
9
  },
16
- "license": "MIT",
10
+ "homepage": "https://github.com/wenerme/wode#readme",
17
11
  "author": "wener",
12
+ "license": "MIT",
13
+ "engines": {
14
+ "node": "16",
15
+ "npm": "8"
16
+ },
17
+ "main": "dist/cjs/index.js",
18
+ "module": "lib/index.js",
18
19
  "exports": {
19
20
  ".": {
20
21
  "types": "./src/index.ts",
21
- "import": "./lib/esm/index.mjs",
22
+ "import": "./lib/index.js",
22
23
  "system": {
23
- "development": "./dist/system/index.development.js",
24
- "default": "./dist/system/index.min.js"
24
+ "default": "./dist/system/index.js"
25
25
  },
26
26
  "require": "./dist/cjs/index.js"
27
27
  },
28
28
  "./types": {
29
29
  "types": "./src/types.d.ts"
30
30
  },
31
+ "./server": {
32
+ "types": "./src/server.ts",
33
+ "import": "./lib/server.js",
34
+ "system": {
35
+ "default": "./dist/system/server.js"
36
+ },
37
+ "require": "./dist/cjs/server.js"
38
+ },
31
39
  "./src/*": "./src/*",
32
40
  "./package.json": "./package.json"
33
41
  },
34
- "main": "dist/cjs/index.js",
35
- "import": "lib/esm/index.mjs",
36
42
  "types": "src/index.ts",
37
- "homepage": "https://github.com/wenerme/wode#readme",
38
43
  "files": [
39
- "index.js",
40
- "index.d.ts",
41
- "lib",
42
44
  "dist",
45
+ "index.ts",
46
+ "lib",
47
+ "server.ts",
43
48
  "src",
44
- "README.md",
45
- "rollup.config.ts",
46
- "jest.config.js",
47
- "jest.setup.js",
48
- "tsconfig.rollup.json",
49
- "tsconfig.jest.json",
50
49
  "tsconfig.json"
51
50
  ],
51
+ "keywords": [
52
+ "utils",
53
+ "core library",
54
+ "helper"
55
+ ],
52
56
  "devDependencies": {
53
57
  "@types/lodash": "^4",
54
- "@types/node": "^16",
55
58
  "ava": "^4.3.3",
56
- "dotenv": "^16",
57
- "esbuild": "^0.14",
58
- "lodash": "^4",
59
- "tslib": "^2",
60
- "typescript": "^4"
59
+ "lodash": "^4"
61
60
  },
62
61
  "publishConfig": {
62
+ "registry": "https://registry.npmjs.org",
63
63
  "access": "public"
64
64
  },
65
- "engines": {
66
- "node": "16",
67
- "npm": "8"
68
- },
65
+ "sideEffects": false,
69
66
  "ava": {
70
67
  "extensions": {
71
68
  "ts": "module"
@@ -74,6 +71,12 @@
74
71
  "--loader=tsx"
75
72
  ]
76
73
  },
74
+ "rollup": {
75
+ "input": [
76
+ "./src/index.ts",
77
+ "./src/server.ts"
78
+ ]
79
+ },
77
80
  "scripts": {
78
81
  "build": "make prepublish",
79
82
  "clean": "make clean",
package/server.ts ADDED
@@ -0,0 +1 @@
1
+ export * from './src/server';
@@ -1,14 +1,18 @@
1
+ /**
2
+ * Array or element of an array
3
+ */
1
4
  export type MaybeArray<T> = T | T[];
2
5
 
6
+ /**
7
+ * convert to single value object
8
+ */
3
9
  export function objectOfMaybeArray<T = any>(
4
10
  o: Record<string, MaybeArray<T>>,
5
11
  keys: string[] | null = null,
6
- picker = firstOfMaybeArray
12
+ picker = firstOfMaybeArray,
7
13
  ): Record<string, T> {
8
14
  if (keys === null) {
9
- return Object.fromEntries(
10
- Object.entries(o).map(([k, v]) => [k, picker(v)])
11
- );
15
+ return Object.fromEntries(Object.entries(o).map(([k, v]) => [k, picker(v)]));
12
16
  }
13
17
  return Object.fromEntries(keys.map((v) => [v, picker(v)])) as any;
14
18
  }
@@ -1,3 +1,6 @@
1
+ /**
2
+ * generate random UUIDv4
3
+ */
1
4
  export function randomUUID() {
2
5
  if ('randomUUID' in crypto) {
3
6
  return crypto.randomUUID();
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ // arrays
1
2
  export {
2
3
  firstOfMaybeArray,
3
4
  lastOfMaybeArray,
@@ -6,6 +7,7 @@ export {
6
7
  type MaybeArray,
7
8
  } from './arrays/MaybeArray';
8
9
 
10
+ // async
9
11
  export { createLazyPromise, type LazyPromise } from './asyncs/LazyPromise';
10
12
  export { setAsyncInterval, clearAsyncInterval } from './asyncs/AsyncInterval';
11
13
  export { type MaybePromise } from './asyncs/MaybePromise';
@@ -15,24 +17,41 @@ export { timeout, TimeoutError } from './asyncs/timeout';
15
17
  export { isPromise } from './asyncs/isPromise';
16
18
  // export * from './async/promiseOfCallback';
17
19
 
18
- // asserts.ts
20
+ // validations
19
21
  export { isClass } from './validations/isClass';
20
22
  export { isDefined } from './validations/isDefined';
21
23
  export { isEmptyObject } from './validations/isEmptyObject';
24
+ export { shallow } from './validations/shallow';
25
+ export { dequal } from './validations/dequal';
22
26
 
27
+ // modules
28
+ export { parseModuleId, type ParsedModuleId } from './modules/parseModuleId';
29
+ export { isModule } from './modules/isModule';
30
+
31
+ // logging
32
+ export { type Logger, type LogLevel } from './logging/Logger';
33
+ export { createWriteLogger } from './logging/createWriteLogger';
34
+ export { createNoopLogger } from './logging/createNoopLogger';
35
+ export { createChildLogger } from './logging/createChildLogger';
36
+
37
+ // strings
23
38
  export { pascalCase, camelCase } from './strings/camelCase';
24
39
  export { templateString } from './strings/templates';
40
+
25
41
  export { createRandom } from './maths/random';
26
42
  export { isBuffer } from './io/isBuffer';
43
+
27
44
  export { copy } from './browsers/copy';
28
45
  export { download } from './browsers/download';
29
46
  export { loadScripts, loadStyles } from './browsers/loaders';
30
47
  export { getFileFromDataTransfer } from './browsers/getFileFromDataTransfer';
31
48
 
32
49
  export { getGlobalThis } from './isomorphics/getGlobalThis';
50
+
33
51
  export { formatBytes } from './formats/formatBytes';
34
52
  export { urljoin } from './shim/urljoin';
35
53
 
54
+ // crypto
36
55
  export { randomUUID } from './crypto/randomUUID';
37
56
  export { sha1, sha256, sha384, sha512 } from './crypto/hashing';
38
57
  export { hex } from './crypto/hex';
@@ -0,0 +1,19 @@
1
+ export interface Logger {
2
+ trace(...data: any[]): void;
3
+
4
+ debug(...data: any[]): void;
5
+
6
+ info(...data: any[]): void;
7
+
8
+ warn(...data: any[]): void;
9
+
10
+ error(...data: any[]): void;
11
+
12
+ child?: (o: object) => Logger;
13
+ }
14
+
15
+ export interface LoggerWithChild extends Logger {
16
+ child: (o: object) => LoggerWithChild;
17
+ }
18
+
19
+ export type LogLevel = 'error' | 'warn' | 'info' | 'debug' | 'trace';
@@ -0,0 +1,16 @@
1
+ import { Logger, LoggerWithChild } from './Logger';
2
+ import { createWriteLogger } from './createWriteLogger';
3
+
4
+ export function createChildLogger(l: Logger, ctx: object): LoggerWithChild {
5
+ if (l.child) {
6
+ return l.child(ctx) as LoggerWithChild;
7
+ }
8
+ return createWriteLogger((o) => {
9
+ const { level, values, ...c } = o;
10
+ if (Object.keys(c).length) {
11
+ l[level](c, ...values);
12
+ } else {
13
+ l[level](...values);
14
+ }
15
+ }, ctx);
16
+ }
@@ -0,0 +1,13 @@
1
+ import { LoggerWithChild } from './Logger';
2
+
3
+ export function createNoopLogger(): LoggerWithChild {
4
+ const noop = (..._: any[]) => void 0;
5
+ return {
6
+ trace: noop,
7
+ debug: noop,
8
+ info: noop,
9
+ warn: noop,
10
+ error: noop,
11
+ child: () => createNoopLogger(),
12
+ };
13
+ }
@@ -0,0 +1,15 @@
1
+ import { LoggerWithChild, LogLevel } from './Logger';
2
+
3
+ export function createWriteLogger(
4
+ write: (o: { level: LogLevel; values: any[] } & Record<string | symbol, any>) => void,
5
+ context: object = {},
6
+ ): LoggerWithChild {
7
+ return {
8
+ trace: (...values) => write({ ...context, level: 'trace', values }),
9
+ debug: (...values) => write({ ...context, level: 'debug', values }),
10
+ info: (...values) => write({ ...context, level: 'info', values }),
11
+ warn: (...values) => write({ ...context, level: 'warn', values }),
12
+ error: (...values) => write({ ...context, level: 'error', values }),
13
+ child: (ctx) => createWriteLogger(write, { ...context, ...ctx }),
14
+ };
15
+ }
@@ -0,0 +1,16 @@
1
+ import test from 'ava';
2
+ import { createChildLogger } from './createChildLogger';
3
+ import { createWriteLogger } from './createWriteLogger';
4
+
5
+ test('logger', (t) => {
6
+ {
7
+ let logs: any[] = [];
8
+ const base = createWriteLogger((o) => logs.push(o));
9
+ let l = createChildLogger(base, { c: 'test' });
10
+ l.info('hello');
11
+ t.deepEqual(logs.shift(), { level: 'info', values: ['hello'], c: 'test' });
12
+ l.child({ m: 1 }).trace('trace');
13
+ t.deepEqual(logs.shift(), { level: 'trace', values: ['trace'], c: 'test', m: 1 });
14
+ }
15
+ createChildLogger(console, { c: 'test' }).info('hello');
16
+ });
@@ -0,0 +1,3 @@
1
+ export function isModule(o: any) {
2
+ return o && o[Symbol.toStringTag] === 'Module';
3
+ }
@@ -0,0 +1,68 @@
1
+ import test from 'ava';
2
+ import { parseModuleId } from './parseModuleId';
3
+
4
+ test('parseModuleId', (t) => {
5
+ const tests = {
6
+ '@wener/reaction': {
7
+ id: `@wener/reaction@latest`,
8
+ name: '@wener/reaction',
9
+ range: 'latest',
10
+ scoped: true,
11
+ org: 'wener',
12
+ pkg: 'reaction',
13
+ },
14
+ reaction: {
15
+ id: `reaction@latest`,
16
+ name: 'reaction',
17
+ range: 'latest',
18
+ pkg: 'reaction',
19
+ scoped: false,
20
+ },
21
+ 'reaction@1': {
22
+ id: `reaction@1`,
23
+ name: 'reaction',
24
+ range: '1',
25
+ pkg: 'reaction',
26
+ scoped: false,
27
+ },
28
+ 'reaction@1.1.1': {
29
+ id: `reaction@1.1.1`,
30
+ name: 'reaction',
31
+ version: '1.1.1',
32
+ range: '1.1.1',
33
+ pkg: 'reaction',
34
+ scoped: false,
35
+ },
36
+ 'reaction@1.1.1-alpha': {
37
+ id: `reaction@1.1.1-alpha`,
38
+ name: 'reaction',
39
+ version: '1.1.1-alpha',
40
+ range: '1.1.1-alpha',
41
+ pkg: 'reaction',
42
+
43
+ scoped: false,
44
+ },
45
+ 'reaction@1.1.1/index.js': {
46
+ id: `reaction@1.1.1`,
47
+ name: 'reaction',
48
+ version: '1.1.1',
49
+ range: '1.1.1',
50
+ scoped: false,
51
+ pkg: 'reaction',
52
+
53
+ path: '/index.js',
54
+ },
55
+ 'reaction@1.1.1/': {
56
+ id: `reaction@1.1.1`,
57
+ name: 'reaction',
58
+ version: '1.1.1',
59
+ range: '1.1.1',
60
+ scoped: false,
61
+ pkg: 'reaction',
62
+ path: '/',
63
+ },
64
+ };
65
+ for (const [k, v] of Object.entries(tests)) {
66
+ t.deepEqual(parseModuleId(k), v);
67
+ }
68
+ });