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

@syncfusion/ej2-filemanager

Package Overview
Dependencies
Maintainers
4
Versions
162
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@syncfusion/ej2-filemanager - npm Package Compare versions

Comparing version 17.2.40 to 17.2.41

12

CHANGELOG.md

@@ -7,4 +7,16 @@ # Changelog

#### Bug Fixes
- The issue with the `file manager that throws script error while accessing the shared folder in physical file provider` has been fixed.
#### New Features
- A method has been provided to customize the filtering support in file manager.
## 17.2.40 (2019-08-06)
### File Manager
#### New Features
- The `ID` based support has been provided to the `selectedItems` property to manage the files with duplicate names.

@@ -11,0 +23,0 @@

2

dist/global/index.d.ts
/*!
* filename: index.d.ts
* version : 17.2.40
* version : 17.2.41
* Copyright Syncfusion Inc. 2001 - 2019. All rights reserved.

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

{
"_from": "@syncfusion/ej2-filemanager@*",
"_id": "@syncfusion/ej2-filemanager@17.2.36",
"_id": "@syncfusion/ej2-filemanager@17.2.40",
"_inBundle": false,
"_integrity": "sha512-UCIFjxjNAWKsfMLPSlsus9qemEotLT0J/AJeC1dzIgdAQt74IXrWhCKiPnlkv+5KdXKxNsDOc1Q9TGtm5qdz8A==",
"_integrity": "sha512-kJIovu0w8pwb1nbxvaexs0b6XiaYHwCqOkBfSCnEOkwjC5Fp3gqCxJrf2HErM6NktaD/F0hk0rE6Pdf89+bjCg==",
"_location": "/@syncfusion/ej2-filemanager",

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

],
"_resolved": "http://nexus.syncfusion.com/repository/ej2-release/@syncfusion/ej2-filemanager/-/ej2-filemanager-17.2.36.tgz",
"_shasum": "f53e0d9509a0a052ae49d6e1d93a10543f8932f6",
"_resolved": "http://nexus.syncfusion.com/repository/ej2-release/@syncfusion/ej2-filemanager/-/ej2-filemanager-17.2.40.tgz",
"_shasum": "d82775879f92108b2cff1423d6a93a07d78172e3",
"_spec": "@syncfusion/ej2-filemanager@*",

@@ -39,4 +39,4 @@ "_where": "/jenkins/workspace/ation_hotfix_16.4.0.42_Vol4-CJVRBFC7Z7RSISPRJNEMNQSRMCB6XTG67IJD6R2DVNXFIKQEITTQ/packages/included",

"dependencies": {
"@syncfusion/ej2-grids": "~17.2.40",
"@syncfusion/ej2-layouts": "~17.2.40",
"@syncfusion/ej2-grids": "~17.2.41",
"@syncfusion/ej2-layouts": "~17.2.41",
"selenium-webdriver": "^4.0.0-alpha.1"

@@ -63,4 +63,4 @@ },

"typings": "index.d.ts",
"version": "17.2.40",
"version": "17.2.41",
"sideEffects": false
}

@@ -224,2 +224,3 @@ import { EventHandler, closest, isNullOrUndefined, KeyboardEvents } from '@syncfusion/ej2-base';

if (!isNullOrUndefined(args.value)) {
this.parent.isFiltered = false;
if (this.parent.searchSettings.allowSearchOnTyping) {

@@ -239,2 +240,3 @@ window.clearTimeout(this.searchTimer);

if (!isNullOrUndefined(node)) {
this.parent.isFiltered = false;
var currentPath = this.updatePath(node);

@@ -296,2 +298,3 @@ this.liClick(currentPath);

BreadCrumbBar.prototype.removeSearchValue = function () {
this.parent.isFiltered = false;
if (this.searchObj && (this.searchObj.value !== '' || this.searchObj.element.value !== '')) {

@@ -298,0 +301,0 @@ this.searchObj.value = '';

@@ -18,2 +18,4 @@ /**

/** @hidden */
export declare const filterEnd: string;
/** @hidden */
export declare const beforeDelete: string;

@@ -20,0 +22,0 @@ /** @hidden */

@@ -18,2 +18,4 @@ /**

/** @hidden */
export var filterEnd = 'filter-end';
/** @hidden */
export var beforeDelete = 'before-delete';

@@ -20,0 +22,0 @@ /** @hidden */

@@ -1,2 +0,2 @@

import { Component, EmitType, ModuleDeclaration, isNullOrUndefined, L10n, closest } from '@syncfusion/ej2-base';import { Property, INotifyPropertyChanged, NotifyPropertyChanges, Complex, select } from '@syncfusion/ej2-base';import { createElement, addClass, removeClass, setStyleAttribute as setAttr } from '@syncfusion/ej2-base';import { isNullOrUndefined as isNOU, formatUnit, Browser, KeyboardEvents, KeyboardEventArgs } from '@syncfusion/ej2-base';import { Event, EventHandler, getValue, setValue } from '@syncfusion/ej2-base';import { Splitter, PanePropertiesModel } from '@syncfusion/ej2-layouts';import { Dialog, createSpinner, hideSpinner, showSpinner } from '@syncfusion/ej2-popups';import { createDialog, createExtDialog } from '../pop-up/dialog';import { ToolbarSettings, ToolbarSettingsModel, AjaxSettings, NavigationPaneSettings, DetailsViewSettings } from '../models/index';import { NavigationPaneSettingsModel, DetailsViewSettingsModel } from '../models/index';import { AjaxSettingsModel, SearchSettings, SearchSettingsModel } from '../models/index';import { Toolbar } from '../actions/toolbar';import { DetailsView } from '../layout/details-view';import { LargeIconsView } from '../layout/large-icons-view';import { Uploader, UploadingEventArgs, SelectedEventArgs, FileInfo } from '@syncfusion/ej2-inputs';import { UploadSettingsModel } from '../models/upload-settings-model';import { UploadSettings } from '../models/upload-settings';import * as events from './constant';import * as CLS from './classes';import { read } from '../common/operations';import { ITreeView, IContextMenu, ViewType, SortOrder, FileDragEventArgs, RetryArgs } from './interface';import { BeforeSendEventArgs, SuccessEventArgs, FailureEventArgs, FileLoadEventArgs } from './interface';import { FileOpenEventArgs, FileSelectEventArgs, MenuClickEventArgs, MenuOpenEventArgs } from './interface';import { ToolbarClickEventArgs, ToolbarCreateEventArgs, UploadListCreateArgs } from './interface';import { refresh, getPathObject, getLocaleText, setNextPath, createDeniedDialog } from '../common/utility';import { hasContentAccess, hasUploadAccess, updateLayout } from '../common/utility';import { TreeView as BaseTreeView } from '@syncfusion/ej2-navigations';import { ContextMenuSettingsModel } from '../models/contextMenu-settings-model';import { ContextMenuSettings } from '../models/contextMenu-settings';import { BreadCrumbBar } from '../actions/breadcrumb-bar';import { ContextMenu } from '../pop-up/context-menu';import { defaultLocale } from '../models/default-locale';import { PositionModel } from '@syncfusion/ej2-base/src/draggable-model';
import { Component, EmitType, ModuleDeclaration, isNullOrUndefined, L10n, closest } from '@syncfusion/ej2-base';import { Property, INotifyPropertyChanged, NotifyPropertyChanges, Complex, select } from '@syncfusion/ej2-base';import { createElement, addClass, removeClass, setStyleAttribute as setAttr } from '@syncfusion/ej2-base';import { isNullOrUndefined as isNOU, formatUnit, Browser, KeyboardEvents, KeyboardEventArgs } from '@syncfusion/ej2-base';import { Event, EventHandler, getValue, setValue } from '@syncfusion/ej2-base';import { Splitter, PanePropertiesModel } from '@syncfusion/ej2-layouts';import { Dialog, createSpinner, hideSpinner, showSpinner } from '@syncfusion/ej2-popups';import { createDialog, createExtDialog } from '../pop-up/dialog';import { ToolbarSettings, ToolbarSettingsModel, AjaxSettings, NavigationPaneSettings, DetailsViewSettings } from '../models/index';import { NavigationPaneSettingsModel, DetailsViewSettingsModel } from '../models/index';import { AjaxSettingsModel, SearchSettings, SearchSettingsModel } from '../models/index';import { Toolbar } from '../actions/toolbar';import { DetailsView } from '../layout/details-view';import { LargeIconsView } from '../layout/large-icons-view';import { Uploader, UploadingEventArgs, SelectedEventArgs, FileInfo } from '@syncfusion/ej2-inputs';import { UploadSettingsModel } from '../models/upload-settings-model';import { UploadSettings } from '../models/upload-settings';import * as events from './constant';import * as CLS from './classes';import { read, filter } from '../common/operations';import { ITreeView, IContextMenu, ViewType, SortOrder, FileDragEventArgs, RetryArgs } from './interface';import { BeforeSendEventArgs, SuccessEventArgs, FailureEventArgs, FileLoadEventArgs } from './interface';import { FileOpenEventArgs, FileSelectEventArgs, MenuClickEventArgs, MenuOpenEventArgs } from './interface';import { ToolbarClickEventArgs, ToolbarCreateEventArgs, UploadListCreateArgs } from './interface';import { refresh, getPathObject, getLocaleText, setNextPath, createDeniedDialog } from '../common/utility';import { hasContentAccess, hasUploadAccess, updateLayout } from '../common/utility';import { TreeView as BaseTreeView } from '@syncfusion/ej2-navigations';import { ContextMenuSettingsModel } from '../models/contextMenu-settings-model';import { ContextMenuSettings } from '../models/contextMenu-settings';import { BreadCrumbBar } from '../actions/breadcrumb-bar';import { ContextMenu } from '../pop-up/context-menu';import { defaultLocale } from '../models/default-locale';import { PositionModel } from '@syncfusion/ej2-base/src/draggable-model';
import {ComponentModel} from '@syncfusion/ej2-base';

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

@@ -49,2 +49,3 @@ import { Component, EmitType, ModuleDeclaration, L10n } from '@syncfusion/ej2-base';

private keyConfigs;
filterData: Object;
originalPath: string;

@@ -78,2 +79,3 @@ filterPath: string;

pasteNodes: string[];
isLayoutChange: boolean;
replaceItems: string[];

@@ -108,2 +110,3 @@ createdItem: {

renameText: string;
isFiltered: boolean;
enablePaste: boolean;

@@ -466,2 +469,9 @@ splitterObj: Splitter;

/**
* Display the custom filtering files in file manager.
* @param {filterData: Object} filterData - Specifies the custom filter details along with custom file action name,
* which needs to be sent to the server side. If you do not specify the details, then default action name will be `filter`.
* @returns void
*/
filterFiles(filterData?: Object): void;
/**
* Gets the details of the selected files in the file manager.

@@ -468,0 +478,0 @@ * @returns void

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

import * as CLS from './classes';
import { read } from '../common/operations';
import { read, filter } from '../common/operations';
import { refresh, getPathObject, getLocaleText, setNextPath, createDeniedDialog } from '../common/utility';

@@ -59,2 +59,3 @@ import { hasContentAccess, hasUploadAccess, updateLayout } from '../common/utility';

var _this = _super.call(this, options, element) || this;
_this.filterData = null;
_this.selectedNodes = [];

@@ -65,2 +66,3 @@ _this.duplicateItems = [];

_this.nextPath = [];
_this.isLayoutChange = false;
_this.layoutSelectedItems = [];

@@ -79,2 +81,3 @@ _this.renamedId = null;

_this.isSameAction = false;
_this.isFiltered = false;
_this.enablePaste = false;

@@ -787,2 +790,18 @@ _this.persistData = false;

/**
* Display the custom filtering files in file manager.
* @param {filterData: Object} filterData - Specifies the custom filter details along with custom file action name,
* which needs to be sent to the server side. If you do not specify the details, then default action name will be `filter`.
* @returns void
*/
FileManager.prototype.filterFiles = function (filterData) {
this.filterData = filterData ? filterData : null;
this.setProperties({ selectedItems: [] }, true);
this.notify(events.selectionChanged, {});
this.isFiltered = true;
if (this.breadcrumbbarModule.searchObj.element.value !== '') {
this.breadcrumbbarModule.searchObj.element.value = '';
}
filter(this, events.filterEnd);
};
/**
* Gets the details of the selected files in the file manager.

@@ -789,0 +808,0 @@ * @returns void

@@ -388,2 +388,5 @@ import { Component, EmitType, L10n } from '@syncfusion/ej2-base';

isCut: boolean;
filterData: Object;
isFiltered: boolean;
isLayoutChange: boolean;
isSearchCut: boolean;

@@ -390,0 +393,0 @@ isPasteError: boolean;

@@ -13,2 +13,7 @@ import { IFileManager } from '../base/interface';

/**
* Function to filter the files in File Manager.
* @private
*/
export declare function filter(parent: IFileManager, event: string): void;
/**
* Function to rename the folder/file in File Manager.

@@ -15,0 +20,0 @@ * @private

@@ -1,2 +0,2 @@

import { Ajax, createElement, select } from '@syncfusion/ej2-base';
import { Ajax, createElement, select, extend } from '@syncfusion/ej2-base';
import { isNullOrUndefined as isNOU, setValue, getValue } from '@syncfusion/ej2-base';

@@ -30,2 +30,12 @@ import * as events from '../base/constant';

/**
* Function to filter the files in File Manager.
* @private
*/
export function filter(parent, event) {
var data = { action: 'filter', path: parent.path, showHiddenItems: parent.showHiddenItems, data: [getPathObject(parent)] };
var filterData;
filterData = parent.filterData ? extend(filterData, data, parent.filterData) : data;
createAjax(parent, filterData, filterSuccess, event, getValue('action', filterData));
}
/**
* Function to rename the folder/file in File Manager.

@@ -37,3 +47,3 @@ * @private

var newName;
if (parent.breadcrumbbarModule.searchObj.element.value === '') {
if (parent.breadcrumbbarModule.searchObj.element.value === '' && !parent.isFiltered) {
name = parent.currentItemText;

@@ -119,2 +129,17 @@ newName = itemNewName;

parent.notify(events.afterRequest, { action: 'success' });
var id = parent.expandedId ? parent.expandedId : parent.pathId[parent.pathId.length - 1];
if (!isNOU(result.cwd) && (getValue('action', data) === 'read')) {
setValue('_fm_id', id, result.cwd);
setValue(id, result.cwd, parent.feParent);
if (!isNOU(result.files) || result.error.code === '401') {
if ((event === 'finalize-end' || event === 'initial-end') && parent.pathNames.length === 0) {
var root = getValue(parent.pathId[0], parent.feParent);
parent.pathNames[0] = getValue('name', root);
parent.hasId = !isNOU(getValue('id', root));
}
if (event === 'finalize-end') {
generatePath(parent);
}
}
}
if (!isNOU(result.files)) {

@@ -128,14 +153,4 @@ // tslint:disable-next-line

if (getValue('action', data) === 'read') {
var id = parent.expandedId ? parent.expandedId : parent.pathId[parent.pathId.length - 1];
setNodeId(result, id);
setValue(id, result.files, parent.feFiles);
setValue(id, result.cwd, parent.feParent);
if ((event === 'finalize-end' || event === 'initial-end') && parent.pathNames.length === 0) {
var root = getValue(parent.pathId[0], parent.feParent);
parent.pathNames[0] = getValue('name', root);
parent.hasId = !isNOU(getValue('id', root));
}
if (event === 'finalize-end') {
generatePath(parent);
}
}

@@ -194,2 +209,12 @@ }

}
function filterSuccess(parent, result, event, action) {
if (!isNOU(result.files)) {
parent.notify(event, result);
var args = { action: action, result: result };
parent.trigger('success', args);
}
else {
onFailure(parent, result, action);
}
}
/* istanbul ignore next */

@@ -240,3 +265,8 @@ function createSuccess(parent, result) {

else {
read(parent, events.renameEnd, parent.path);
if (parent.isFiltered) {
filter(parent, events.renameEnd);
}
else {
read(parent, events.renameEnd, parent.path);
}
}

@@ -296,4 +326,9 @@ }

read(parent, events.deleteEnd, parent.path);
var args = { action: 'delete', result: result };
parent.trigger('success', args);
if (result.error) {
onFailure(parent, result, 'delete');
}
else {
var args = { action: 'delete', result: result };
parent.trigger('success', args);
}
}

@@ -300,0 +335,0 @@ else {

import * as CLS from '../base/classes';
import * as events from '../base/constant';
import { read, paste, Search } from '../common/operations';
import { read, paste, Search, filter } from '../common/operations';
import { getValue, setValue, isNullOrUndefined as isNOU, matches, select, createElement } from '@syncfusion/ej2-base';

@@ -116,3 +116,3 @@ import { closest, detach } from '@syncfusion/ej2-base';

}
if (parent.breadcrumbbarModule.searchObj.element.value !== '' &&
if ((parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) &&
parent.activeModule !== 'navigationpane') {

@@ -158,3 +158,3 @@ parent.selectedNodes = [];

var searchWord;
if (value.length === 0) {
if (value.length === 0 && !parent.isFiltered) {
parent.notify(events.pathColumn, { args: parent });

@@ -179,3 +179,8 @@ }

else {
read(parent, isLayoutChange ? events.layoutChange : events.search, parent.path);
if (!parent.isFiltered) {
read(parent, isLayoutChange ? events.layoutChange : events.search, parent.path);
}
else {
filter(parent, events.layoutChange);
}
}

@@ -185,3 +190,3 @@ }

parent.setProperties({ view: view }, true);
if (parent.breadcrumbbarModule.searchObj.element.value !== '') {
if (parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) {
parent.layoutSelectedItems = parent.selectedItems;

@@ -193,2 +198,3 @@ }

}
parent.isLayoutChange = true;
searchWordHandler(parent, searchWord, true);

@@ -298,3 +304,3 @@ }

}
else if (parent.breadcrumbbarModule.searchObj.element.value !== '' && !isNOU(fPath)) {
else if ((parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) && !isNOU(fPath)) {
imgUrl = baseUrl + '?path=' + fPath.replace(/\\/g, '/') + fileName;

@@ -327,3 +333,3 @@ }

var fPath = getValue('filterPath', data);
if (parent.breadcrumbbarModule.searchObj.element.value !== '' && !isNOU(fPath)) {
if ((parent.breadcrumbbarModule.searchObj.element.value !== '' || parent.isFiltered) && !isNOU(fPath)) {
fPath = fPath.replace(/\\/g, '/');

@@ -376,2 +382,6 @@ name = fPath.replace(parent.path, '') + name;

}
else if (parent.isFiltered) {
element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Filter-Empty');
element.querySelector('.' + CLS.EMPTY_INNER_CONTENT).innerHTML = getLocaleText(parent, 'Filter-Key');
}
else if (parent.breadcrumbbarModule.searchObj.element.value !== '') {

@@ -394,3 +404,2 @@ element.querySelector('.' + CLS.EMPTY_CONTENT).innerHTML = getLocaleText(parent, 'Search-Empty');

export function setNodeId(result, rootId) {
setValue('_fm_id', rootId, result.cwd);
var dirs = getDirectories(result.files);

@@ -397,0 +406,0 @@ for (var i = 0, len = dirs.length; i < len; i++) {

@@ -13,7 +13,6 @@ import { Grid } from '@syncfusion/ej2-grids';

private keyConfigs;
private islayoutChange;
private sortItem;
private isInteracted;
private isPasteOperation;
private isCloumnRefresh;
private isColumnRefresh;
private clickObj;

@@ -50,2 +49,3 @@ private sortSelectedNodes;

private onPathChanged;
private updatePathColumn;
private checkEmptyDiv;

@@ -52,0 +52,0 @@ private onOpenInit;

@@ -59,3 +59,2 @@ import { ListBaseOptions } from '@syncfusion/ej2-lists';

private onRenameInit;
private onRenameEnd;
private onPathChanged;

@@ -62,0 +61,0 @@ private onOpenInit;

@@ -286,2 +286,3 @@ import { ListBase } from '@syncfusion/ej2-lists';

this.checkItem();
this.parent.isLayoutChange = false;
}

@@ -372,12 +373,2 @@ else {

};
LargeIconsView.prototype.onRenameEnd = function (args) {
if (this.parent.view !== 'LargeIcons') {
return;
}
this.onLayoutChange(args);
this.clearSelect();
this.parent.setProperties({ selectedItems: [] }, true);
this.addSelection(this.parent.renamedItem);
this.parent.renamedItem = null;
};
LargeIconsView.prototype.onPathChanged = function (args) {

@@ -393,2 +384,7 @@ this.parent.isCut = false;

this.onLayoutChange(args);
if (this.parent.renamedItem) {
this.clearSelect();
this.addSelection(this.parent.renamedItem);
this.parent.renamedItem = null;
}
}

@@ -463,3 +459,3 @@ };

this.parent.off(events.renameInit, this.onRenameInit);
this.parent.off(events.renameEnd, this.onRenameEnd);
this.parent.off(events.renameEnd, this.onPathChanged);
this.parent.off(events.hideLayout, this.onHideLayout);

@@ -481,2 +477,3 @@ this.parent.off(events.selectAllInit, this.onSelectAllInit);

this.parent.off(events.updateSelectionData, this.onUpdateSelectionData);
this.parent.off(events.filterEnd, this.onPathChanged);
};

@@ -496,3 +493,3 @@ LargeIconsView.prototype.addEventListener = function () {

this.parent.on(events.renameInit, this.onRenameInit, this);
this.parent.on(events.renameEnd, this.onRenameEnd, this);
this.parent.on(events.renameEnd, this.onPathChanged, this);
this.parent.on(events.openEnd, this.onPathChanged, this);

@@ -515,2 +512,3 @@ this.parent.on(events.modelChanged, this.onPropertyChanged, this);

this.parent.on(events.updateSelectionData, this.onUpdateSelectionData, this);
this.parent.on(events.filterEnd, this.onPathChanged, this);
};

@@ -804,3 +802,3 @@ LargeIconsView.prototype.onMenuItemData = function (args) {

var val = _this.parent.breadcrumbbarModule.searchObj.element.value;
if (val === '') {
if (val === '' && !_this.parent.isFiltered) {
var id = getValue('id', details_1);

@@ -817,2 +815,3 @@ var newPath = _this.parent.path + (isNOU(id) ? text : id) + '/';

}
_this.parent.isFiltered = false;
_this.parent.setProperties({ selectedItems: [] }, true);

@@ -819,0 +818,0 @@ }

@@ -162,2 +162,3 @@ import { TreeView as BaseTreeView } from '@syncfusion/ej2-navigations';

this.parent.breadcrumbbarModule.searchObj.element.value = '';
this.parent.isFiltered = false;
}

@@ -345,3 +346,3 @@ this.parent.searchedItems = [];

NavigationPane.prototype.onRenameEnd = function (args) {
if (this.parent.breadcrumbbarModule.searchObj.element.value === '') {
if (this.parent.breadcrumbbarModule.searchObj.element.value === '' && !this.parent.isFiltered) {
this.updateTree(args);

@@ -368,3 +369,3 @@ }

this.parent.itemData = this.getTreeData(this.renameParent);
read(this.parent, events.renameEndParent, this.parent.filterPath);
read(this.parent, events.renameEndParent, this.parent.filterPath.replace(/\\/g, '/'));
}

@@ -371,0 +372,0 @@ }

@@ -80,2 +80,4 @@ /**

'Search-Key': 'Try with different keywords',
'Filter-Empty': 'No results found',
'Filter-Key': 'Try with different filter',
'Sub-Folder-Error': 'The destination folder is the subfolder of the source folder.',

@@ -82,0 +84,0 @@ 'Access-Denied': 'Access Denied',

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

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