@atlaskit/media-common 13.1.0 → 13.3.0
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 +24 -0
- package/dist/cjs/analytics/sanitisePayload.js +2 -2
- package/dist/cjs/mediaTypeUtils/index.js +7 -0
- package/dist/cjs/mediaTypeUtils/isExcelFile.js +13 -0
- package/dist/cjs/utils/isValidUuid.js +27 -0
- package/dist/es2019/analytics/sanitisePayload.js +2 -2
- package/dist/es2019/mediaTypeUtils/index.js +1 -0
- package/dist/es2019/mediaTypeUtils/isExcelFile.js +5 -0
- package/dist/es2019/utils/isValidUuid.js +21 -0
- package/dist/esm/analytics/sanitisePayload.js +2 -2
- package/dist/esm/mediaTypeUtils/index.js +1 -0
- package/dist/esm/mediaTypeUtils/isExcelFile.js +7 -0
- package/dist/esm/utils/isValidUuid.js +21 -0
- package/dist/types/mediaTypeUtils/index.d.ts +1 -0
- package/dist/types/mediaTypeUtils/isExcelFile.d.ts +1 -0
- package/dist/types/utils/isValidUuid.d.ts +1 -0
- package/dist/types-ts4.5/mediaTypeUtils/index.d.ts +1 -0
- package/dist/types-ts4.5/mediaTypeUtils/isExcelFile.d.ts +1 -0
- package/dist/types-ts4.5/utils/isValidUuid.d.ts +1 -0
- package/isExcelFile/package.json +15 -0
- package/isValidUuid/package.json +15 -0
- package/package.json +2 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,29 @@
|
|
|
1
1
|
# @atlaskit/media-common
|
|
2
2
|
|
|
3
|
+
## 13.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`34c40eb233aa4`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/34c40eb233aa4) -
|
|
8
|
+
isUxChange: true
|
|
9
|
+
|
|
10
|
+
Lazy-append document pages for MS Excel previews behind platform_media_excel_lazy_load gate to fix
|
|
11
|
+
initial-render freeze on very large documents
|
|
12
|
+
|
|
13
|
+
## 13.2.0
|
|
14
|
+
|
|
15
|
+
### Minor Changes
|
|
16
|
+
|
|
17
|
+
- [`5653e8be24c05`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/5653e8be24c05) -
|
|
18
|
+
Replace `uuid-validate` with an inlined, browser-only `isValidUuid` helper in
|
|
19
|
+
`@atlaskit/media-common`. Removes the `uuid-validate` dependency from `media-card`,
|
|
20
|
+
`media-client`, `media-common` and `media-picker` so consumers no longer pull in the Node `Buffer`
|
|
21
|
+
polyfill purely for a `Buffer.isBuffer` check that always returned `false` in the browser.
|
|
22
|
+
|
|
23
|
+
Adds a new `@atlaskit/media-common/isValidUuid` subpath export so consumers can import the helper
|
|
24
|
+
without going through the package's barrel file (in line with the Debarreling Platform Packages
|
|
25
|
+
initiative).
|
|
26
|
+
|
|
3
27
|
## 13.1.0
|
|
4
28
|
|
|
5
29
|
### Minor Changes
|
|
@@ -6,11 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.sanitiseAnalyticsPayload = void 0;
|
|
8
8
|
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
9
|
-
var _uuidValidate = _interopRequireDefault(require("uuid-validate"));
|
|
10
9
|
var _immer = require("immer");
|
|
10
|
+
var _isValidUuid = require("../utils/isValidUuid");
|
|
11
11
|
var sanitiseFileId = function sanitiseFileId(draft) {
|
|
12
12
|
var fileId = draft.attributes.fileAttributes.fileId;
|
|
13
|
-
draft.attributes.fileAttributes.fileId = fileId === 'external-image' || (0,
|
|
13
|
+
draft.attributes.fileAttributes.fileId = fileId === 'external-image' || (0, _isValidUuid.isValidUuid)(fileId) ? fileId : 'INVALID_FILE_ID';
|
|
14
14
|
};
|
|
15
15
|
var hasFileAttributesWithFileId = function hasFileAttributesWithFileId(payload) {
|
|
16
16
|
return 'attributes' in payload && !!payload.attributes && (0, _typeof2.default)(payload.attributes) === 'object' && 'fileAttributes' in payload.attributes && !!payload.attributes.fileAttributes && (0, _typeof2.default)(payload.attributes.fileAttributes) === 'object' && 'fileId' in payload.attributes.fileAttributes && typeof payload.attributes.fileAttributes.fileId === 'string';
|
|
@@ -28,6 +28,12 @@ Object.defineProperty(exports, "isDocumentMimeTypeSupportedByServer", {
|
|
|
28
28
|
return _isMimeTypeSupportedByServer.isDocumentMimeTypeSupportedByServer;
|
|
29
29
|
}
|
|
30
30
|
});
|
|
31
|
+
Object.defineProperty(exports, "isExcelFile", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function get() {
|
|
34
|
+
return _isExcelFile.isExcelFile;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
31
37
|
Object.defineProperty(exports, "isImageMimeTypeSupportedByBrowser", {
|
|
32
38
|
enumerable: true,
|
|
33
39
|
get: function get() {
|
|
@@ -73,6 +79,7 @@ Object.defineProperty(exports, "isVideoMimeTypeSupportedByServer", {
|
|
|
73
79
|
var _isArchive = require("./isArchive");
|
|
74
80
|
var _isMimeTypeSupportedByBrowser = require("./isMimeTypeSupportedByBrowser");
|
|
75
81
|
var _isMimeTypeSupportedByServer = require("./isMimeTypeSupportedByServer");
|
|
82
|
+
var _isExcelFile = require("./isExcelFile");
|
|
76
83
|
var getMediaTypeFromMimeType = exports.getMediaTypeFromMimeType = function getMediaTypeFromMimeType(mimeType) {
|
|
77
84
|
if ((0, _isArchive.isArchive)(mimeType)) {
|
|
78
85
|
return 'archive';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isExcelFile = void 0;
|
|
7
|
+
// MS Excel MIME types — covers all native Microsoft spreadsheet formats.
|
|
8
|
+
// Stored in their canonical form (RFC 4288 mimetypes are case-sensitive;
|
|
9
|
+
// the media backend always sends them in this exact casing).
|
|
10
|
+
var EXCEL_MIME_TYPES = new Set(['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'application/vnd.ms-excel.sheet.macroEnabled.12']);
|
|
11
|
+
var isExcelFile = exports.isExcelFile = function isExcelFile(mimeType) {
|
|
12
|
+
return EXCEL_MIME_TYPES.has(mimeType);
|
|
13
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.isValidUuid = void 0;
|
|
7
|
+
var BASIC_UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
8
|
+
|
|
9
|
+
// Modified copy of `uuid-validate` package
|
|
10
|
+
var isValidUuid = exports.isValidUuid = function isValidUuid(value) {
|
|
11
|
+
if (typeof value !== 'string') {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
var normalizedValue = value.toLowerCase();
|
|
15
|
+
if (!BASIC_UUID_REGEX.test(normalizedValue)) {
|
|
16
|
+
return false;
|
|
17
|
+
}
|
|
18
|
+
var version = normalizedValue[14];
|
|
19
|
+
if (version === '1' || version === '2') {
|
|
20
|
+
return true;
|
|
21
|
+
}
|
|
22
|
+
if (version === '3' || version === '4' || version === '5') {
|
|
23
|
+
var variant = normalizedValue[19];
|
|
24
|
+
return variant === '8' || variant === '9' || variant === 'a' || variant === 'b';
|
|
25
|
+
}
|
|
26
|
+
return false;
|
|
27
|
+
};
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import isValidId from 'uuid-validate';
|
|
2
1
|
import { produce } from 'immer';
|
|
2
|
+
import { isValidUuid } from '../utils/isValidUuid';
|
|
3
3
|
const sanitiseFileId = draft => {
|
|
4
4
|
const {
|
|
5
5
|
fileId
|
|
6
6
|
} = draft.attributes.fileAttributes;
|
|
7
|
-
draft.attributes.fileAttributes.fileId = fileId === 'external-image' ||
|
|
7
|
+
draft.attributes.fileAttributes.fileId = fileId === 'external-image' || isValidUuid(fileId) ? fileId : 'INVALID_FILE_ID';
|
|
8
8
|
};
|
|
9
9
|
const hasFileAttributesWithFileId = payload => 'attributes' in payload && !!payload.attributes && typeof payload.attributes === 'object' && 'fileAttributes' in payload.attributes && !!payload.attributes.fileAttributes && typeof payload.attributes.fileAttributes === 'object' && 'fileId' in payload.attributes.fileAttributes && typeof payload.attributes.fileAttributes.fileId === 'string';
|
|
10
10
|
export const sanitiseAnalyticsPayload = payload => hasFileAttributesWithFileId(payload) ? produce(payload, sanitiseFileId) : payload;
|
|
@@ -2,6 +2,7 @@ import { isArchive } from './isArchive';
|
|
|
2
2
|
import { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser } from './isMimeTypeSupportedByBrowser';
|
|
3
3
|
import { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer } from './isMimeTypeSupportedByServer';
|
|
4
4
|
export { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser } from './isMimeTypeSupportedByBrowser';
|
|
5
|
+
export { isExcelFile } from './isExcelFile';
|
|
5
6
|
export { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './isMimeTypeSupportedByServer';
|
|
6
7
|
export const getMediaTypeFromMimeType = mimeType => {
|
|
7
8
|
if (isArchive(mimeType)) {
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
// MS Excel MIME types — covers all native Microsoft spreadsheet formats.
|
|
2
|
+
// Stored in their canonical form (RFC 4288 mimetypes are case-sensitive;
|
|
3
|
+
// the media backend always sends them in this exact casing).
|
|
4
|
+
const EXCEL_MIME_TYPES = new Set(['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'application/vnd.ms-excel.sheet.macroEnabled.12']);
|
|
5
|
+
export const isExcelFile = mimeType => EXCEL_MIME_TYPES.has(mimeType);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
const BASIC_UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
2
|
+
|
|
3
|
+
// Modified copy of `uuid-validate` package
|
|
4
|
+
export const isValidUuid = value => {
|
|
5
|
+
if (typeof value !== 'string') {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
const normalizedValue = value.toLowerCase();
|
|
9
|
+
if (!BASIC_UUID_REGEX.test(normalizedValue)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const version = normalizedValue[14];
|
|
13
|
+
if (version === '1' || version === '2') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (version === '3' || version === '4' || version === '5') {
|
|
17
|
+
const variant = normalizedValue[19];
|
|
18
|
+
return variant === '8' || variant === '9' || variant === 'a' || variant === 'b';
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import _typeof from "@babel/runtime/helpers/typeof";
|
|
2
|
-
import isValidId from 'uuid-validate';
|
|
3
2
|
import { produce } from 'immer';
|
|
3
|
+
import { isValidUuid } from '../utils/isValidUuid';
|
|
4
4
|
var sanitiseFileId = function sanitiseFileId(draft) {
|
|
5
5
|
var fileId = draft.attributes.fileAttributes.fileId;
|
|
6
|
-
draft.attributes.fileAttributes.fileId = fileId === 'external-image' ||
|
|
6
|
+
draft.attributes.fileAttributes.fileId = fileId === 'external-image' || isValidUuid(fileId) ? fileId : 'INVALID_FILE_ID';
|
|
7
7
|
};
|
|
8
8
|
var hasFileAttributesWithFileId = function hasFileAttributesWithFileId(payload) {
|
|
9
9
|
return 'attributes' in payload && !!payload.attributes && _typeof(payload.attributes) === 'object' && 'fileAttributes' in payload.attributes && !!payload.attributes.fileAttributes && _typeof(payload.attributes.fileAttributes) === 'object' && 'fileId' in payload.attributes.fileAttributes && typeof payload.attributes.fileAttributes.fileId === 'string';
|
|
@@ -2,6 +2,7 @@ import { isArchive } from './isArchive';
|
|
|
2
2
|
import { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser } from './isMimeTypeSupportedByBrowser';
|
|
3
3
|
import { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer } from './isMimeTypeSupportedByServer';
|
|
4
4
|
export { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser } from './isMimeTypeSupportedByBrowser';
|
|
5
|
+
export { isExcelFile } from './isExcelFile';
|
|
5
6
|
export { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer } from './isMimeTypeSupportedByServer';
|
|
6
7
|
export var getMediaTypeFromMimeType = function getMediaTypeFromMimeType(mimeType) {
|
|
7
8
|
if (isArchive(mimeType)) {
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
// MS Excel MIME types — covers all native Microsoft spreadsheet formats.
|
|
2
|
+
// Stored in their canonical form (RFC 4288 mimetypes are case-sensitive;
|
|
3
|
+
// the media backend always sends them in this exact casing).
|
|
4
|
+
var EXCEL_MIME_TYPES = new Set(['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/vnd.ms-excel.sheet.binary.macroEnabled.12', 'application/vnd.ms-excel.sheet.macroEnabled.12']);
|
|
5
|
+
export var isExcelFile = function isExcelFile(mimeType) {
|
|
6
|
+
return EXCEL_MIME_TYPES.has(mimeType);
|
|
7
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
var BASIC_UUID_REGEX = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
2
|
+
|
|
3
|
+
// Modified copy of `uuid-validate` package
|
|
4
|
+
export var isValidUuid = function isValidUuid(value) {
|
|
5
|
+
if (typeof value !== 'string') {
|
|
6
|
+
return false;
|
|
7
|
+
}
|
|
8
|
+
var normalizedValue = value.toLowerCase();
|
|
9
|
+
if (!BASIC_UUID_REGEX.test(normalizedValue)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
var version = normalizedValue[14];
|
|
13
|
+
if (version === '1' || version === '2') {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (version === '3' || version === '4' || version === '5') {
|
|
17
|
+
var variant = normalizedValue[19];
|
|
18
|
+
return variant === '8' || variant === '9' || variant === 'a' || variant === 'b';
|
|
19
|
+
}
|
|
20
|
+
return false;
|
|
21
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MediaType } from '..';
|
|
2
2
|
export { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, } from './isMimeTypeSupportedByBrowser';
|
|
3
|
+
export { isExcelFile } from './isExcelFile';
|
|
3
4
|
export { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer, } from './isMimeTypeSupportedByServer';
|
|
4
5
|
export declare const getMediaTypeFromMimeType: (mimeType: string) => MediaType;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isExcelFile: (mimeType: string) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isValidUuid: (value: unknown) => value is string;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type MediaType } from '..';
|
|
2
2
|
export { isImageMimeTypeSupportedByBrowser, isDocumentMimeTypeSupportedByBrowser, isAudioMimeTypeSupportedByBrowser, isVideoMimeTypeSupportedByBrowser, isMimeTypeSupportedByBrowser, } from './isMimeTypeSupportedByBrowser';
|
|
3
|
+
export { isExcelFile } from './isExcelFile';
|
|
3
4
|
export { isImageMimeTypeSupportedByServer, isDocumentMimeTypeSupportedByServer, isAudioMimeTypeSupportedByServer, isVideoMimeTypeSupportedByServer, isUnknownMimeTypeSupportedByServer, isMimeTypeSupportedByServer, } from './isMimeTypeSupportedByServer';
|
|
4
5
|
export declare const getMediaTypeFromMimeType: (mimeType: string) => MediaType;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isExcelFile: (mimeType: string) => boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const isValidUuid: (value: unknown) => value is string;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atlaskit/media-common/isExcelFile",
|
|
3
|
+
"main": "../dist/cjs/mediaTypeUtils/isExcelFile.js",
|
|
4
|
+
"module": "../dist/esm/mediaTypeUtils/isExcelFile.js",
|
|
5
|
+
"module:es2019": "../dist/es2019/mediaTypeUtils/isExcelFile.js",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"types": "../dist/types/mediaTypeUtils/isExcelFile.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
">=4.5 <5.9": {
|
|
10
|
+
"*": [
|
|
11
|
+
"../dist/types-ts4.5/mediaTypeUtils/isExcelFile.d.ts"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@atlaskit/media-common/isValidUuid",
|
|
3
|
+
"main": "../dist/cjs/utils/isValidUuid.js",
|
|
4
|
+
"module": "../dist/esm/utils/isValidUuid.js",
|
|
5
|
+
"module:es2019": "../dist/es2019/utils/isValidUuid.js",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"types": "../dist/types/utils/isValidUuid.d.ts",
|
|
8
|
+
"typesVersions": {
|
|
9
|
+
">=4.5 <5.9": {
|
|
10
|
+
"*": [
|
|
11
|
+
"../dist/types-ts4.5/utils/isValidUuid.d.ts"
|
|
12
|
+
]
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/media-common",
|
|
3
|
-
"version": "13.
|
|
3
|
+
"version": "13.3.0",
|
|
4
4
|
"description": "Includes common utilities used by other media packages",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -35,8 +35,7 @@
|
|
|
35
35
|
"@atlaskit/link": "^3.4.0",
|
|
36
36
|
"@atlaskit/section-message": "^8.12.0",
|
|
37
37
|
"@babel/runtime": "^7.0.0",
|
|
38
|
-
"immer": "11.1.4"
|
|
39
|
-
"uuid-validate": "^0.0.3"
|
|
38
|
+
"immer": "11.1.4"
|
|
40
39
|
},
|
|
41
40
|
"peerDependencies": {
|
|
42
41
|
"enzyme": ">=3.10.0",
|
|
@@ -49,7 +48,6 @@
|
|
|
49
48
|
}
|
|
50
49
|
},
|
|
51
50
|
"devDependencies": {
|
|
52
|
-
"@types/uuid-validate": "^0.0.2",
|
|
53
51
|
"enzyme": "^3.10.0",
|
|
54
52
|
"react": "^18.2.0",
|
|
55
53
|
"react-dom": "^18.2.0"
|