Socket
Socket
Sign inDemoInstall

@mui/x-data-grid-pro

Package Overview
Dependencies
91
Maintainers
10
Versions
171
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 7.0.0-beta.4 to 7.0.0-beta.5

10

components/GridPinnedRows.js

@@ -33,6 +33,14 @@ "use strict";

const apiRef = (0, _internals.useGridPrivateApiContext)();
const renderContext = (0, _xDataGrid.useGridSelector)(apiRef, _internals.gridRenderContextSelector);
const pinnedRowsData = (0, _xDataGrid.useGridSelector)(apiRef, _internals.gridPinnedRowsSelector);
const rows = pinnedRowsData[position];
const pinnedRows = virtualScroller.getRows({
position,
rows: pinnedRowsData[position]
rows,
renderContext: React.useMemo(() => ({
firstRowIndex: 0,
lastRowIndex: rows.length,
firstColumnIndex: renderContext.firstColumnIndex,
lastColumnIndex: renderContext.lastColumnIndex
}), [rows, renderContext.firstColumnIndex, renderContext.lastColumnIndex])
});

@@ -39,0 +47,0 @@ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", (0, _extends2.default)({}, other, {

"use strict";
'use client';

@@ -3,0 +4,0 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");

@@ -8,3 +8,3 @@ import _extends from "@babel/runtime/helpers/esm/extends";

import { getDataGridUtilityClass, gridClasses, useGridSelector } from '@mui/x-data-grid';
import { gridPinnedRowsSelector, useGridPrivateApiContext } from '@mui/x-data-grid/internals';
import { gridPinnedRowsSelector, gridRenderContextSelector, useGridPrivateApiContext } from '@mui/x-data-grid/internals';
import { jsx as _jsx } from "react/jsx-runtime";

@@ -25,6 +25,14 @@ const useUtilityClasses = () => {

const apiRef = useGridPrivateApiContext();
const renderContext = useGridSelector(apiRef, gridRenderContextSelector);
const pinnedRowsData = useGridSelector(apiRef, gridPinnedRowsSelector);
const rows = pinnedRowsData[position];
const pinnedRows = virtualScroller.getRows({
position,
rows: pinnedRowsData[position]
rows,
renderContext: React.useMemo(() => ({
firstRowIndex: 0,
lastRowIndex: rows.length,
firstColumnIndex: renderContext.firstColumnIndex,
lastColumnIndex: renderContext.lastColumnIndex
}), [rows, renderContext.firstColumnIndex, renderContext.lastColumnIndex])
});

@@ -31,0 +39,0 @@ return /*#__PURE__*/_jsx("div", _extends({}, other, {

@@ -0,1 +1,3 @@

'use client';
import _extends from "@babel/runtime/helpers/esm/extends";

@@ -2,0 +4,0 @@ import * as React from 'react';

@@ -180,2 +180,3 @@ import _extends from "@babel/runtime/helpers/esm/extends";

const colDefRef = React.useRef();
const previousMouseClickEvent = React.useRef();
const columnHeaderElementRef = React.useRef();

@@ -256,2 +257,16 @@ const headerFilterElementRef = React.useRef();

stopListening();
// Prevent double-clicks from being interpreted as two separate clicks
if (previousMouseClickEvent.current) {
const prevEvent = previousMouseClickEvent.current;
const prevTimeStamp = prevEvent.timeStamp;
const prevClientX = prevEvent.clientX;
const prevClientY = prevEvent.clientY;
// Check if the current event is part of a double-click
if (nativeEvent.timeStamp - prevTimeStamp < 300 && nativeEvent.clientX === prevClientX && nativeEvent.clientY === prevClientY) {
previousMouseClickEvent.current = undefined;
return;
}
}
if (colDefRef.current) {

@@ -412,2 +427,3 @@ apiRef.current.setColumnWidth(colDefRef.current.field, colDefRef.current.width);

doc.body.style.cursor = 'col-resize';
previousMouseClickEvent.current = event.nativeEvent;
doc.addEventListener('mousemove', handleResizeMouseMove);

@@ -485,2 +501,12 @@ doc.addEventListener('mouseup', handleResizeMouseUp);

apiRef.current.updateColumns(newColumns);
newColumns.forEach((newColumn, index) => {
if (newColumn.width !== columns[index].width) {
const width = newColumn.width;
apiRef.current.publishEvent('columnWidthChange', {
element: apiRef.current.getColumnHeaderElement(newColumn.field),
colDef: newColumn,
width
});
}
});
} finally {

@@ -521,3 +547,6 @@ apiRef.current.unstable_setColumnVirtualization(true);

function updateProperty(element, property, delta) {
if (!element) {
return;
}
element.style[property] = `${parseInt(element.style[property], 10) + delta}px`;
}

53

esm/hooks/features/lazyLoader/useGridLazyLoader.js
import * as React from 'react';
import { useGridApiEventHandler, useGridSelector, gridSortModelSelector, gridFilterModelSelector, gridRenderContextSelector, useGridApiOptionHandler } from '@mui/x-data-grid';
import { useGridVisibleRows } from '@mui/x-data-grid/internals';
import { getVisibleRows } from '@mui/x-data-grid/internals';
function findSkeletonRowsSection({

@@ -40,6 +40,5 @@ apiRef,

lazyLoadingFeatureFlag,
rowsLoadingMode,
gridDimensions
rowsLoadingMode
}) {
if (!lazyLoadingFeatureFlag || !gridDimensions) {
if (!lazyLoadingFeatureFlag) {
return true;

@@ -61,3 +60,2 @@ }

var _props$experimentalFe;
const visibleRows = useGridVisibleRows(privateApiRef, props);
const sortModel = useGridSelector(privateApiRef, gridSortModelSelector);

@@ -72,9 +70,8 @@ const filterModel = useGridSelector(privateApiRef, gridFilterModelSelector);

} = (_props$experimentalFe = props.experimentalFeatures) != null ? _props$experimentalFe : {};
const isDisabled = isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode
});
const handleRenderedRowsIntervalChange = React.useCallback(params => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -91,6 +88,14 @@ }

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
if (sortModel.length === 0 && filterModel.items.length === 0) {
const currentVisibleRows = getVisibleRows(privateApiRef, {
pagination: props.pagination,
paginationMode: props.paginationMode
});
const skeletonRowsSection = findSkeletonRowsSection({
apiRef: privateApiRef,
visibleRows: visibleRows.rows,
visibleRows: currentVisibleRows.rows,
range: {

@@ -107,15 +112,6 @@ firstRowIndex: params.firstRowIndex,

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, filterModel, visibleRows.rows, lazyLoading]);
}, [privateApiRef, isDisabled, props.pagination, props.paginationMode, sortModel, filterModel]);
const handleGridSortModelChange = React.useCallback(newSortModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -132,10 +128,5 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, filterModel, lazyLoading]);
}, [privateApiRef, isDisabled, filterModel]);
const handleGridFilterModelChange = React.useCallback(newFilterModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -152,3 +143,3 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, lazyLoading]);
}, [privateApiRef, isDisabled, sortModel]);
useGridApiEventHandler(privateApiRef, 'renderedRowsIntervalChange', handleRenderedRowsIntervalChange);

@@ -155,0 +146,0 @@ useGridApiEventHandler(privateApiRef, 'sortModelChange', handleGridSortModelChange);

import { ponyfillGlobal } from '@mui/utils';
export const getReleaseInfo = () => {
const releaseInfo = "MTcwODYyODQwMDAwMA==";
const releaseInfo = "MTcwOTM1NTYwMDAwMA==";
if (process.env.NODE_ENV !== 'production') {

@@ -5,0 +5,0 @@ // A simple hack to set the value in the test environment (has no build step).

@@ -188,2 +188,3 @@ "use strict";

const colDefRef = React.useRef();
const previousMouseClickEvent = React.useRef();
const columnHeaderElementRef = React.useRef();

@@ -264,2 +265,16 @@ const headerFilterElementRef = React.useRef();

stopListening();
// Prevent double-clicks from being interpreted as two separate clicks
if (previousMouseClickEvent.current) {
const prevEvent = previousMouseClickEvent.current;
const prevTimeStamp = prevEvent.timeStamp;
const prevClientX = prevEvent.clientX;
const prevClientY = prevEvent.clientY;
// Check if the current event is part of a double-click
if (nativeEvent.timeStamp - prevTimeStamp < 300 && nativeEvent.clientX === prevClientX && nativeEvent.clientY === prevClientY) {
previousMouseClickEvent.current = undefined;
return;
}
}
if (colDefRef.current) {

@@ -419,2 +434,3 @@ apiRef.current.setColumnWidth(colDefRef.current.field, colDefRef.current.width);

doc.body.style.cursor = 'col-resize';
previousMouseClickEvent.current = event.nativeEvent;
doc.addEventListener('mousemove', handleResizeMouseMove);

@@ -488,2 +504,12 @@ doc.addEventListener('mouseup', handleResizeMouseUp);

apiRef.current.updateColumns(newColumns);
newColumns.forEach((newColumn, index) => {
if (newColumn.width !== columns[index].width) {
const width = newColumn.width;
apiRef.current.publishEvent('columnWidthChange', {
element: apiRef.current.getColumnHeaderElement(newColumn.field),
colDef: newColumn,
width
});
}
});
} finally {

@@ -522,3 +548,6 @@ apiRef.current.unstable_setColumnVirtualization(true);

function updateProperty(element, property, delta) {
if (!element) {
return;
}
element.style[property] = `${parseInt(element.style[property], 10) + delta}px`;
}

@@ -47,6 +47,5 @@ "use strict";

lazyLoadingFeatureFlag,
rowsLoadingMode,
gridDimensions
rowsLoadingMode
}) {
if (!lazyLoadingFeatureFlag || !gridDimensions) {
if (!lazyLoadingFeatureFlag) {
return true;

@@ -67,3 +66,2 @@ }

const useGridLazyLoader = (privateApiRef, props) => {
const visibleRows = (0, _internals.useGridVisibleRows)(privateApiRef, props);
const sortModel = (0, _xDataGrid.useGridSelector)(privateApiRef, _xDataGrid.gridSortModelSelector);

@@ -78,9 +76,8 @@ const filterModel = (0, _xDataGrid.useGridSelector)(privateApiRef, _xDataGrid.gridFilterModelSelector);

} = props.experimentalFeatures ?? {};
const isDisabled = isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode
});
const handleRenderedRowsIntervalChange = React.useCallback(params => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -97,6 +94,14 @@ }

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
if (sortModel.length === 0 && filterModel.items.length === 0) {
const currentVisibleRows = (0, _internals.getVisibleRows)(privateApiRef, {
pagination: props.pagination,
paginationMode: props.paginationMode
});
const skeletonRowsSection = findSkeletonRowsSection({
apiRef: privateApiRef,
visibleRows: visibleRows.rows,
visibleRows: currentVisibleRows.rows,
range: {

@@ -113,15 +118,6 @@ firstRowIndex: params.firstRowIndex,

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, filterModel, visibleRows.rows, lazyLoading]);
}, [privateApiRef, isDisabled, props.pagination, props.paginationMode, sortModel, filterModel]);
const handleGridSortModelChange = React.useCallback(newSortModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -138,10 +134,5 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, filterModel, lazyLoading]);
}, [privateApiRef, isDisabled, filterModel]);
const handleGridFilterModelChange = React.useCallback(newFilterModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -158,3 +149,3 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, lazyLoading]);
}, [privateApiRef, isDisabled, sortModel]);
(0, _xDataGrid.useGridApiEventHandler)(privateApiRef, 'renderedRowsIntervalChange', handleRenderedRowsIntervalChange);

@@ -161,0 +152,0 @@ (0, _xDataGrid.useGridApiEventHandler)(privateApiRef, 'sortModelChange', handleGridSortModelChange);

/**
* @mui/x-data-grid-pro v7.0.0-beta.4
* @mui/x-data-grid-pro v7.0.0-beta.5
*

@@ -4,0 +4,0 @@ * @license MUI X Commercial

@@ -8,3 +8,3 @@ import _extends from "@babel/runtime/helpers/esm/extends";

import { getDataGridUtilityClass, gridClasses, useGridSelector } from '@mui/x-data-grid';
import { gridPinnedRowsSelector, useGridPrivateApiContext } from '@mui/x-data-grid/internals';
import { gridPinnedRowsSelector, gridRenderContextSelector, useGridPrivateApiContext } from '@mui/x-data-grid/internals';
import { jsx as _jsx } from "react/jsx-runtime";

@@ -25,6 +25,14 @@ const useUtilityClasses = () => {

const apiRef = useGridPrivateApiContext();
const renderContext = useGridSelector(apiRef, gridRenderContextSelector);
const pinnedRowsData = useGridSelector(apiRef, gridPinnedRowsSelector);
const rows = pinnedRowsData[position];
const pinnedRows = virtualScroller.getRows({
position,
rows: pinnedRowsData[position]
rows,
renderContext: React.useMemo(() => ({
firstRowIndex: 0,
lastRowIndex: rows.length,
firstColumnIndex: renderContext.firstColumnIndex,
lastColumnIndex: renderContext.lastColumnIndex
}), [rows, renderContext.firstColumnIndex, renderContext.lastColumnIndex])
});

@@ -31,0 +39,0 @@ return /*#__PURE__*/_jsx("div", _extends({}, other, {

@@ -0,1 +1,3 @@

'use client';
import _extends from "@babel/runtime/helpers/esm/extends";

@@ -2,0 +4,0 @@ import * as React from 'react';

@@ -178,2 +178,3 @@ import _extends from "@babel/runtime/helpers/esm/extends";

const colDefRef = React.useRef();
const previousMouseClickEvent = React.useRef();
const columnHeaderElementRef = React.useRef();

@@ -254,2 +255,16 @@ const headerFilterElementRef = React.useRef();

stopListening();
// Prevent double-clicks from being interpreted as two separate clicks
if (previousMouseClickEvent.current) {
const prevEvent = previousMouseClickEvent.current;
const prevTimeStamp = prevEvent.timeStamp;
const prevClientX = prevEvent.clientX;
const prevClientY = prevEvent.clientY;
// Check if the current event is part of a double-click
if (nativeEvent.timeStamp - prevTimeStamp < 300 && nativeEvent.clientX === prevClientX && nativeEvent.clientY === prevClientY) {
previousMouseClickEvent.current = undefined;
return;
}
}
if (colDefRef.current) {

@@ -409,2 +424,3 @@ apiRef.current.setColumnWidth(colDefRef.current.field, colDefRef.current.width);

doc.body.style.cursor = 'col-resize';
previousMouseClickEvent.current = event.nativeEvent;
doc.addEventListener('mousemove', handleResizeMouseMove);

@@ -478,2 +494,12 @@ doc.addEventListener('mouseup', handleResizeMouseUp);

apiRef.current.updateColumns(newColumns);
newColumns.forEach((newColumn, index) => {
if (newColumn.width !== columns[index].width) {
const width = newColumn.width;
apiRef.current.publishEvent('columnWidthChange', {
element: apiRef.current.getColumnHeaderElement(newColumn.field),
colDef: newColumn,
width
});
}
});
} finally {

@@ -511,3 +537,6 @@ apiRef.current.unstable_setColumnVirtualization(true);

function updateProperty(element, property, delta) {
if (!element) {
return;
}
element.style[property] = `${parseInt(element.style[property], 10) + delta}px`;
}
import * as React from 'react';
import { useGridApiEventHandler, useGridSelector, gridSortModelSelector, gridFilterModelSelector, gridRenderContextSelector, useGridApiOptionHandler } from '@mui/x-data-grid';
import { useGridVisibleRows } from '@mui/x-data-grid/internals';
import { getVisibleRows } from '@mui/x-data-grid/internals';
function findSkeletonRowsSection({

@@ -39,6 +39,5 @@ apiRef,

lazyLoadingFeatureFlag,
rowsLoadingMode,
gridDimensions
rowsLoadingMode
}) {
if (!lazyLoadingFeatureFlag || !gridDimensions) {
if (!lazyLoadingFeatureFlag) {
return true;

@@ -59,3 +58,2 @@ }

export const useGridLazyLoader = (privateApiRef, props) => {
const visibleRows = useGridVisibleRows(privateApiRef, props);
const sortModel = useGridSelector(privateApiRef, gridSortModelSelector);

@@ -70,9 +68,8 @@ const filterModel = useGridSelector(privateApiRef, gridFilterModelSelector);

} = props.experimentalFeatures ?? {};
const isDisabled = isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode
});
const handleRenderedRowsIntervalChange = React.useCallback(params => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -89,6 +86,14 @@ }

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
if (sortModel.length === 0 && filterModel.items.length === 0) {
const currentVisibleRows = getVisibleRows(privateApiRef, {
pagination: props.pagination,
paginationMode: props.paginationMode
});
const skeletonRowsSection = findSkeletonRowsSection({
apiRef: privateApiRef,
visibleRows: visibleRows.rows,
visibleRows: currentVisibleRows.rows,
range: {

@@ -105,15 +110,6 @@ firstRowIndex: params.firstRowIndex,

}
renderedRowsIntervalCache.current = {
firstRowToRender: params.firstRowIndex,
lastRowToRender: params.lastRowIndex
};
privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, filterModel, visibleRows.rows, lazyLoading]);
}, [privateApiRef, isDisabled, props.pagination, props.paginationMode, sortModel, filterModel]);
const handleGridSortModelChange = React.useCallback(newSortModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -130,10 +126,5 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, filterModel, lazyLoading]);
}, [privateApiRef, isDisabled, filterModel]);
const handleGridFilterModelChange = React.useCallback(newFilterModel => {
const dimensions = privateApiRef.current.getRootDimensions();
if (isLazyLoadingDisabled({
lazyLoadingFeatureFlag: lazyLoading,
rowsLoadingMode: props.rowsLoadingMode,
gridDimensions: dimensions
})) {
if (isDisabled) {
return;

@@ -150,3 +141,3 @@ }

privateApiRef.current.publishEvent('fetchRows', fetchRowsParams);
}, [privateApiRef, props.rowsLoadingMode, sortModel, lazyLoading]);
}, [privateApiRef, isDisabled, sortModel]);
useGridApiEventHandler(privateApiRef, 'renderedRowsIntervalChange', handleRenderedRowsIntervalChange);

@@ -153,0 +144,0 @@ useGridApiEventHandler(privateApiRef, 'sortModelChange', handleGridSortModelChange);

/**
* @mui/x-data-grid-pro v7.0.0-beta.4
* @mui/x-data-grid-pro v7.0.0-beta.5
*

@@ -4,0 +4,0 @@ * @license MUI X Commercial

import { ponyfillGlobal } from '@mui/utils';
export const getReleaseInfo = () => {
const releaseInfo = "MTcwODYyODQwMDAwMA==";
const releaseInfo = "MTcwOTM1NTYwMDAwMA==";
if (process.env.NODE_ENV !== 'production') {

@@ -5,0 +5,0 @@ // A simple hack to set the value in the test environment (has no build step).

{
"name": "@mui/x-data-grid-pro",
"version": "7.0.0-beta.4",
"version": "7.0.0-beta.5",
"description": "The Pro plan edition of the data grid component (MUI X).",

@@ -38,3 +38,3 @@ "author": "MUI Team",

"@mui/utils": "^5.15.9",
"@mui/x-data-grid": "7.0.0-beta.4",
"@mui/x-data-grid": "7.0.0-beta.5",
"@mui/x-license": "7.0.0-beta.2",

@@ -41,0 +41,0 @@ "@types/format-util": "^1.0.4",

@@ -9,3 +9,3 @@ "use strict";

const getReleaseInfo = () => {
const releaseInfo = "MTcwODYyODQwMDAwMA==";
const releaseInfo = "MTcwOTM1NTYwMDAwMA==";
if (process.env.NODE_ENV !== 'production') {

@@ -12,0 +12,0 @@ // A simple hack to set the value in the test environment (has no build step).

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc