@mui/x-license 8.10.0 → 8.10.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.
- package/CHANGELOG.md +96 -0
- package/encoding/index.d.ts +2 -0
- package/encoding/index.js +27 -0
- package/esm/encoding/index.d.ts +2 -0
- package/esm/encoding/index.js +2 -0
- package/esm/index.js +1 -1
- package/esm/package.json +1 -1
- package/esm/utils/licenseInfo.d.ts +3 -0
- package/esm/verifyLicense/verifyLicense.js +31 -11
- package/index.js +1 -1
- package/package.json +17 -17
- package/utils/licenseInfo.d.ts +3 -0
- package/verifyLicense/verifyLicense.js +31 -11
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,102 @@
|
|
|
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.10.1
|
|
9
|
+
|
|
10
|
+
_Aug 15, 2025_
|
|
11
|
+
|
|
12
|
+
We'd like to extend a big thank you to the 8 contributors who made this release possible. Here are some highlights ✨:
|
|
13
|
+
|
|
14
|
+
- 📊 Y-axes can now be grouped by category when using `band` and `point` scales.
|
|
15
|
+
- 📚 Documentation improvements
|
|
16
|
+
|
|
17
|
+
The following are all team members who have contributed to this release:
|
|
18
|
+
@alexfauquette, @bernardobelchior, @Janpot, @JCQuintas, @mnajdova, @oliviertassinari, @prakhargupta1, @romgrk
|
|
19
|
+
|
|
20
|
+
### Data Grid
|
|
21
|
+
|
|
22
|
+
#### `@mui/x-data-grid@8.10.1`
|
|
23
|
+
|
|
24
|
+
- [DataGrid] Fix scroll jumping (#19156) @romgrk
|
|
25
|
+
- [DataGrid] Fix scroll restoration (#19182) @romgrk
|
|
26
|
+
- [DataGrid] Fix "no row with id" error (#19193) @romgrk
|
|
27
|
+
|
|
28
|
+
#### `@mui/x-data-grid-pro@8.10.1` [](https://mui.com/r/x-pro-svg-link "Pro plan")
|
|
29
|
+
|
|
30
|
+
Same changes as in `@mui/x-data-grid@8.10.1`.
|
|
31
|
+
|
|
32
|
+
#### `@mui/x-data-grid-premium@8.10.1` [](https://mui.com/r/x-premium-svg-link "Premium plan")
|
|
33
|
+
|
|
34
|
+
Same changes as in `@mui/x-data-grid-pro@8.10.1`.
|
|
35
|
+
|
|
36
|
+
### Date and Time Pickers
|
|
37
|
+
|
|
38
|
+
#### `@mui/x-date-pickers@8.10.0`
|
|
39
|
+
|
|
40
|
+
Internal changes.
|
|
41
|
+
|
|
42
|
+
#### `@mui/x-date-pickers-pro@8.10.0` [](https://mui.com/r/x-pro-svg-link "Pro plan")
|
|
43
|
+
|
|
44
|
+
Same changes as in `@mui/x-date-pickers@8.10.0`.
|
|
45
|
+
|
|
46
|
+
### Charts
|
|
47
|
+
|
|
48
|
+
- Axes can now be grouped by category when using `band` and `point` scales
|
|
49
|
+
|
|
50
|
+
<img width="643" height="455" alt="Bar chart with y-axis grouped per categories" src="https://github.com/user-attachments/assets/59044afe-bcc5-4152-8bf1-225db0635025" />
|
|
51
|
+
|
|
52
|
+
#### `@mui/x-charts@8.10.1`
|
|
53
|
+
|
|
54
|
+
- [charts] Allow y-axis to be grouped (#19081) @JCQuintas
|
|
55
|
+
- [charts] Fix default axis highlight for axes without data attribute (#18985) @alexfauquette
|
|
56
|
+
- [charts] Fix tooltip mark unexpected wrapping in mobile (#19122) @bernardobelchior
|
|
57
|
+
- [charts] Prevent overflow on charts tooltip (#19123) @bernardobelchior
|
|
58
|
+
|
|
59
|
+
#### `@mui/x-charts-pro@8.10.1` [](https://mui.com/r/x-pro-svg-link "Pro plan")
|
|
60
|
+
|
|
61
|
+
Same changes as in `@mui/x-charts@8.10.1`.
|
|
62
|
+
|
|
63
|
+
### Tree View
|
|
64
|
+
|
|
65
|
+
#### `@mui/x-tree-view@8.10.1`
|
|
66
|
+
|
|
67
|
+
Internal changes.
|
|
68
|
+
|
|
69
|
+
#### `@mui/x-tree-view-pro@8.10.1` [](https://mui.com/r/x-pro-svg-link "Pro plan")
|
|
70
|
+
|
|
71
|
+
Same changes as in `@mui/x-tree-view@8.10.1`.
|
|
72
|
+
|
|
73
|
+
### Codemod
|
|
74
|
+
|
|
75
|
+
#### `@mui/x-codemod@8.10.1`
|
|
76
|
+
|
|
77
|
+
Internal changes.
|
|
78
|
+
|
|
79
|
+
### Docs
|
|
80
|
+
|
|
81
|
+
- [docs] Add all planned charts on the overview page (#19077) @prakhargupta1
|
|
82
|
+
- [docs] Add future charts components link in the sidebar (#19140) @prakhargupta1
|
|
83
|
+
- [docs] Fix Heatmap docs duplicate text (#19138) @JCQuintas
|
|
84
|
+
- [docs] Remove preview from Toolbar & Funnel (#19131) @mnajdova
|
|
85
|
+
- [docs] Reproduce npm sparkline (#19089) @alexfauquette
|
|
86
|
+
|
|
87
|
+
### Core
|
|
88
|
+
|
|
89
|
+
- [core] Fix licensing model name (#19025) @oliviertassinari
|
|
90
|
+
- [core] Fix usage of `:catalog` for `@babel/runtime` (#19028) @oliviertassinari
|
|
91
|
+
- [core] Refactor virtualizer API (#18995) @romgrk
|
|
92
|
+
|
|
93
|
+
### Miscellaneous
|
|
94
|
+
|
|
95
|
+
- [code-infra] Remove namespaces (#19071) @Janpot
|
|
96
|
+
- [code-infra] Fix `fs-extra` removal from `formattedTSDemos` script (#19132) @bernardobelchior
|
|
97
|
+
- [code-infra] Remove unused code and dependency (#19139) @bernardobelchior
|
|
98
|
+
- [code-infra] Replace `fs-extra` with `node:fs` where possible (#19127) @bernardobelchior
|
|
99
|
+
- [internal] Edit, keep `lockFileMaintenance` simple @oliviertassinari
|
|
100
|
+
- [internal] Fix writing style action name @oliviertassinari
|
|
101
|
+
- [internal] Make it clear that `lockFileMaintenance` is enabled @oliviertassinari
|
|
102
|
+
- [support-infra] Remove default issue label (#19104) @oliviertassinari
|
|
103
|
+
|
|
8
104
|
## 8.10.0
|
|
9
105
|
|
|
10
106
|
_Aug 8, 2025_
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
var _base = require("./base64");
|
|
7
|
+
Object.keys(_base).forEach(function (key) {
|
|
8
|
+
if (key === "default" || key === "__esModule") return;
|
|
9
|
+
if (key in exports && exports[key] === _base[key]) return;
|
|
10
|
+
Object.defineProperty(exports, key, {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
get: function () {
|
|
13
|
+
return _base[key];
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
var _md = require("./md5");
|
|
18
|
+
Object.keys(_md).forEach(function (key) {
|
|
19
|
+
if (key === "default" || key === "__esModule") return;
|
|
20
|
+
if (key in exports && exports[key] === _md[key]) return;
|
|
21
|
+
Object.defineProperty(exports, key, {
|
|
22
|
+
enumerable: true,
|
|
23
|
+
get: function () {
|
|
24
|
+
return _md[key];
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
package/esm/index.js
CHANGED
package/esm/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"type":"module","sideEffects":["./utils/licenseInfo.js"]}
|
|
1
|
+
{"type":"module","sideEffects":["./utils/licenseInfo.js","./esm/utils/licenseInfo.js"]}
|
|
@@ -23,38 +23,51 @@ function isPlanScopeSufficient(packageName, planScope) {
|
|
|
23
23
|
return acceptedScopes.includes(planScope);
|
|
24
24
|
}
|
|
25
25
|
const expiryReg = /^.*EXPIRY=([0-9]+),.*$/;
|
|
26
|
+
const orderReg = /^.*ORDER:([0-9]+),.*$/;
|
|
26
27
|
const PRO_PACKAGES_AVAILABLE_IN_INITIAL_PRO_PLAN = ['x-data-grid-pro', 'x-date-pickers-pro'];
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Format: ORDER:${orderNumber},EXPIRY=${expiryTimestamp},KEYVERSION=1
|
|
30
31
|
*/
|
|
31
|
-
|
|
32
|
+
function decodeLicenseVersion1(license) {
|
|
32
33
|
let expiryTimestamp;
|
|
34
|
+
let orderId;
|
|
33
35
|
try {
|
|
34
36
|
expiryTimestamp = parseInt(license.match(expiryReg)[1], 10);
|
|
35
37
|
if (!expiryTimestamp || Number.isNaN(expiryTimestamp)) {
|
|
36
38
|
expiryTimestamp = null;
|
|
37
39
|
}
|
|
40
|
+
orderId = parseInt(license.match(orderReg)[1], 10);
|
|
41
|
+
if (!orderId || Number.isNaN(orderId)) {
|
|
42
|
+
orderId = null;
|
|
43
|
+
}
|
|
38
44
|
} catch (err) {
|
|
39
45
|
expiryTimestamp = null;
|
|
46
|
+
orderId = null;
|
|
40
47
|
}
|
|
41
48
|
return {
|
|
42
|
-
|
|
49
|
+
version: 1,
|
|
43
50
|
licenseModel: 'perpetual',
|
|
51
|
+
planScope: 'pro',
|
|
52
|
+
planVersion: 'initial',
|
|
44
53
|
expiryTimestamp,
|
|
45
|
-
|
|
54
|
+
expiryDate: expiryTimestamp ? new Date(expiryTimestamp) : null,
|
|
55
|
+
orderId
|
|
46
56
|
};
|
|
47
|
-
}
|
|
57
|
+
}
|
|
48
58
|
|
|
49
59
|
/**
|
|
50
60
|
* Format: O=${orderNumber},E=${expiryTimestamp},S=${planScope},LM=${licenseModel},PV=${planVersion},KV=2`;
|
|
51
61
|
*/
|
|
52
|
-
|
|
62
|
+
function decodeLicenseVersion2(license) {
|
|
53
63
|
const licenseInfo = {
|
|
54
|
-
|
|
64
|
+
version: 2,
|
|
55
65
|
licenseModel: null,
|
|
66
|
+
planScope: null,
|
|
67
|
+
planVersion: 'initial',
|
|
56
68
|
expiryTimestamp: null,
|
|
57
|
-
|
|
69
|
+
expiryDate: null,
|
|
70
|
+
orderId: null
|
|
58
71
|
};
|
|
59
72
|
license.split(',').map(token => token.split('=')).filter(el => el.length === 2).forEach(([key, value]) => {
|
|
60
73
|
if (key === 'S') {
|
|
@@ -67,19 +80,26 @@ const decodeLicenseVersion2 = license => {
|
|
|
67
80
|
const expiryTimestamp = parseInt(value, 10);
|
|
68
81
|
if (expiryTimestamp && !Number.isNaN(expiryTimestamp)) {
|
|
69
82
|
licenseInfo.expiryTimestamp = expiryTimestamp;
|
|
83
|
+
licenseInfo.expiryDate = new Date(expiryTimestamp);
|
|
70
84
|
}
|
|
71
85
|
}
|
|
72
86
|
if (key === 'PV') {
|
|
73
87
|
licenseInfo.planVersion = value;
|
|
74
88
|
}
|
|
89
|
+
if (key === 'O') {
|
|
90
|
+
const orderNum = parseInt(value, 10);
|
|
91
|
+
if (orderNum && !Number.isNaN(orderNum)) {
|
|
92
|
+
licenseInfo.orderId = orderNum;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
75
95
|
});
|
|
76
96
|
return licenseInfo;
|
|
77
|
-
}
|
|
97
|
+
}
|
|
78
98
|
|
|
79
99
|
/**
|
|
80
100
|
* Decode the license based on its key version and return a version-agnostic `MuiLicense` object.
|
|
81
101
|
*/
|
|
82
|
-
|
|
102
|
+
function decodeLicense(encodedLicense) {
|
|
83
103
|
const license = base64Decode(encodedLicense);
|
|
84
104
|
if (license.includes('KEYVERSION=1')) {
|
|
85
105
|
return decodeLicenseVersion1(license);
|
|
@@ -88,7 +108,7 @@ const decodeLicense = encodedLicense => {
|
|
|
88
108
|
return decodeLicenseVersion2(license);
|
|
89
109
|
}
|
|
90
110
|
return null;
|
|
91
|
-
}
|
|
111
|
+
}
|
|
92
112
|
export function verifyLicense({
|
|
93
113
|
releaseInfo,
|
|
94
114
|
licenseKey,
|
|
@@ -124,7 +144,7 @@ export function verifyLicense({
|
|
|
124
144
|
};
|
|
125
145
|
}
|
|
126
146
|
if (license.licenseModel == null || !LICENSE_MODELS.includes(license.licenseModel)) {
|
|
127
|
-
console.error('MUI X: Error checking license.
|
|
147
|
+
console.error('MUI X: Error checking license. License model not found or invalid!');
|
|
128
148
|
return {
|
|
129
149
|
status: LICENSE_STATUS.Invalid
|
|
130
150
|
};
|
package/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mui/x-license",
|
|
3
|
-
"version": "8.10.
|
|
3
|
+
"version": "8.10.1",
|
|
4
4
|
"author": "MUI Team",
|
|
5
5
|
"description": "MUI X License verification.",
|
|
6
6
|
"main": "./index.js",
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
},
|
|
11
11
|
"homepage": "https://mui.com/x/introduction/licensing/",
|
|
12
12
|
"sideEffects": [
|
|
13
|
-
"./utils/licenseInfo.js"
|
|
13
|
+
"./utils/licenseInfo.js",
|
|
14
|
+
"./esm/utils/licenseInfo.js"
|
|
14
15
|
],
|
|
15
16
|
"publishConfig": {
|
|
16
17
|
"access": "public"
|
|
@@ -22,9 +23,9 @@
|
|
|
22
23
|
},
|
|
23
24
|
"dependencies": {
|
|
24
25
|
"@babel/runtime": "^7.28.2",
|
|
25
|
-
"@mui/utils": "^7.
|
|
26
|
+
"@mui/utils": "^7.3.1",
|
|
26
27
|
"@mui/x-internals": "8.10.0",
|
|
27
|
-
"@mui/x-telemetry": "8.5.
|
|
28
|
+
"@mui/x-telemetry": "8.5.4"
|
|
28
29
|
},
|
|
29
30
|
"peerDependencies": {
|
|
30
31
|
"react": "^17.0.0 || ^18.0.0 || ^19.0.0"
|
|
@@ -32,31 +33,30 @@
|
|
|
32
33
|
"engines": {
|
|
33
34
|
"node": ">=14.0.0"
|
|
34
35
|
},
|
|
35
|
-
"
|
|
36
|
+
"type": "commonjs",
|
|
37
|
+
"types": "./index.d.ts",
|
|
36
38
|
"exports": {
|
|
37
39
|
"./package.json": "./package.json",
|
|
38
40
|
".": {
|
|
39
|
-
"require": {
|
|
40
|
-
"types": "./index.d.ts",
|
|
41
|
-
"default": "./index.js"
|
|
42
|
-
},
|
|
43
41
|
"import": {
|
|
44
42
|
"types": "./esm/index.d.ts",
|
|
45
43
|
"default": "./esm/index.js"
|
|
44
|
+
},
|
|
45
|
+
"require": {
|
|
46
|
+
"types": "./index.d.ts",
|
|
47
|
+
"default": "./index.js"
|
|
46
48
|
}
|
|
47
49
|
},
|
|
48
50
|
"./*": {
|
|
49
|
-
"require": {
|
|
50
|
-
"types": "./*/index.d.ts",
|
|
51
|
-
"default": "./*/index.js"
|
|
52
|
-
},
|
|
53
51
|
"import": {
|
|
54
52
|
"types": "./esm/*/index.d.ts",
|
|
55
53
|
"default": "./esm/*/index.js"
|
|
54
|
+
},
|
|
55
|
+
"require": {
|
|
56
|
+
"types": "./*/index.d.ts",
|
|
57
|
+
"default": "./*/index.js"
|
|
56
58
|
}
|
|
57
59
|
},
|
|
58
|
-
"./esm": null
|
|
59
|
-
|
|
60
|
-
},
|
|
61
|
-
"types": "./index.d.ts"
|
|
60
|
+
"./esm": null
|
|
61
|
+
}
|
|
62
62
|
}
|
package/utils/licenseInfo.d.ts
CHANGED
|
@@ -30,38 +30,51 @@ function isPlanScopeSufficient(packageName, planScope) {
|
|
|
30
30
|
return acceptedScopes.includes(planScope);
|
|
31
31
|
}
|
|
32
32
|
const expiryReg = /^.*EXPIRY=([0-9]+),.*$/;
|
|
33
|
+
const orderReg = /^.*ORDER:([0-9]+),.*$/;
|
|
33
34
|
const PRO_PACKAGES_AVAILABLE_IN_INITIAL_PRO_PLAN = ['x-data-grid-pro', 'x-date-pickers-pro'];
|
|
34
35
|
|
|
35
36
|
/**
|
|
36
37
|
* Format: ORDER:${orderNumber},EXPIRY=${expiryTimestamp},KEYVERSION=1
|
|
37
38
|
*/
|
|
38
|
-
|
|
39
|
+
function decodeLicenseVersion1(license) {
|
|
39
40
|
let expiryTimestamp;
|
|
41
|
+
let orderId;
|
|
40
42
|
try {
|
|
41
43
|
expiryTimestamp = parseInt(license.match(expiryReg)[1], 10);
|
|
42
44
|
if (!expiryTimestamp || Number.isNaN(expiryTimestamp)) {
|
|
43
45
|
expiryTimestamp = null;
|
|
44
46
|
}
|
|
47
|
+
orderId = parseInt(license.match(orderReg)[1], 10);
|
|
48
|
+
if (!orderId || Number.isNaN(orderId)) {
|
|
49
|
+
orderId = null;
|
|
50
|
+
}
|
|
45
51
|
} catch (err) {
|
|
46
52
|
expiryTimestamp = null;
|
|
53
|
+
orderId = null;
|
|
47
54
|
}
|
|
48
55
|
return {
|
|
49
|
-
|
|
56
|
+
version: 1,
|
|
50
57
|
licenseModel: 'perpetual',
|
|
58
|
+
planScope: 'pro',
|
|
59
|
+
planVersion: 'initial',
|
|
51
60
|
expiryTimestamp,
|
|
52
|
-
|
|
61
|
+
expiryDate: expiryTimestamp ? new Date(expiryTimestamp) : null,
|
|
62
|
+
orderId
|
|
53
63
|
};
|
|
54
|
-
}
|
|
64
|
+
}
|
|
55
65
|
|
|
56
66
|
/**
|
|
57
67
|
* Format: O=${orderNumber},E=${expiryTimestamp},S=${planScope},LM=${licenseModel},PV=${planVersion},KV=2`;
|
|
58
68
|
*/
|
|
59
|
-
|
|
69
|
+
function decodeLicenseVersion2(license) {
|
|
60
70
|
const licenseInfo = {
|
|
61
|
-
|
|
71
|
+
version: 2,
|
|
62
72
|
licenseModel: null,
|
|
73
|
+
planScope: null,
|
|
74
|
+
planVersion: 'initial',
|
|
63
75
|
expiryTimestamp: null,
|
|
64
|
-
|
|
76
|
+
expiryDate: null,
|
|
77
|
+
orderId: null
|
|
65
78
|
};
|
|
66
79
|
license.split(',').map(token => token.split('=')).filter(el => el.length === 2).forEach(([key, value]) => {
|
|
67
80
|
if (key === 'S') {
|
|
@@ -74,19 +87,26 @@ const decodeLicenseVersion2 = license => {
|
|
|
74
87
|
const expiryTimestamp = parseInt(value, 10);
|
|
75
88
|
if (expiryTimestamp && !Number.isNaN(expiryTimestamp)) {
|
|
76
89
|
licenseInfo.expiryTimestamp = expiryTimestamp;
|
|
90
|
+
licenseInfo.expiryDate = new Date(expiryTimestamp);
|
|
77
91
|
}
|
|
78
92
|
}
|
|
79
93
|
if (key === 'PV') {
|
|
80
94
|
licenseInfo.planVersion = value;
|
|
81
95
|
}
|
|
96
|
+
if (key === 'O') {
|
|
97
|
+
const orderNum = parseInt(value, 10);
|
|
98
|
+
if (orderNum && !Number.isNaN(orderNum)) {
|
|
99
|
+
licenseInfo.orderId = orderNum;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
82
102
|
});
|
|
83
103
|
return licenseInfo;
|
|
84
|
-
}
|
|
104
|
+
}
|
|
85
105
|
|
|
86
106
|
/**
|
|
87
107
|
* Decode the license based on its key version and return a version-agnostic `MuiLicense` object.
|
|
88
108
|
*/
|
|
89
|
-
|
|
109
|
+
function decodeLicense(encodedLicense) {
|
|
90
110
|
const license = (0, _base.base64Decode)(encodedLicense);
|
|
91
111
|
if (license.includes('KEYVERSION=1')) {
|
|
92
112
|
return decodeLicenseVersion1(license);
|
|
@@ -95,7 +115,7 @@ const decodeLicense = encodedLicense => {
|
|
|
95
115
|
return decodeLicenseVersion2(license);
|
|
96
116
|
}
|
|
97
117
|
return null;
|
|
98
|
-
}
|
|
118
|
+
}
|
|
99
119
|
function verifyLicense({
|
|
100
120
|
releaseInfo,
|
|
101
121
|
licenseKey,
|
|
@@ -131,7 +151,7 @@ function verifyLicense({
|
|
|
131
151
|
};
|
|
132
152
|
}
|
|
133
153
|
if (license.licenseModel == null || !_licenseModel.LICENSE_MODELS.includes(license.licenseModel)) {
|
|
134
|
-
console.error('MUI X: Error checking license.
|
|
154
|
+
console.error('MUI X: Error checking license. License model not found or invalid!');
|
|
135
155
|
return {
|
|
136
156
|
status: _licenseStatus.LICENSE_STATUS.Invalid
|
|
137
157
|
};
|