@mui/x-internals 8.5.1 → 8.5.3
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 +187 -10
- package/ToolbarContext/useRegisterToolbarButton.d.ts +1 -1
- package/esm/ToolbarContext/useRegisterToolbarButton.d.ts +1 -1
- 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,193 @@
|
|
|
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.3
|
|
9
|
+
|
|
10
|
+
_Jun 19, 2025_
|
|
11
|
+
|
|
12
|
+
We'd like to extend a big thank you to the 10 contributors who made this release possible. Here are some highlights ✨:
|
|
13
|
+
|
|
14
|
+
- 📚 Documentation improvements
|
|
15
|
+
- 🐞 Bugfixes
|
|
16
|
+
|
|
17
|
+
Special thanks go out to the community members for their valuable contributions:
|
|
18
|
+
@alisasanib, @arminmeh, @sai6855
|
|
19
|
+
|
|
20
|
+
The following are all team members who have contributed to this release:
|
|
21
|
+
@alexfauquette, @bernardobelchior, @flaviendelangle, @JCQuintas, @LukasTy, @MBilalShafi, @oliviertassinari
|
|
22
|
+
|
|
23
|
+
### Data Grid
|
|
24
|
+
|
|
25
|
+
#### `@mui/x-data-grid@8.5.3`
|
|
26
|
+
|
|
27
|
+
- [DataGrid] Fix export menu button tooltip being interactive when menu is open (#18327) @bernardobelchior
|
|
28
|
+
- [DataGrid] Fix column menu scroll close (#18065) @alisasanib
|
|
29
|
+
- [DataGrid] Fix page size issue with data source (#18419) @MBilalShafi
|
|
30
|
+
|
|
31
|
+
#### `@mui/x-data-grid-pro@8.5.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
32
|
+
|
|
33
|
+
Same changes as in `@mui/x-data-grid@8.5.3`, plus:
|
|
34
|
+
|
|
35
|
+
- [DataGridPro] Ignore missing `rowCount` response when new children are fetched with the data source (#17711) @arminmeh
|
|
36
|
+
|
|
37
|
+
#### `@mui/x-data-grid-premium@8.5.3` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
38
|
+
|
|
39
|
+
Same changes as in `@mui/x-data-grid-pro@8.5.3`.
|
|
40
|
+
|
|
41
|
+
### Date and Time Pickers
|
|
42
|
+
|
|
43
|
+
#### `@mui/x-date-pickers@8.5.3`
|
|
44
|
+
|
|
45
|
+
- [pickers] Add `inputSizeSmall` to classes interface (#18242) @sai6855
|
|
46
|
+
|
|
47
|
+
#### `@mui/x-date-pickers-pro@8.5.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
48
|
+
|
|
49
|
+
Same changes as in `@mui/x-date-pickers@8.5.3`.
|
|
50
|
+
|
|
51
|
+
### Charts
|
|
52
|
+
|
|
53
|
+
#### `@mui/x-charts@8.5.3`
|
|
54
|
+
|
|
55
|
+
- [charts] Add item class to list item around each series in legend (#18411) @bernardobelchior
|
|
56
|
+
- [charts] Allow `tabIndex` in surface and legend (#18344) @JCQuintas
|
|
57
|
+
- [charts] Explore selector typing (#18362) @alexfauquette
|
|
58
|
+
- [charts] Fix highlight with number ids (#18423) @alexfauquette
|
|
59
|
+
- [charts] Make scatter chart use data attributes (#18048) @alexfauquette
|
|
60
|
+
|
|
61
|
+
#### `@mui/x-charts-pro@8.5.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
62
|
+
|
|
63
|
+
Same changes as in `@mui/x-charts@8.5.3`, plus:
|
|
64
|
+
|
|
65
|
+
- [charts-pro] Add data-series to elements of funnel chart (#18067) @JCQuintas
|
|
66
|
+
- [charts-pro] Hide values outside minStart and maxEnd in zoom slider (#18336) @bernardobelchior
|
|
67
|
+
- [charts-pro] Fix `FunnelChart` label positioning with different curves (#18354) @JCQuintas
|
|
68
|
+
|
|
69
|
+
### Tree View
|
|
70
|
+
|
|
71
|
+
#### `@mui/x-tree-view@8.5.3`
|
|
72
|
+
|
|
73
|
+
Internal changes.
|
|
74
|
+
|
|
75
|
+
#### `@mui/x-tree-view-pro@8.5.3` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
76
|
+
|
|
77
|
+
Same changes as in `@mui/x-tree-view@8.5.3`.
|
|
78
|
+
|
|
79
|
+
### Codemod
|
|
80
|
+
|
|
81
|
+
#### `@mui/x-codemod@8.5.3`
|
|
82
|
+
|
|
83
|
+
Internal changes.
|
|
84
|
+
|
|
85
|
+
### Docs
|
|
86
|
+
|
|
87
|
+
- [docs] Fix 404 in charts docs (#18440) @alexfauquette
|
|
88
|
+
- [docs][pickers] Fix adapter version resolving when opening demo to edit (#18363) @LukasTy
|
|
89
|
+
|
|
90
|
+
### Core
|
|
91
|
+
|
|
92
|
+
- [core] Fix pnpm valelint error (#18420) @oliviertassinari
|
|
93
|
+
|
|
94
|
+
### Miscellaneous
|
|
95
|
+
|
|
96
|
+
- [code-infra] Add back a `Playwright` renovate group (#18397) @LukasTy
|
|
97
|
+
- [code-infra] Setup `CODEOWNERS` for charts repositories (#18418) @JCQuintas
|
|
98
|
+
- [code-infra] Strengthen `URL` usage for test config (#18444) @LukasTy
|
|
99
|
+
- [code-infra] Use `vitest` bundled types (#17758) @JCQuintas
|
|
100
|
+
- [infra] Stabilise tests by removing babel and plugins from vitest (#18341) @JCQuintas
|
|
101
|
+
- [infra] Add automated release PR creation script (#18345) @michelengelen
|
|
102
|
+
|
|
103
|
+
## 8.5.2
|
|
104
|
+
|
|
105
|
+
_Jun 12, 2025_
|
|
106
|
+
|
|
107
|
+
We'd like to extend a big thank you to the 15 contributors who made this release possible. Here are some highlights ✨:
|
|
108
|
+
|
|
109
|
+
- 📊 Improve Data Grid selectors performance
|
|
110
|
+
- 🐞 Fix `useSyncExternalStore` import error in React 17
|
|
111
|
+
|
|
112
|
+
Special thanks go out to the community members for their valuable contributions:
|
|
113
|
+
@alisasanib, @noobyogi0010.
|
|
114
|
+
|
|
115
|
+
The following are all team members who have contributed to this release:
|
|
116
|
+
@alexfauquette, @arminmeh, @bernardobelchior, @cherniavskii, @JCQuintas, @KenanYusuf, @LukasTy, @mapache-salvaje, @michelengelen, @noraleonte, @oliviertassinari, @prakhargupta1, @romgrk.
|
|
117
|
+
|
|
118
|
+
### Data Grid
|
|
119
|
+
|
|
120
|
+
#### `@mui/x-data-grid@8.5.2`
|
|
121
|
+
|
|
122
|
+
- [DataGrid] Improve selectors performance (#18234) @romgrk
|
|
123
|
+
- [DataGrid] Fix data grid palette when using CSS vars (#18310) @KenanYusuf
|
|
124
|
+
- [DataGrid] Ignore data source request if the grid got unmounted (#18268) @arminmeh
|
|
125
|
+
|
|
126
|
+
#### `@mui/x-data-grid-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
127
|
+
|
|
128
|
+
Same changes as in `@mui/x-data-grid@8.5.2`, plus:
|
|
129
|
+
|
|
130
|
+
- [DataGridPro] Fix flex column width if it is a pinned column (#18293) @alisasanib
|
|
131
|
+
- [DataGridPro] Fix inconsistent filtering results with aggregation (#17954) @cherniavskii
|
|
132
|
+
|
|
133
|
+
#### `@mui/x-data-grid-premium@8.5.2` [](https://mui.com/r/x-premium-svg-link 'Premium plan')
|
|
134
|
+
|
|
135
|
+
Same changes as in `@mui/x-data-grid-pro@8.5.2`.
|
|
136
|
+
|
|
137
|
+
### Date and Time Pickers
|
|
138
|
+
|
|
139
|
+
#### `@mui/x-date-pickers@8.5.2`
|
|
140
|
+
|
|
141
|
+
- [pickers] Add `PickerDay2` and `DateRangePickerDay2` components (#15921) @noraleonte
|
|
142
|
+
- [pickers] Fix `hiddenLabel` prop propagation (#18195) @noobyogi0010
|
|
143
|
+
|
|
144
|
+
#### `@mui/x-date-pickers-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
145
|
+
|
|
146
|
+
Same changes as in `@mui/x-date-pickers@8.5.2`.
|
|
147
|
+
|
|
148
|
+
### Charts
|
|
149
|
+
|
|
150
|
+
#### `@mui/x-charts@8.5.2`
|
|
151
|
+
|
|
152
|
+
- [charts] Add a default value formatter for continuous scales (#18178) @bernardobelchior
|
|
153
|
+
- [charts] Add margin-bottom to charts toolbar (#18326) @bernardobelchior
|
|
154
|
+
- [charts] Fix grid with band scale (#18295) @alexfauquette
|
|
155
|
+
- [charts] Remove unnecessary style changes in tests (#18317) @JCQuintas
|
|
156
|
+
- [charts] Remove `sx` prop merging from `useComponentRenderer` (#18235) @bernardobelchior
|
|
157
|
+
- [charts] Fix `useSyncExternalStore` import error in React 17 (#18314) @bernardobelchior
|
|
158
|
+
|
|
159
|
+
#### `@mui/x-charts-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
160
|
+
|
|
161
|
+
Same changes as in `@mui/x-charts@8.5.2`, plus:
|
|
162
|
+
|
|
163
|
+
- [charts-pro] Document zoom slider tooltip value formatting (#18261) @bernardobelchior
|
|
164
|
+
- [charts-pro] Funnel `gap` prop does not impact the drawing area (#18233) @JCQuintas
|
|
165
|
+
- [charts-pro] Use `ChartsToolbarPro` types in pro charts (#18243) @bernardobelchior
|
|
166
|
+
|
|
167
|
+
### Tree View
|
|
168
|
+
|
|
169
|
+
#### `@mui/x-tree-view@8.5.2`
|
|
170
|
+
|
|
171
|
+
- [tree-view] Fix `useSyncExternalStore` import error in React 17 (#18314) @bernardobelchior
|
|
172
|
+
|
|
173
|
+
#### `@mui/x-tree-view-pro@8.5.2` [](https://mui.com/r/x-pro-svg-link 'Pro plan')
|
|
174
|
+
|
|
175
|
+
Same changes as in `@mui/x-tree-view@8.5.2`.
|
|
176
|
+
|
|
177
|
+
### Docs
|
|
178
|
+
|
|
179
|
+
- [docs] Add toolbar custom trigger and panel recipe (#18297) @KenanYusuf
|
|
180
|
+
- [docs] Copyedit the Priority support page (#18311) @mapache-salvaje
|
|
181
|
+
- [docs] Remove confusing opt-out mention in telemetry docs (#18257) @prakhargupta1
|
|
182
|
+
- [docs] Revise the Master Detail doc (#17927) @mapache-salvaje
|
|
183
|
+
- [docs] Revise the list view doc (#17928) @mapache-salvaje
|
|
184
|
+
- [docs] Audit and revise the Pro column docs (#17844) @mapache-salvaje
|
|
185
|
+
- [docs] Add some more context on Heatmap (#18256) @oliviertassinari
|
|
186
|
+
- [x-telemetry] Reduce Telemetry overhead (#18292) @oliviertassinari
|
|
187
|
+
- [code-infra] Align Node version used in CI to v22 (#18319) @LukasTy
|
|
188
|
+
- [code-infra] Fix pkg.pr.new publishing (#18316) @bernardobelchior
|
|
189
|
+
- [code-infra] Revert `React` to `19.0.0` (#18265) @LukasTy
|
|
190
|
+
- [code-infra] Use `catalog` for reused dependencies (#18302) @LukasTy
|
|
191
|
+
- [infra] Remove unused karma/mocha deps and files (#18340) @JCQuintas
|
|
192
|
+
- [infra] Update GitHub label references to use 'scope' instead of 'component' (#18260) @michelengelen
|
|
193
|
+
- [infra] Use a single browser server in CI (#18230) @JCQuintas
|
|
194
|
+
|
|
8
195
|
## 8.5.1
|
|
9
196
|
|
|
10
197
|
<!-- generated comparing v8.5.0..master -->
|
|
@@ -97,15 +284,6 @@ Same changes as in `@mui/x-tree-view@8.5.1`.
|
|
|
97
284
|
|
|
98
285
|
### Core
|
|
99
286
|
|
|
100
|
-
- chore(deps): bump @next/eslint-plugin-next to 15.3.3 (#18155) @renovate[bot]
|
|
101
|
-
- chore(deps): bump @types/lodash to ^4.17.17 (#17990) @renovate[bot]
|
|
102
|
-
- chore(deps): bump babel (#18157) @renovate[bot]
|
|
103
|
-
- chore(deps): bump eslint to ^9.28.0 (#17352) @renovate[bot]
|
|
104
|
-
- chore(deps): bump material ui (#17802) @renovate[bot]
|
|
105
|
-
- chore(deps): bump next to ^15.3.3 (#18159) @renovate[bot]
|
|
106
|
-
- chore(deps): bump ossf/scorecard-action action to v2.4.2 (#18160) @renovate[bot]
|
|
107
|
-
- chore(deps): bump react-router to ^7.6.1 (#18162) @renovate[bot]
|
|
108
|
-
- chore(deps): bump yargs to ^18.0.0 (#18169) @renovate[bot]
|
|
109
287
|
- [code-infra] Different approach to console testing for `processRowUpdate` (#18213) @JCQuintas
|
|
110
288
|
- [code-infra] Fix act warnings in DataGrid/toolbar (#18207) @JCQuintas
|
|
111
289
|
- [code-infra] Remove `istanbul` references (#18194) @JCQuintas
|
|
@@ -4549,7 +4727,6 @@ No changes since `@mui/x-charts@7.22.2`.
|
|
|
4549
4727
|
- [docs] Add `next` version links (#15423) @LukasTy
|
|
4550
4728
|
- [docs] Use the `loading` state in the demos (#15538) @cherniavskii
|
|
4551
4729
|
- [docs] Add data caching to lazy loaded detail panel demo (#15506) @cherniavskii
|
|
4552
|
-
|
|
4553
4730
|
- [code-infra] Tentative fix for Argos flaky screenshot tests (#15399) @JCQuintas
|
|
4554
4731
|
- [docs-infra] Transpile `.ts` demo files (#15421) @KenanYusuf
|
|
4555
4732
|
- [core] Clarify release version bump strategy (#15536) @cherniavskii
|
|
@@ -3,7 +3,7 @@ interface ToolbarItemProps extends Pick<React.ComponentProps<'button'>, 'onKeyDo
|
|
|
3
3
|
export declare function useRegisterToolbarButton(props: ToolbarItemProps, ref: React.RefObject<HTMLButtonElement | null>): {
|
|
4
4
|
tabIndex: number;
|
|
5
5
|
disabled: boolean | undefined;
|
|
6
|
-
'aria-disabled': (boolean | "
|
|
6
|
+
'aria-disabled': (boolean | "true" | "false") | undefined;
|
|
7
7
|
onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
8
8
|
onFocus: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
9
9
|
};
|
|
@@ -3,7 +3,7 @@ interface ToolbarItemProps extends Pick<React.ComponentProps<'button'>, 'onKeyDo
|
|
|
3
3
|
export declare function useRegisterToolbarButton(props: ToolbarItemProps, ref: React.RefObject<HTMLButtonElement | null>): {
|
|
4
4
|
tabIndex: number;
|
|
5
5
|
disabled: boolean | undefined;
|
|
6
|
-
'aria-disabled': (boolean | "
|
|
6
|
+
'aria-disabled': (boolean | "true" | "false") | undefined;
|
|
7
7
|
onKeyDown: (event: React.KeyboardEvent<HTMLButtonElement>) => void;
|
|
8
8
|
onFocus: (event: React.FocusEvent<HTMLButtonElement>) => void;
|
|
9
9
|
};
|
|
@@ -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.3",
|
|
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
|
}
|