@livestore/utils 0.0.0-snapshot-909cdd1ac2fd591945c2be2b0f53e14d87f3c9d4

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 (169) hide show
  1. package/dist/.tsbuildinfo.json +1 -0
  2. package/dist/Deferred.d.ts +10 -0
  3. package/dist/Deferred.d.ts.map +1 -0
  4. package/dist/Deferred.js +21 -0
  5. package/dist/Deferred.js.map +1 -0
  6. package/dist/NoopTracer.d.ts +10 -0
  7. package/dist/NoopTracer.d.ts.map +1 -0
  8. package/dist/NoopTracer.js +52 -0
  9. package/dist/NoopTracer.js.map +1 -0
  10. package/dist/base64.d.ts +13 -0
  11. package/dist/base64.d.ts.map +1 -0
  12. package/dist/base64.js +117 -0
  13. package/dist/base64.js.map +1 -0
  14. package/dist/browser.d.ts +3 -0
  15. package/dist/browser.d.ts.map +1 -0
  16. package/dist/browser.js +28 -0
  17. package/dist/browser.js.map +1 -0
  18. package/dist/cuid/cuid.browser.d.ts +18 -0
  19. package/dist/cuid/cuid.browser.d.ts.map +1 -0
  20. package/dist/cuid/cuid.browser.js +80 -0
  21. package/dist/cuid/cuid.browser.js.map +1 -0
  22. package/dist/cuid/cuid.node.d.ts +18 -0
  23. package/dist/cuid/cuid.node.d.ts.map +1 -0
  24. package/dist/cuid/cuid.node.js +83 -0
  25. package/dist/cuid/cuid.node.js.map +1 -0
  26. package/dist/effect/Effect.d.ts +28 -0
  27. package/dist/effect/Effect.d.ts.map +1 -0
  28. package/dist/effect/Effect.js +82 -0
  29. package/dist/effect/Effect.js.map +1 -0
  30. package/dist/effect/Error.d.ts +11 -0
  31. package/dist/effect/Error.d.ts.map +1 -0
  32. package/dist/effect/Error.js +7 -0
  33. package/dist/effect/Error.js.map +1 -0
  34. package/dist/effect/Schedule.d.ts +4 -0
  35. package/dist/effect/Schedule.d.ts.map +1 -0
  36. package/dist/effect/Schedule.js +5 -0
  37. package/dist/effect/Schedule.js.map +1 -0
  38. package/dist/effect/Scheduler.d.ts +4 -0
  39. package/dist/effect/Scheduler.d.ts.map +1 -0
  40. package/dist/effect/Scheduler.js +10 -0
  41. package/dist/effect/Scheduler.js.map +1 -0
  42. package/dist/effect/Schema/debug-diff.d.ts +12 -0
  43. package/dist/effect/Schema/debug-diff.d.ts.map +1 -0
  44. package/dist/effect/Schema/debug-diff.js +51 -0
  45. package/dist/effect/Schema/debug-diff.js.map +1 -0
  46. package/dist/effect/Schema/debug-diff.test.d.ts +2 -0
  47. package/dist/effect/Schema/debug-diff.test.d.ts.map +1 -0
  48. package/dist/effect/Schema/debug-diff.test.js +91 -0
  49. package/dist/effect/Schema/debug-diff.test.js.map +1 -0
  50. package/dist/effect/Schema/index.d.ts +18 -0
  51. package/dist/effect/Schema/index.d.ts.map +1 -0
  52. package/dist/effect/Schema/index.js +29 -0
  53. package/dist/effect/Schema/index.js.map +1 -0
  54. package/dist/effect/Schema/msgpack.d.ts +3 -0
  55. package/dist/effect/Schema/msgpack.d.ts.map +1 -0
  56. package/dist/effect/Schema/msgpack.js +7 -0
  57. package/dist/effect/Schema/msgpack.js.map +1 -0
  58. package/dist/effect/ServiceContext.d.ts +37 -0
  59. package/dist/effect/ServiceContext.d.ts.map +1 -0
  60. package/dist/effect/ServiceContext.js +55 -0
  61. package/dist/effect/ServiceContext.js.map +1 -0
  62. package/dist/effect/Stream.d.ts +10 -0
  63. package/dist/effect/Stream.d.ts.map +1 -0
  64. package/dist/effect/Stream.js +17 -0
  65. package/dist/effect/Stream.js.map +1 -0
  66. package/dist/effect/SubscriptionRef.d.ts +11 -0
  67. package/dist/effect/SubscriptionRef.d.ts.map +1 -0
  68. package/dist/effect/SubscriptionRef.js +5 -0
  69. package/dist/effect/SubscriptionRef.js.map +1 -0
  70. package/dist/effect/WebChannel.d.ts +30 -0
  71. package/dist/effect/WebChannel.d.ts.map +1 -0
  72. package/dist/effect/WebChannel.js +44 -0
  73. package/dist/effect/WebChannel.js.map +1 -0
  74. package/dist/effect/WebLock.d.ts +9 -0
  75. package/dist/effect/WebLock.d.ts.map +1 -0
  76. package/dist/effect/WebLock.js +73 -0
  77. package/dist/effect/WebLock.js.map +1 -0
  78. package/dist/effect/index.d.ts +21 -0
  79. package/dist/effect/index.d.ts.map +1 -0
  80. package/dist/effect/index.js +20 -0
  81. package/dist/effect/index.js.map +1 -0
  82. package/dist/fast-deep-equal.d.ts +2 -0
  83. package/dist/fast-deep-equal.d.ts.map +1 -0
  84. package/dist/fast-deep-equal.js +79 -0
  85. package/dist/fast-deep-equal.js.map +1 -0
  86. package/dist/global.d.ts +5 -0
  87. package/dist/global.d.ts.map +1 -0
  88. package/dist/global.js +2 -0
  89. package/dist/global.js.map +1 -0
  90. package/dist/guards.d.ts +6 -0
  91. package/dist/guards.d.ts.map +1 -0
  92. package/dist/guards.js +6 -0
  93. package/dist/guards.js.map +1 -0
  94. package/dist/index.d.ts +76 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +176 -0
  97. package/dist/index.js.map +1 -0
  98. package/dist/misc.d.ts +3 -0
  99. package/dist/misc.d.ts.map +1 -0
  100. package/dist/misc.js +24 -0
  101. package/dist/misc.js.map +1 -0
  102. package/dist/nanoid/index.d.ts +2 -0
  103. package/dist/nanoid/index.d.ts.map +1 -0
  104. package/dist/nanoid/index.js +2 -0
  105. package/dist/nanoid/index.js.map +1 -0
  106. package/dist/object/index.d.ts +10 -0
  107. package/dist/object/index.d.ts.map +1 -0
  108. package/dist/object/index.js +10 -0
  109. package/dist/object/index.js.map +1 -0
  110. package/dist/object/omit.d.ts +3 -0
  111. package/dist/object/omit.d.ts.map +1 -0
  112. package/dist/object/omit.js +14 -0
  113. package/dist/object/omit.js.map +1 -0
  114. package/dist/object/pick.d.ts +14 -0
  115. package/dist/object/pick.d.ts.map +1 -0
  116. package/dist/object/pick.js +17 -0
  117. package/dist/object/pick.js.map +1 -0
  118. package/dist/promise.d.ts +6 -0
  119. package/dist/promise.d.ts.map +1 -0
  120. package/dist/promise.js +27 -0
  121. package/dist/promise.js.map +1 -0
  122. package/dist/set.d.ts +2 -0
  123. package/dist/set.d.ts.map +1 -0
  124. package/dist/set.js +10 -0
  125. package/dist/set.js.map +1 -0
  126. package/dist/string.d.ts +5 -0
  127. package/dist/string.d.ts.map +1 -0
  128. package/dist/string.js +8 -0
  129. package/dist/string.js.map +1 -0
  130. package/dist/time.d.ts +12 -0
  131. package/dist/time.d.ts.map +1 -0
  132. package/dist/time.js +22 -0
  133. package/dist/time.js.map +1 -0
  134. package/package.json +74 -0
  135. package/src/Deferred.ts +24 -0
  136. package/src/NoopTracer.ts +75 -0
  137. package/src/ambient.d.ts +3 -0
  138. package/src/base64.ts +123 -0
  139. package/src/browser.ts +32 -0
  140. package/src/cuid/cuid.browser.ts +95 -0
  141. package/src/cuid/cuid.node.ts +103 -0
  142. package/src/effect/Effect.ts +180 -0
  143. package/src/effect/Error.ts +6 -0
  144. package/src/effect/Schedule.ts +10 -0
  145. package/src/effect/Scheduler.ts +14 -0
  146. package/src/effect/Schema/debug-diff.test.ts +102 -0
  147. package/src/effect/Schema/debug-diff.ts +58 -0
  148. package/src/effect/Schema/index.ts +58 -0
  149. package/src/effect/Schema/msgpack.ts +8 -0
  150. package/src/effect/ServiceContext.ts +108 -0
  151. package/src/effect/Stream.ts +63 -0
  152. package/src/effect/SubscriptionRef.ts +22 -0
  153. package/src/effect/WebChannel.ts +116 -0
  154. package/src/effect/WebLock.ts +95 -0
  155. package/src/effect/index.ts +91 -0
  156. package/src/fast-deep-equal.ts +72 -0
  157. package/src/global.ts +5 -0
  158. package/src/guards.ts +8 -0
  159. package/src/index.ts +240 -0
  160. package/src/misc.ts +26 -0
  161. package/src/nanoid/index.ts +1 -0
  162. package/src/object/index.ts +24 -0
  163. package/src/object/omit.ts +17 -0
  164. package/src/object/pick.ts +27 -0
  165. package/src/promise.ts +43 -0
  166. package/src/set.ts +10 -0
  167. package/src/string.ts +9 -0
  168. package/src/time.ts +25 -0
  169. package/tsconfig.json +10 -0
@@ -0,0 +1,10 @@
1
+ export * from './pick.js';
2
+ export * from './omit.js';
3
+ type ValueOfRecord<R extends Record<any, any>> = R extends Record<any, infer V> ? V : never;
4
+ export declare const mapObjectValues: <O_In extends Record<string, any>, V_Out>(obj: O_In, mapValue: (key: keyof O_In, val: ValueOfRecord<O_In>) => V_Out) => { [K in keyof O_In]: V_Out; };
5
+ export type Entries<T> = {
6
+ [K in keyof T]: [K, T[K]];
7
+ }[keyof T][];
8
+ export declare const objectEntries: <T extends Record<string, any>>(obj: T) => Entries<T>;
9
+ export declare const keyObjectFromObject: <TObj extends Record<string, any>>(obj: TObj) => { [K in keyof TObj]: K; };
10
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAEA,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,KAAK,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;AAE3F,eAAO,MAAM,eAAe,GAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,KAAK,OAChE,IAAI,YACC,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE,GAAG,EAAE,aAAa,CAAC,IAAI,CAAC,KAAK,KAAK,KAC7D,GAAG,CAAe,IAAV,MAAM,IAAI,GAAG,KAAK,GAG5B,CAAA;AAED,MAAM,MAAM,OAAO,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,MAAM,CAAC,CAAC,EAAE,CAAA;AAEjE,eAAO,MAAM,aAAa,GAAI,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,KAAG,OAAO,CAAC,CAAC,CAAsC,CAAA;AAErH,eAAO,MAAM,mBAAmB,GAAI,IAAI,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,OAAO,IAAI,KAAG,GAAG,CAAe,IAAV,MAAM,IAAI,GAAG,CAAC,GAI9F,CAAA"}
@@ -0,0 +1,10 @@
1
+ import { pipe } from 'effect';
2
+ export * from './pick.js';
3
+ export * from './omit.js';
4
+ export const mapObjectValues = (obj, mapValue) => {
5
+ const mappedEntries = Object.entries(obj).map(([key, val]) => [key, mapValue(key, val)]);
6
+ return Object.fromEntries(mappedEntries);
7
+ };
8
+ export const objectEntries = (obj) => Object.entries(obj);
9
+ export const keyObjectFromObject = (obj) => pipe(objectEntries(obj).map(([k]) => [k, k]), Object.fromEntries);
10
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/object/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAA;AAE7B,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAIzB,MAAM,CAAC,MAAM,eAAe,GAAG,CAC7B,GAAS,EACT,QAA8D,EAChC,EAAE;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,GAAiB,EAAE,GAAG,CAAC,CAAU,CAAC,CAAA;IAC/G,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAQ,CAAA;AACjD,CAAC,CAAA;AAID,MAAM,CAAC,MAAM,aAAa,GAAG,CAAgC,GAAM,EAAc,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAe,CAAA;AAErH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAmC,GAAS,EAA4B,EAAE,CAC3G,IAAI,CACF,aAAa,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EACvC,MAAM,CAAC,WAAW,CACZ,CAAA"}
@@ -0,0 +1,3 @@
1
+ /** Returns a shallowly cloned object with the provided keys omitted */
2
+ export declare const omit: <Obj extends Record<string, any>, Keys extends keyof Obj>(obj: Obj, keys: Keys[]) => Omit<Obj, Keys>;
3
+ //# sourceMappingURL=omit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omit.d.ts","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAKA,uEAAuE;AACvE,eAAO,MAAM,IAAI,GAAI,GAAG,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,IAAI,SAAS,MAAM,GAAG,OACrE,GAAG,QACF,IAAI,EAAE,KACX,IAAI,CAAC,GAAG,EAAE,IAAI,CAOhB,CAAA"}
@@ -0,0 +1,14 @@
1
+ // type ConvertUndefined<T> = OrUndefined<{ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K] }>
2
+ // type OrUndefined<T> = { [K in keyof T]: T[K] | undefined }
3
+ // type PickRequired<T> = { [K in keyof T as undefined extends T[K] ? never : K]: T[K] }
4
+ // type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>
5
+ /** Returns a shallowly cloned object with the provided keys omitted */
6
+ export const omit = (obj, keys) => {
7
+ return Object.keys(obj).reduce((acc, key) => {
8
+ if (!keys.includes(key)) {
9
+ acc[key] = obj[key];
10
+ }
11
+ return acc;
12
+ }, {});
13
+ };
14
+ //# sourceMappingURL=omit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"omit.js","sourceRoot":"","sources":["../../src/object/omit.ts"],"names":[],"mappings":"AAAA,2GAA2G;AAC3G,6DAA6D;AAC7D,wFAAwF;AACxF,8DAA8D;AAE9D,uEAAuE;AACvE,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,GAAQ,EACR,IAAY,EACK,EAAE;IACnB,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAQ,EAAE,EAAE;QAC/C,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,GAAG,CAAC,GAAG,CAAC,GAAI,GAAW,CAAC,GAAG,CAAC,CAAA;QAC9B,CAAC;QACD,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC,CAAA"}
@@ -0,0 +1,14 @@
1
+ type ConvertUndefined<T> = OrUndefined<{
2
+ [K in keyof T as undefined extends T[K] ? K : never]-?: T[K];
3
+ }>;
4
+ type OrUndefined<T> = {
5
+ [K in keyof T]: T[K] | undefined;
6
+ };
7
+ type PickRequired<T> = {
8
+ [K in keyof T as undefined extends T[K] ? never : K]: T[K];
9
+ };
10
+ type ConvertPick<T> = ConvertUndefined<T> & PickRequired<T>;
11
+ export declare const pick: <Obj, Keys extends keyof Obj>(obj: Obj, keys: Keys[]) => ConvertPick<{ [K in Keys]: Obj[K]; }>;
12
+ export declare const pickAllOrElse: <Obj, Keys extends keyof Obj, TElse>(obj: Obj, keys: Keys[], elseValue: TElse) => ConvertPick<{ [K in Keys]: NonNullable<Obj[K]>; }> | TElse;
13
+ export {};
14
+ //# sourceMappingURL=pick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.d.ts","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAAA,KAAK,gBAAgB,CAAC,CAAC,IAAI,WAAW,CAAC;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA;AACxG,KAAK,WAAW,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS;CAAE,CAAA;AAC1D,KAAK,YAAY,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,IAAI,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AACrF,KAAK,WAAW,CAAC,CAAC,IAAI,gBAAgB,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAA;AAE3D,eAAO,MAAM,IAAI,GAAI,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,OAAO,GAAG,QAAQ,IAAI,EAAE,KAAG,WAAW,CAAC,GAAG,CAAS,IAAJ,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,GAAE,CAK7G,CAAA;AAED,eAAO,MAAM,aAAa,GAAI,GAAG,EAAE,IAAI,SAAS,MAAM,GAAG,EAAE,KAAK,OACzD,GAAG,QACF,IAAI,EAAE,aACD,KAAK,KACf,WAAW,CAAC,GAAG,CAAS,IAAJ,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAE,CAAC,GAAG,KAUtD,CAAA"}
@@ -0,0 +1,17 @@
1
+ export const pick = (obj, keys) => {
2
+ return keys.reduce((acc, key) => {
3
+ acc[key] = obj[key];
4
+ return acc;
5
+ }, {});
6
+ };
7
+ export const pickAllOrElse = (obj, keys, elseValue) => {
8
+ const ret = {};
9
+ for (const key of keys) {
10
+ if (obj[key] === undefined) {
11
+ return elseValue;
12
+ }
13
+ ret[key] = obj[key];
14
+ }
15
+ return ret;
16
+ };
17
+ //# sourceMappingURL=pick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pick.js","sourceRoot":"","sources":["../../src/object/pick.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,IAAI,GAAG,CAA8B,GAAQ,EAAE,IAAY,EAAwC,EAAE;IAChH,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QAC9B,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACnB,OAAO,GAAG,CAAA;IACZ,CAAC,EAAE,EAAS,CAAC,CAAA;AACf,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,GAAQ,EACR,IAAY,EACZ,SAAgB,EAC2C,EAAE;IAC7D,MAAM,GAAG,GAAG,EAAS,CAAA;IACrB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;IACrB,CAAC;IAED,OAAO,GAAG,CAAA;AACZ,CAAC,CAAA"}
@@ -0,0 +1,6 @@
1
+ /** Promise.all + Array.map */
2
+ export declare const promiseMap: <T, Res>(arr: T[], map: (el: T, index?: number) => Res | Promise<Res>) => Promise<(Awaited<Res> | Awaited<Res>)[]>;
3
+ export declare const promiseMapDict: <T, Res>(dict: Record<string, T>, map: (el: T, index?: number) => Res | Promise<Res>) => Promise<Record<string, Res>>;
4
+ export declare const promiseMapToDict: <T, Res>(arr: T[], mapValue: (el: T, index?: number) => Res | Promise<Res>, mapKey: (el: T, index?: number) => string) => Promise<Record<string, Res>>;
5
+ export declare const promiseMapPool: <T, Res>(arr: T[], map: (el: T, index?: number) => Promise<Res>, poolLimit: number) => Promise<Res[]>;
6
+ //# sourceMappingURL=promise.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,eAAO,MAAM,UAAU,GAAI,CAAC,EAAE,GAAG,OAAO,CAAC,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,6CACpE,CAAA;AAE3B,eAAO,MAAM,cAAc,GAAU,CAAC,EAAE,GAAG,QACnC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,OAClB,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,KACjD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAG7B,CAAA;AAED,eAAO,MAAM,gBAAgB,GAAU,CAAC,EAAE,GAAG,OACtC,CAAC,EAAE,YACE,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAC/C,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,MAAM,KACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAI7B,CAAA;AAED,eAAO,MAAM,cAAc,GAAU,CAAC,EAAE,GAAG,OACpC,CAAC,EAAE,OACH,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,GAAG,CAAC,aACjC,MAAM,KAChB,OAAO,CAAC,GAAG,EAAE,CAgBf,CAAA"}
@@ -0,0 +1,27 @@
1
+ /** Promise.all + Array.map */
2
+ export const promiseMap = (arr, map) => Promise.all(arr.map(map));
3
+ export const promiseMapDict = async (dict, map) => {
4
+ const mappedEntries = await Promise.all(Object.entries(dict).map(async ([key, val]) => [key, await map(val)]));
5
+ return Object.fromEntries(mappedEntries);
6
+ };
7
+ export const promiseMapToDict = async (arr, mapValue, mapKey) => {
8
+ const mappedEntries = await Promise.all(arr.map(async (el, index) => [mapKey(el, index), await mapValue(el, index)]));
9
+ return Object.fromEntries(mappedEntries);
10
+ };
11
+ export const promiseMapPool = async (arr, map, poolLimit) => {
12
+ const ret = [];
13
+ const executing = [];
14
+ for (const [index, item] of arr.entries()) {
15
+ const p = Promise.resolve().then(() => map(item, index));
16
+ ret.push(p);
17
+ if (poolLimit <= arr.length) {
18
+ const e = p.then(() => executing.splice(executing.indexOf(e), 1));
19
+ executing.push(e);
20
+ if (executing.length >= poolLimit) {
21
+ await Promise.race(executing);
22
+ }
23
+ }
24
+ }
25
+ return Promise.all(ret);
26
+ };
27
+ //# sourceMappingURL=promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,MAAM,CAAC,MAAM,UAAU,GAAG,CAAS,GAAQ,EAAE,GAAkD,EAAE,EAAE,CACjG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;AAE3B,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,IAAuB,EACvB,GAAkD,EACpB,EAAE;IAChC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;IAC9G,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,gBAAgB,GAAG,KAAK,EACnC,GAAQ,EACR,QAAuD,EACvD,MAAyC,EACX,EAAE;IAChC,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAErH,OAAO,MAAM,CAAC,WAAW,CAAC,aAAa,CAAC,CAAA;AAC1C,CAAC,CAAA;AAED,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EACjC,GAAQ,EACR,GAA4C,EAC5C,SAAiB,EACD,EAAE;IAClB,MAAM,GAAG,GAAmB,EAAE,CAAA;IAC9B,MAAM,SAAS,GAAmB,EAAE,CAAA;IACpC,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC;QAC1C,MAAM,CAAC,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAA;QACxD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAEX,IAAI,SAAS,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAC5B,MAAM,CAAC,GAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;YACtE,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;YACjB,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;gBAClC,MAAM,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAA;AACzB,CAAC,CAAA"}
package/dist/set.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ export declare const difference: <T>(a: Set<T>, b: Set<T>) => Set<T>;
2
+ //# sourceMappingURL=set.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,GAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,WASjD,CAAA"}
package/dist/set.js ADDED
@@ -0,0 +1,10 @@
1
+ export const difference = (a, b) => {
2
+ const diff = new Set();
3
+ for (const item of a) {
4
+ if (!b.has(item)) {
5
+ diff.add(item);
6
+ }
7
+ }
8
+ return diff;
9
+ };
10
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,CAAI,CAAS,EAAE,CAAS,EAAE,EAAE;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAK,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,CAAC,EAAE,CAAC;QACrB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC,CAAA"}
@@ -0,0 +1,5 @@
1
+ export declare const lowercaseFirstChar: (str: string) => string;
2
+ export declare const uppercaseFirstChar: (str: string) => string;
3
+ /** Indents a string each line by `n` characters (default: spaces) */
4
+ export declare const indent: (str: string, n: number, char?: string) => string;
5
+ //# sourceMappingURL=string.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB,QAAS,MAAM,WAA+C,CAAA;AAC7F,eAAO,MAAM,kBAAkB,QAAS,MAAM,WAA+C,CAAA;AAE7F,qEAAqE;AACrE,eAAO,MAAM,MAAM,QAAS,MAAM,KAAK,MAAM,oBAAe,MAI7C,CAAA"}
package/dist/string.js ADDED
@@ -0,0 +1,8 @@
1
+ export const lowercaseFirstChar = (str) => str.charAt(0).toLowerCase() + str.slice(1);
2
+ export const uppercaseFirstChar = (str) => str.charAt(0).toUpperCase() + str.slice(1);
3
+ /** Indents a string each line by `n` characters (default: spaces) */
4
+ export const indent = (str, n, char = ' ') => str
5
+ .split('\n')
6
+ .map((line) => char.repeat(n) + line)
7
+ .join('\n');
8
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAC7F,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;AAE7F,qEAAqE;AACrE,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,CAAS,EAAE,IAAI,GAAG,GAAG,EAAU,EAAE,CACnE,GAAG;KACA,KAAK,CAAC,IAAI,CAAC;KACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;KACpC,IAAI,CAAC,IAAI,CAAC,CAAA"}
package/dist/time.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ export declare const minuteInMs: number;
2
+ export declare const time: {
3
+ ms: number;
4
+ sec: number;
5
+ min: number;
6
+ hour: number;
7
+ day: number;
8
+ week: number;
9
+ };
10
+ /** Returns a string of format `m:ss` / `mm:ss` / `h:mm:ss` / ... */
11
+ export declare const msAsTimeString: (ms: number) => string;
12
+ //# sourceMappingURL=time.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.d.ts","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,UAAU,QAAY,CAAA;AAEnC,eAAO,MAAM,IAAI;;;;;;;CAOhB,CAAA;AAED,oEAAoE;AACpE,eAAO,MAAM,cAAc,OAAQ,MAAM,WAYxC,CAAA"}
package/dist/time.js ADDED
@@ -0,0 +1,22 @@
1
+ export const minuteInMs = 1000 * 60;
2
+ export const time = {
3
+ ms: 1,
4
+ sec: 1000,
5
+ min: 60 * 1000,
6
+ hour: 60 * 60 * 1000,
7
+ day: 24 * 60 * 60 * 1000,
8
+ week: 7 * 24 * 60 * 60 * 1000,
9
+ };
10
+ /** Returns a string of format `m:ss` / `mm:ss` / `h:mm:ss` / ... */
11
+ export const msAsTimeString = (ms) => {
12
+ const seconds = Math.floor(ms / 1000);
13
+ const minutes = Math.floor(seconds / 60);
14
+ const hours = Math.floor(minutes / 60);
15
+ const remainingSeconds = (seconds % 60).toString().padStart(2, '0');
16
+ const remainingMinutes = hours > 0 ? (minutes % 60).toString().padStart(2, '0') : minutes % 60;
17
+ const timeString = [hours > 0 ? `${hours}:` : '', `${remainingMinutes}:`, `${remainingSeconds}`]
18
+ .filter((val) => val !== '')
19
+ .join('');
20
+ return timeString;
21
+ };
22
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","sourceRoot":"","sources":["../src/time.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAE,CAAA;AAEnC,MAAM,CAAC,MAAM,IAAI,GAAG;IAClB,EAAE,EAAE,CAAC;IACL,GAAG,EAAE,IAAI;IACT,GAAG,EAAE,EAAE,GAAG,IAAI;IACd,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,IAAI;IACpB,GAAG,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;IACxB,IAAI,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;CAC9B,CAAA;AAED,oEAAoE;AACpE,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,EAAU,EAAE,EAAE;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,IAAI,CAAC,CAAA;IACrC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAA;IACtC,MAAM,gBAAgB,GAAG,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IACnE,MAAM,gBAAgB,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,EAAE,CAAA;IAE9F,MAAM,UAAU,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,gBAAgB,GAAG,EAAE,GAAG,gBAAgB,EAAE,CAAC;SAC7F,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC;SAC3B,IAAI,CAAC,EAAE,CAAC,CAAA;IAEX,OAAO,UAAU,CAAA;AACnB,CAAC,CAAA"}
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@livestore/utils",
3
+ "version": "0.0.0-snapshot-909cdd1ac2fd591945c2be2b0f53e14d87f3c9d4",
4
+ "sideEffects": [
5
+ "./dist/global.js"
6
+ ],
7
+ "type": "module",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "default": "./dist/index.js"
12
+ },
13
+ "./cuid": {
14
+ "types": "./dist/cuid/cuid.node.d.ts",
15
+ "node": "./dist/cuid/cuid.node.js",
16
+ "react-native": "./dist/cuid/cuid.browser.js",
17
+ "browser": "./dist/cuid/cuid.browser.js"
18
+ },
19
+ "./nanoid": {
20
+ "types": "./dist/nanoid/index.d.ts",
21
+ "default": "./dist/nanoid/index.js"
22
+ },
23
+ "./effect": {
24
+ "types": "./dist/effect/index.d.ts",
25
+ "default": "./dist/effect/index.js"
26
+ }
27
+ },
28
+ "react-native": "./dist/index.js",
29
+ "types": "./dist/index.d.ts",
30
+ "typesVersions": {
31
+ "*": {
32
+ "./cuid": [
33
+ "./dist/cuid/cuid.node.d.ts"
34
+ ],
35
+ "./nanoid": [
36
+ "./dist/nanoid/index.d.ts"
37
+ ],
38
+ "effect": [
39
+ "./dist/effect"
40
+ ]
41
+ }
42
+ },
43
+ "dependencies": {
44
+ "msgpackr": "^1.11.2",
45
+ "nanoid": "^5.0.7",
46
+ "pretty-bytes": "^6.1.1",
47
+ "@livestore/db-schema": "0.0.0-snapshot-909cdd1ac2fd591945c2be2b0f53e14d87f3c9d4"
48
+ },
49
+ "peerDependencies": {
50
+ "@effect/experimental": "^0.30.13",
51
+ "@effect/opentelemetry": "^0.39.7",
52
+ "@effect/platform": "^0.69.12",
53
+ "@effect/platform-browser": "^0.48.12",
54
+ "@opentelemetry/api": "^1.9.0",
55
+ "effect": "^3.10.7"
56
+ },
57
+ "devDependencies": {
58
+ "@effect/experimental": "0.30.13",
59
+ "@effect/opentelemetry": "0.39.7",
60
+ "@effect/platform": "0.69.12",
61
+ "@effect/platform-browser": "0.48.12",
62
+ "@opentelemetry/api": "^1.9.0",
63
+ "@types/node": "^22.8.5",
64
+ "@types/web": "^0.0.175",
65
+ "effect": "3.10.7",
66
+ "vitest": "^2.1.4"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public"
70
+ },
71
+ "scripts": {
72
+ "test": "vitest"
73
+ }
74
+ }
@@ -0,0 +1,24 @@
1
+ export class Deferred<T> {
2
+ private readonly _promise: Promise<T>
3
+ private _resolve!: (value: T | PromiseLike<T>) => void
4
+ private _reject!: (reason: any) => void
5
+
6
+ constructor() {
7
+ this._promise = new Promise<T>((resolve, reject) => {
8
+ this._resolve = resolve
9
+ this._reject = reject
10
+ })
11
+ }
12
+
13
+ get promise(): Promise<T> {
14
+ return this._promise
15
+ }
16
+
17
+ resolve = (value: T | PromiseLike<T>): void => {
18
+ this._resolve(value)
19
+ }
20
+
21
+ reject = (reason?: any): void => {
22
+ this._reject(reason)
23
+ }
24
+ }
@@ -0,0 +1,75 @@
1
+ /* eslint-disable prefer-arrow/prefer-arrow-functions */
2
+ import type * as otel from '@opentelemetry/api'
3
+
4
+ export const makeNoopSpan = () => {
5
+ const performanceStartTime: DOMHighResTimeStamp = performance.now()
6
+
7
+ const span = {
8
+ _performanceStartTime: performanceStartTime,
9
+ setAttribute: () => null,
10
+ setAttributes: () => null,
11
+ addEvent: () => null,
12
+ setStatus: () => null,
13
+ updateName: () => null,
14
+ recordException: () => null,
15
+ end: () => {
16
+ const endTime: DOMHighResTimeStamp = performance.now()
17
+ const duration = endTime - performanceStartTime
18
+ const durationSecs = duration / 1000
19
+ const durationRestNs = (duration % 1000) * 1_000_000
20
+ ;(span as any)._duration = [durationSecs, durationRestNs]
21
+ },
22
+ spanContext: () => {
23
+ return { traceId: 'noop-trace-id', spanId: 'noop-span-id' }
24
+ },
25
+ _duration: [0, 0],
26
+ } as unknown as otel.Span
27
+
28
+ return span
29
+ }
30
+
31
+ export const makeNoopTracer = () => {
32
+ return new NoopTracer() as unknown as otel.Tracer
33
+ }
34
+
35
+ export class NoopTracer {
36
+ startSpan = () => makeNoopSpan()
37
+
38
+ startActiveSpan<F extends (span: otel.Span) => ReturnType<F>>(name: string, fn: F): ReturnType<F>
39
+ startActiveSpan<F extends (span: otel.Span) => ReturnType<F>>(
40
+ name: string,
41
+ opts: otel.SpanOptions,
42
+ fn: F,
43
+ ): ReturnType<F>
44
+ startActiveSpan<F extends (span: otel.Span) => ReturnType<F>>(
45
+ name: string,
46
+ opts: otel.SpanOptions,
47
+ ctx: otel.Context,
48
+ fn: F,
49
+ ): ReturnType<F>
50
+ startActiveSpan<F extends (span: otel.Span) => ReturnType<F>>(
51
+ name: string,
52
+ arg2?: F | otel.SpanOptions,
53
+ arg3?: F | otel.Context,
54
+ arg4?: F,
55
+ ): ReturnType<F> | undefined {
56
+ let _opts: otel.SpanOptions | undefined
57
+ let _ctx: otel.Context | undefined
58
+ let fn: F
59
+
60
+ if (arguments.length < 2) {
61
+ return
62
+ } else if (arguments.length === 2) {
63
+ fn = arg2 as F
64
+ } else if (arguments.length === 3) {
65
+ _opts = arg2 as otel.SpanOptions | undefined
66
+ fn = arg3 as F
67
+ } else {
68
+ _opts = arg2 as otel.SpanOptions | undefined
69
+ _ctx = arg3 as otel.Context | undefined
70
+ fn = arg4 as F
71
+ }
72
+
73
+ return fn(makeNoopSpan())
74
+ }
75
+ }
@@ -0,0 +1,3 @@
1
+ interface ImportMeta {
2
+ readonly env: ImportMetaEnv
3
+ }
package/src/base64.ts ADDED
@@ -0,0 +1,123 @@
1
+ // Copyright 2018-2022 the Deno authors. All rights reserved. MIT license.
2
+ // This module is browser compatible.
3
+ // https://deno.land/std/encoding/base64.ts
4
+
5
+ const base64abc = [
6
+ 'A',
7
+ 'B',
8
+ 'C',
9
+ 'D',
10
+ 'E',
11
+ 'F',
12
+ 'G',
13
+ 'H',
14
+ 'I',
15
+ 'J',
16
+ 'K',
17
+ 'L',
18
+ 'M',
19
+ 'N',
20
+ 'O',
21
+ 'P',
22
+ 'Q',
23
+ 'R',
24
+ 'S',
25
+ 'T',
26
+ 'U',
27
+ 'V',
28
+ 'W',
29
+ 'X',
30
+ 'Y',
31
+ 'Z',
32
+ 'a',
33
+ 'b',
34
+ 'c',
35
+ 'd',
36
+ 'e',
37
+ 'f',
38
+ 'g',
39
+ 'h',
40
+ 'i',
41
+ 'j',
42
+ 'k',
43
+ 'l',
44
+ 'm',
45
+ 'n',
46
+ 'o',
47
+ 'p',
48
+ 'q',
49
+ 'r',
50
+ 's',
51
+ 't',
52
+ 'u',
53
+ 'v',
54
+ 'w',
55
+ 'x',
56
+ 'y',
57
+ 'z',
58
+ '0',
59
+ '1',
60
+ '2',
61
+ '3',
62
+ '4',
63
+ '5',
64
+ '6',
65
+ '7',
66
+ '8',
67
+ '9',
68
+ '+',
69
+ '/',
70
+ ]
71
+
72
+ const textEncoder = new TextEncoder()
73
+
74
+ /**
75
+ * CREDIT: https://gist.github.com/enepomnyaschih/72c423f727d395eeaa09697058238727
76
+ * Encodes a given Uint8Array, ArrayBuffer or string into RFC4648 base64 representation
77
+ * @param data
78
+ */
79
+ export const encode = (data: ArrayBuffer | string): string => {
80
+ const uint8 =
81
+ typeof data === 'string' ? textEncoder.encode(data) : data instanceof Uint8Array ? data : new Uint8Array(data)
82
+ let result = '',
83
+ i
84
+ const l = uint8.length
85
+ for (i = 2; i < l; i += 3) {
86
+ result += base64abc[uint8[i - 2]! >> 2]
87
+ result += base64abc[((uint8[i - 2]! & 0x03) << 4) | (uint8[i - 1]! >> 4)]
88
+ result += base64abc[((uint8[i - 1]! & 0x0f) << 2) | (uint8[i]! >> 6)]
89
+ result += base64abc[uint8[i]! & 0x3f]
90
+ }
91
+ if (i === l + 1) {
92
+ // 1 octet yet to write
93
+ result += base64abc[uint8[i - 2]! >> 2]
94
+ result += base64abc[(uint8[i - 2]! & 0x03) << 4]
95
+ result += '=='
96
+ }
97
+ if (i === l) {
98
+ // 2 octets yet to write
99
+ result += base64abc[uint8[i - 2]! >> 2]
100
+ result += base64abc[((uint8[i - 2]! & 0x03) << 4) | (uint8[i - 1]! >> 4)]
101
+ result += base64abc[(uint8[i - 1]! & 0x0f) << 2]
102
+ result += '='
103
+ }
104
+ return result
105
+ }
106
+
107
+ /**
108
+ * Decodes a given RFC4648 base64 encoded string
109
+ * @param b64
110
+ */
111
+ export const decode = (b64: string): Uint8Array => {
112
+ const binString = atob(b64)
113
+ const size = binString.length
114
+ const bytes = new Uint8Array(size)
115
+ for (let i = 0; i < size; i++) {
116
+ // eslint-disable-next-line unicorn/prefer-code-point
117
+ bytes[i] = binString.charCodeAt(i)
118
+ }
119
+ return bytes
120
+ }
121
+
122
+ const textDecoder = new TextDecoder()
123
+ export const decodeToString = (b64: string): string => textDecoder.decode(decode(b64))
package/src/browser.ts ADDED
@@ -0,0 +1,32 @@
1
+ export type DetectedBrowser = 'Something' | 'Opera' | 'Chrome' | 'Safari' | 'Firefox' | 'Edge' | 'Browser'
2
+
3
+ export const detectBrowserName: () => DetectedBrowser = () => {
4
+ if (!navigator.userAgent) {
5
+ return 'Something'
6
+ }
7
+
8
+ const isOpera = navigator.userAgent.includes('OP')
9
+ const isChrome = navigator.userAgent.includes('Chrome') && !isOpera
10
+ const isSafari = navigator.userAgent.includes('Safari') && !isChrome
11
+ const isFirefox = navigator.userAgent.includes('Firefox')
12
+ const isEdge = navigator.userAgent.includes('Edg') || navigator.userAgent.includes('Trident')
13
+
14
+ // TODO: also parse out version
15
+
16
+ if (isOpera) {
17
+ return 'Opera'
18
+ }
19
+ if (isChrome) {
20
+ return 'Chrome'
21
+ }
22
+ if (isSafari) {
23
+ return 'Safari'
24
+ }
25
+ if (isFirefox) {
26
+ return 'Firefox'
27
+ }
28
+ if (isEdge) {
29
+ return 'Edge'
30
+ }
31
+ return 'Browser'
32
+ }