@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 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` [![pro](https://mui.com/r/x-pro-svg)](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` [![premium](https://mui.com/r/x-premium-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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` [![pro](https://mui.com/r/x-pro-svg)](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,2 @@
1
+ export * from "./base64.js";
2
+ export * from "./md5.js";
@@ -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
+ });
@@ -0,0 +1,2 @@
1
+ export * from "./base64.js";
2
+ export * from "./md5.js";
@@ -0,0 +1,2 @@
1
+ export * from "./base64.js";
2
+ export * from "./md5.js";
package/esm/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-license v8.10.0
2
+ * @mui/x-license v8.10.1
3
3
  *
4
4
  * @license SEE LICENSE IN LICENSE
5
5
  * This source code is licensed under the SEE LICENSE IN LICENSE license found in the
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"]}
@@ -4,6 +4,9 @@
4
4
  export interface MuiLicenseInfo {
5
5
  key: string | undefined;
6
6
  }
7
+ declare global {
8
+ var __MUI_LICENSE_INFO__: MuiLicenseInfo;
9
+ }
7
10
  export declare class LicenseInfo {
8
11
  private static getLicenseInfo;
9
12
  static getLicenseKey(): MuiLicenseInfo['key'];
@@ -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
- const decodeLicenseVersion1 = license => {
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
- planScope: 'pro',
49
+ version: 1,
43
50
  licenseModel: 'perpetual',
51
+ planScope: 'pro',
52
+ planVersion: 'initial',
44
53
  expiryTimestamp,
45
- planVersion: 'initial'
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
- const decodeLicenseVersion2 = license => {
62
+ function decodeLicenseVersion2(license) {
53
63
  const licenseInfo = {
54
- planScope: null,
64
+ version: 2,
55
65
  licenseModel: null,
66
+ planScope: null,
67
+ planVersion: 'initial',
56
68
  expiryTimestamp: null,
57
- planVersion: 'initial'
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
- const decodeLicense = encodedLicense => {
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. Licensing model not found or invalid!');
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
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @mui/x-license v8.10.0
2
+ * @mui/x-license v8.10.1
3
3
  *
4
4
  * @license SEE LICENSE IN LICENSE
5
5
  * This source code is licensed under the SEE LICENSE IN LICENSE license found in the
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mui/x-license",
3
- "version": "8.10.0",
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.2.0",
26
+ "@mui/utils": "^7.3.1",
26
27
  "@mui/x-internals": "8.10.0",
27
- "@mui/x-telemetry": "8.5.3"
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
- "private": false,
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
- "./modern": null
60
- },
61
- "types": "./index.d.ts"
60
+ "./esm": null
61
+ }
62
62
  }
@@ -4,6 +4,9 @@
4
4
  export interface MuiLicenseInfo {
5
5
  key: string | undefined;
6
6
  }
7
+ declare global {
8
+ var __MUI_LICENSE_INFO__: MuiLicenseInfo;
9
+ }
7
10
  export declare class LicenseInfo {
8
11
  private static getLicenseInfo;
9
12
  static getLicenseKey(): MuiLicenseInfo['key'];
@@ -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
- const decodeLicenseVersion1 = license => {
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
- planScope: 'pro',
56
+ version: 1,
50
57
  licenseModel: 'perpetual',
58
+ planScope: 'pro',
59
+ planVersion: 'initial',
51
60
  expiryTimestamp,
52
- planVersion: 'initial'
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
- const decodeLicenseVersion2 = license => {
69
+ function decodeLicenseVersion2(license) {
60
70
  const licenseInfo = {
61
- planScope: null,
71
+ version: 2,
62
72
  licenseModel: null,
73
+ planScope: null,
74
+ planVersion: 'initial',
63
75
  expiryTimestamp: null,
64
- planVersion: 'initial'
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
- const decodeLicense = encodedLicense => {
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. Licensing model not found or invalid!');
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
  };