@mui/x-internals 8.5.1 → 8.5.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.
- package/CHANGELOG.md +92 -0
- package/esm/lruMemoize/index.d.ts +1 -0
- package/esm/lruMemoize/index.js +1 -0
- package/esm/store/Store.d.ts +13 -0
- package/esm/store/Store.js +42 -0
- package/esm/store/createSelector.d.ts +4 -0
- package/esm/store/createSelector.js +138 -0
- package/esm/store/createSelectorType.d.ts +9 -0
- package/esm/store/createSelectorType.js +1 -0
- package/esm/store/index.d.ts +2 -0
- package/esm/store/index.js +2 -0
- package/esm/useComponentRenderer/useComponentRenderer.js +0 -9
- package/lruMemoize/index.d.ts +1 -0
- package/lruMemoize/index.js +12 -0
- package/package.json +4 -3
- package/store/Store.d.ts +13 -0
- package/store/Store.js +50 -0
- package/store/createSelector.d.ts +4 -0
- package/store/createSelector.js +145 -0
- package/store/createSelectorType.d.ts +9 -0
- package/store/createSelectorType.js +5 -0
- package/store/index.d.ts +2 -0
- package/store/index.js +27 -0
- package/useComponentRenderer/useComponentRenderer.js +0 -9
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,98 @@
|
|
|
5
5
|
All notable changes to this project will be documented in this file.
|
|
6
6
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
7
7
|
|
|
8
|
+
## 8.5.2
|
|
9
|
+
|
|
10
|
+
_Jun 12, 2025_
|
|
11
|
+
|
|
12
|
+
We'd like to extend a big thank you to the 15 contributors who made this release possible. Here are some highlights ✨:
|
|
13
|
+
|
|
14
|
+
- 📊 Improve Data Grid selectors performance
|
|
15
|
+
- 🐞 Fix `useSyncExternalStore` import error in React 17
|
|
16
|
+
|
|
17
|
+
Special thanks go out to the community members for their valuable contributions:
|
|
18
|
+
@alisasanib, @noobyogi0010.
|
|
19
|
+
|
|
20
|
+
The following are all team members who have contributed to this release:
|
|
21
|
+
@alexfauquette, @arminmeh, @bernardobelchior, @cherniavskii, @JCQuintas, @KenanYusuf, @LukasTy, @mapache-salvaje, @michelengelen, @noraleonte, @oliviertassinari, @prakhargupta1, @romgrk.
|
|
22
|
+
|
|
23
|
+
### Data Grid
|
|
24
|
+
|
|
25
|
+
#### `@mui/x-data-grid@8.5.2`
|
|
26
|
+
|
|
27
|
+
- [DataGrid] Improve selectors performance (#18234) @romgrk
|
|
28
|
+
- [DataGrid] Fix data grid palette when using CSS vars (#18310) @KenanYusuf
|
|
29
|
+
- [DataGrid] Ignore data source request if the grid got unmounted (#18268) @arminmeh
|
|
30
|
+
|
|
31
|
+
#### `@mui/x-data-grid-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
32
|
+
|
|
33
|
+
Same changes as in `@mui/x-data-grid@8.5.2`, plus:
|
|
34
|
+
|
|
35
|
+
- [DataGridPro] Fix flex column width if it is a pinned column (#18293) @alisasanib
|
|
36
|
+
- [DataGridPro] Fix inconsistent filtering results with aggregation (#17954) @cherniavskii
|
|
37
|
+
|
|
38
|
+
#### `@mui/x-data-grid-premium@8.5.2` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
39
|
+
|
|
40
|
+
Same changes as in `@mui/x-data-grid-pro@8.5.2`.
|
|
41
|
+
|
|
42
|
+
### Date and Time Pickers
|
|
43
|
+
|
|
44
|
+
#### `@mui/x-date-pickers@8.5.2`
|
|
45
|
+
|
|
46
|
+
- [pickers] Add `PickerDay2` and `DateRangePickerDay2` components (#15921) @noraleonte
|
|
47
|
+
- [pickers] Fix `hiddenLabel` prop propagation (#18195) @noobyogi0010
|
|
48
|
+
|
|
49
|
+
#### `@mui/x-date-pickers-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
50
|
+
|
|
51
|
+
Same changes as in `@mui/x-date-pickers@8.5.2`.
|
|
52
|
+
|
|
53
|
+
### Charts
|
|
54
|
+
|
|
55
|
+
#### `@mui/x-charts@8.5.2`
|
|
56
|
+
|
|
57
|
+
- [charts] Add a default value formatter for continuous scales (#18178) @bernardobelchior
|
|
58
|
+
- [charts] Add margin-bottom to charts toolbar (#18326) @bernardobelchior
|
|
59
|
+
- [charts] Fix grid with band scale (#18295) @alexfauquette
|
|
60
|
+
- [charts] Remove unnecessary style changes in tests (#18317) @JCQuintas
|
|
61
|
+
- [charts] Remove `sx` prop merging from `useComponentRenderer` (#18235) @bernardobelchior
|
|
62
|
+
- [charts] Fix `useSyncExternalStore` import error in React 17 (#18314) @bernardobelchior
|
|
63
|
+
|
|
64
|
+
#### `@mui/x-charts-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
65
|
+
|
|
66
|
+
Same changes as in `@mui/x-charts@8.5.2`, plus:
|
|
67
|
+
|
|
68
|
+
- [charts-pro] Document zoom slider tooltip value formatting (#18261) @bernardobelchior
|
|
69
|
+
- [charts-pro] Funnel `gap` prop does not impact the drawing area (#18233) @JCQuintas
|
|
70
|
+
- [charts-pro] Use `ChartsToolbarPro` types in pro charts (#18243) @bernardobelchior
|
|
71
|
+
|
|
72
|
+
### Tree View
|
|
73
|
+
|
|
74
|
+
#### `@mui/x-tree-view@8.5.2`
|
|
75
|
+
|
|
76
|
+
- [tree-view] Fix `useSyncExternalStore` import error in React 17 (#18314) @bernardobelchior
|
|
77
|
+
|
|
78
|
+
#### `@mui/x-tree-view-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
79
|
+
|
|
80
|
+
Same changes as in `@mui/x-tree-view@8.5.2`.
|
|
81
|
+
|
|
82
|
+
### Docs
|
|
83
|
+
|
|
84
|
+
- [docs] Add toolbar custom trigger and panel recipe (#18297) @KenanYusuf
|
|
85
|
+
- [docs] Copyedit the Priority support page (#18311) @mapache-salvaje
|
|
86
|
+
- [docs] Remove confusing opt-out mention in telemetry docs (#18257) @prakhargupta1
|
|
87
|
+
- [docs] Revise the Master Detail doc (#17927) @mapache-salvaje
|
|
88
|
+
- [docs] Revise the list view doc (#17928) @mapache-salvaje
|
|
89
|
+
- [docs] Audit and revise the Pro column docs (#17844) @mapache-salvaje
|
|
90
|
+
- [docs] Add some more context on Heatmap (#18256) @oliviertassinari
|
|
91
|
+
- [x-telemetry] Reduce Telemetry overhead (#18292) @oliviertassinari
|
|
92
|
+
- [code-infra] Align Node version used in CI to v22 (#18319) @LukasTy
|
|
93
|
+
- [code-infra] Fix pkg.pr.new publishing (#18316) @bernardobelchior
|
|
94
|
+
- [code-infra] Revert `React` to `19.0.0` (#18265) @LukasTy
|
|
95
|
+
- [code-infra] Use `catalog` for reused dependencies (#18302) @LukasTy
|
|
96
|
+
- [infra] Remove unused karma/mocha deps and files (#18340) @JCQuintas
|
|
97
|
+
- [infra] Update github label references to use 'scope' instead of 'component' (#18260) @michelengelen
|
|
98
|
+
- [infra] Use a single browser server in CI (#18230) @JCQuintas
|
|
99
|
+
|
|
8
100
|
## 8.5.1
|
|
9
101
|
|
|
10
102
|
<!-- generated comparing v8.5.0..master -->
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { lruMemoize } from 'reselect';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { lruMemoize } from 'reselect';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type Listener<T> = (value: T) => void;
|
|
2
|
+
export declare class Store<State> {
|
|
3
|
+
state: State;
|
|
4
|
+
private listeners;
|
|
5
|
+
static create<T>(state: T): Store<T>;
|
|
6
|
+
constructor(state: State);
|
|
7
|
+
subscribe: (fn: Listener<State>) => () => void;
|
|
8
|
+
getSnapshot: () => State;
|
|
9
|
+
update: (newState: State) => void;
|
|
10
|
+
apply(changes: Partial<State>): void;
|
|
11
|
+
set<T>(key: keyof State, value: T): void;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import _extends from "@babel/runtime/helpers/esm/extends";
|
|
2
|
+
export class Store {
|
|
3
|
+
static create(state) {
|
|
4
|
+
return new Store(state);
|
|
5
|
+
}
|
|
6
|
+
constructor(state) {
|
|
7
|
+
this.state = void 0;
|
|
8
|
+
this.listeners = void 0;
|
|
9
|
+
this.subscribe = fn => {
|
|
10
|
+
this.listeners.add(fn);
|
|
11
|
+
return () => {
|
|
12
|
+
this.listeners.delete(fn);
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
this.getSnapshot = () => {
|
|
16
|
+
return this.state;
|
|
17
|
+
};
|
|
18
|
+
this.update = newState => {
|
|
19
|
+
if (this.state !== newState) {
|
|
20
|
+
this.state = newState;
|
|
21
|
+
this.listeners.forEach(l => l(newState));
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
this.state = state;
|
|
25
|
+
this.listeners = new Set();
|
|
26
|
+
}
|
|
27
|
+
apply(changes) {
|
|
28
|
+
for (const key in changes) {
|
|
29
|
+
if (!Object.is(this.state[key], changes[key])) {
|
|
30
|
+
this.update(_extends({}, this.state, changes));
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
set(key, value) {
|
|
36
|
+
if (!Object.is(this.state[key], value)) {
|
|
37
|
+
this.update(_extends({}, this.state, {
|
|
38
|
+
[key]: value
|
|
39
|
+
}));
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateSelectorFunction } from "./createSelectorType.js";
|
|
2
|
+
export type { CreateSelectorFunction } from "./createSelectorType.js";
|
|
3
|
+
export declare const createSelector: CreateSelectorFunction;
|
|
4
|
+
export declare const createSelectorMemoized: CreateSelectorFunction;
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { lruMemoize, createSelectorCreator } from 'reselect';
|
|
2
|
+
/* eslint-disable no-underscore-dangle */ // __cacheKey__
|
|
3
|
+
|
|
4
|
+
const reselectCreateSelector = createSelectorCreator({
|
|
5
|
+
memoize: lruMemoize,
|
|
6
|
+
memoizeOptions: {
|
|
7
|
+
maxSize: 1,
|
|
8
|
+
equalityCheck: Object.is
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
/* eslint-disable id-denylist */
|
|
12
|
+
export const createSelector = (a, b, c, d, e, f, ...other) => {
|
|
13
|
+
if (other.length > 0) {
|
|
14
|
+
throw new Error('Unsupported number of selectors');
|
|
15
|
+
}
|
|
16
|
+
let selector;
|
|
17
|
+
if (a && b && c && d && e && f) {
|
|
18
|
+
selector = (state, a1, a2, a3) => {
|
|
19
|
+
const va = a(state, a1, a2, a3);
|
|
20
|
+
const vb = b(state, a1, a2, a3);
|
|
21
|
+
const vc = c(state, a1, a2, a3);
|
|
22
|
+
const vd = d(state, a1, a2, a3);
|
|
23
|
+
const ve = e(state, a1, a2, a3);
|
|
24
|
+
return f(va, vb, vc, vd, ve, a1, a2, a3);
|
|
25
|
+
};
|
|
26
|
+
} else if (a && b && c && d && e) {
|
|
27
|
+
selector = (state, a1, a2, a3) => {
|
|
28
|
+
const va = a(state, a1, a2, a3);
|
|
29
|
+
const vb = b(state, a1, a2, a3);
|
|
30
|
+
const vc = c(state, a1, a2, a3);
|
|
31
|
+
const vd = d(state, a1, a2, a3);
|
|
32
|
+
return e(va, vb, vc, vd, a1, a2, a3);
|
|
33
|
+
};
|
|
34
|
+
} else if (a && b && c && d) {
|
|
35
|
+
selector = (state, a1, a2, a3) => {
|
|
36
|
+
const va = a(state, a1, a2, a3);
|
|
37
|
+
const vb = b(state, a1, a2, a3);
|
|
38
|
+
const vc = c(state, a1, a2, a3);
|
|
39
|
+
return d(va, vb, vc, a1, a2, a3);
|
|
40
|
+
};
|
|
41
|
+
} else if (a && b && c) {
|
|
42
|
+
selector = (state, a1, a2, a3) => {
|
|
43
|
+
const va = a(state, a1, a2, a3);
|
|
44
|
+
const vb = b(state, a1, a2, a3);
|
|
45
|
+
return c(va, vb, a1, a2, a3);
|
|
46
|
+
};
|
|
47
|
+
} else if (a && b) {
|
|
48
|
+
selector = (state, a1, a2, a3) => {
|
|
49
|
+
const va = a(state, a1, a2, a3);
|
|
50
|
+
return b(va, a1, a2, a3);
|
|
51
|
+
};
|
|
52
|
+
} else if (a) {
|
|
53
|
+
selector = a;
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error('Missing arguments');
|
|
56
|
+
}
|
|
57
|
+
return selector;
|
|
58
|
+
};
|
|
59
|
+
/* eslint-enable id-denylist */
|
|
60
|
+
|
|
61
|
+
export const createSelectorMemoized = (...selectors) => {
|
|
62
|
+
const cache = new WeakMap();
|
|
63
|
+
let nextCacheId = 1;
|
|
64
|
+
const combiner = selectors[selectors.length - 1];
|
|
65
|
+
const nSelectors = selectors.length - 1 || 1;
|
|
66
|
+
// (s1, s2, ..., sN, a1, a2, a3) => { ... }
|
|
67
|
+
const argsLength = Math.max(combiner.length - nSelectors, 0);
|
|
68
|
+
if (argsLength > 3) {
|
|
69
|
+
throw new Error('Unsupported number of arguments');
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
// prettier-ignore
|
|
73
|
+
const selector = (state, a1, a2, a3) => {
|
|
74
|
+
let cacheKey = state.__cacheKey__;
|
|
75
|
+
if (!cacheKey) {
|
|
76
|
+
cacheKey = {
|
|
77
|
+
id: nextCacheId
|
|
78
|
+
};
|
|
79
|
+
state.__cacheKey__ = cacheKey;
|
|
80
|
+
nextCacheId += 1;
|
|
81
|
+
}
|
|
82
|
+
let fn = cache.get(cacheKey);
|
|
83
|
+
if (!fn) {
|
|
84
|
+
let reselectArgs = selectors;
|
|
85
|
+
const selectorArgs = [undefined, undefined, undefined];
|
|
86
|
+
switch (argsLength) {
|
|
87
|
+
case 0:
|
|
88
|
+
break;
|
|
89
|
+
case 1:
|
|
90
|
+
{
|
|
91
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], combiner];
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 2:
|
|
95
|
+
{
|
|
96
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], () => selectorArgs[1], combiner];
|
|
97
|
+
break;
|
|
98
|
+
}
|
|
99
|
+
case 3:
|
|
100
|
+
{
|
|
101
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], () => selectorArgs[1], () => selectorArgs[2], combiner];
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
default:
|
|
105
|
+
throw new Error('Unsupported number of arguments');
|
|
106
|
+
}
|
|
107
|
+
fn = reselectCreateSelector(...reselectArgs);
|
|
108
|
+
fn.selectorArgs = selectorArgs;
|
|
109
|
+
cache.set(cacheKey, fn);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* eslint-disable no-fallthrough */
|
|
113
|
+
|
|
114
|
+
switch (argsLength) {
|
|
115
|
+
case 3:
|
|
116
|
+
fn.selectorArgs[2] = a3;
|
|
117
|
+
case 2:
|
|
118
|
+
fn.selectorArgs[1] = a2;
|
|
119
|
+
case 1:
|
|
120
|
+
fn.selectorArgs[0] = a1;
|
|
121
|
+
case 0:
|
|
122
|
+
default:
|
|
123
|
+
}
|
|
124
|
+
switch (argsLength) {
|
|
125
|
+
case 0:
|
|
126
|
+
return fn(state);
|
|
127
|
+
case 1:
|
|
128
|
+
return fn(state, a1);
|
|
129
|
+
case 2:
|
|
130
|
+
return fn(state, a1, a2);
|
|
131
|
+
case 3:
|
|
132
|
+
return fn(state, a1, a2, a3);
|
|
133
|
+
default:
|
|
134
|
+
throw new Error('unreachable');
|
|
135
|
+
}
|
|
136
|
+
};
|
|
137
|
+
return selector;
|
|
138
|
+
};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Selector } from 'reselect';
|
|
2
|
+
export type CreateSelectorFunction = <const Args extends any[], const Selectors extends ReadonlyArray<Selector<any>>, const Combiner extends (...args: readonly [...ReturnTypes<Selectors>, ...Args]) => any>(...items: [...Selectors, Combiner]) => (...args: Selectors['length'] extends 0 ? MergeParams<ReturnTypes<Selectors>, Parameters<Combiner>> : [StateFromSelectorList<Selectors>, ...MergeParams<ReturnTypes<Selectors>, Parameters<Combiner>>]) => ReturnType<Combiner>;
|
|
3
|
+
type StateFromSelectorList<Selectors extends readonly any[]> = Selectors extends [f: infer F, ...other: infer R] ? StateFromSelector<F> extends StateFromSelectorList<R> ? StateFromSelector<F> : StateFromSelectorList<R> : {};
|
|
4
|
+
type StateFromSelector<T> = T extends ((first: infer F, ...args: any[]) => any) ? F : never;
|
|
5
|
+
type Fn = (...args: any[]) => any;
|
|
6
|
+
type ReturnTypes<FunctionsArray extends readonly Fn[]> = { [Index in keyof FunctionsArray]: FunctionsArray[Index] extends FunctionsArray[number] ? ReturnType<FunctionsArray[Index]> : never };
|
|
7
|
+
type MergeParams<STypes extends readonly unknown[], CTypes extends readonly unknown[]> = STypes['length'] extends 0 ? CTypes : MergeParams<DropFirst<STypes>, DropFirst<CTypes>>;
|
|
8
|
+
type DropFirst<T> = T extends [any, ...infer Xs] ? Xs : [];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -20,9 +20,6 @@ export function useComponentRenderer(defaultElement, render, props, state = {})
|
|
|
20
20
|
if (render.props.style || props.style) {
|
|
21
21
|
props.style = _extends({}, props.style, render.props.style);
|
|
22
22
|
}
|
|
23
|
-
if (render.props.sx || props.sx) {
|
|
24
|
-
props.sx = mergeSx(props.sx, render.props.sx);
|
|
25
|
-
}
|
|
26
23
|
return /*#__PURE__*/React.cloneElement(render, props);
|
|
27
24
|
}
|
|
28
25
|
return /*#__PURE__*/React.createElement(defaultElement, props);
|
|
@@ -32,10 +29,4 @@ function mergeClassNames(className, otherClassName) {
|
|
|
32
29
|
return className || otherClassName;
|
|
33
30
|
}
|
|
34
31
|
return `${className} ${otherClassName}`;
|
|
35
|
-
}
|
|
36
|
-
function mergeSx(sx1, sx2) {
|
|
37
|
-
if (!sx1 || !sx2) {
|
|
38
|
-
return sx1 || sx2;
|
|
39
|
-
}
|
|
40
|
-
return (Array.isArray(sx1) ? sx1 : [sx1]).concat(Array.isArray(sx2) ? sx2 : [sx2]);
|
|
41
32
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { lruMemoize } from 'reselect';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "lruMemoize", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _reselect.lruMemoize;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
var _reselect = require("reselect");
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-internals",
|
|
3
|
-
"version": "8.5.
|
|
3
|
+
"version": "8.5.2",
|
|
4
4
|
"author": "MUI Team",
|
|
5
5
|
"description": "Utility functions for the MUI X packages (internal use only).",
|
|
6
6
|
"license": "MIT",
|
|
@@ -31,8 +31,9 @@
|
|
|
31
31
|
"directory": "packages/x-internals"
|
|
32
32
|
},
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"@babel/runtime": "^7.27.
|
|
35
|
-
"@mui/utils": "^7.1.1"
|
|
34
|
+
"@babel/runtime": "^7.27.6",
|
|
35
|
+
"@mui/utils": "^7.1.1",
|
|
36
|
+
"reselect": "^5.1.1"
|
|
36
37
|
},
|
|
37
38
|
"peerDependencies": {
|
|
38
39
|
"@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0",
|
package/store/Store.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
type Listener<T> = (value: T) => void;
|
|
2
|
+
export declare class Store<State> {
|
|
3
|
+
state: State;
|
|
4
|
+
private listeners;
|
|
5
|
+
static create<T>(state: T): Store<T>;
|
|
6
|
+
constructor(state: State);
|
|
7
|
+
subscribe: (fn: Listener<State>) => () => void;
|
|
8
|
+
getSnapshot: () => State;
|
|
9
|
+
update: (newState: State) => void;
|
|
10
|
+
apply(changes: Partial<State>): void;
|
|
11
|
+
set<T>(key: keyof State, value: T): void;
|
|
12
|
+
}
|
|
13
|
+
export {};
|
package/store/Store.js
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default;
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.Store = void 0;
|
|
8
|
+
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
9
|
+
class Store {
|
|
10
|
+
static create(state) {
|
|
11
|
+
return new Store(state);
|
|
12
|
+
}
|
|
13
|
+
constructor(state) {
|
|
14
|
+
this.state = void 0;
|
|
15
|
+
this.listeners = void 0;
|
|
16
|
+
this.subscribe = fn => {
|
|
17
|
+
this.listeners.add(fn);
|
|
18
|
+
return () => {
|
|
19
|
+
this.listeners.delete(fn);
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
this.getSnapshot = () => {
|
|
23
|
+
return this.state;
|
|
24
|
+
};
|
|
25
|
+
this.update = newState => {
|
|
26
|
+
if (this.state !== newState) {
|
|
27
|
+
this.state = newState;
|
|
28
|
+
this.listeners.forEach(l => l(newState));
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
this.state = state;
|
|
32
|
+
this.listeners = new Set();
|
|
33
|
+
}
|
|
34
|
+
apply(changes) {
|
|
35
|
+
for (const key in changes) {
|
|
36
|
+
if (!Object.is(this.state[key], changes[key])) {
|
|
37
|
+
this.update((0, _extends2.default)({}, this.state, changes));
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
set(key, value) {
|
|
43
|
+
if (!Object.is(this.state[key], value)) {
|
|
44
|
+
this.update((0, _extends2.default)({}, this.state, {
|
|
45
|
+
[key]: value
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
exports.Store = Store;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { CreateSelectorFunction } from "./createSelectorType.js";
|
|
2
|
+
export type { CreateSelectorFunction } from "./createSelectorType.js";
|
|
3
|
+
export declare const createSelector: CreateSelectorFunction;
|
|
4
|
+
export declare const createSelectorMemoized: CreateSelectorFunction;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createSelectorMemoized = exports.createSelector = void 0;
|
|
7
|
+
var _reselect = require("reselect");
|
|
8
|
+
/* eslint-disable no-underscore-dangle */ // __cacheKey__
|
|
9
|
+
|
|
10
|
+
const reselectCreateSelector = (0, _reselect.createSelectorCreator)({
|
|
11
|
+
memoize: _reselect.lruMemoize,
|
|
12
|
+
memoizeOptions: {
|
|
13
|
+
maxSize: 1,
|
|
14
|
+
equalityCheck: Object.is
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
/* eslint-disable id-denylist */
|
|
18
|
+
const createSelector = (a, b, c, d, e, f, ...other) => {
|
|
19
|
+
if (other.length > 0) {
|
|
20
|
+
throw new Error('Unsupported number of selectors');
|
|
21
|
+
}
|
|
22
|
+
let selector;
|
|
23
|
+
if (a && b && c && d && e && f) {
|
|
24
|
+
selector = (state, a1, a2, a3) => {
|
|
25
|
+
const va = a(state, a1, a2, a3);
|
|
26
|
+
const vb = b(state, a1, a2, a3);
|
|
27
|
+
const vc = c(state, a1, a2, a3);
|
|
28
|
+
const vd = d(state, a1, a2, a3);
|
|
29
|
+
const ve = e(state, a1, a2, a3);
|
|
30
|
+
return f(va, vb, vc, vd, ve, a1, a2, a3);
|
|
31
|
+
};
|
|
32
|
+
} else if (a && b && c && d && e) {
|
|
33
|
+
selector = (state, a1, a2, a3) => {
|
|
34
|
+
const va = a(state, a1, a2, a3);
|
|
35
|
+
const vb = b(state, a1, a2, a3);
|
|
36
|
+
const vc = c(state, a1, a2, a3);
|
|
37
|
+
const vd = d(state, a1, a2, a3);
|
|
38
|
+
return e(va, vb, vc, vd, a1, a2, a3);
|
|
39
|
+
};
|
|
40
|
+
} else if (a && b && c && d) {
|
|
41
|
+
selector = (state, a1, a2, a3) => {
|
|
42
|
+
const va = a(state, a1, a2, a3);
|
|
43
|
+
const vb = b(state, a1, a2, a3);
|
|
44
|
+
const vc = c(state, a1, a2, a3);
|
|
45
|
+
return d(va, vb, vc, a1, a2, a3);
|
|
46
|
+
};
|
|
47
|
+
} else if (a && b && c) {
|
|
48
|
+
selector = (state, a1, a2, a3) => {
|
|
49
|
+
const va = a(state, a1, a2, a3);
|
|
50
|
+
const vb = b(state, a1, a2, a3);
|
|
51
|
+
return c(va, vb, a1, a2, a3);
|
|
52
|
+
};
|
|
53
|
+
} else if (a && b) {
|
|
54
|
+
selector = (state, a1, a2, a3) => {
|
|
55
|
+
const va = a(state, a1, a2, a3);
|
|
56
|
+
return b(va, a1, a2, a3);
|
|
57
|
+
};
|
|
58
|
+
} else if (a) {
|
|
59
|
+
selector = a;
|
|
60
|
+
} else {
|
|
61
|
+
throw new Error('Missing arguments');
|
|
62
|
+
}
|
|
63
|
+
return selector;
|
|
64
|
+
};
|
|
65
|
+
/* eslint-enable id-denylist */
|
|
66
|
+
exports.createSelector = createSelector;
|
|
67
|
+
const createSelectorMemoized = (...selectors) => {
|
|
68
|
+
const cache = new WeakMap();
|
|
69
|
+
let nextCacheId = 1;
|
|
70
|
+
const combiner = selectors[selectors.length - 1];
|
|
71
|
+
const nSelectors = selectors.length - 1 || 1;
|
|
72
|
+
// (s1, s2, ..., sN, a1, a2, a3) => { ... }
|
|
73
|
+
const argsLength = Math.max(combiner.length - nSelectors, 0);
|
|
74
|
+
if (argsLength > 3) {
|
|
75
|
+
throw new Error('Unsupported number of arguments');
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// prettier-ignore
|
|
79
|
+
const selector = (state, a1, a2, a3) => {
|
|
80
|
+
let cacheKey = state.__cacheKey__;
|
|
81
|
+
if (!cacheKey) {
|
|
82
|
+
cacheKey = {
|
|
83
|
+
id: nextCacheId
|
|
84
|
+
};
|
|
85
|
+
state.__cacheKey__ = cacheKey;
|
|
86
|
+
nextCacheId += 1;
|
|
87
|
+
}
|
|
88
|
+
let fn = cache.get(cacheKey);
|
|
89
|
+
if (!fn) {
|
|
90
|
+
let reselectArgs = selectors;
|
|
91
|
+
const selectorArgs = [undefined, undefined, undefined];
|
|
92
|
+
switch (argsLength) {
|
|
93
|
+
case 0:
|
|
94
|
+
break;
|
|
95
|
+
case 1:
|
|
96
|
+
{
|
|
97
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], combiner];
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
case 2:
|
|
101
|
+
{
|
|
102
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], () => selectorArgs[1], combiner];
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case 3:
|
|
106
|
+
{
|
|
107
|
+
reselectArgs = [...selectors.slice(0, -1), () => selectorArgs[0], () => selectorArgs[1], () => selectorArgs[2], combiner];
|
|
108
|
+
break;
|
|
109
|
+
}
|
|
110
|
+
default:
|
|
111
|
+
throw new Error('Unsupported number of arguments');
|
|
112
|
+
}
|
|
113
|
+
fn = reselectCreateSelector(...reselectArgs);
|
|
114
|
+
fn.selectorArgs = selectorArgs;
|
|
115
|
+
cache.set(cacheKey, fn);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* eslint-disable no-fallthrough */
|
|
119
|
+
|
|
120
|
+
switch (argsLength) {
|
|
121
|
+
case 3:
|
|
122
|
+
fn.selectorArgs[2] = a3;
|
|
123
|
+
case 2:
|
|
124
|
+
fn.selectorArgs[1] = a2;
|
|
125
|
+
case 1:
|
|
126
|
+
fn.selectorArgs[0] = a1;
|
|
127
|
+
case 0:
|
|
128
|
+
default:
|
|
129
|
+
}
|
|
130
|
+
switch (argsLength) {
|
|
131
|
+
case 0:
|
|
132
|
+
return fn(state);
|
|
133
|
+
case 1:
|
|
134
|
+
return fn(state, a1);
|
|
135
|
+
case 2:
|
|
136
|
+
return fn(state, a1, a2);
|
|
137
|
+
case 3:
|
|
138
|
+
return fn(state, a1, a2, a3);
|
|
139
|
+
default:
|
|
140
|
+
throw new Error('unreachable');
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
return selector;
|
|
144
|
+
};
|
|
145
|
+
exports.createSelectorMemoized = createSelectorMemoized;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Selector } from 'reselect';
|
|
2
|
+
export type CreateSelectorFunction = <const Args extends any[], const Selectors extends ReadonlyArray<Selector<any>>, const Combiner extends (...args: readonly [...ReturnTypes<Selectors>, ...Args]) => any>(...items: [...Selectors, Combiner]) => (...args: Selectors['length'] extends 0 ? MergeParams<ReturnTypes<Selectors>, Parameters<Combiner>> : [StateFromSelectorList<Selectors>, ...MergeParams<ReturnTypes<Selectors>, Parameters<Combiner>>]) => ReturnType<Combiner>;
|
|
3
|
+
type StateFromSelectorList<Selectors extends readonly any[]> = Selectors extends [f: infer F, ...other: infer R] ? StateFromSelector<F> extends StateFromSelectorList<R> ? StateFromSelector<F> : StateFromSelectorList<R> : {};
|
|
4
|
+
type StateFromSelector<T> = T extends ((first: infer F, ...args: any[]) => any) ? F : never;
|
|
5
|
+
type Fn = (...args: any[]) => any;
|
|
6
|
+
type ReturnTypes<FunctionsArray extends readonly Fn[]> = { [Index in keyof FunctionsArray]: FunctionsArray[Index] extends FunctionsArray[number] ? ReturnType<FunctionsArray[Index]> : never };
|
|
7
|
+
type MergeParams<STypes extends readonly unknown[], CTypes extends readonly unknown[]> = STypes['length'] extends 0 ? CTypes : MergeParams<DropFirst<STypes>, DropFirst<CTypes>>;
|
|
8
|
+
type DropFirst<T> = T extends [any, ...infer Xs] ? Xs : [];
|
|
9
|
+
export {};
|
package/store/index.d.ts
ADDED
package/store/index.js
ADDED
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _createSelector = require("./createSelector");
|
|
7
|
+
Object.keys(_createSelector).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _createSelector[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _createSelector[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _Store = require("./Store");
|
|
18
|
+
Object.keys(_Store).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _Store[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _Store[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
@@ -28,9 +28,6 @@ function useComponentRenderer(defaultElement, render, props, state = {}) {
|
|
|
28
28
|
if (render.props.style || props.style) {
|
|
29
29
|
props.style = (0, _extends2.default)({}, props.style, render.props.style);
|
|
30
30
|
}
|
|
31
|
-
if (render.props.sx || props.sx) {
|
|
32
|
-
props.sx = mergeSx(props.sx, render.props.sx);
|
|
33
|
-
}
|
|
34
31
|
return /*#__PURE__*/React.cloneElement(render, props);
|
|
35
32
|
}
|
|
36
33
|
return /*#__PURE__*/React.createElement(defaultElement, props);
|
|
@@ -40,10 +37,4 @@ function mergeClassNames(className, otherClassName) {
|
|
|
40
37
|
return className || otherClassName;
|
|
41
38
|
}
|
|
42
39
|
return `${className} ${otherClassName}`;
|
|
43
|
-
}
|
|
44
|
-
function mergeSx(sx1, sx2) {
|
|
45
|
-
if (!sx1 || !sx2) {
|
|
46
|
-
return sx1 || sx2;
|
|
47
|
-
}
|
|
48
|
-
return (Array.isArray(sx1) ? sx1 : [sx1]).concat(Array.isArray(sx2) ? sx2 : [sx2]);
|
|
49
40
|
}
|