yummies 5.11.0 → 5.11.2

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 (135) hide show
  1. package/async.cjs +1 -1
  2. package/async.cjs.map +1 -1
  3. package/async.js +38 -21
  4. package/async.js.map +1 -1
  5. package/common.cjs +1 -1
  6. package/common.cjs.map +1 -1
  7. package/common.js +9 -3
  8. package/common.js.map +1 -1
  9. package/complex.cjs +1 -1
  10. package/complex.cjs.map +1 -1
  11. package/complex.js +56 -33
  12. package/complex.js.map +1 -1
  13. package/cookie.cjs +1 -1
  14. package/cookie.cjs.map +1 -1
  15. package/cookie.js +7 -2
  16. package/cookie.js.map +1 -1
  17. package/css.cjs +1 -1
  18. package/css.cjs.map +1 -1
  19. package/css.js +41 -20
  20. package/css.js.map +1 -1
  21. package/data.cjs +1 -1
  22. package/data.cjs.map +1 -1
  23. package/data.js +35 -25
  24. package/data.js.map +1 -1
  25. package/date-time.cjs +1 -1
  26. package/date-time.cjs.map +1 -1
  27. package/date-time.d.ts.map +1 -1
  28. package/date-time.js +332 -250
  29. package/date-time.js.map +1 -1
  30. package/device.cjs +1 -1
  31. package/device.cjs.map +1 -1
  32. package/device.js +27 -18
  33. package/device.js.map +1 -1
  34. package/encodings.cjs +1 -1
  35. package/encodings.cjs.map +1 -1
  36. package/encodings.js +10 -10
  37. package/encodings.js.map +1 -1
  38. package/errors.cjs +1 -1
  39. package/errors.cjs.map +1 -1
  40. package/errors.d.ts.map +1 -1
  41. package/errors.js +21 -6
  42. package/errors.js.map +1 -1
  43. package/file.cjs +1 -1
  44. package/file.cjs.map +1 -1
  45. package/file.js +26 -17
  46. package/file.js.map +1 -1
  47. package/format/percent.d.ts +2 -2
  48. package/format/percent.d.ts.map +1 -1
  49. package/format.cjs +1 -1
  50. package/format.cjs.map +1 -1
  51. package/format.js +66 -42
  52. package/format.js.map +1 -1
  53. package/html.cjs +1 -1
  54. package/html.cjs.map +1 -1
  55. package/html.d.ts +1 -1
  56. package/html.d.ts.map +1 -1
  57. package/html.js +111 -68
  58. package/html.js.map +1 -1
  59. package/id.cjs +1 -2
  60. package/id.cjs.map +1 -1
  61. package/id.js +23 -13
  62. package/id.js.map +1 -1
  63. package/imports.cjs +1 -1
  64. package/imports.cjs.map +1 -1
  65. package/imports.js +27 -18
  66. package/imports.js.map +1 -1
  67. package/math.cjs +1 -1
  68. package/math.cjs.map +1 -1
  69. package/math.js +10 -8
  70. package/math.js.map +1 -1
  71. package/media.cjs +1 -1
  72. package/media.cjs.map +1 -1
  73. package/media.js +94 -49
  74. package/media.js.map +1 -1
  75. package/mobx/deep-observable-struct.d.ts.map +1 -1
  76. package/mobx.cjs +1 -1
  77. package/mobx.cjs.map +1 -1
  78. package/mobx.js +123 -68
  79. package/mobx.js.map +1 -1
  80. package/ms.cjs +1 -1
  81. package/ms.cjs.map +1 -1
  82. package/ms.js +9 -8
  83. package/ms.js.map +1 -1
  84. package/number.cjs +1 -1
  85. package/number.cjs.map +1 -1
  86. package/number.js +7 -6
  87. package/number.js.map +1 -1
  88. package/package.json +34 -33
  89. package/parser.cjs +1 -1
  90. package/parser.cjs.map +1 -1
  91. package/parser.js +64 -10
  92. package/parser.js.map +1 -1
  93. package/price.cjs +1 -1
  94. package/price.cjs.map +1 -1
  95. package/price.js +14 -7
  96. package/price.js.map +1 -1
  97. package/random.cjs +1 -1
  98. package/random.cjs.map +1 -1
  99. package/random.js +22 -9
  100. package/random.js.map +1 -1
  101. package/react.cjs +1 -1
  102. package/react.cjs.map +1 -1
  103. package/react.js +195 -130
  104. package/react.js.map +1 -1
  105. package/sound.cjs +1 -1
  106. package/sound.cjs.map +1 -1
  107. package/sound.js +8 -4
  108. package/sound.js.map +1 -1
  109. package/text.cjs +1 -1
  110. package/text.cjs.map +1 -1
  111. package/text.js +30 -14
  112. package/text.js.map +1 -1
  113. package/type-guard.cjs +1 -1
  114. package/type-guard.cjs.map +1 -1
  115. package/type-guard.js +93 -2
  116. package/type-guard.js.map +1 -1
  117. package/utility-types.d.ts +4 -0
  118. package/utils/types.d.ts +4 -0
  119. package/utils/types.d.ts.map +1 -1
  120. package/vibrate.cjs +1 -1
  121. package/vibrate.cjs.map +1 -1
  122. package/vibrate.js +5 -3
  123. package/vibrate.js.map +1 -1
  124. package/~constants-CFexlSUS.js +0 -7
  125. package/~constants-CFexlSUS.js.map +0 -1
  126. package/~constants-HmaulHpr.js +0 -2
  127. package/~constants-HmaulHpr.js.map +0 -1
  128. package/~index-C3wKHvHr.js +0 -80
  129. package/~index-C3wKHvHr.js.map +0 -1
  130. package/~index-PKNbSTT-.js +0 -2
  131. package/~index-PKNbSTT-.js.map +0 -1
  132. package/~number-B1MpW9GU.js +0 -2
  133. package/~number-B1MpW9GU.js.map +0 -1
  134. package/~number-EWff2XI6.js +0 -25
  135. package/~number-EWff2XI6.js.map +0 -1
package/id.js CHANGED
@@ -1,16 +1,26 @@
1
- import { customAlphabet as e } from "nanoid";
2
- const t = "0123456789", c = "abcdefghijklmnopqrstuvwxyz", r = `${c}${t}`, i = e(r, 6), d = e(r, 4), I = e(t, 6), u = e(t, 4), a = (n = 9) => {
3
- let o = 0;
4
- return () => (o++).toString().padStart(n, "0");
5
- }, g = a(), m = () => new Error().stack.split(`
6
- `).slice(1, 4).join("");
1
+ import { customAlphabet } from "nanoid";
2
+ const DIGITS = "0123456789";
3
+ const LATIN_CHARS = "abcdefghijklmnopqrstuvwxyz";
4
+ const ALPHABET = `${LATIN_CHARS}${DIGITS}`;
5
+ const generateId = customAlphabet(ALPHABET, 6);
6
+ const generateShortId = customAlphabet(ALPHABET, 4);
7
+ const generateNumericId = customAlphabet(DIGITS, 6);
8
+ const generateNumericShortId = customAlphabet(DIGITS, 4);
9
+ const createLinearNumericIdGenerator = (size = 9) => {
10
+ let lastCount = 0;
11
+ return () => {
12
+ return (lastCount++).toString().padStart(size, "0");
13
+ };
14
+ };
15
+ const generateLinearNumericId = createLinearNumericIdGenerator();
16
+ const generateStackBasedId = () => new Error().stack.split("\n").slice(1, 4).join("");
7
17
  export {
8
- a as createLinearNumericIdGenerator,
9
- i as generateId,
10
- g as generateLinearNumericId,
11
- I as generateNumericId,
12
- u as generateNumericShortId,
13
- d as generateShortId,
14
- m as generateStackBasedId
18
+ createLinearNumericIdGenerator,
19
+ generateId,
20
+ generateLinearNumericId,
21
+ generateNumericId,
22
+ generateNumericShortId,
23
+ generateShortId,
24
+ generateStackBasedId
15
25
  };
16
26
  //# sourceMappingURL=id.js.map
package/id.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"id.js","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":["DIGITS","LATIN_CHARS","ALPHABET","generateId","customAlphabet","generateShortId","generateNumericId","generateNumericShortId","createLinearNumericIdGenerator","size","lastCount","generateLinearNumericId","generateStackBasedId"],"mappings":";AAEA,MAAMA,IAAS,cACTC,IAAc,8BAEdC,IAAW,GAAGD,CAAW,GAAGD,CAAM,IAM3BG,IAAaC,EAAeF,GAAU,CAAC,GAMvCG,IAAkBD,EAAeF,GAAU,CAAC,GAM5CI,IAAoBF,EAAeJ,GAAQ,CAAC,GAM5CO,IAAyBH,EAAeJ,GAAQ,CAAC,GAqBjDQ,IAAiC,CAACC,IAAe,MAAM;AAClE,MAAIC,IAAY;AAChB,SAAO,OACGA,KAAa,SAAA,EAAW,SAASD,GAAM,GAAG;AAEtD,GAiBaE,IAA0BH,EAAA,GAO1BI,IAAuB,MAClC,IAAI,MAAA,EAAQ,MAAO,MAAM;AAAA,CAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;"}
1
+ {"version":3,"file":"id.js","sources":["../src/id.ts"],"sourcesContent":["import { customAlphabet } from 'nanoid';\n\nconst DIGITS = '0123456789';\nconst LATIN_CHARS = 'abcdefghijklmnopqrstuvwxyz';\n\nconst ALPHABET = `${LATIN_CHARS}${DIGITS}`;\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 6\n */\nexport const generateId = customAlphabet(ALPHABET, 6);\n\n/**\n * Использует алфавит abcdefghijklmnopqrstuvwxyz0123456789\n * Размер 4\n */\nexport const generateShortId = customAlphabet(ALPHABET, 4);\n\n/**\n * Использует алфавит 0123456789\n * Размер 6\n */\nexport const generateNumericId = customAlphabet(DIGITS, 6);\n\n/**\n * Использует алфавит 0123456789\n * Размер 4\n */\nexport const generateNumericShortId = customAlphabet(DIGITS, 4);\n\n/**\n * Создает функцию, которая будет создавать уникальную строку, уникальность которой основана на порядке вызова этой функции\n *\n * @example\n * ```ts\n * generateLinearNumericId = createLinearNumericIdGenerator(6);\n * generateLinearNumericId() // '000000'\n * generateLinearNumericId() // '000001'\n * ...\n * generateLinearNumericId() // '999999'\n * generateLinearNumericId() // '1000000'\n * ...\n * generateLinearNumericId() // '9999999'\n * generateLinearNumericId() // '10000000'\n * ```\n *\n * @param size размер\n * @returns {()=>string}\n */\nexport const createLinearNumericIdGenerator = (size: number = 9) => {\n let lastCount = 0;\n return () => {\n return (lastCount++).toString().padStart(size, '0');\n };\n};\n\n/**\n *\n * @example\n * ```ts\n * generateLinearNumericId() // '000000000'\n * generateLinearNumericId() // '000000001'\n * ...\n * generateLinearNumericId() // '999999999'\n * generateLinearNumericId() // '1000000000'\n * ...\n * generateLinearNumericId() // '9999999999'\n * generateLinearNumericId() // '10000000000'\n * ```\n *\n */\nexport const generateLinearNumericId = createLinearNumericIdGenerator();\n\n/**\n * Is not recommended to use.\n *\n * Generates execution stack based pseudo-id (just sliced string from error stack)\n */\nexport const generateStackBasedId = () =>\n new Error().stack!.split('\\n').slice(1, 4).join('');\n"],"names":[],"mappings":";AAEA,MAAM,SAAS;AACf,MAAM,cAAc;AAEpB,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM;AAMjC,MAAM,aAAa,eAAe,UAAU,CAAC;AAM7C,MAAM,kBAAkB,eAAe,UAAU,CAAC;AAMlD,MAAM,oBAAoB,eAAe,QAAQ,CAAC;AAMlD,MAAM,yBAAyB,eAAe,QAAQ,CAAC;AAqBvD,MAAM,iCAAiC,CAAC,OAAe,MAAM;AAClE,MAAI,YAAY;AAChB,SAAO,MAAM;AACX,YAAQ,aAAa,SAAA,EAAW,SAAS,MAAM,GAAG;AAAA,EACpD;AACF;AAiBO,MAAM,0BAA0B,+BAAA;AAOhC,MAAM,uBAAuB,MAClC,IAAI,MAAA,EAAQ,MAAO,MAAM,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,EAAE;"}
package/imports.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("yummies/async"),l=async(t,e=3,a=1e3)=>{const n=Array.from({length:e}).fill(t);let r=null;for await(const c of n)try{return r!==null&&await s.sleep(a),await c()}catch(o){r=o}throw r},u=async t=>{if(t instanceof Promise){const e=await t;return e.default?e.default:e}return t};exports.fetchLazyModule=l;exports.unpackAsyncModule=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("yummies/async");exports.fetchLazyModule=async(e,r=3,a=1e3)=>{const n=Array.from({length:r}).fill(e);let o=null;for await(const l of n)try{return null!==o&&await t.sleep(a),await l()}catch(s){o=s}throw o},exports.unpackAsyncModule=async t=>{if(t instanceof Promise){const e=await t;return e.default?e.default:e}return t};
2
2
  //# sourceMappingURL=imports.cjs.map
package/imports.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"imports.cjs","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":["fetchLazyModule","fetchModule","attempts","delay","attemptsArray","lastError","attempt","sleep","error","unpackAsyncModule","maybeModule","data"],"mappings":"iHAWaA,EAAkB,MAC7BC,EACAC,EAAW,EACXC,EAAQ,MACO,CACf,MAAMC,EAAgB,MAAM,KAAyB,CACnD,OAAQF,CAAA,CACT,EAAE,KAAKD,CAAW,EAEnB,IAAII,EAA0B,KAE9B,gBAAiBC,KAAWF,EAC1B,GAAI,CACF,OAAIC,IAAc,MAChB,MAAME,EAAAA,MAAMJ,CAAK,EAEZ,MAAMG,EAAA,CACf,OAASE,EAAO,CACdH,EAAYG,CACd,CAEF,MAAMH,CACR,EAIaI,EAAoB,MAC/BC,GACe,CACf,GAAIA,aAAuB,QAAS,CAClC,MAAMC,EAAQ,MAAMD,EAEpB,OAAKC,EAAa,QACRA,EAAa,QAEdA,CAEX,CAEA,OAAOD,CACT"}
1
+ {"version":3,"file":"imports.cjs","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":["async","fetchModule","attempts","delay","attemptsArray","Array","from","length","fill","lastError","attempt","sleep","error","maybeModule","Promise","data","default"],"mappings":"yIAW+BA,MAC7BC,EACAC,EAAW,EACXC,EAAQ,OAER,MAAMC,EAAgBC,MAAMC,KAAyB,CACnDC,OAAQL,IACPM,KAAKP,GAER,IAAIQ,EAA0B,KAE9B,UAAA,MAAiBC,KAAWN,EAC1B,IAIE,OAHkB,OAAdK,SACIE,EAAAA,MAAMR,SAEDO,GACf,OAASE,GACPH,EAAYG,CACd,CAEF,MAAMH,6BAKyBT,MAC/Ba,IAEA,GAAIA,aAAuBC,QAAS,CAClC,MAAMC,QAAcF,EAEpB,OAAKE,EAAaC,QACRD,EAAaC,QAEdD,CAEX,CAEA,OAAOF"}
package/imports.js CHANGED
@@ -1,25 +1,34 @@
1
- import { sleep as c } from "yummies/async";
2
- const f = async (t, r = 3, e = 1e3) => {
3
- const n = Array.from({
4
- length: r
5
- }).fill(t);
6
- let a = null;
7
- for await (const o of n)
1
+ import { sleep } from "yummies/async";
2
+ const fetchLazyModule = async (fetchModule, attempts = 3, delay = 1e3) => {
3
+ const attemptsArray = Array.from({
4
+ length: attempts
5
+ }).fill(fetchModule);
6
+ let lastError = null;
7
+ for await (const attempt of attemptsArray) {
8
8
  try {
9
- return a !== null && await c(e), await o();
10
- } catch (s) {
11
- a = s;
9
+ if (lastError !== null) {
10
+ await sleep(delay);
11
+ }
12
+ return await attempt();
13
+ } catch (error) {
14
+ lastError = error;
12
15
  }
13
- throw a;
14
- }, i = async (t) => {
15
- if (t instanceof Promise) {
16
- const r = await t;
17
- return r.default ? r.default : r;
18
16
  }
19
- return t;
17
+ throw lastError;
18
+ };
19
+ const unpackAsyncModule = async (maybeModule) => {
20
+ if (maybeModule instanceof Promise) {
21
+ const data = await maybeModule;
22
+ if (data.default) {
23
+ return data.default;
24
+ } else {
25
+ return data;
26
+ }
27
+ }
28
+ return maybeModule;
20
29
  };
21
30
  export {
22
- f as fetchLazyModule,
23
- i as unpackAsyncModule
31
+ fetchLazyModule,
32
+ unpackAsyncModule
24
33
  };
25
34
  //# sourceMappingURL=imports.js.map
package/imports.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"imports.js","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":["fetchLazyModule","fetchModule","attempts","delay","attemptsArray","lastError","attempt","sleep","error","unpackAsyncModule","maybeModule","data"],"mappings":";AAWO,MAAMA,IAAkB,OAC7BC,GACAC,IAAW,GACXC,IAAQ,QACO;AACf,QAAMC,IAAgB,MAAM,KAAyB;AAAA,IACnD,QAAQF;AAAA,EAAA,CACT,EAAE,KAAKD,CAAW;AAEnB,MAAII,IAA0B;AAE9B,mBAAiBC,KAAWF;AAC1B,QAAI;AACF,aAAIC,MAAc,QAChB,MAAME,EAAMJ,CAAK,GAEZ,MAAMG,EAAA;AAAA,IACf,SAASE,GAAO;AACd,MAAAH,IAAYG;AAAA,IACd;AAEF,QAAMH;AACR,GAIaI,IAAoB,OAC/BC,MACe;AACf,MAAIA,aAAuB,SAAS;AAClC,UAAMC,IAAQ,MAAMD;AAEpB,WAAKC,EAAa,UACRA,EAAa,UAEdA;AAAA,EAEX;AAEA,SAAOD;AACT;"}
1
+ {"version":3,"file":"imports.js","sources":["../src/imports.ts"],"sourcesContent":["import { sleep } from 'yummies/async';\n\n/**\n * Функция ленивой загрузки модуля, с возможностью вызова доп. попыток\n * @example\n * ```ts\n * fetchLazyModule(() => import(\"./test.ts\"), 3) // начнет загрузку test.ts\n * // Произошла ошибка загрузки test.ts, тогда fetchLazyModule повторно вызовет fn()\n * // Вызывать будет столько раз сколько указано attempts (по умолчанию 3)\n * ```\n */\nexport const fetchLazyModule = async <T>(\n fetchModule: () => Promise<T>,\n attempts = 3,\n delay = 1000,\n): Promise<T> => {\n const attemptsArray = Array.from<typeof fetchModule>({\n length: attempts,\n }).fill(fetchModule);\n\n let lastError: null | Error = null;\n\n for await (const attempt of attemptsArray) {\n try {\n if (lastError !== null) {\n await sleep(delay);\n }\n return await attempt();\n } catch (error) {\n lastError = error as Error;\n }\n }\n throw lastError;\n};\n\nexport type PackedAsyncModule<T> = Promise<T | { default: T }>;\n\nexport const unpackAsyncModule = async <T>(\n maybeModule: T | PackedAsyncModule<T>,\n): Promise<T> => {\n if (maybeModule instanceof Promise) {\n const data = (await maybeModule) as any;\n\n if ((data as any).default) {\n return (data as any).default;\n } else {\n return data;\n }\n }\n\n return maybeModule;\n};\n"],"names":[],"mappings":";AAWO,MAAM,kBAAkB,OAC7B,aACA,WAAW,GACX,QAAQ,QACO;AACf,QAAM,gBAAgB,MAAM,KAAyB;AAAA,IACnD,QAAQ;AAAA,EAAA,CACT,EAAE,KAAK,WAAW;AAEnB,MAAI,YAA0B;AAE9B,mBAAiB,WAAW,eAAe;AACzC,QAAI;AACF,UAAI,cAAc,MAAM;AACtB,cAAM,MAAM,KAAK;AAAA,MACnB;AACA,aAAO,MAAM,QAAA;AAAA,IACf,SAAS,OAAO;AACd,kBAAY;AAAA,IACd;AAAA,EACF;AACA,QAAM;AACR;AAIO,MAAM,oBAAoB,OAC/B,gBACe;AACf,MAAI,uBAAuB,SAAS;AAClC,UAAM,OAAQ,MAAM;AAEpB,QAAK,KAAa,SAAS;AACzB,aAAQ,KAAa;AAAA,IACvB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;"}
package/math.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});function t(e){return e*(Math.PI/180)}function o(e){return e*(180/Math.PI)}const n=(e,r)=>(e??0)/(r??0)*100||0;exports.degToRad=t;exports.percentFrom=n;exports.radToDeg=o;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});exports.degToRad=function(e){return e*(Math.PI/180)},exports.percentFrom=(e,t)=>(e??0)/(t??0)*100||0,exports.radToDeg=function(e){return e*(180/Math.PI)};
2
2
  //# sourceMappingURL=math.cjs.map
package/math.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"math.cjs","sources":["../src/math.ts"],"sourcesContent":["import type { Maybe } from 'yummies/utils/types';\n\nexport function degToRad(deg: number) {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number) {\n return rad * (180 / Math.PI);\n}\n\n/**\n * Получить процент от числа\n * @example\n * ```ts\n * percentFrom(500, 2000) // 25\n * percentFrom(1000, 2000) // 50\n * ```\n */\nexport const percentFrom = (value: Maybe<number>, from: Maybe<number>) => {\n return ((value ?? 0) / (from ?? 0)) * 100 || 0;\n};\n"],"names":["degToRad","deg","radToDeg","rad","percentFrom","value","from"],"mappings":"gFAEO,SAASA,EAASC,EAAa,CACpC,OAAOA,GAAO,KAAK,GAAK,IAC1B,CACO,SAASC,EAASC,EAAa,CACpC,OAAOA,GAAO,IAAM,KAAK,GAC3B,CAUO,MAAMC,EAAc,CAACC,EAAsBC,KACvCD,GAAS,IAAMC,GAAQ,GAAM,KAAO"}
1
+ {"version":3,"file":"math.cjs","sources":["../src/math.ts"],"sourcesContent":["import type { Maybe } from 'yummies/utils/types';\n\nexport function degToRad(deg: number) {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number) {\n return rad * (180 / Math.PI);\n}\n\n/**\n * Получить процент от числа\n * @example\n * ```ts\n * percentFrom(500, 2000) // 25\n * percentFrom(1000, 2000) // 50\n * ```\n */\nexport const percentFrom = (value: Maybe<number>, from: Maybe<number>) => {\n return ((value ?? 0) / (from ?? 0)) * 100 || 0;\n};\n"],"names":["deg","Math","PI","value","from","rad"],"mappings":"iGAEO,SAAkBA,GACvB,OAAOA,GAAOC,KAAKC,GAAK,IAC1B,sBAa2B,CAACC,EAAsBC,KACvCD,GAAS,IAAMC,GAAQ,GAAM,KAAO,mBAbxC,SAAkBC,GACvB,OAAOA,GAAO,IAAMJ,KAAKC,GAC3B"}
package/math.js CHANGED
@@ -1,13 +1,15 @@
1
- function n(r) {
2
- return r * (Math.PI / 180);
1
+ function degToRad(deg) {
2
+ return deg * (Math.PI / 180);
3
3
  }
4
- function e(r) {
5
- return r * (180 / Math.PI);
4
+ function radToDeg(rad) {
5
+ return rad * (180 / Math.PI);
6
6
  }
7
- const o = (r, t) => (r ?? 0) / (t ?? 0) * 100 || 0;
7
+ const percentFrom = (value, from) => {
8
+ return (value ?? 0) / (from ?? 0) * 100 || 0;
9
+ };
8
10
  export {
9
- n as degToRad,
10
- o as percentFrom,
11
- e as radToDeg
11
+ degToRad,
12
+ percentFrom,
13
+ radToDeg
12
14
  };
13
15
  //# sourceMappingURL=math.js.map
package/math.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"math.js","sources":["../src/math.ts"],"sourcesContent":["import type { Maybe } from 'yummies/utils/types';\n\nexport function degToRad(deg: number) {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number) {\n return rad * (180 / Math.PI);\n}\n\n/**\n * Получить процент от числа\n * @example\n * ```ts\n * percentFrom(500, 2000) // 25\n * percentFrom(1000, 2000) // 50\n * ```\n */\nexport const percentFrom = (value: Maybe<number>, from: Maybe<number>) => {\n return ((value ?? 0) / (from ?? 0)) * 100 || 0;\n};\n"],"names":["degToRad","deg","radToDeg","rad","percentFrom","value","from"],"mappings":"AAEO,SAASA,EAASC,GAAa;AACpC,SAAOA,KAAO,KAAK,KAAK;AAC1B;AACO,SAASC,EAASC,GAAa;AACpC,SAAOA,KAAO,MAAM,KAAK;AAC3B;AAUO,MAAMC,IAAc,CAACC,GAAsBC,OACvCD,KAAS,MAAMC,KAAQ,KAAM,OAAO;"}
1
+ {"version":3,"file":"math.js","sources":["../src/math.ts"],"sourcesContent":["import type { Maybe } from 'yummies/utils/types';\n\nexport function degToRad(deg: number) {\n return deg * (Math.PI / 180);\n}\nexport function radToDeg(rad: number) {\n return rad * (180 / Math.PI);\n}\n\n/**\n * Получить процент от числа\n * @example\n * ```ts\n * percentFrom(500, 2000) // 25\n * percentFrom(1000, 2000) // 50\n * ```\n */\nexport const percentFrom = (value: Maybe<number>, from: Maybe<number>) => {\n return ((value ?? 0) / (from ?? 0)) * 100 || 0;\n};\n"],"names":[],"mappings":"AAEO,SAAS,SAAS,KAAa;AACpC,SAAO,OAAO,KAAK,KAAK;AAC1B;AACO,SAAS,SAAS,KAAa;AACpC,SAAO,OAAO,MAAM,KAAK;AAC3B;AAUO,MAAM,cAAc,CAAC,OAAsB,SAAwB;AACxE,UAAS,SAAS,MAAM,QAAQ,KAAM,OAAO;AAC/C;"}
package/media.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const p=require("yummies/math");function w(t){return new Promise((n,a)=>{const e=new FileReader;e.onloadend=()=>n(e.result),e.onerror=a,e.readAsDataURL(t)})}const m=t=>t instanceof Blob?URL.createObjectURL(t):t,y=t=>new Blob([t],{type:t.type}),x=(t,n="image/png")=>{const a=document.createElement("canvas");a.width=t.naturalWidth||300,a.height=t.naturalHeight||300,a.getContext("2d").drawImage(t,0,0);const e=a.toDataURL(n,1),o=e.split(",")[1],h=e.split(";")[0].slice(5),s=globalThis.atob(o),r=new ArrayBuffer(s.length),i=new Uint8Array(r);for(let c=0;c<s.length;c++)i[c]=s.charCodeAt(c);return new Blob([i],{type:h})},b=t=>new Promise((n,a)=>{const e=new Image;e.src=m(t),e.onload=()=>n(e),e.onerror=()=>a()});function T(t){const n=t.canvas;let a=n.width,e=n.height;const o={x:[],y:[]},h=t.getImageData(0,0,n.width,n.height);let s,r,i;for(r=0;r<e;r++)for(s=0;s<a;s++)i=(r*a+s)*4,h.data[i+3]>0&&(o.x.push(s),o.y.push(r));o.x.sort((l,g)=>l-g),o.y.sort((l,g)=>l-g);const d=o.x.length-1;a=1+o.x[d]-o.x[0],e=1+o.y[d]-o.y[0];const c=t.getImageData(o.x[0],o.y[0],a,e);return n.width=a,n.height=e,t.putImageData(c,0,0),n}const f=(t,n)=>{const a=Math.max(t.width,t.height),e=document.createElement("canvas");e.width=a,e.height=a;const o=e.getContext("2d");return o.save(),o.translate(e.width/2,e.height/2),o.rotate(p.degToRad(n)),o.drawImage(t,-t.width/2,-t.height/2),o.restore(),T(o),b(e.toDataURL("image/png"))};function u(t){const n=/^data:(.*);base64,\s?(.*)$/,a=new RegExp(n).exec(t);return{mimeType:a?.[1],data:a?.[2]}}const I=t=>t.startsWith("https://")||t.startsWith("http://"),U=t=>{const{mimeType:n,data:a}=u(t);return!!(a&&n?.startsWith("image/"))};exports.blobToBase64=w;exports.blobToUrl=m;exports.decodeDataUrl=u;exports.fileToBlob=y;exports.imageToBlob=x;exports.isBase64Image=U;exports.isHttpUrl=I;exports.renderImage=b;exports.rotateImage=f;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("yummies/math");const e=t=>t instanceof Blob?URL.createObjectURL(t):t,a=t=>new Promise((a,o)=>{const r=new Image;r.src=e(t),r.onload=()=>a(r),r.onerror=()=>o()});function o(t){const e=new RegExp(/^data:(.*);base64,\s?(.*)$/).exec(t);return{mimeType:e?.[1],data:e?.[2]}}exports.blobToBase64=function(t){return new Promise((e,a)=>{const o=new FileReader;o.onloadend=()=>e(o.result),o.onerror=a,o.readAsDataURL(t)})},exports.blobToUrl=e,exports.decodeDataUrl=o,exports.fileToBlob=t=>new Blob([t],{type:t.type}),exports.imageToBlob=(t,e="image/png")=>{const a=document.createElement("canvas");a.width=t.naturalWidth||300,a.height=t.naturalHeight||300,a.getContext("2d").drawImage(t,0,0);const o=a.toDataURL(e,1),r=o.split(",")[1],n=o.split(";")[0].slice(5),s=globalThis.atob(r),i=new ArrayBuffer(s.length),h=new Uint8Array(i);for(let g=0;g<s.length;g++)h[g]=s.charCodeAt(g);return new Blob([h],{type:n})},exports.isBase64Image=t=>{const{mimeType:e,data:a}=o(t);return!(!a||!e?.startsWith("image/"))},exports.isHttpUrl=t=>t.startsWith("https://")||t.startsWith("http://"),exports.renderImage=a,exports.rotateImage=(e,o)=>{const r=Math.max(e.width,e.height),n=document.createElement("canvas");n.width=r,n.height=r;const s=n.getContext("2d");return s.save(),s.translate(n.width/2,n.height/2),s.rotate(t.degToRad(o)),s.drawImage(e,-e.width/2,-e.height/2),s.restore(),function(t){const e=t.canvas;let a=e.width,o=e.height;const r={x:[],y:[]},n=t.getImageData(0,0,e.width,e.height);let s,i,h;for(i=0;i<o;i++)for(s=0;s<a;s++)h=4*(i*a+s),n.data[h+3]>0&&(r.x.push(s),r.y.push(i));r.x.sort((t,e)=>t-e),r.y.sort((t,e)=>t-e);const g=r.x.length-1;a=1+r.x[g]-r.x[0],o=1+r.y[g]-r.y[0];const c=t.getImageData(r.x[0],r.y[0],a,o);e.width=a,e.height=o,t.putImageData(c,0,0)}(s),a(n.toDataURL("image/png"))};
2
2
  //# sourceMappingURL=media.cjs.map
package/media.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"media.cjs","sources":["../src/media.ts"],"sourcesContent":["import { degToRad } from 'yummies/math';\n\nexport function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport const blobToUrl = (urlOrBlob: string | Blob) =>\n urlOrBlob instanceof Blob ? URL.createObjectURL(urlOrBlob) : urlOrBlob;\n\nexport const fileToBlob = (file: File) => {\n return new Blob([file], { type: file.type });\n};\n\nexport const imageToBlob = (\n imageElement: HTMLImageElement,\n mimeType: string = 'image/png',\n) => {\n const canvas = document.createElement('canvas');\n\n canvas.width = imageElement.naturalWidth || 300;\n canvas.height = imageElement.naturalHeight || 300;\n\n canvas.getContext('2d')!.drawImage(imageElement, 0, 0);\n\n const dataUri = canvas.toDataURL(mimeType, 1);\n const base64data = dataUri.split(',')[1];\n const base64MimeType = dataUri.split(';')[0].slice(5);\n\n const bytes = globalThis.atob(base64data);\n const buf = new ArrayBuffer(bytes.length);\n const array = new Uint8Array(buf);\n\n for (let index = 0; index < bytes.length; index++) {\n array[index] = bytes.charCodeAt(index);\n }\n\n const blob = new Blob([array], { type: base64MimeType });\n\n return blob;\n};\n\n/**\n * Загружает и отрисовывает изображение с использованием Image\n *\n * @returns {Promise<HTMLImageElement>}\n */\nexport const renderImage = (urlOrBlob: Blob | string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = blobToUrl(urlOrBlob);\n image.onload = () => resolve(image);\n image.onerror = () => reject();\n });\n\nfunction cropImageFromCanvas(context: CanvasRenderingContext2D) {\n const canvas = context.canvas;\n let w = canvas.width;\n let h = canvas.height;\n const pix: { x: number[]; y: number[] } = { x: [], y: [] };\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let x: number;\n let y: number;\n let index: number;\n\n for (y = 0; y < h; y++) {\n for (x = 0; x < w; x++) {\n index = (y * w + x) * 4;\n if (imageData.data[index + 3] > 0) {\n pix.x.push(x);\n pix.y.push(y);\n }\n }\n }\n pix.x.sort((a, b) => a - b);\n pix.y.sort((a, b) => a - b);\n const n = pix.x.length - 1;\n\n w = 1 + pix.x[n] - pix.x[0];\n h = 1 + pix.y[n] - pix.y[0];\n const cut = context.getImageData(pix.x[0], pix.y[0], w, h);\n\n canvas.width = w;\n canvas.height = h;\n context.putImageData(cut, 0, 0);\n return canvas;\n}\n\n// TODO: ломает iphone с огромными изображениями\nexport const rotateImage = (image: HTMLImageElement, angle: number) => {\n const maxSize = Math.max(image.width, image.height);\n const canvas = document.createElement('canvas');\n canvas.width = maxSize;\n canvas.height = maxSize;\n const context = canvas.getContext('2d')!;\n context.save();\n context.translate(canvas.width / 2, canvas.height / 2);\n context.rotate(degToRad(angle));\n context.drawImage(image, -image.width / 2, -image.height / 2);\n context.restore();\n cropImageFromCanvas(context);\n return renderImage(canvas.toDataURL('image/png'));\n};\n\ninterface DecodedDataUrl {\n mimeType?: string;\n data?: string;\n}\n\n/*\n * Returning object which contains base64 data and mime type of passed data url string.\n * */\nexport function decodeDataUrl(url: string): DecodedDataUrl {\n const regex = /^data:(.*);base64,\\s?(.*)$/;\n const matches = new RegExp(regex).exec(url);\n\n return {\n mimeType: matches?.[1],\n data: matches?.[2],\n };\n}\n\nexport const isHttpUrl = (url: string): boolean => {\n return url.startsWith('https://') || url.startsWith('http://');\n};\n\nexport const isBase64Image = (str: string): boolean => {\n const { mimeType, data } = decodeDataUrl(str);\n return !!(data && mimeType?.startsWith('image/'));\n};\n"],"names":["blobToBase64","blob","resolve","reject","reader","blobToUrl","urlOrBlob","fileToBlob","file","imageToBlob","imageElement","mimeType","canvas","dataUri","base64data","base64MimeType","bytes","buf","array","index","renderImage","image","cropImageFromCanvas","context","w","h","pix","imageData","x","y","a","b","n","cut","rotateImage","angle","maxSize","degToRad","decodeDataUrl","url","regex","matches","isHttpUrl","isBase64Image","str","data"],"mappings":"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"}
1
+ {"version":3,"file":"media.cjs","sources":["../src/media.ts"],"sourcesContent":["import { degToRad } from 'yummies/math';\n\nexport function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport const blobToUrl = (urlOrBlob: string | Blob) =>\n urlOrBlob instanceof Blob ? URL.createObjectURL(urlOrBlob) : urlOrBlob;\n\nexport const fileToBlob = (file: File) => {\n return new Blob([file], { type: file.type });\n};\n\nexport const imageToBlob = (\n imageElement: HTMLImageElement,\n mimeType: string = 'image/png',\n) => {\n const canvas = document.createElement('canvas');\n\n canvas.width = imageElement.naturalWidth || 300;\n canvas.height = imageElement.naturalHeight || 300;\n\n canvas.getContext('2d')!.drawImage(imageElement, 0, 0);\n\n const dataUri = canvas.toDataURL(mimeType, 1);\n const base64data = dataUri.split(',')[1];\n const base64MimeType = dataUri.split(';')[0].slice(5);\n\n const bytes = globalThis.atob(base64data);\n const buf = new ArrayBuffer(bytes.length);\n const array = new Uint8Array(buf);\n\n for (let index = 0; index < bytes.length; index++) {\n array[index] = bytes.charCodeAt(index);\n }\n\n const blob = new Blob([array], { type: base64MimeType });\n\n return blob;\n};\n\n/**\n * Загружает и отрисовывает изображение с использованием Image\n *\n * @returns {Promise<HTMLImageElement>}\n */\nexport const renderImage = (urlOrBlob: Blob | string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = blobToUrl(urlOrBlob);\n image.onload = () => resolve(image);\n image.onerror = () => reject();\n });\n\nfunction cropImageFromCanvas(context: CanvasRenderingContext2D) {\n const canvas = context.canvas;\n let w = canvas.width;\n let h = canvas.height;\n const pix: { x: number[]; y: number[] } = { x: [], y: [] };\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let x: number;\n let y: number;\n let index: number;\n\n for (y = 0; y < h; y++) {\n for (x = 0; x < w; x++) {\n index = (y * w + x) * 4;\n if (imageData.data[index + 3] > 0) {\n pix.x.push(x);\n pix.y.push(y);\n }\n }\n }\n pix.x.sort((a, b) => a - b);\n pix.y.sort((a, b) => a - b);\n const n = pix.x.length - 1;\n\n w = 1 + pix.x[n] - pix.x[0];\n h = 1 + pix.y[n] - pix.y[0];\n const cut = context.getImageData(pix.x[0], pix.y[0], w, h);\n\n canvas.width = w;\n canvas.height = h;\n context.putImageData(cut, 0, 0);\n return canvas;\n}\n\n// TODO: ломает iphone с огромными изображениями\nexport const rotateImage = (image: HTMLImageElement, angle: number) => {\n const maxSize = Math.max(image.width, image.height);\n const canvas = document.createElement('canvas');\n canvas.width = maxSize;\n canvas.height = maxSize;\n const context = canvas.getContext('2d')!;\n context.save();\n context.translate(canvas.width / 2, canvas.height / 2);\n context.rotate(degToRad(angle));\n context.drawImage(image, -image.width / 2, -image.height / 2);\n context.restore();\n cropImageFromCanvas(context);\n return renderImage(canvas.toDataURL('image/png'));\n};\n\ninterface DecodedDataUrl {\n mimeType?: string;\n data?: string;\n}\n\n/*\n * Returning object which contains base64 data and mime type of passed data url string.\n * */\nexport function decodeDataUrl(url: string): DecodedDataUrl {\n const regex = /^data:(.*);base64,\\s?(.*)$/;\n const matches = new RegExp(regex).exec(url);\n\n return {\n mimeType: matches?.[1],\n data: matches?.[2],\n };\n}\n\nexport const isHttpUrl = (url: string): boolean => {\n return url.startsWith('https://') || url.startsWith('http://');\n};\n\nexport const isBase64Image = (str: string): boolean => {\n const { mimeType, data } = decodeDataUrl(str);\n return !!(data && mimeType?.startsWith('image/'));\n};\n"],"names":["blobToUrl","urlOrBlob","Blob","URL","createObjectURL","renderImage","Promise","resolve","reject","image","Image","src","onload","onerror","decodeDataUrl","url","matches","RegExp","exec","mimeType","data","blob","reader","FileReader","onloadend","result","readAsDataURL","file","type","imageElement","canvas","document","createElement","width","naturalWidth","height","naturalHeight","getContext","drawImage","dataUri","toDataURL","base64data","split","base64MimeType","slice","bytes","globalThis","atob","buf","ArrayBuffer","length","array","Uint8Array","index","charCodeAt","str","startsWith","angle","maxSize","Math","max","context","save","translate","rotate","degToRad","restore","w","h","pix","x","y","imageData","getImageData","push","sort","a","b","n","cut","putImageData","cropImageFromCanvas"],"mappings":"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"}
package/media.js CHANGED
@@ -1,61 +1,106 @@
1
- import { degToRad as m } from "yummies/math";
2
- function y(t) {
3
- return new Promise((o, a) => {
4
- const e = new FileReader();
5
- e.onloadend = () => o(e.result), e.onerror = a, e.readAsDataURL(t);
1
+ import { degToRad } from "yummies/math";
2
+ function blobToBase64(blob) {
3
+ return new Promise((resolve, reject) => {
4
+ const reader = new FileReader();
5
+ reader.onloadend = () => resolve(reader.result);
6
+ reader.onerror = reject;
7
+ reader.readAsDataURL(blob);
6
8
  });
7
9
  }
8
- const p = (t) => t instanceof Blob ? URL.createObjectURL(t) : t, f = (t) => new Blob([t], { type: t.type }), I = (t, o = "image/png") => {
9
- const a = document.createElement("canvas");
10
- a.width = t.naturalWidth || 300, a.height = t.naturalHeight || 300, a.getContext("2d").drawImage(t, 0, 0);
11
- const e = a.toDataURL(o, 1), n = e.split(",")[1], h = e.split(";")[0].slice(5), s = globalThis.atob(n), r = new ArrayBuffer(s.length), i = new Uint8Array(r);
12
- for (let c = 0; c < s.length; c++)
13
- i[c] = s.charCodeAt(c);
14
- return new Blob([i], { type: h });
15
- }, w = (t) => new Promise((o, a) => {
16
- const e = new Image();
17
- e.src = p(t), e.onload = () => o(e), e.onerror = () => a();
10
+ const blobToUrl = (urlOrBlob) => urlOrBlob instanceof Blob ? URL.createObjectURL(urlOrBlob) : urlOrBlob;
11
+ const fileToBlob = (file) => {
12
+ return new Blob([file], { type: file.type });
13
+ };
14
+ const imageToBlob = (imageElement, mimeType = "image/png") => {
15
+ const canvas = document.createElement("canvas");
16
+ canvas.width = imageElement.naturalWidth || 300;
17
+ canvas.height = imageElement.naturalHeight || 300;
18
+ canvas.getContext("2d").drawImage(imageElement, 0, 0);
19
+ const dataUri = canvas.toDataURL(mimeType, 1);
20
+ const base64data = dataUri.split(",")[1];
21
+ const base64MimeType = dataUri.split(";")[0].slice(5);
22
+ const bytes = globalThis.atob(base64data);
23
+ const buf = new ArrayBuffer(bytes.length);
24
+ const array = new Uint8Array(buf);
25
+ for (let index = 0; index < bytes.length; index++) {
26
+ array[index] = bytes.charCodeAt(index);
27
+ }
28
+ const blob = new Blob([array], { type: base64MimeType });
29
+ return blob;
30
+ };
31
+ const renderImage = (urlOrBlob) => new Promise((resolve, reject) => {
32
+ const image = new Image();
33
+ image.src = blobToUrl(urlOrBlob);
34
+ image.onload = () => resolve(image);
35
+ image.onerror = () => reject();
18
36
  });
19
- function b(t) {
20
- const o = t.canvas;
21
- let a = o.width, e = o.height;
22
- const n = { x: [], y: [] }, h = t.getImageData(0, 0, o.width, o.height);
23
- let s, r, i;
24
- for (r = 0; r < e; r++)
25
- for (s = 0; s < a; s++)
26
- i = (r * a + s) * 4, h.data[i + 3] > 0 && (n.x.push(s), n.y.push(r));
27
- n.x.sort((g, l) => g - l), n.y.sort((g, l) => g - l);
28
- const d = n.x.length - 1;
29
- a = 1 + n.x[d] - n.x[0], e = 1 + n.y[d] - n.y[0];
30
- const c = t.getImageData(n.x[0], n.y[0], a, e);
31
- return o.width = a, o.height = e, t.putImageData(c, 0, 0), o;
37
+ function cropImageFromCanvas(context) {
38
+ const canvas = context.canvas;
39
+ let w = canvas.width;
40
+ let h = canvas.height;
41
+ const pix = { x: [], y: [] };
42
+ const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
43
+ let x;
44
+ let y;
45
+ let index;
46
+ for (y = 0; y < h; y++) {
47
+ for (x = 0; x < w; x++) {
48
+ index = (y * w + x) * 4;
49
+ if (imageData.data[index + 3] > 0) {
50
+ pix.x.push(x);
51
+ pix.y.push(y);
52
+ }
53
+ }
54
+ }
55
+ pix.x.sort((a, b) => a - b);
56
+ pix.y.sort((a, b) => a - b);
57
+ const n = pix.x.length - 1;
58
+ w = 1 + pix.x[n] - pix.x[0];
59
+ h = 1 + pix.y[n] - pix.y[0];
60
+ const cut = context.getImageData(pix.x[0], pix.y[0], w, h);
61
+ canvas.width = w;
62
+ canvas.height = h;
63
+ context.putImageData(cut, 0, 0);
64
+ return canvas;
32
65
  }
33
- const U = (t, o) => {
34
- const a = Math.max(t.width, t.height), e = document.createElement("canvas");
35
- e.width = a, e.height = a;
36
- const n = e.getContext("2d");
37
- return n.save(), n.translate(e.width / 2, e.height / 2), n.rotate(m(o)), n.drawImage(t, -t.width / 2, -t.height / 2), n.restore(), b(n), w(e.toDataURL("image/png"));
66
+ const rotateImage = (image, angle) => {
67
+ const maxSize = Math.max(image.width, image.height);
68
+ const canvas = document.createElement("canvas");
69
+ canvas.width = maxSize;
70
+ canvas.height = maxSize;
71
+ const context = canvas.getContext("2d");
72
+ context.save();
73
+ context.translate(canvas.width / 2, canvas.height / 2);
74
+ context.rotate(degToRad(angle));
75
+ context.drawImage(image, -image.width / 2, -image.height / 2);
76
+ context.restore();
77
+ cropImageFromCanvas(context);
78
+ return renderImage(canvas.toDataURL("image/png"));
38
79
  };
39
- function u(t) {
40
- const o = /^data:(.*);base64,\s?(.*)$/, a = new RegExp(o).exec(t);
80
+ function decodeDataUrl(url) {
81
+ const regex = /^data:(.*);base64,\s?(.*)$/;
82
+ const matches = new RegExp(regex).exec(url);
41
83
  return {
42
- mimeType: a?.[1],
43
- data: a?.[2]
84
+ mimeType: matches?.[1],
85
+ data: matches?.[2]
44
86
  };
45
87
  }
46
- const T = (t) => t.startsWith("https://") || t.startsWith("http://"), v = (t) => {
47
- const { mimeType: o, data: a } = u(t);
48
- return !!(a && o?.startsWith("image/"));
88
+ const isHttpUrl = (url) => {
89
+ return url.startsWith("https://") || url.startsWith("http://");
90
+ };
91
+ const isBase64Image = (str) => {
92
+ const { mimeType, data } = decodeDataUrl(str);
93
+ return !!(data && mimeType?.startsWith("image/"));
49
94
  };
50
95
  export {
51
- y as blobToBase64,
52
- p as blobToUrl,
53
- u as decodeDataUrl,
54
- f as fileToBlob,
55
- I as imageToBlob,
56
- v as isBase64Image,
57
- T as isHttpUrl,
58
- w as renderImage,
59
- U as rotateImage
96
+ blobToBase64,
97
+ blobToUrl,
98
+ decodeDataUrl,
99
+ fileToBlob,
100
+ imageToBlob,
101
+ isBase64Image,
102
+ isHttpUrl,
103
+ renderImage,
104
+ rotateImage
60
105
  };
61
106
  //# sourceMappingURL=media.js.map
package/media.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"media.js","sources":["../src/media.ts"],"sourcesContent":["import { degToRad } from 'yummies/math';\n\nexport function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport const blobToUrl = (urlOrBlob: string | Blob) =>\n urlOrBlob instanceof Blob ? URL.createObjectURL(urlOrBlob) : urlOrBlob;\n\nexport const fileToBlob = (file: File) => {\n return new Blob([file], { type: file.type });\n};\n\nexport const imageToBlob = (\n imageElement: HTMLImageElement,\n mimeType: string = 'image/png',\n) => {\n const canvas = document.createElement('canvas');\n\n canvas.width = imageElement.naturalWidth || 300;\n canvas.height = imageElement.naturalHeight || 300;\n\n canvas.getContext('2d')!.drawImage(imageElement, 0, 0);\n\n const dataUri = canvas.toDataURL(mimeType, 1);\n const base64data = dataUri.split(',')[1];\n const base64MimeType = dataUri.split(';')[0].slice(5);\n\n const bytes = globalThis.atob(base64data);\n const buf = new ArrayBuffer(bytes.length);\n const array = new Uint8Array(buf);\n\n for (let index = 0; index < bytes.length; index++) {\n array[index] = bytes.charCodeAt(index);\n }\n\n const blob = new Blob([array], { type: base64MimeType });\n\n return blob;\n};\n\n/**\n * Загружает и отрисовывает изображение с использованием Image\n *\n * @returns {Promise<HTMLImageElement>}\n */\nexport const renderImage = (urlOrBlob: Blob | string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = blobToUrl(urlOrBlob);\n image.onload = () => resolve(image);\n image.onerror = () => reject();\n });\n\nfunction cropImageFromCanvas(context: CanvasRenderingContext2D) {\n const canvas = context.canvas;\n let w = canvas.width;\n let h = canvas.height;\n const pix: { x: number[]; y: number[] } = { x: [], y: [] };\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let x: number;\n let y: number;\n let index: number;\n\n for (y = 0; y < h; y++) {\n for (x = 0; x < w; x++) {\n index = (y * w + x) * 4;\n if (imageData.data[index + 3] > 0) {\n pix.x.push(x);\n pix.y.push(y);\n }\n }\n }\n pix.x.sort((a, b) => a - b);\n pix.y.sort((a, b) => a - b);\n const n = pix.x.length - 1;\n\n w = 1 + pix.x[n] - pix.x[0];\n h = 1 + pix.y[n] - pix.y[0];\n const cut = context.getImageData(pix.x[0], pix.y[0], w, h);\n\n canvas.width = w;\n canvas.height = h;\n context.putImageData(cut, 0, 0);\n return canvas;\n}\n\n// TODO: ломает iphone с огромными изображениями\nexport const rotateImage = (image: HTMLImageElement, angle: number) => {\n const maxSize = Math.max(image.width, image.height);\n const canvas = document.createElement('canvas');\n canvas.width = maxSize;\n canvas.height = maxSize;\n const context = canvas.getContext('2d')!;\n context.save();\n context.translate(canvas.width / 2, canvas.height / 2);\n context.rotate(degToRad(angle));\n context.drawImage(image, -image.width / 2, -image.height / 2);\n context.restore();\n cropImageFromCanvas(context);\n return renderImage(canvas.toDataURL('image/png'));\n};\n\ninterface DecodedDataUrl {\n mimeType?: string;\n data?: string;\n}\n\n/*\n * Returning object which contains base64 data and mime type of passed data url string.\n * */\nexport function decodeDataUrl(url: string): DecodedDataUrl {\n const regex = /^data:(.*);base64,\\s?(.*)$/;\n const matches = new RegExp(regex).exec(url);\n\n return {\n mimeType: matches?.[1],\n data: matches?.[2],\n };\n}\n\nexport const isHttpUrl = (url: string): boolean => {\n return url.startsWith('https://') || url.startsWith('http://');\n};\n\nexport const isBase64Image = (str: string): boolean => {\n const { mimeType, data } = decodeDataUrl(str);\n return !!(data && mimeType?.startsWith('image/'));\n};\n"],"names":["blobToBase64","blob","resolve","reject","reader","blobToUrl","urlOrBlob","fileToBlob","file","imageToBlob","imageElement","mimeType","canvas","dataUri","base64data","base64MimeType","bytes","buf","array","index","renderImage","image","cropImageFromCanvas","context","w","h","pix","imageData","x","y","a","b","n","cut","rotateImage","angle","maxSize","degToRad","decodeDataUrl","url","regex","matches","isHttpUrl","isBase64Image","str","data"],"mappings":"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"}
1
+ {"version":3,"file":"media.js","sources":["../src/media.ts"],"sourcesContent":["import { degToRad } from 'yummies/math';\n\nexport function blobToBase64(blob: Blob): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\nexport const blobToUrl = (urlOrBlob: string | Blob) =>\n urlOrBlob instanceof Blob ? URL.createObjectURL(urlOrBlob) : urlOrBlob;\n\nexport const fileToBlob = (file: File) => {\n return new Blob([file], { type: file.type });\n};\n\nexport const imageToBlob = (\n imageElement: HTMLImageElement,\n mimeType: string = 'image/png',\n) => {\n const canvas = document.createElement('canvas');\n\n canvas.width = imageElement.naturalWidth || 300;\n canvas.height = imageElement.naturalHeight || 300;\n\n canvas.getContext('2d')!.drawImage(imageElement, 0, 0);\n\n const dataUri = canvas.toDataURL(mimeType, 1);\n const base64data = dataUri.split(',')[1];\n const base64MimeType = dataUri.split(';')[0].slice(5);\n\n const bytes = globalThis.atob(base64data);\n const buf = new ArrayBuffer(bytes.length);\n const array = new Uint8Array(buf);\n\n for (let index = 0; index < bytes.length; index++) {\n array[index] = bytes.charCodeAt(index);\n }\n\n const blob = new Blob([array], { type: base64MimeType });\n\n return blob;\n};\n\n/**\n * Загружает и отрисовывает изображение с использованием Image\n *\n * @returns {Promise<HTMLImageElement>}\n */\nexport const renderImage = (urlOrBlob: Blob | string) =>\n new Promise<HTMLImageElement>((resolve, reject) => {\n const image = new Image();\n image.src = blobToUrl(urlOrBlob);\n image.onload = () => resolve(image);\n image.onerror = () => reject();\n });\n\nfunction cropImageFromCanvas(context: CanvasRenderingContext2D) {\n const canvas = context.canvas;\n let w = canvas.width;\n let h = canvas.height;\n const pix: { x: number[]; y: number[] } = { x: [], y: [] };\n const imageData = context.getImageData(0, 0, canvas.width, canvas.height);\n let x: number;\n let y: number;\n let index: number;\n\n for (y = 0; y < h; y++) {\n for (x = 0; x < w; x++) {\n index = (y * w + x) * 4;\n if (imageData.data[index + 3] > 0) {\n pix.x.push(x);\n pix.y.push(y);\n }\n }\n }\n pix.x.sort((a, b) => a - b);\n pix.y.sort((a, b) => a - b);\n const n = pix.x.length - 1;\n\n w = 1 + pix.x[n] - pix.x[0];\n h = 1 + pix.y[n] - pix.y[0];\n const cut = context.getImageData(pix.x[0], pix.y[0], w, h);\n\n canvas.width = w;\n canvas.height = h;\n context.putImageData(cut, 0, 0);\n return canvas;\n}\n\n// TODO: ломает iphone с огромными изображениями\nexport const rotateImage = (image: HTMLImageElement, angle: number) => {\n const maxSize = Math.max(image.width, image.height);\n const canvas = document.createElement('canvas');\n canvas.width = maxSize;\n canvas.height = maxSize;\n const context = canvas.getContext('2d')!;\n context.save();\n context.translate(canvas.width / 2, canvas.height / 2);\n context.rotate(degToRad(angle));\n context.drawImage(image, -image.width / 2, -image.height / 2);\n context.restore();\n cropImageFromCanvas(context);\n return renderImage(canvas.toDataURL('image/png'));\n};\n\ninterface DecodedDataUrl {\n mimeType?: string;\n data?: string;\n}\n\n/*\n * Returning object which contains base64 data and mime type of passed data url string.\n * */\nexport function decodeDataUrl(url: string): DecodedDataUrl {\n const regex = /^data:(.*);base64,\\s?(.*)$/;\n const matches = new RegExp(regex).exec(url);\n\n return {\n mimeType: matches?.[1],\n data: matches?.[2],\n };\n}\n\nexport const isHttpUrl = (url: string): boolean => {\n return url.startsWith('https://') || url.startsWith('http://');\n};\n\nexport const isBase64Image = (str: string): boolean => {\n const { mimeType, data } = decodeDataUrl(str);\n return !!(data && mimeType?.startsWith('image/'));\n};\n"],"names":[],"mappings":";AAEO,SAAS,aAAa,MAA6B;AACxD,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,WAAA;AACnB,WAAO,YAAY,MAAM,QAAQ,OAAO,MAAgB;AACxD,WAAO,UAAU;AACjB,WAAO,cAAc,IAAI;AAAA,EAC3B,CAAC;AACH;AAEO,MAAM,YAAY,CAAC,cACxB,qBAAqB,OAAO,IAAI,gBAAgB,SAAS,IAAI;AAExD,MAAM,aAAa,CAAC,SAAe;AACxC,SAAO,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,MAAM,KAAK,MAAM;AAC7C;AAEO,MAAM,cAAc,CACzB,cACA,WAAmB,gBAChB;AACH,QAAM,SAAS,SAAS,cAAc,QAAQ;AAE9C,SAAO,QAAQ,aAAa,gBAAgB;AAC5C,SAAO,SAAS,aAAa,iBAAiB;AAE9C,SAAO,WAAW,IAAI,EAAG,UAAU,cAAc,GAAG,CAAC;AAErD,QAAM,UAAU,OAAO,UAAU,UAAU,CAAC;AAC5C,QAAM,aAAa,QAAQ,MAAM,GAAG,EAAE,CAAC;AACvC,QAAM,iBAAiB,QAAQ,MAAM,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC;AAEpD,QAAM,QAAQ,WAAW,KAAK,UAAU;AACxC,QAAM,MAAM,IAAI,YAAY,MAAM,MAAM;AACxC,QAAM,QAAQ,IAAI,WAAW,GAAG;AAEhC,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;AACjD,UAAM,KAAK,IAAI,MAAM,WAAW,KAAK;AAAA,EACvC;AAEA,QAAM,OAAO,IAAI,KAAK,CAAC,KAAK,GAAG,EAAE,MAAM,gBAAgB;AAEvD,SAAO;AACT;AAOO,MAAM,cAAc,CAAC,cAC1B,IAAI,QAA0B,CAAC,SAAS,WAAW;AACjD,QAAM,QAAQ,IAAI,MAAA;AAClB,QAAM,MAAM,UAAU,SAAS;AAC/B,QAAM,SAAS,MAAM,QAAQ,KAAK;AAClC,QAAM,UAAU,MAAM,OAAA;AACxB,CAAC;AAEH,SAAS,oBAAoB,SAAmC;AAC9D,QAAM,SAAS,QAAQ;AACvB,MAAI,IAAI,OAAO;AACf,MAAI,IAAI,OAAO;AACf,QAAM,MAAoC,EAAE,GAAG,CAAA,GAAI,GAAG,CAAA,EAAC;AACvD,QAAM,YAAY,QAAQ,aAAa,GAAG,GAAG,OAAO,OAAO,OAAO,MAAM;AACxE,MAAI;AACJ,MAAI;AACJ,MAAI;AAEJ,OAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACtB,SAAK,IAAI,GAAG,IAAI,GAAG,KAAK;AACtB,eAAS,IAAI,IAAI,KAAK;AACtB,UAAI,UAAU,KAAK,QAAQ,CAAC,IAAI,GAAG;AACjC,YAAI,EAAE,KAAK,CAAC;AACZ,YAAI,EAAE,KAAK,CAAC;AAAA,MACd;AAAA,IACF;AAAA,EACF;AACA,MAAI,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC1B,MAAI,EAAE,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAC1B,QAAM,IAAI,IAAI,EAAE,SAAS;AAEzB,MAAI,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAC1B,MAAI,IAAI,IAAI,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC;AAC1B,QAAM,MAAM,QAAQ,aAAa,IAAI,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,GAAG,GAAG,CAAC;AAEzD,SAAO,QAAQ;AACf,SAAO,SAAS;AAChB,UAAQ,aAAa,KAAK,GAAG,CAAC;AAC9B,SAAO;AACT;AAGO,MAAM,cAAc,CAAC,OAAyB,UAAkB;AACrE,QAAM,UAAU,KAAK,IAAI,MAAM,OAAO,MAAM,MAAM;AAClD,QAAM,SAAS,SAAS,cAAc,QAAQ;AAC9C,SAAO,QAAQ;AACf,SAAO,SAAS;AAChB,QAAM,UAAU,OAAO,WAAW,IAAI;AACtC,UAAQ,KAAA;AACR,UAAQ,UAAU,OAAO,QAAQ,GAAG,OAAO,SAAS,CAAC;AACrD,UAAQ,OAAO,SAAS,KAAK,CAAC;AAC9B,UAAQ,UAAU,OAAO,CAAC,MAAM,QAAQ,GAAG,CAAC,MAAM,SAAS,CAAC;AAC5D,UAAQ,QAAA;AACR,sBAAoB,OAAO;AAC3B,SAAO,YAAY,OAAO,UAAU,WAAW,CAAC;AAClD;AAUO,SAAS,cAAc,KAA6B;AACzD,QAAM,QAAQ;AACd,QAAM,UAAU,IAAI,OAAO,KAAK,EAAE,KAAK,GAAG;AAE1C,SAAO;AAAA,IACL,UAAU,UAAU,CAAC;AAAA,IACrB,MAAM,UAAU,CAAC;AAAA,EAAA;AAErB;AAEO,MAAM,YAAY,CAAC,QAAyB;AACjD,SAAO,IAAI,WAAW,UAAU,KAAK,IAAI,WAAW,SAAS;AAC/D;AAEO,MAAM,gBAAgB,CAAC,QAAyB;AACrD,QAAM,EAAE,UAAU,SAAS,cAAc,GAAG;AAC5C,SAAO,CAAC,EAAE,QAAQ,UAAU,WAAW,QAAQ;AACjD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"deep-observable-struct.d.ts","sourceRoot":"","sources":["../../src/mobx/deep-observable-struct.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,qBAAa,oBAAoB,CAAC,KAAK,SAAS,SAAS;IACvD,IAAI,EAAE,KAAK,CAAC;gBAEA,IAAI,EAAE,KAAK;IASvB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;CAoD5B"}
1
+ {"version":3,"file":"deep-observable-struct.d.ts","sourceRoot":"","sources":["../../src/mobx/deep-observable-struct.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,qBAAa,oBAAoB,CAAC,KAAK,SAAS,SAAS;IACvD,IAAI,EAAE,KAAK,CAAC;gBAEA,IAAI,EAAE,KAAK;IASvB,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC;CAoD5B"}
package/mobx.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const c=require("mobx"),m=require("./~index-PKNbSTT-.js"),h=(r,s,o)=>{o?(s.forEach(([n,t])=>{t(r,n)}),c.makeObservable(r)):c.makeObservable(r,Object.fromEntries(s))},g=(r,s,o,n)=>{const t=c.createAtom(r,s&&(()=>s(t)),o&&(()=>o(t)));return t.meta=n??{},t.reportChanged=t.reportChanged.bind(t),t.reportObserved=t.reportObserved.bind(t),t};class k{data;constructor(s){this.data=s,c.makeObservable(this,{data:c.observable.deep,set:c.action})}set(s){const o=Object.keys(this.data).map(e=>[e,this.data,s]);let n=0,t=o.length;for(;n<t;){const[e,i,b]=o[n],l=b[e],d=i[e];if(n++,e in b)if(m.isObject(l)&&m.isObject(d)){const v=Object.keys(l);Object.keys(d).forEach(u=>{u in l||delete i[e][u]}),v.forEach(u=>{t=o.push([u,i[e],l])})}else l!==d&&(i[e]=l);else delete i[e]}Object.keys(s).forEach(e=>{this.data[e]||(this.data[e]=s[e])})}}const j=r=>r[c.$mobx],A=({context:r,property:s,onStart:o,onEnd:n,endDelay:t=!1})=>{let e,i;const b=new Set,l=Array.isArray(s)?s:[s],d=()=>{if(b.clear(),t===!1){n?.(i,d),i=void 0;return}e&&(clearTimeout(e),e=void 0),e=setTimeout(()=>{n?.(i,d),e=void 0,i=void 0},t)},v=a=>{const O=b.size>0;b.add(a),!O&&(e&&(clearTimeout(e),e=void 0),i=o?.())},u=a=>{const O=!b.size;b.delete(a);const f=b.size>0;O||f||d()};return l.forEach(a=>{r?(c.onBecomeObserved(r,a,()=>v(a)),c.onBecomeUnobserved(r,a,()=>u(a))):(c.onBecomeObserved(a,()=>v(a)),c.onBecomeUnobserved(a,()=>u(a)))}),d};exports.DeepObservableStruct=k;exports.applyObservable=h;exports.createEnhancedAtom=g;exports.getMobxAdministration=j;exports.lazyObserve=A;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("mobx"),t=require("yummies/type-guard");exports.DeepObservableStruct=class{data;constructor(t){this.data=t,e.makeObservable(this,{data:e.observable.deep,set:e.action})}set(e){const r=Object.keys(this.data).map(t=>[t,this.data,e]);let o=0,s=r.length;for(;o<s;){const[e,a,n]=r[o],c=n[e],i=a[e];if(o++,e in n)if(t.typeGuard.isObject(c)&&t.typeGuard.isObject(i)){const t=Object.keys(c);Object.keys(i).forEach(t=>{t in c||delete a[e][t]}),t.forEach(t=>{const o=r.push([t,a[e],c]);s=o})}else c!==i&&(a[e]=c);else delete a[e]}Object.keys(e).forEach(t=>{this.data[t]||(this.data[t]=e[t])})}},exports.applyObservable=(t,r,o)=>{o?(r.forEach(([e,r])=>{r(t,e)}),e.makeObservable(t)):e.makeObservable(t,Object.fromEntries(r))},exports.createEnhancedAtom=(t,r,o,s)=>{const a=e.createAtom(t,r&&(()=>r(a)),o&&(()=>o(a)));return a.meta=s??{},a.reportChanged=a.reportChanged.bind(a),a.reportObserved=a.reportObserved.bind(a),a},exports.getMobxAdministration=t=>t[e.$mobx],exports.lazyObserve=({context:t,property:r,onStart:o,onEnd:s,endDelay:a=!1})=>{let n,c;const i=new Set,d=Array.isArray(r)?r:[r],b=()=>{if(i.clear(),!1===a)return s?.(c,b),void(c=void 0);n&&(clearTimeout(n),n=void 0),n=setTimeout(()=>{s?.(c,b),n=void 0,c=void 0},a)},l=e=>{const t=i.size>0;i.add(e),t||(n&&(clearTimeout(n),n=void 0),c=o?.())},p=e=>{const t=!i.size;i.delete(e);const r=i.size>0;t||r||b()};return d.forEach(r=>{t?(e.onBecomeObserved(t,r,()=>l(r)),e.onBecomeUnobserved(t,r,()=>p(r))):(e.onBecomeObserved(r,()=>l(r)),e.onBecomeUnobserved(r,()=>p(r)))}),b};
2
2
  //# sourceMappingURL=mobx.cjs.map
package/mobx.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"mobx.cjs","sources":["../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/deep-observable-struct.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import { action, makeObservable, observable } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\nimport { typeGuard } from '../type-guard/index.js';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["applyObservable","context","annotationsArray","useDecorators","field","annotation","makeObservable","createEnhancedAtom","name","onBecomeObservedHandler","onBecomeUnobservedHandler","meta","atom","createAtom","DeepObservableStruct","data","observable","action","newData","stack","key","currentIndex","stackLength","currObservableData","newValue","currValue","typeGuard.isObject","newValueKeys","childKey","newDataKey","getMobxAdministration","$mobx","lazyObserve","property","onStart","onEnd","endDelay","timeoutId","metaData","observingProps","properties","cleanup","start","isAlreadyObserving","stop","isAlreadyNotObserving","isObserving","onBecomeObserved","onBecomeUnobserved"],"mappings":"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"}
1
+ {"version":3,"file":"mobx.cjs","sources":["../src/mobx/deep-observable-struct.ts","../src/mobx/apply-observable.ts","../src/mobx/create-enhanced-atom.ts","../src/mobx/get-mobx-administration.ts","../src/mobx/lazy-observe.ts"],"sourcesContent":["import { action, makeObservable, observable } from 'mobx';\nimport { typeGuard } from 'yummies/type-guard';\nimport type { AnyObject } from 'yummies/utils/types';\n\nexport class DeepObservableStruct<TData extends AnyObject> {\n data: TData;\n\n constructor(data: TData) {\n this.data = data;\n\n makeObservable(this, {\n data: observable.deep,\n set: action,\n });\n }\n\n set(newData: Partial<TData>) {\n type StackItem = [key: string, currObservable: AnyObject, new: AnyObject];\n\n const stack: StackItem[] = Object.keys(this.data).map((key) => [\n key,\n this.data,\n newData,\n ]);\n\n let currentIndex = 0;\n let stackLength = stack.length;\n\n while (currentIndex < stackLength) {\n const [key, currObservableData, newData] = stack[currentIndex];\n const newValue = newData[key];\n const currValue = currObservableData[key];\n\n currentIndex++;\n\n if (key in newData) {\n if (typeGuard.isObject(newValue) && typeGuard.isObject(currValue)) {\n const newValueKeys = Object.keys(newValue);\n\n Object.keys(currValue).forEach((childKey) => {\n if (!(childKey in newValue)) {\n delete currObservableData[key][childKey];\n }\n });\n\n newValueKeys.forEach((childKey) => {\n const length = stack.push([\n childKey,\n currObservableData[key],\n newValue,\n ]);\n stackLength = length;\n });\n } else if (newValue !== currValue) {\n currObservableData[key] = newValue;\n }\n } else {\n delete currObservableData[key];\n }\n }\n\n Object.keys(newData).forEach((newDataKey) => {\n if (!this.data[newDataKey]) {\n // @ts-expect-error\n this.data[newDataKey] = newData[newDataKey];\n }\n });\n }\n}\n","import { makeObservable } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\nexport type ObservableAnnotationsArray = [string, any][];\n\nexport const applyObservable = (\n context: AnyObject,\n annotationsArray: ObservableAnnotationsArray,\n useDecorators?: boolean,\n) => {\n if (useDecorators) {\n annotationsArray.forEach(([field, annotation]) => {\n annotation(context, field);\n });\n\n makeObservable(context);\n } else {\n makeObservable(context, Object.fromEntries(annotationsArray));\n }\n};\n","import { createAtom, type IAtom } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\nexport interface IEnhancedAtom<TMeta extends AnyObject = AnyObject>\n extends IAtom {\n meta: TMeta;\n}\n\n/**\n * Creates an enhanced atom with meta data\n * And bind `reportChanged` and `reportObserved` method to the atom\n */\nexport const createEnhancedAtom = <TMeta extends AnyObject>(\n name: string,\n onBecomeObservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n onBecomeUnobservedHandler?: (atom: IEnhancedAtom<TMeta>) => void,\n meta?: TMeta,\n): IEnhancedAtom<TMeta> => {\n const atom = createAtom(\n name,\n onBecomeObservedHandler && (() => onBecomeObservedHandler(atom)),\n onBecomeUnobservedHandler && (() => onBecomeUnobservedHandler(atom)),\n ) as IEnhancedAtom<TMeta>;\n atom.meta = meta ?? ({} as TMeta);\n atom.reportChanged = atom.reportChanged.bind(atom);\n atom.reportObserved = atom.reportObserved.bind(atom);\n return atom;\n};\n","import { $mobx, type AnnotationMapEntry } from 'mobx';\nimport type { AnyObject } from 'yummies/utils/types';\n\ntype ObservableObjectAdministration = Parameters<\n Exclude<AnnotationMapEntry, boolean>['make_']\n>[0];\n\nexport const getMobxAdministration = (\n context: AnyObject,\n): ObservableObjectAdministration => context[$mobx];\n","import { onBecomeObserved, onBecomeUnobserved } from 'mobx';\n\n/**\n * When ONE OF the properties is becomes observed then `onStart` function is called.\n * WHen ALL properties are unobserved then `onEnd` function is called with the `metaData` that was returned by `onStart`.\n *\n * It uses `onBecomeObserved` and `onBecomeUnobserved` mobx hooks to perform lazy observation.\n */\nexport const lazyObserve = <TMetaData = void>({\n context,\n property,\n onStart,\n onEnd,\n endDelay = false,\n}: {\n context?: any;\n property: any | any[];\n onStart?: () => TMetaData;\n onEnd?: (metaData: TMetaData, cleanupFn: VoidFunction) => void;\n endDelay?: number | false;\n}) => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n let metaData: TMetaData | undefined;\n const observingProps = new Set<string>();\n const properties = Array.isArray(property) ? property : [property];\n\n const cleanup = () => {\n observingProps.clear();\n\n if (endDelay === false) {\n onEnd?.(metaData!, cleanup);\n metaData = undefined;\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n timeoutId = setTimeout(() => {\n onEnd?.(metaData!, cleanup);\n timeoutId = undefined;\n metaData = undefined;\n }, endDelay);\n };\n\n const start = (property: string) => {\n const isAlreadyObserving = observingProps.size > 0;\n observingProps.add(property);\n\n if (isAlreadyObserving) {\n return;\n }\n\n if (timeoutId) {\n clearTimeout(timeoutId);\n timeoutId = undefined;\n }\n\n metaData = onStart?.();\n };\n\n const stop = (property: string) => {\n const isAlreadyNotObserving = !observingProps.size;\n\n observingProps.delete(property);\n\n const isObserving = observingProps.size > 0;\n\n if (isAlreadyNotObserving || isObserving) {\n return;\n }\n\n cleanup();\n };\n\n properties.forEach((property) => {\n if (context) {\n onBecomeObserved(context, property, () => start(property));\n onBecomeUnobserved(context, property, () => stop(property));\n } else {\n onBecomeObserved(property, () => start(property));\n onBecomeUnobserved(property, () => stop(property));\n }\n });\n\n return cleanup;\n};\n"],"names":["data","constructor","this","makeObservable","observable","deep","set","action","newData","stack","Object","keys","map","key","currentIndex","stackLength","length","currObservableData","newValue","currValue","typeGuard","isObject","newValueKeys","forEach","childKey","push","newDataKey","context","annotationsArray","useDecorators","field","annotation","fromEntries","name","onBecomeObservedHandler","onBecomeUnobservedHandler","meta","atom","createAtom","reportChanged","bind","reportObserved","$mobx","property","onStart","onEnd","endDelay","timeoutId","metaData","observingProps","Set","properties","Array","isArray","cleanup","clear","clearTimeout","setTimeout","start","isAlreadyObserving","size","add","stop","isAlreadyNotObserving","delete","isObserving","onBecomeObserved","onBecomeUnobserved"],"mappings":"qKAIO,MACLA,KAEA,WAAAC,CAAYD,GACVE,KAAKF,KAAOA,EAEZG,EAAAA,eAAeD,KAAM,CACnBF,KAAMI,EAAAA,WAAWC,KACjBC,IAAKC,EAAAA,QAET,CAEA,GAAAD,CAAIE,GAGF,MAAMC,EAAqBC,OAAOC,KAAKT,KAAKF,MAAMY,IAAKC,GAAQ,CAC7DA,EACAX,KAAKF,KACLQ,IAGF,IAAIM,EAAe,EACfC,EAAcN,EAAMO,OAExB,KAAOF,EAAeC,GAAa,CACjC,MAAOF,EAAKI,EAAoBT,GAAWC,EAAMK,GAC3CI,EAAWV,EAAQK,GACnBM,EAAYF,EAAmBJ,GAIrC,GAFAC,IAEID,KAAOL,EACT,GAAIY,EAAAA,UAAUC,SAASH,IAAaE,EAAAA,UAAUC,SAASF,GAAY,CACjE,MAAMG,EAAeZ,OAAOC,KAAKO,GAEjCR,OAAOC,KAAKQ,GAAWI,QAASC,IACxBA,KAAYN,UACTD,EAAmBJ,GAAKW,KAInCF,EAAaC,QAASC,IACpB,MAAMR,EAASP,EAAMgB,KAAK,CACxBD,EACAP,EAAmBJ,GACnBK,IAEFH,EAAcC,GAElB,MAAWE,IAAaC,IACtBF,EAAmBJ,GAAOK,eAGrBD,EAAmBJ,EAE9B,CAEAH,OAAOC,KAAKH,GAASe,QAASG,IACvBxB,KAAKF,KAAK0B,KAEbxB,KAAKF,KAAK0B,GAAclB,EAAQkB,KAGtC,2BC9D6B,CAC7BC,EACAC,EACAC,KAEIA,GACFD,EAAiBL,QAAQ,EAAEO,EAAOC,MAChCA,EAAWJ,EAASG,KAGtB3B,EAAAA,eAAewB,IAEfxB,EAAAA,eAAewB,EAASjB,OAAOsB,YAAYJ,gCCLb,CAChCK,EACAC,EACAC,EACAC,KAEA,MAAMC,EAAOC,EAAAA,WACXL,EACAC,GAAA,KAAkCA,EAAwBG,IAC1DF,GAAA,KAAoCA,EAA0BE,KAKhE,OAHAA,EAAKD,KAAOA,GAAS,CAAA,EACrBC,EAAKE,cAAgBF,EAAKE,cAAcC,KAAKH,GAC7CA,EAAKI,eAAiBJ,EAAKI,eAAeD,KAAKH,GACxCA,iCClBPV,GACmCA,EAAQe,EAAAA,2BCDlB,EACzBf,UACAgB,WACAC,UACAC,QACAC,YAAW,MAQX,IAAIC,EACAC,EACJ,MAAMC,MAAqBC,IACrBC,EAAaC,MAAMC,QAAQV,GAAYA,EAAW,CAACA,GAEnDW,EAAU,KAGd,GAFAL,EAAeM,SAEE,IAAbT,EAGF,OAFAD,IAAQG,EAAWM,QACnBN,OAAW,GAITD,IACFS,aAAaT,GACbA,OAAY,GAGdA,EAAYU,WAAW,KACrBZ,IAAQG,EAAWM,GACnBP,OAAY,EACZC,OAAW,GACVF,IAGCY,EAASf,IACb,MAAMgB,EAAqBV,EAAeW,KAAO,EACjDX,EAAeY,IAAIlB,GAEfgB,IAIAZ,IACFS,aAAaT,GACbA,OAAY,GAGdC,EAAWJ,QAGPkB,EAAQnB,IACZ,MAAMoB,GAAyBd,EAAeW,KAE9CX,EAAee,OAAOrB,GAEtB,MAAMsB,EAAchB,EAAeW,KAAO,EAEtCG,GAAyBE,GAI7BX,KAaF,OAVAH,EAAW5B,QAASoB,IACdhB,GACFuC,EAAAA,iBAAiBvC,EAASgB,EAAU,IAAMe,EAAMf,IAChDwB,EAAAA,mBAAmBxC,EAASgB,EAAU,IAAMmB,EAAKnB,MAEjDuB,EAAAA,iBAAiBvB,EAAU,IAAMe,EAAMf,IACvCwB,EAAAA,mBAAmBxB,EAAU,IAAMmB,EAAKnB,OAIrCW"}