Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@syncfusion/ej2-treegrid

Package Overview
Dependencies
Maintainers
3
Versions
240
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@syncfusion/ej2-treegrid - npm Package Compare versions

Comparing version 18.3.47 to 18.3.48

13

CHANGELOG.md

@@ -9,2 +9,15 @@ # Changelog

- `#F158886` - Cell editing with frozen columns works fine.
- `#299761` - Treegrid column width renders fine in Internet Explorer when Virtualization is enabled.
#### New Features
- `#293514` - Provided the Cell Editing support for Remote Data Binding.
## 18.3.47 (2020-11-05)
### TreeGrid
#### Bug Fixes
- `#F159016` - Expand / Collapse works properly, when we use template column as treecolumn

@@ -11,0 +24,0 @@ - `#299693` - Template in tree column works fine.

2

dist/global/index.d.ts
/*!
* filename: index.d.ts
* version : 18.3.47
* version : 18.3.48
* Copyright Syncfusion Inc. 2001 - 2020. All rights reserved.

@@ -5,0 +5,0 @@ * Use of this code is subject to the terms of our license.

{
"_from": "@syncfusion/ej2-treegrid@*",
"_id": "@syncfusion/ej2-treegrid@18.3.44",
"_id": "@syncfusion/ej2-treegrid@18.3.47",
"_inBundle": false,
"_integrity": "sha512-tpVOdJvw/Rnpy1jroC9tFc35qwb/e/25JOdI7Ls4Mu8Ov/UfXB/DTkiSUSFXoZTjJUwb73uykUBf/KyzRoP2kg==",
"_integrity": "sha512-kakIOOXUnLg84E68lIp1E1uSktcQbFE6EC0hMhaJlfXlHkkeT0oMGTEB9GLM3Q3xvk0E8GHFfXxRj5H+nZm4tg==",
"_location": "/@syncfusion/ej2-treegrid",

@@ -27,4 +27,4 @@ "_phantomChildren": {},

],
"_resolved": "http://nexus.syncfusion.com/repository/ej2-hotfix/@syncfusion/ej2-treegrid/-/ej2-treegrid-18.3.44.tgz",
"_shasum": "ed70ac0bbd107d3ac3f73fb4fab095d38cee82af",
"_resolved": "http://nexus.syncfusion.com/repository/ej2-hotfix/@syncfusion/ej2-treegrid/-/ej2-treegrid-18.3.47.tgz",
"_shasum": "f21110fe8cc0e5274255977eb98681809e8d12aa",
"_spec": "@syncfusion/ej2-treegrid@*",

@@ -40,5 +40,5 @@ "_where": "/jenkins/workspace/automation_release_18.1.0.1-52JLNOGRCDHXRVQM3W564VPLFCPHWUYDYU3I3DVRABSR7F6AIFYQ/packages/included",

"dependencies": {
"@syncfusion/ej2-base": "~18.3.47",
"@syncfusion/ej2-base": "~18.3.48",
"@syncfusion/ej2-data": "~18.3.47",
"@syncfusion/ej2-grids": "~18.3.47",
"@syncfusion/ej2-grids": "~18.3.48",
"@syncfusion/ej2-popups": "~18.3.47"

@@ -65,4 +65,4 @@ },

"typings": "index.d.ts",
"version": "18.3.47",
"version": "18.3.48",
"sideEffects": false
}

@@ -8,2 +8,3 @@ /**

* The `Clipboard` module is used to handle clipboard copy action.
* @hidden
*/

@@ -10,0 +11,0 @@ export declare class TreeClipboard extends GridClipboard {

@@ -19,2 +19,3 @@ var __extends = (this && this.__extends) || (function () {

* The `Clipboard` module is used to handle clipboard copy action.
* @hidden
*/

@@ -21,0 +22,0 @@ var TreeClipboard = /** @class */ (function (_super) {

@@ -64,3 +64,5 @@ import { Column } from '@syncfusion/ej2-grids';

private batchCancel;
private customCellSave;
private cellSave;
private afterCellSave;
private lastCellTab;

@@ -67,0 +69,0 @@ private blazorTemplates;

@@ -7,3 +7,3 @@ import { Grid, Edit as GridEdit, getUid, getObject } from '@syncfusion/ej2-grids';

import { DataManager, RemoteSaveAdaptor } from '@syncfusion/ej2-data';
import { findChildrenRecords, getParentData, isRemoteData } from '../utils';
import { findChildrenRecords, getParentData, isCountRequired, isRemoteData } from '../utils';
import { editAction, updateParentRow } from './crud-actions';

@@ -56,2 +56,3 @@ import { BatchEdit } from './batch-edit';

this.parent.grid.on('dblclick', this.gridDblClick, this);
this.parent.grid.on('recordAdded', this.customCellSave, this);
this.parent.on('savePreviousRowPosition', this.savePreviousRowPosition, this);

@@ -98,2 +99,3 @@ // this.parent.on(events.beforeDataBound, this.beforeDataBound, this);

this.parent.off('actionComplete', this.editActionEvents);
this.parent.grid.off('recordAdded', this.customCellSave);
this.parent.grid.off(events.doubleTap, this.recordDoubleClick);

@@ -220,3 +222,3 @@ this.parent.off('savePreviousRowPosition', this.savePreviousRowPosition);

if (this.doubleClickTarget && (this.doubleClickTarget.classList.contains('e-treegridexpand') ||
this.doubleClickTarget.classList.contains('e-treegridcollapse'))) {
this.doubleClickTarget.classList.contains('e-treegridcollapse') || this.doubleClickTarget.classList.contains('e-summarycell'))) {
args.cancel = true;

@@ -249,10 +251,3 @@ this.doubleClickTarget = null;

var cellDetails = getValue('editModule.cellDetails', this.parent.grid.editModule);
var selectRowIndex = cellDetails.rowIndex;
var treeCell = void 0;
if (this.parent.allowRowDragAndDrop === true && !(this.parent.rowDropSettings.targetID)) {
treeCell = this.parent.getRows()[selectRowIndex].cells[this.parent.treeColumnIndex + 1];
}
else {
treeCell = this.parent.getRows()[selectRowIndex].cells[this.parent.treeColumnIndex];
}
var treeCell = this.parent.getCellFromIndex(cellDetails.rowIndex, this.parent.treeColumnIndex);
this.parent.renderModule.cellRender({

@@ -270,3 +265,10 @@ data: cellDetails.rowData,

};
Edit.prototype.customCellSave = function (args) {
if (isCountRequired(this.parent) && this.parent.editSettings.mode === 'Cell' && args.action === 'edit') {
this.updateCell(args, args.rowIndex);
this.afterCellSave(args, args.row, args.rowIndex);
}
};
Edit.prototype.cellSave = function (args) {
var _this = this;
if (this.parent.editSettings.mode === 'Cell' && this.parent.element.querySelector('form')) {

@@ -278,13 +280,12 @@ args.cancel = true;

args.rowData[args.columnName] = args.value;
var row = void 0;
var mRow = void 0;
var row_1;
if (isNullOrUndefined(args.cell)) {
row = this.parent.grid.editModule[editModule].form.parentElement.parentNode;
row_1 = this.parent.grid.editModule[editModule].form.parentElement.parentNode;
}
else {
row = args.cell.parentNode;
row_1 = args.cell.parentNode;
}
var rowIndex_1;
var primaryKeys_1 = this.parent.getPrimaryKeyFieldNames();
if (isNullOrUndefined(row)) {
if (isNullOrUndefined(row_1)) {
this.parent.grid.getCurrentViewRecords().filter(function (e, i) {

@@ -298,4 +299,4 @@ if (e[primaryKeys_1[0]] === args.rowData[primaryKeys_1[0]]) {

else {
rowIndex_1 = (this.parent.getRows().indexOf(row) === -1 && this.parent.frozenColumns > 0) ?
this.parent.grid.getMovableRows().indexOf(row) : this.parent.getRows().indexOf(row);
rowIndex_1 = (this.parent.getRows().indexOf(row_1) === -1 && (this.parent.getFrozenColumns() > 0)) ?
this.parent.grid.getMovableRows().indexOf(row_1) : this.parent.getRows().indexOf(row_1);
}

@@ -306,37 +307,35 @@ var arg = {};

arg.type = 'save';
row = this.parent.grid.getRows()[row.rowIndex];
row_1 = this.parent.grid.getRows()[row_1.rowIndex];
this.parent.trigger(events.actionBegin, arg);
if (!arg.cancel) {
if ((row.rowIndex === this.parent.getCurrentViewRecords().length - 1) && this.keyPress === 'tab') {
if ((row_1.rowIndex === this.parent.getCurrentViewRecords().length - 1) && this.keyPress === 'tab') {
this.isTabLastRow = true;
}
this.blazorTemplates(args);
this.updateCell(args, rowIndex_1);
if (this.parent.grid.aggregateModule) {
this.parent.grid.aggregateModule.refresh(args.rowData);
if (!isRemoteData(this.parent) &&
!(this.parent.dataSource instanceof DataManager && this.parent.dataSource.adaptor instanceof RemoteSaveAdaptor)) {
if (isCountRequired(this.parent)) {
var eventPromise = 'eventPromise';
var editArgs = { requestType: 'save', data: args.rowData, action: 'edit', row: row_1,
rowIndex: rowIndex_1, rowData: args.rowData, columnName: args.columnName,
filterChoiceCount: null, excelSearchOperator: null };
this.parent.grid.getDataModule()[eventPromise](editArgs, this.parent.grid.query);
}
else {
this.updateCell(args, rowIndex_1);
this.afterCellSave(args, row_1, rowIndex_1);
}
}
this.parent.grid.editModule.destroyWidgets([this.parent.grid.getColumnByField(args.columnName)]);
this.parent.grid.editModule.formObj.destroy();
if (this.keyPress !== 'tab' && this.keyPress !== 'shiftTab') {
this.updateGridEditMode('Normal');
this.isOnBatch = false;
else if (isRemoteData(this.parent) ||
(this.parent.dataSource instanceof DataManager && this.parent.dataSource.adaptor instanceof RemoteSaveAdaptor)) {
var query = this.parent.grid.query;
var crud = this.parent.grid.dataSource.update(primaryKeys_1[0], args.rowData, query.fromTable, query, args.previousValue);
crud.then(function (e) {
if (!isNullOrUndefined(e)) {
args.rowData[args.columnName] = e[args.columnName];
}
_this.updateCell(args, rowIndex_1);
_this.afterCellSave(args, row_1, rowIndex_1);
});
}
this.enableToolbarItems('save');
if (this.parent.frozenColumns > 0) {
mRow = this.parent.grid.getMovableRows()[rowIndex_1];
removeClass([mRow], ['e-editedrow', 'e-batchrow']);
removeClass(mRow.querySelectorAll('.e-rowcell'), ['e-editedbatchcell', 'e-updatedtd']);
}
removeClass([row], ['e-editedrow', 'e-batchrow']);
removeClass(row.querySelectorAll('.e-rowcell'), ['e-editedbatchcell', 'e-updatedtd']);
this.parent.grid.focusModule.restoreFocus();
editAction({ value: args.rowData, action: 'edit' }, this.parent, this.isSelfReference, this.addRowIndex, this.selectedIndex, args.columnName);
if ((row.rowIndex === this.parent.getCurrentViewRecords().length - 1) && this.keyPress === 'enter') {
this.keyPress = null;
}
var saveArgs = {
type: 'save', column: this.parent.getColumnByField(args.columnName), data: args.rowData,
previousData: args.previousValue, row: row, target: args.cell
};
this.parent.trigger(events.actionComplete, saveArgs);
}

@@ -348,2 +347,32 @@ else {

};
Edit.prototype.afterCellSave = function (args, row, rowIndex) {
var mRow;
if (this.parent.grid.aggregateModule) {
this.parent.grid.aggregateModule.refresh(args.rowData);
}
this.parent.grid.editModule.destroyWidgets([this.parent.grid.getColumnByField(args.columnName)]);
this.parent.grid.editModule.formObj.destroy();
if (this.keyPress !== 'tab' && this.keyPress !== 'shiftTab') {
this.updateGridEditMode('Normal');
this.isOnBatch = false;
}
this.enableToolbarItems('save');
if (this.parent.getFrozenColumns() > 0) {
mRow = this.parent.grid.getMovableRows()[rowIndex];
removeClass([mRow], ['e-editedrow', 'e-batchrow']);
removeClass(mRow.querySelectorAll('.e-rowcell'), ['e-editedbatchcell', 'e-updatedtd']);
}
removeClass([row], ['e-editedrow', 'e-batchrow']);
removeClass(row.querySelectorAll('.e-rowcell'), ['e-editedbatchcell', 'e-updatedtd']);
this.parent.grid.focusModule.restoreFocus();
editAction({ value: args.rowData, action: 'edit' }, this.parent, this.isSelfReference, this.addRowIndex, this.selectedIndex, args.columnName);
if ((row.rowIndex === this.parent.getCurrentViewRecords().length - 1) && this.keyPress === 'enter') {
this.keyPress = null;
}
var saveArgs = {
type: 'save', column: this.parent.getColumnByField(args.columnName), data: args.rowData,
previousData: args.previousValue, row: row, target: args.cell
};
this.parent.trigger(events.actionComplete, saveArgs);
};
Edit.prototype.lastCellTab = function (formObj) {

@@ -350,0 +379,0 @@ if (!this.parent.grid.isEdit && this.isOnBatch && this.keyPress === 'tab' && this.parent.editSettings.mode === 'Cell') {

@@ -224,3 +224,3 @@ import { Component, addClass, createElement, EventHandler, isNullOrUndefined, Ajax, ModuleDeclaration, extend} from '@syncfusion/ej2-base';import { removeClass, EmitType, Complex, Collection, KeyboardEventArgs, isBlazor, getElement, getValue } from '@syncfusion/ej2-base';import {Event, Property, NotifyPropertyChanges, INotifyPropertyChanged, setValue, KeyboardEvents, L10n } from '@syncfusion/ej2-base';import { Column, ColumnModel } from '../models/column';import { BeforeBatchSaveArgs, BeforeBatchAddArgs, BatchDeleteArgs, BeforeBatchDeleteArgs } from '@syncfusion/ej2-grids';import { GridModel, ColumnQueryModeType, HeaderCellInfoEventArgs, EditSettingsModel as GridEditModel } from '@syncfusion/ej2-grids';import {RowDragEventArgs, RowDropEventArgs, RowDropSettingsModel, RowDropSettings, ReturnType, getUid } from '@syncfusion/ej2-grids';import { ActionEventArgs } from'@syncfusion/ej2-grids';import { DetailDataBoundEventArgs, Row, ClipMode, ColumnChooser} from '@syncfusion/ej2-grids';import { SearchEventArgs, AddEventArgs, EditEventArgs, DeleteEventArgs} from '@syncfusion/ej2-grids';import { SaveEventArgs, CellSaveArgs, BatchAddArgs, BatchCancelArgs, BeginEditArgs, CellEditArgs} from '@syncfusion/ej2-grids';import { FilterSettings } from '../models/filter-settings';import { TextWrapSettings } from '../models/textwrap-settings';import { TextWrapSettingsModel } from '../models/textwrap-settings-model';import {Filter} from '../actions/filter';import { Logger as TreeLogger } from '../actions/logger';import { gridObserver, BeforeCopyEventArgs, BeforePasteEventArgs } from '@syncfusion/ej2-grids';import { TreeClipboard } from '../actions/clipboard';import {Aggregate} from '../actions/summary';import { Reorder } from '../actions/reorder';import { Resize } from '../actions/resize';import { Selection as TreeGridSelection } from '../actions/selection';import { ColumnMenu } from '../actions/column-menu';import { DetailRow } from '../actions/detail-row';import { Freeze } from '../actions/freeze-column';import { Print } from '../actions/print';import * as events from '../base/constant';import { FilterSettingsModel } from '../models/filter-settings-model';import { SearchSettings} from '../models/search-settings';import { SearchSettingsModel } from '../models/search-settings-model';import {RowInfo, RowDataBoundEventArgs, PageEventArgs, FilterEventArgs, FailureEventArgs, SortEventArgs } from '@syncfusion/ej2-grids';import { RowSelectingEventArgs, RowSelectEventArgs, RowDeselectEventArgs, IIndex, ISelectedCell } from '@syncfusion/ej2-grids';import {ColumnModel as GridColumnModel, Column as GridColumn, CellSelectEventArgs, CellDeselectEventArgs } from '@syncfusion/ej2-grids';import { SelectionSettings } from '../models/selection-settings';import { SelectionSettingsModel } from '../models/selection-settings-model';import {getActualProperties, SortDirection, getObject, ColumnDragEventArgs } from '@syncfusion/ej2-grids';import { PrintMode, Data, IGrid, ContextMenuItemModel } from '@syncfusion/ej2-grids';import { ColumnMenuItem, ColumnMenuItemModel, CheckBoxChangeEventArgs } from '@syncfusion/ej2-grids';import { ExcelExportCompleteArgs, ExcelHeaderQueryCellInfoEventArgs, ExcelQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { PdfExportCompleteArgs, PdfHeaderQueryCellInfoEventArgs, PdfQueryCellInfoEventArgs } from '@syncfusion/ej2-grids';import { ExcelExportProperties, PdfExportProperties, CellSelectingEventArgs, PrintEventArgs } from '@syncfusion/ej2-grids';import { ColumnMenuOpenEventArgs } from '@syncfusion/ej2-grids';import {BeforeDataBoundArgs} from '@syncfusion/ej2-grids';import { DataManager, ReturnOption, RemoteSaveAdaptor, Query, JsonAdaptor, Deferred } from '@syncfusion/ej2-data';import { createSpinner, hideSpinner, showSpinner, Dialog } from '@syncfusion/ej2-popups';import { isRemoteData, isOffline, extendArray, isCountRequired } from '../utils';import { Grid, QueryCellInfoEventArgs, Logger } from '@syncfusion/ej2-grids';import { Render } from '../renderer/render';import { VirtualTreeContentRenderer } from '../renderer/virtual-tree-content-render';import { DataManipulation } from './data';import { RowDD } from '../actions/rowdragdrop';import { Sort } from '../actions/sort';import { ITreeData, RowExpandedEventArgs, RowCollapsedEventArgs, RowCollapsingEventArgs } from './interface';import { CellSaveEventArgs, DataStateChangeEventArgs, RowExpandingEventArgs } from './interface';import { iterateArrayOrObject, GridLine } from '@syncfusion/ej2-grids';import { DataSourceChangedEventArgs, RecordDoubleClickEventArgs, ResizeArgs } from '@syncfusion/ej2-grids';import { ToolbarItems, ToolbarItem, ContextMenuItem, ContextMenuItems, RowPosition, CopyHierarchyType } from '../enum';import { ItemModel, ClickEventArgs, BeforeOpenCloseMenuEventArgs, MenuEventArgs } from '@syncfusion/ej2-navigations';import { PageSettings } from '../models/page-settings';import { PageSettingsModel } from '../models/page-settings-model';import { AggregateRow } from '../models/summary';import { AggregateRowModel } from '../models/summary-model';import { ExcelExport } from '../actions/excel-export';import { PdfExport } from '../actions/pdf-export';import { Toolbar } from '../actions/toolbar';import { Page } from '../actions/page';import { ContextMenu } from '../actions/context-menu';import { EditSettings } from '../models/edit-settings';import { EditSettingsModel } from '../models/edit-settings-model';import { Edit} from '../actions/edit';import { SortSettings } from '../models/sort-settings';import { SortSettingsModel } from '../models/sort-settings-model';import { isHidden } from '../utils';

* Configures the TreeGrid aggregate rows.
* > Check the [`Aggregates`](../../treegrid/aggregates/) for its configuration.
* > Check the [`Aggregates`](../../treegrid/aggregate/) for its configuration.
* @default []

@@ -248,3 +248,4 @@ */

*
* > It accepts either the [template string](../../common/template-engine/) or the HTML element ID.
* > It accepts either the [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
* or the HTML element ID.
*

@@ -345,3 +346,4 @@ */

* By default, TreeGrid renders a table row for every data source item.
* > * It accepts either [template string](../../common/template-engine/) or HTML element ID.
* > * It accepts either [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
* or HTML element ID.
* > * The row template must be a table row.

@@ -874,3 +876,3 @@ *

*
* > Check the [`ExcelExport`](../../treegrid/excel-exporting/) to configure exporting document.
* > Check the [`ExcelExport`](../../treegrid/excel-export/) to configure exporting document.
* @default false

@@ -877,0 +879,0 @@ */

@@ -346,3 +346,3 @@ import { Component, ModuleDeclaration } from '@syncfusion/ej2-base';

* Configures the TreeGrid aggregate rows.
* > Check the [`Aggregates`](../../treegrid/aggregates/) for its configuration.
* > Check the [`Aggregates`](../../treegrid/aggregate/) for its configuration.
* @default []

@@ -367,3 +367,4 @@ */

*
* > It accepts either the [template string](../../common/template-engine/) or the HTML element ID.
* > It accepts either the [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
* or the HTML element ID.
*

@@ -456,3 +457,4 @@ */

* By default, TreeGrid renders a table row for every data source item.
* > * It accepts either [template string](../../common/template-engine/) or HTML element ID.
* > * It accepts either [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
* or HTML element ID.
* > * The row template must be a table row.

@@ -914,3 +916,3 @@ *

*
* > Check the [`ExcelExport`](../../treegrid/excel-exporting/) to configure exporting document.
* > Check the [`ExcelExport`](../../treegrid/excel-export/) to configure exporting document.
* @default false

@@ -917,0 +919,0 @@ */

@@ -173,3 +173,4 @@ import { TextAlign, ClipMode, ValueAccessor, IFilter, IFilterUI, IEditCell, CommandModel } from '@syncfusion/ej2-grids';

* Defines the column template that renders customized element in each cell of the column.
* It accepts either [template string](../../../common/template-engine/) or HTML element ID.
* It accepts either [template string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals)
* or HTML element ID.
* @default null

@@ -176,0 +177,0 @@ */

@@ -18,3 +18,3 @@ var __extends = (this && this.__extends) || (function () {

import * as events from '../base/constant';
import { isNullOrUndefined, EventHandler, getValue, setValue } from '@syncfusion/ej2-base';
import { isNullOrUndefined, EventHandler, getValue, setValue, Browser } from '@syncfusion/ej2-base';
import { DataManager } from '@syncfusion/ej2-data';

@@ -301,3 +301,3 @@ import { isCountRequired } from '../utils';

var cOffset = this.getColumnOffset(cBlock);
//this.virtualEle.setWrapperWidth(width, ( Browser.isIE || Browser.info.name === 'edge') as boolean);
this.virtualEle.setWrapperWidth(null, (Browser.isIE || Browser.info.name === 'edge'));
target = this.parent.createElement('tbody');

@@ -304,0 +304,0 @@ target.appendChild(newChild);

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

Sorry, the diff of this file is not supported yet

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

Sorry, the diff of this file is not supported yet

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

Sorry, the diff of this file is not supported yet

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

Sorry, the diff of this file is not supported yet

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

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

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

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc