@fluentui-react-native/framework-base 0.1.1

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 (141) hide show
  1. package/CHANGELOG.json +20 -0
  2. package/CHANGELOG.md +13 -0
  3. package/README.md +20 -0
  4. package/babel.config.js +1 -0
  5. package/eslint.config.js +3 -0
  6. package/lib/immutable-merge/Merge.d.ts +78 -0
  7. package/lib/immutable-merge/Merge.d.ts.map +1 -0
  8. package/lib/immutable-merge/Merge.js +179 -0
  9. package/lib/immutable-merge/Merge.js.map +1 -0
  10. package/lib/immutable-merge/Merge.test.d.ts +2 -0
  11. package/lib/immutable-merge/Merge.test.d.ts.map +1 -0
  12. package/lib/immutable-merge/Merge.test.js +262 -0
  13. package/lib/immutable-merge/Merge.test.js.map +1 -0
  14. package/lib/index.d.ts +9 -0
  15. package/lib/index.d.ts.map +1 -0
  16. package/lib/index.js +7 -0
  17. package/lib/index.js.map +1 -0
  18. package/lib/memo-cache/getCacheEntry.d.ts +22 -0
  19. package/lib/memo-cache/getCacheEntry.d.ts.map +1 -0
  20. package/lib/memo-cache/getCacheEntry.js +49 -0
  21. package/lib/memo-cache/getCacheEntry.js.map +1 -0
  22. package/lib/memo-cache/getCacheEntry.test.d.ts +2 -0
  23. package/lib/memo-cache/getCacheEntry.test.d.ts.map +1 -0
  24. package/lib/memo-cache/getCacheEntry.test.js +95 -0
  25. package/lib/memo-cache/getCacheEntry.test.js.map +1 -0
  26. package/lib/memo-cache/getMemoCache.d.ts +11 -0
  27. package/lib/memo-cache/getMemoCache.d.ts.map +1 -0
  28. package/lib/memo-cache/getMemoCache.js +29 -0
  29. package/lib/memo-cache/getMemoCache.js.map +1 -0
  30. package/lib/memo-cache/getMemoCache.test.d.ts +2 -0
  31. package/lib/memo-cache/getMemoCache.test.d.ts.map +1 -0
  32. package/lib/memo-cache/getMemoCache.test.js +78 -0
  33. package/lib/memo-cache/getMemoCache.test.js.map +1 -0
  34. package/lib/memo-cache/index.d.ts +4 -0
  35. package/lib/memo-cache/index.d.ts.map +1 -0
  36. package/lib/memo-cache/index.js +3 -0
  37. package/lib/memo-cache/index.js.map +1 -0
  38. package/lib/memo-cache/memoize.d.ts +6 -0
  39. package/lib/memo-cache/memoize.d.ts.map +1 -0
  40. package/lib/memo-cache/memoize.js +17 -0
  41. package/lib/memo-cache/memoize.js.map +1 -0
  42. package/lib/memo-cache/memoize.test.d.ts +2 -0
  43. package/lib/memo-cache/memoize.test.d.ts.map +1 -0
  44. package/lib/memo-cache/memoize.test.js +45 -0
  45. package/lib/memo-cache/memoize.test.js.map +1 -0
  46. package/lib/merge-props/index.d.ts +4 -0
  47. package/lib/merge-props/index.d.ts.map +1 -0
  48. package/lib/merge-props/index.js +3 -0
  49. package/lib/merge-props/index.js.map +1 -0
  50. package/lib/merge-props/mergeProps.d.ts +6 -0
  51. package/lib/merge-props/mergeProps.d.ts.map +1 -0
  52. package/lib/merge-props/mergeProps.js +17 -0
  53. package/lib/merge-props/mergeProps.js.map +1 -0
  54. package/lib/merge-props/mergeStyles.d.ts +16 -0
  55. package/lib/merge-props/mergeStyles.d.ts.map +1 -0
  56. package/lib/merge-props/mergeStyles.js +32 -0
  57. package/lib/merge-props/mergeStyles.js.map +1 -0
  58. package/lib/merge-props/mergeStyles.test.d.ts +2 -0
  59. package/lib/merge-props/mergeStyles.test.d.ts.map +1 -0
  60. package/lib/merge-props/mergeStyles.test.js +94 -0
  61. package/lib/merge-props/mergeStyles.test.js.map +1 -0
  62. package/lib/merge-props/mergeStyles.types.d.ts +12 -0
  63. package/lib/merge-props/mergeStyles.types.d.ts.map +1 -0
  64. package/lib/merge-props/mergeStyles.types.js +2 -0
  65. package/lib/merge-props/mergeStyles.types.js.map +1 -0
  66. package/lib-commonjs/immutable-merge/Merge.d.ts +78 -0
  67. package/lib-commonjs/immutable-merge/Merge.d.ts.map +1 -0
  68. package/lib-commonjs/immutable-merge/Merge.js +186 -0
  69. package/lib-commonjs/immutable-merge/Merge.js.map +1 -0
  70. package/lib-commonjs/immutable-merge/Merge.test.d.ts +2 -0
  71. package/lib-commonjs/immutable-merge/Merge.test.d.ts.map +1 -0
  72. package/lib-commonjs/immutable-merge/Merge.test.js +264 -0
  73. package/lib-commonjs/immutable-merge/Merge.test.js.map +1 -0
  74. package/lib-commonjs/index.d.ts +9 -0
  75. package/lib-commonjs/index.d.ts.map +1 -0
  76. package/lib-commonjs/index.js +18 -0
  77. package/lib-commonjs/index.js.map +1 -0
  78. package/lib-commonjs/memo-cache/getCacheEntry.d.ts +22 -0
  79. package/lib-commonjs/memo-cache/getCacheEntry.d.ts.map +1 -0
  80. package/lib-commonjs/memo-cache/getCacheEntry.js +53 -0
  81. package/lib-commonjs/memo-cache/getCacheEntry.js.map +1 -0
  82. package/lib-commonjs/memo-cache/getCacheEntry.test.d.ts +2 -0
  83. package/lib-commonjs/memo-cache/getCacheEntry.test.d.ts.map +1 -0
  84. package/lib-commonjs/memo-cache/getCacheEntry.test.js +97 -0
  85. package/lib-commonjs/memo-cache/getCacheEntry.test.js.map +1 -0
  86. package/lib-commonjs/memo-cache/getMemoCache.d.ts +11 -0
  87. package/lib-commonjs/memo-cache/getMemoCache.d.ts.map +1 -0
  88. package/lib-commonjs/memo-cache/getMemoCache.js +33 -0
  89. package/lib-commonjs/memo-cache/getMemoCache.js.map +1 -0
  90. package/lib-commonjs/memo-cache/getMemoCache.test.d.ts +2 -0
  91. package/lib-commonjs/memo-cache/getMemoCache.test.d.ts.map +1 -0
  92. package/lib-commonjs/memo-cache/getMemoCache.test.js +80 -0
  93. package/lib-commonjs/memo-cache/getMemoCache.test.js.map +1 -0
  94. package/lib-commonjs/memo-cache/index.d.ts +4 -0
  95. package/lib-commonjs/memo-cache/index.d.ts.map +1 -0
  96. package/lib-commonjs/memo-cache/index.js +8 -0
  97. package/lib-commonjs/memo-cache/index.js.map +1 -0
  98. package/lib-commonjs/memo-cache/memoize.d.ts +6 -0
  99. package/lib-commonjs/memo-cache/memoize.d.ts.map +1 -0
  100. package/lib-commonjs/memo-cache/memoize.js +21 -0
  101. package/lib-commonjs/memo-cache/memoize.js.map +1 -0
  102. package/lib-commonjs/memo-cache/memoize.test.d.ts +2 -0
  103. package/lib-commonjs/memo-cache/memoize.test.d.ts.map +1 -0
  104. package/lib-commonjs/memo-cache/memoize.test.js +47 -0
  105. package/lib-commonjs/memo-cache/memoize.test.js.map +1 -0
  106. package/lib-commonjs/merge-props/index.d.ts +4 -0
  107. package/lib-commonjs/merge-props/index.d.ts.map +1 -0
  108. package/lib-commonjs/merge-props/index.js +8 -0
  109. package/lib-commonjs/merge-props/index.js.map +1 -0
  110. package/lib-commonjs/merge-props/mergeProps.d.ts +6 -0
  111. package/lib-commonjs/merge-props/mergeProps.d.ts.map +1 -0
  112. package/lib-commonjs/merge-props/mergeProps.js +21 -0
  113. package/lib-commonjs/merge-props/mergeProps.js.map +1 -0
  114. package/lib-commonjs/merge-props/mergeStyles.d.ts +16 -0
  115. package/lib-commonjs/merge-props/mergeStyles.d.ts.map +1 -0
  116. package/lib-commonjs/merge-props/mergeStyles.js +38 -0
  117. package/lib-commonjs/merge-props/mergeStyles.js.map +1 -0
  118. package/lib-commonjs/merge-props/mergeStyles.test.d.ts +2 -0
  119. package/lib-commonjs/merge-props/mergeStyles.test.d.ts.map +1 -0
  120. package/lib-commonjs/merge-props/mergeStyles.test.js +96 -0
  121. package/lib-commonjs/merge-props/mergeStyles.test.js.map +1 -0
  122. package/lib-commonjs/merge-props/mergeStyles.types.d.ts +12 -0
  123. package/lib-commonjs/merge-props/mergeStyles.types.d.ts.map +1 -0
  124. package/lib-commonjs/merge-props/mergeStyles.types.js +3 -0
  125. package/lib-commonjs/merge-props/mergeStyles.types.js.map +1 -0
  126. package/package.json +58 -0
  127. package/src/immutable-merge/Merge.test.ts +342 -0
  128. package/src/immutable-merge/Merge.ts +255 -0
  129. package/src/index.ts +20 -0
  130. package/src/memo-cache/getCacheEntry.test.ts +120 -0
  131. package/src/memo-cache/getCacheEntry.ts +67 -0
  132. package/src/memo-cache/getMemoCache.test.ts +91 -0
  133. package/src/memo-cache/getMemoCache.ts +37 -0
  134. package/src/memo-cache/index.ts +3 -0
  135. package/src/memo-cache/memoize.test.ts +48 -0
  136. package/src/memo-cache/memoize.ts +17 -0
  137. package/src/merge-props/index.ts +3 -0
  138. package/src/merge-props/mergeProps.ts +20 -0
  139. package/src/merge-props/mergeStyles.test.ts +124 -0
  140. package/src/merge-props/mergeStyles.ts +40 -0
  141. package/src/merge-props/mergeStyles.types.ts +9 -0
@@ -0,0 +1,22 @@
1
+ export type CacheEntry<T, TGet = any> = {
2
+ /** stores the cached value if any */
3
+ value?: T;
4
+ /** entry used for undefined and null values, these both collapse to the same type */
5
+ empty?: CacheEntry<TGet>;
6
+ /** entry used for the case where the array of args is null or length 0 */
7
+ noargs?: CacheEntry<TGet>;
8
+ /** all remaining non-object types are keyed as strings for lookups */
9
+ str?: {
10
+ [key: string]: CacheEntry<TGet>;
11
+ };
12
+ /** object types are keyed in a weak map on object identity */
13
+ obj?: WeakMap<object, TGet>;
14
+ };
15
+ /**
16
+ * Given a base entry, either traverse or build the cache tree that matches the provided args
17
+ *
18
+ * @param entry - entry to use as the base of the cache walk
19
+ * @param args - array of arguments to use to progress deeper into the cache
20
+ */
21
+ export declare function getCacheEntry<T, TGet = any>(entry: CacheEntry<T>, args: any[]): CacheEntry<TGet>;
22
+ //# sourceMappingURL=getCacheEntry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCacheEntry.d.ts","sourceRoot":"","sources":["../../src/memo-cache/getCacheEntry.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,IAAI;IACtC,qCAAqC;IACrC,KAAK,CAAC,EAAE,CAAC,CAAC;IAEV,qFAAqF;IACrF,KAAK,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAEzB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IAE1B,sEAAsE;IACtE,GAAG,CAAC,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAA;KAAE,CAAC;IAE1C,8DAA8D;IAC9D,GAAG,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;CAC7B,CAAC;AAsCF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAOhG"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * just wraps the common entry.foo = entry.foo || {} pattern
3
+ * @param entry - entry to ensure a key value for
4
+ * @param key - which key of that entry to ensure the value for
5
+ */
6
+ function ensureAndReturn(entry, key) {
7
+ if (key === '__proto__' || key === 'constructor' || key === 'prototype') {
8
+ throw new Error('Invalid key');
9
+ }
10
+ return (entry[key] = entry[key] || {});
11
+ }
12
+ /**
13
+ * Step one level deeper in the cache, based on the key value from the current location
14
+ *
15
+ * @param entry - base entry to work from
16
+ * @param val - value to use as the key for progressing to the next level of the cache
17
+ */
18
+ function jumpToCacheEntry(entry, val) {
19
+ if (val === undefined || val === null) {
20
+ // undefined or null just routes directly to the empty object. This avoids the issues of string collisions with 'null' or 'undefined'
21
+ // when using the string key map, it also avoids creating the WeakMap (since null is technically typoef object), particularly in cases
22
+ // where null is just being set on non-object types.
23
+ return ensureAndReturn(entry, 'empty');
24
+ }
25
+ if (typeof val === 'object' || typeof val === 'function') {
26
+ // objects and functions will be treated as key values in a WeakMap
27
+ const byObj = (entry.obj = entry.obj || new WeakMap());
28
+ return byObj.get(val) || byObj.set(val, {}).get(val);
29
+ }
30
+ // otherwise convert everything to a string and store it in the str object (using it as a map)
31
+ const key = val + '';
32
+ const byString = ensureAndReturn(entry, 'str');
33
+ return (byString[key] = byString[key] || {});
34
+ }
35
+ /**
36
+ * Given a base entry, either traverse or build the cache tree that matches the provided args
37
+ *
38
+ * @param entry - entry to use as the base of the cache walk
39
+ * @param args - array of arguments to use to progress deeper into the cache
40
+ */
41
+ export function getCacheEntry(entry, args) {
42
+ // in the case where the args array exists and is > 0 length:
43
+ // - walk the cache from entry, like a linked list, jumping to the next entry by key, building it up as you go
44
+ // - otherwise if there are no args just use the noargs branch
45
+ return args && args.length > 0
46
+ ? args.reduce((previous, arg) => jumpToCacheEntry(previous, arg), entry)
47
+ : ensureAndReturn(entry, 'noargs');
48
+ }
49
+ //# sourceMappingURL=getCacheEntry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCacheEntry.js","sourceRoot":"","sources":["../../src/memo-cache/getCacheEntry.ts"],"names":[],"mappings":"AAiBA;;;;GAIG;AACH,SAAS,eAAe,CAAC,KAAsB,EAAE,GAA0B;IACzE,IAAK,GAAc,KAAK,WAAW,IAAK,GAAc,KAAK,aAAa,IAAK,GAAc,KAAK,WAAW,EAAE;QAC3G,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;KAChC;IACD,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AACzC,CAAC;AAED;;;;;GAKG;AACH,SAAS,gBAAgB,CAAC,KAAsB,EAAE,GAAQ;IACxD,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,KAAK,IAAI,EAAE;QACrC,sIAAsI;QACtI,sIAAsI;QACtI,oDAAoD;QACpD,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;KACxC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE;QACxD,mEAAmE;QACnE,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,IAAI,IAAI,OAAO,EAA2B,CAAC,CAAC;QAChF,OAAO,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;KACtD;IACD,8FAA8F;IAC9F,MAAM,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;IACrB,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC/C,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAgB,KAAoB,EAAE,IAAW;IAC5E,6DAA6D;IAC7D,8GAA8G;IAC9G,8DAA8D;IAC9D,OAAO,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAC5B,CAAC,CAAE,IAAI,CAAC,MAAM,CAAC,CAAC,QAAyB,EAAE,GAAQ,EAAE,EAAE,CAAC,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,EAAE,KAAK,CAAsB;QACpH,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;AACvC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getCacheEntry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCacheEntry.test.d.ts","sourceRoot":"","sources":["../../src/memo-cache/getCacheEntry.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,95 @@
1
+ import { getCacheEntry } from './getCacheEntry';
2
+ function compareResults(base, args, argsNoMatch) {
3
+ const e1 = getCacheEntry(base, args);
4
+ expect(getCacheEntry(base, args)).toBe(e1);
5
+ if (argsNoMatch) {
6
+ expect(getCacheEntry(base, argsNoMatch)).not.toBe(e1);
7
+ }
8
+ }
9
+ describe('Memo cache unit tests', () => {
10
+ test('undefined args to return noargs', () => {
11
+ const base = {};
12
+ expect(getCacheEntry(base, undefined)).toBe(base.noargs);
13
+ });
14
+ test('empty args array to return noargs entry', () => {
15
+ const base = {};
16
+ expect(getCacheEntry(base, [])).toBe(base.noargs);
17
+ });
18
+ test('undefined goes to empty entry', () => {
19
+ const base = {};
20
+ expect(getCacheEntry(base, [undefined])).toBe(base.empty);
21
+ });
22
+ test('null to go to empty entry', () => {
23
+ const base = {};
24
+ expect(getCacheEntry(base, [null])).toBe(base.empty);
25
+ });
26
+ test('string gets keyed correctly', () => {
27
+ const base = {};
28
+ const key = 'foo';
29
+ expect(getCacheEntry(base, [key])).toBe(base.str[key]);
30
+ });
31
+ test('number gets keyed correctly', () => {
32
+ const base = {};
33
+ const val = 235;
34
+ const key = val + '';
35
+ expect(getCacheEntry(base, [val])).toBe(base.str[key]);
36
+ });
37
+ test('bool gets keyed correctly', () => {
38
+ const base = {};
39
+ const val = true;
40
+ const key = val + '';
41
+ expect(getCacheEntry(base, [val])).toBe(base.str[key]);
42
+ });
43
+ test('false bool gets keyed correctly', () => {
44
+ const base = {};
45
+ const val = false;
46
+ const key = val + '';
47
+ expect(getCacheEntry(base, [val])).toBe(base.str[key]);
48
+ });
49
+ test('object gets keyed correctly', () => {
50
+ const base = {};
51
+ const key = {};
52
+ expect(getCacheEntry(base, [key])).toBe(base.obj.get(key));
53
+ });
54
+ test('function gets keyed correctly', () => {
55
+ const base = {};
56
+ const key = () => {
57
+ return 'hello world';
58
+ };
59
+ expect(getCacheEntry(base, [key])).toBe(base.obj.get(key));
60
+ });
61
+ test('basic string retrieval', () => {
62
+ compareResults({}, ['hello', 'world'], ['hello world']);
63
+ });
64
+ test('mixed keys with strings', () => {
65
+ compareResults({}, ['hello', 1, true, undefined, 'world'], ['hello', 1, true, '', 'world']);
66
+ });
67
+ test('basic object matches', () => {
68
+ const obj = {};
69
+ compareResults({}, [obj]);
70
+ });
71
+ test('mixed object and string matches', () => {
72
+ const obj = {};
73
+ compareResults({}, [obj, 'hello', 1, 'world']);
74
+ });
75
+ test('mixed obj and strings with obj at end', () => {
76
+ const obj = {};
77
+ const obj2 = {};
78
+ compareResults({}, ['hello', 1, 'world', obj], ['hello', 1, 'world', obj2]);
79
+ });
80
+ test('hybrid sets', () => {
81
+ const obj = {};
82
+ const obj2 = {};
83
+ compareResults({}, ['hello', obj, 'world', 1, false, obj2, undefined]);
84
+ });
85
+ test('sub cache on object', () => {
86
+ const obj = {};
87
+ const args1 = ['hello', obj];
88
+ const base = {};
89
+ const subRoot = getCacheEntry(base, args1);
90
+ const args2 = ['world', base];
91
+ const target = getCacheEntry(subRoot, args2);
92
+ expect(getCacheEntry(base, [...args1, ...args2])).toBe(target);
93
+ });
94
+ });
95
+ //# sourceMappingURL=getCacheEntry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getCacheEntry.test.js","sourceRoot":"","sources":["../../src/memo-cache/getCacheEntry.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export type ValueFactory<T> = () => T;
2
+ /** signature for the cache function */
3
+ export type GetMemoValue<T, TGet = any> = (factory: T | ValueFactory<T>, keys: any[]) => [T, GetMemoValue<TGet>];
4
+ /**
5
+ * Get a memo cache instance, this can either be completely self-contained or associated with a global key
6
+ *
7
+ * @param globalKey - optional object reference to use as a key for this cache. If specified it can be used
8
+ * to retrieve the same cache from the global call. If not specified the returned cache will be completely isolated.
9
+ */
10
+ export declare function getMemoCache<T = any>(globalKey?: object): GetMemoValue<T>;
11
+ //# sourceMappingURL=getMemoCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMemoCache.d.ts","sourceRoot":"","sources":["../../src/memo-cache/getMemoCache.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAEtC,uCAAuC;AACvC,MAAM,MAAM,YAAY,CAAC,CAAC,EAAE,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;AAqBjH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,CAGzE"}
@@ -0,0 +1,29 @@
1
+ import { getCacheEntry } from './getCacheEntry';
2
+ /** base node used to remember references when a globalKey is set */
3
+ const _baseEntry = {};
4
+ /**
5
+ * Primary functional worker used to implement the caching pattern
6
+ *
7
+ * @param entry - entry to use as the base of the cache traversal
8
+ * @param factory - generally a function who's results will be cached, and returned via the set of keys
9
+ * @param keys - an ordered array of values of any type, used as keys to look up the entry
10
+ */
11
+ function getMemoValueWorker(entry, factory, keys) {
12
+ const foundEntry = getCacheEntry(entry, keys);
13
+ // check the key being set, not the value to disambiguate an undefined factory result/value from never having run the factory
14
+ if (!foundEntry.hasOwnProperty('value')) {
15
+ foundEntry.value = typeof factory === 'function' ? factory() : factory;
16
+ }
17
+ return [foundEntry.value, (fact, args) => getMemoValueWorker(foundEntry, fact, args)];
18
+ }
19
+ /**
20
+ * Get a memo cache instance, this can either be completely self-contained or associated with a global key
21
+ *
22
+ * @param globalKey - optional object reference to use as a key for this cache. If specified it can be used
23
+ * to retrieve the same cache from the global call. If not specified the returned cache will be completely isolated.
24
+ */
25
+ export function getMemoCache(globalKey) {
26
+ const entry = globalKey ? getCacheEntry(_baseEntry, [globalKey]) : {};
27
+ return (fact, args) => getMemoValueWorker(entry, fact, args);
28
+ }
29
+ //# sourceMappingURL=getMemoCache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMemoCache.js","sourceRoot":"","sources":["../../src/memo-cache/getMemoCache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAOhD,oEAAoE;AACpE,MAAM,UAAU,GAAoB,EAAE,CAAC;AAEvC;;;;;;GAMG;AACH,SAAS,kBAAkB,CAAgB,KAAsB,EAAE,OAA4B,EAAE,IAAW;IAC1G,MAAM,UAAU,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC9C,6HAA6H;IAC7H,IAAI,CAAC,UAAU,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE;QACvC,UAAU,CAAC,KAAK,GAAG,OAAO,OAAO,KAAK,UAAU,CAAC,CAAC,CAAE,OAA2B,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;KAC7F;IACD,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,IAA+B,EAAE,IAAW,EAAE,EAAE,CAAC,kBAAkB,CAAO,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAChI,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAU,SAAkB;IACtD,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,UAAU,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtE,OAAO,CAAC,IAAyB,EAAE,IAAW,EAAE,EAAE,CAAC,kBAAkB,CAAI,KAAK,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAC9F,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getMemoCache.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMemoCache.test.d.ts","sourceRoot":"","sources":["../../src/memo-cache/getMemoCache.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,78 @@
1
+ import { getMemoCache } from './getMemoCache';
2
+ function getObjFactory() {
3
+ const obj = { id: 0 };
4
+ return () => ({
5
+ id: obj.id++,
6
+ });
7
+ }
8
+ describe('getMemoCache unit tests', () => {
9
+ test('memoValue with null function', () => {
10
+ const memoValue = getMemoCache();
11
+ const [val] = memoValue(null, ['foo', 'bar']);
12
+ expect(val).toBeNull();
13
+ });
14
+ test('memoValue with undefined', () => {
15
+ const memoValue = getMemoCache();
16
+ const [val] = memoValue(undefined, ['foo', 'bar']);
17
+ expect(val).toBeUndefined();
18
+ });
19
+ test('memoValue with string', () => {
20
+ const memoValue = getMemoCache();
21
+ const [val] = memoValue('foo', ['bar', 'baz']);
22
+ expect(val).toEqual('foo');
23
+ });
24
+ test('memoValue with object', () => {
25
+ const memoValue = getMemoCache();
26
+ const obj = { foo: 'hello', bar: 2, baz: 'you' };
27
+ const [val] = memoValue(obj, ['hello', obj]);
28
+ expect(val).toBe(obj);
29
+ });
30
+ test('memoValue executes function', () => {
31
+ const memoValue = getMemoCache();
32
+ const fn = getObjFactory();
33
+ const v1 = fn();
34
+ const [v2] = memoValue(fn, ['bar', 'baz']);
35
+ expect(v1).not.toBe(v2);
36
+ expect(v1.id).not.toEqual(v2.id);
37
+ });
38
+ test('memo calls function only once', () => {
39
+ const memoValue = getMemoCache();
40
+ const fn = getObjFactory();
41
+ const keys = ['hello', 'world'];
42
+ const [o1] = memoValue(fn, keys);
43
+ const [o2] = memoValue(fn, keys);
44
+ expect(o2).toBe(o1);
45
+ });
46
+ test('memo calls function only once for empty inputs', () => {
47
+ const memoValue = getMemoCache();
48
+ const fn = getObjFactory();
49
+ const [o1] = memoValue(fn, undefined);
50
+ const [o2] = memoValue(fn, undefined);
51
+ expect(o2).toBe(o1);
52
+ });
53
+ test('sub caches are separate', () => {
54
+ const memoValue = getMemoCache();
55
+ const base1 = {};
56
+ const base2 = {};
57
+ const [, getCache1] = memoValue(null, [base1]);
58
+ const [, getCache2] = memoValue(null, [base2]);
59
+ const objKey = {};
60
+ const fn = getObjFactory();
61
+ const [o1] = getCache1(fn, [objKey]);
62
+ const [o2] = getCache2(fn, [objKey]);
63
+ const [o3] = getCache2(fn, [objKey]);
64
+ expect(o1).not.toBe(o2);
65
+ expect(o3).toBe(o2);
66
+ });
67
+ test('sub caches work on branches', () => {
68
+ const memoValue = getMemoCache();
69
+ const keys1 = [{}, 2, 'hello'];
70
+ const keys2 = [{}, true];
71
+ const fn = getObjFactory();
72
+ const [, getMemoValue] = memoValue(null, keys1);
73
+ const [val1] = getMemoValue(fn, keys2);
74
+ const [val2] = memoValue(fn, [...keys1, ...keys2]);
75
+ expect(val2).toBe(val1);
76
+ });
77
+ });
78
+ //# sourceMappingURL=getMemoCache.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getMemoCache.test.js","sourceRoot":"","sources":["../../src/memo-cache/getMemoCache.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export type { GetMemoValue } from './getMemoCache';
2
+ export { getMemoCache } from './getMemoCache';
3
+ export { memoize } from './memoize';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/memo-cache/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { getMemoCache } from './getMemoCache';
2
+ export { memoize } from './memoize';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/memo-cache/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * This wraps a function to memoize the results using the standard javascript memoization pattern
3
+ * @param fn - function to memoize
4
+ */
5
+ export declare function memoize<T extends Function>(fn: T): T;
6
+ //# sourceMappingURL=memoize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.d.ts","sourceRoot":"","sources":["../../src/memo-cache/memoize.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,wBAAgB,OAAO,CAAC,CAAC,SAAS,QAAQ,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CASpD"}
@@ -0,0 +1,17 @@
1
+ import { getMemoCache } from './getMemoCache';
2
+ /**
3
+ * This wraps a function to memoize the results using the standard javascript memoization pattern
4
+ * @param fn - function to memoize
5
+ */
6
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
7
+ export function memoize(fn) {
8
+ // create a unique cache that will be captured in the closure
9
+ const cache = getMemoCache();
10
+ // create the closure which wraps the calling function
11
+ const closure = (...args) => {
12
+ return cache(() => fn(...(args || [])), args)[0];
13
+ };
14
+ // now return that closure strongly typed as the function.
15
+ return closure;
16
+ }
17
+ //# sourceMappingURL=memoize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.js","sourceRoot":"","sources":["../../src/memo-cache/memoize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C;;;GAGG;AACH,sEAAsE;AACtE,MAAM,UAAU,OAAO,CAAqB,EAAK;IAC/C,6DAA6D;IAC7D,MAAM,KAAK,GAAG,YAAY,EAAO,CAAC;IAClC,sDAAsD;IACtD,MAAM,OAAO,GAAG,CAAC,GAAG,IAAW,EAAE,EAAE;QACjC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,CAAC,CAAC;IACF,0DAA0D;IAC1D,OAAO,OAAuB,CAAC;AACjC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=memoize.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.test.d.ts","sourceRoot":"","sources":["../../src/memo-cache/memoize.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,45 @@
1
+ import { memoize } from './memoize';
2
+ let _globalCalls = 0;
3
+ describe('Memoize unit tests', () => {
4
+ test('simple function no args', () => {
5
+ const noArgsFn = memoize(() => {
6
+ return ++_globalCalls;
7
+ });
8
+ const result1 = noArgsFn();
9
+ expect(noArgsFn()).toEqual(result1);
10
+ });
11
+ test('simple function 1 arg', () => {
12
+ const incrementFn = memoize((bump) => {
13
+ ++_globalCalls;
14
+ return bump + 1;
15
+ });
16
+ expect(incrementFn(3)).toEqual(4);
17
+ const calls = _globalCalls;
18
+ incrementFn(3);
19
+ expect(_globalCalls).toEqual(calls);
20
+ incrementFn(4);
21
+ expect(_globalCalls).toEqual(calls + 1);
22
+ incrementFn(4);
23
+ expect(_globalCalls).toEqual(calls + 1);
24
+ });
25
+ test('void function 2 args', () => {
26
+ const voidFn = memoize((a, b) => {
27
+ if (a) {
28
+ ++_globalCalls;
29
+ }
30
+ else if (b) {
31
+ ++_globalCalls;
32
+ }
33
+ else {
34
+ ++_globalCalls;
35
+ }
36
+ });
37
+ voidFn(3, 'hello');
38
+ const calls = _globalCalls;
39
+ voidFn(3, 'hello');
40
+ expect(_globalCalls).toEqual(calls);
41
+ voidFn(3, 'world');
42
+ expect(_globalCalls).toEqual(calls + 1);
43
+ });
44
+ });
45
+ //# sourceMappingURL=memoize.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"memoize.test.js","sourceRoot":"","sources":["../../src/memo-cache/memoize.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,IAAI,YAAY,GAAG,CAAC,CAAC;AAErB,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IAClC,IAAI,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACnC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;YAC5B,OAAO,EAAE,YAAY,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,QAAQ,EAAE,CAAC;QAC3B,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,uBAAuB,EAAE,GAAG,EAAE;QACjC,MAAM,WAAW,GAAG,OAAO,CAAC,CAAC,IAAY,EAAE,EAAE;YAC3C,EAAE,YAAY,CAAC;YACf,OAAO,IAAI,GAAG,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxC,WAAW,CAAC,CAAC,CAAC,CAAC;QACf,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,sBAAsB,EAAE,GAAG,EAAE;QAChC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;YAC9C,IAAI,CAAC,EAAE;gBACL,EAAE,YAAY,CAAC;aAChB;iBAAM,IAAI,CAAC,EAAE;gBACZ,EAAE,YAAY,CAAC;aAChB;iBAAM;gBACL,EAAE,YAAY,CAAC;aAChB;QACH,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,YAAY,CAAC;QAC3B,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnB,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpC,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;QACnB,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,4 @@
1
+ export type { StyleProp } from './mergeStyles.types';
2
+ export { mergeStyles } from './mergeStyles';
3
+ export { mergeProps } from './mergeProps';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/merge-props/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,3 @@
1
+ export { mergeStyles } from './mergeStyles';
2
+ export { mergeProps } from './mergeProps';
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/merge-props/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Merge props together, flattening and merging styles as appropriate
3
+ * @param props - props to merge together
4
+ */
5
+ export declare function mergeProps<TProps>(...props: (TProps | undefined)[]): TProps;
6
+ //# sourceMappingURL=mergeProps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeProps.d.ts","sourceRoot":"","sources":["../../src/merge-props/mergeProps.ts"],"names":[],"mappings":"AAaA;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,GAAG,KAAK,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,GAAG,MAAM,CAE3E"}
@@ -0,0 +1,17 @@
1
+ import { immutableMergeCore, filterToObjects } from '../immutable-merge/Merge';
2
+ import { mergeStyles } from './mergeStyles';
3
+ /**
4
+ * Props will not deeply merge with the exception of a style property. Also className needs to be handled specially.
5
+ */
6
+ const mergePropsOptions = {
7
+ className: (...names) => names.filter((v) => v && typeof v === 'string').join(' '),
8
+ style: mergeStyles,
9
+ };
10
+ /**
11
+ * Merge props together, flattening and merging styles as appropriate
12
+ * @param props - props to merge together
13
+ */
14
+ export function mergeProps(...props) {
15
+ return immutableMergeCore(mergePropsOptions, ...filterToObjects(props));
16
+ }
17
+ //# sourceMappingURL=mergeProps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeProps.js","sourceRoot":"","sources":["../../src/merge-props/mergeProps.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAE/E,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE5C;;GAEG;AACH,MAAM,iBAAiB,GAAiB;IACtC,SAAS,EAAE,CAAC,GAAG,KAAY,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;IACzF,KAAK,EAAE,WAAW;CACnB,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,UAAU,CAAS,GAAG,KAA6B;IACjE,OAAO,kBAAkB,CAAC,iBAAiB,EAAE,GAAG,eAAe,CAAS,KAAK,CAAC,CAAC,CAAC;AAClF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { StyleProp } from './mergeStyles.types';
2
+ /**
3
+ * Take a react-native style, which may be a recursive array, and return as a flattened
4
+ * style. This is analagous to the flatten routine that is part of the style sheet API
5
+ *
6
+ * @param style - StyleProp<TStyle> to flatten, this can be a TStyle or an array
7
+ */
8
+ export declare function flattenStyle(style: StyleProp<object>): object;
9
+ /**
10
+ * Merge styles together into a single flat object and optionally finalize them, can also be used to finalize a single style
11
+ *
12
+ * @param styles - array of styles to merge together. The styles will be flattened as part of the process
13
+ */
14
+ export declare function mergeAndFlattenStyles(...styles: StyleProp<object>[]): object | undefined;
15
+ export declare function mergeStyles(...styles: StyleProp<object>[]): object | undefined;
16
+ //# sourceMappingURL=mergeStyles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeStyles.d.ts","sourceRoot":"","sources":["../../src/merge-props/mergeStyles.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAE7D;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAOxF;AAID,wBAAgB,WAAW,CAAC,GAAG,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,GAAG,SAAS,CAQ9E"}
@@ -0,0 +1,32 @@
1
+ import { immutableMerge } from '../immutable-merge/Merge';
2
+ import { getMemoCache } from '../memo-cache/getMemoCache';
3
+ /**
4
+ * Take a react-native style, which may be a recursive array, and return as a flattened
5
+ * style. This is analagous to the flatten routine that is part of the style sheet API
6
+ *
7
+ * @param style - StyleProp<TStyle> to flatten, this can be a TStyle or an array
8
+ */
9
+ export function flattenStyle(style) {
10
+ return Array.isArray(style) ? immutableMerge(...style.map((v) => flattenStyle(v))) : style || {};
11
+ }
12
+ /**
13
+ * Merge styles together into a single flat object and optionally finalize them, can also be used to finalize a single style
14
+ *
15
+ * @param styles - array of styles to merge together. The styles will be flattened as part of the process
16
+ */
17
+ export function mergeAndFlattenStyles(...styles) {
18
+ // baseline merge and flatten the objects
19
+ return immutableMerge(...styles.map((styleProp) => {
20
+ return flattenStyle(styleProp);
21
+ }));
22
+ }
23
+ const _styleCache = getMemoCache();
24
+ export function mergeStyles(...styles) {
25
+ // filter the style set to just objects (which might be arrays or plain style objects)
26
+ const inputs = styles.filter((s) => typeof s === 'object');
27
+ // now memo the results if there is more than one element or if the one element is an array
28
+ return inputs.length > 1 || (inputs.length === 1 && Array.isArray(inputs[0]))
29
+ ? _styleCache(() => mergeAndFlattenStyles(undefined, ...inputs), inputs)[0]
30
+ : inputs[0] || {};
31
+ }
32
+ //# sourceMappingURL=mergeStyles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeStyles.js","sourceRoot":"","sources":["../../src/merge-props/mergeStyles.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAI1D;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,KAAwB;IACnD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;AACnG,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAG,MAA2B;IAClE,yCAAyC;IACzC,OAAO,cAAc,CACnB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,SAA4B,EAAE,EAAE;QAC7C,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC,CAAC,CACH,CAAC;AACJ,CAAC;AAED,MAAM,WAAW,GAAG,YAAY,EAAE,CAAC;AAEnC,MAAM,UAAU,WAAW,CAAC,GAAG,MAA2B;IACxD,sFAAsF;IACtF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAa,CAAC;IAEvE,2FAA2F;IAC3F,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,SAAS,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;QAC3E,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;AACtB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=mergeStyles.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergeStyles.test.d.ts","sourceRoot":"","sources":["../../src/merge-props/mergeStyles.test.ts"],"names":[],"mappings":""}