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

xterm

Package Overview
Dependencies
Maintainers
2
Versions
1092
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

xterm - npm Package Compare versions

Comparing version 2.6.0 to 2.7.0

lib/utils/DomElementObjectPool.js

2

bower.json
{
"name": "xterm.js",
"version": "2.6.0",
"version": "2.7.0",
"ignore": ["demo", "test", ".gitignore"],

@@ -5,0 +5,0 @@ "main": [

@@ -40,6 +40,9 @@ "use strict";

EventEmitter.prototype.emit = function (type) {
var args = [];
for (var _i = 1; _i < arguments.length; _i++) {
args[_i - 1] = arguments[_i];
}
if (!this._events[type]) {
return;
}
var args = Array.prototype.slice.call(arguments, 1);
var obj = this._events[type];

@@ -46,0 +49,0 @@ for (var i = 0; i < obj.length; i++) {

@@ -11,2 +11,9 @@ "use strict";

exports.prepareTextForClipboard = prepareTextForClipboard;
function prepareTextForTerminal(text, isMSWindows) {
if (isMSWindows) {
return text.replace(/\r?\n/g, '\n');
}
return text;
}
exports.prepareTextForTerminal = prepareTextForTerminal;
function copyHandler(ev, term) {

@@ -27,4 +34,6 @@ var copiedText = window.getSelection().toString(), text = prepareTextForClipboard(copiedText);

var dispatchPaste = function (text) {
text = prepareTextForTerminal(text, term.browser.isMSWindows);
term.handler(text);
term.textarea.value = '';
term.emit('paste', text);
return term.cancel(ev);

@@ -31,0 +40,0 @@ };

@@ -12,3 +12,10 @@ "use strict";

});
describe('evaluatePastedTextProcessing', function () {
it('should replace carriage return + line feed with line feed on windows', function () {
var pastedText = 'foo\r\nbar\r\n', processedText = Clipboard.prepareTextForTerminal(pastedText, false), windowsProcessedText = Clipboard.prepareTextForTerminal(pastedText, true);
chai_1.assert.equal(processedText, 'foo\r\nbar\r\n');
chai_1.assert.equal(windowsProcessedText, 'foo\nbar\n');
});
});
//# sourceMappingURL=Clipboard.test.js.map

@@ -379,2 +379,4 @@ "use strict";

this._position++;
var pt = void 0;
var valid = void 0;
switch (this._terminal.prefix) {

@@ -384,3 +386,4 @@ case '':

case '$q':
var pt = this._terminal.currentParam, valid = false;
pt = this._terminal.currentParam;
valid = false;
switch (pt) {

@@ -413,4 +416,4 @@ case '"q':

case '+q':
pt = this._terminal.currentParam
, valid = false;
pt = this._terminal.currentParam;
valid = false;
this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '+r' + pt + EscapeSequences_1.C0.ESC + '\\');

@@ -450,2 +453,3 @@ break;

}
return this._state;
};

@@ -452,0 +456,0 @@ Parser.prototype.setState = function (state) {

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var DomElementObjectPool_1 = require("./utils/DomElementObjectPool");
var MAX_REFRESH_FRAME_SKIP = 5;

@@ -20,5 +21,7 @@ var FLAGS;

this._refreshAnimationFrame = null;
this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span');
if (brokenBold === null) {
brokenBold = checkBoldBroken(this._terminal.element);
}
this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span');
}

@@ -61,3 +64,3 @@ Renderer.prototype.queueRefresh = function (start, end) {

Renderer.prototype._refresh = function (start, end) {
var x, y, i, line, out, ch, ch_width, width, data, attr, bg, fg, flags, row, parent, focused = document.activeElement;
var parent;
if (end - start >= this._terminal.rows / 2) {

@@ -69,4 +72,4 @@ parent = this._terminal.element.parentNode;

}
width = this._terminal.cols;
y = start;
var width = this._terminal.cols;
var y = start;
if (end >= this._terminal.rows) {

@@ -77,11 +80,8 @@ this._terminal.log('`end` is too large. Most likely a bad CSR.');

for (; y <= end; y++) {
row = y + this._terminal.ydisp;
line = this._terminal.lines.get(row);
if (!line || !this._terminal.children[y]) {
continue;
}
out = '';
if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp)
&& this._terminal.cursorState
&& !this._terminal.cursorHidden) {
var row = y + this._terminal.ydisp;
var line = this._terminal.lines.get(row);
var x = void 0;
if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp) &&
this._terminal.cursorState &&
!this._terminal.cursorHidden) {
x = this._terminal.x;

@@ -92,48 +92,73 @@ }

}
attr = this._terminal.defAttr;
i = 0;
for (; i < width; i++) {
if (!line[i]) {
var attr = this._terminal.defAttr;
var documentFragment = document.createDocumentFragment();
var innerHTML = '';
var currentElement = void 0;
while (this._terminal.children[y].children.length) {
var child = this._terminal.children[y].children[0];
this._terminal.children[y].removeChild(child);
this._spanElementObjectPool.release(child);
}
for (var i = 0; i < width; i++) {
var data = line[i][0];
var ch = line[i][1];
var ch_width = line[i][2];
if (!ch_width) {
continue;
}
data = line[i][0];
ch = line[i][1];
ch_width = line[i][2];
if (!ch_width)
continue;
if (i === x)
if (i === x) {
data = -1;
}
if (data !== attr) {
if (attr !== this._terminal.defAttr) {
out += '</span>';
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
currentElement = null;
}
if (data !== this._terminal.defAttr) {
if (innerHTML && !currentElement) {
currentElement = this._spanElementObjectPool.acquire();
}
if (currentElement) {
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
}
currentElement = this._spanElementObjectPool.acquire();
if (data === -1) {
out += '<span class="reverse-video terminal-cursor">';
currentElement.classList.add('reverse-video', 'terminal-cursor');
}
else {
var classNames = [];
bg = data & 0x1ff;
fg = (data >> 9) & 0x1ff;
flags = data >> 18;
var bg = data & 0x1ff;
var fg = (data >> 9) & 0x1ff;
var flags = data >> 18;
if (flags & FLAGS.BOLD) {
if (!brokenBold) {
classNames.push('xterm-bold');
currentElement.classList.add('xterm-bold');
}
if (fg < 8)
if (fg < 8) {
fg += 8;
}
}
if (flags & FLAGS.UNDERLINE) {
classNames.push('xterm-underline');
currentElement.classList.add('xterm-underline');
}
if (flags & FLAGS.BLINK) {
classNames.push('xterm-blink');
currentElement.classList.add('xterm-blink');
}
if (flags & FLAGS.INVERSE) {
bg = [fg, fg = bg][0];
if ((flags & 1) && fg < 8)
var temp = bg;
bg = fg;
fg = temp;
if ((flags & 1) && fg < 8) {
fg += 8;
}
}
if (flags & FLAGS.INVISIBLE) {
classNames.push('xterm-hidden');
currentElement.classList.add('xterm-hidden');
}

@@ -149,12 +174,7 @@ if (flags & FLAGS.INVERSE) {

if (bg < 256) {
classNames.push('xterm-bg-color-' + bg);
currentElement.classList.add("xterm-bg-color-" + bg);
}
if (fg < 256) {
classNames.push('xterm-color-' + fg);
currentElement.classList.add("xterm-color-" + fg);
}
out += '<span';
if (classNames.length) {
out += ' class="' + classNames.join(' ') + '"';
}
out += '>';
}

@@ -164,32 +184,42 @@ }

if (ch_width === 2) {
out += '<span class="xterm-wide-char">';
innerHTML += "<span class=\"xterm-wide-char\">" + ch + "</span>";
}
switch (ch) {
case '&':
out += '&amp;';
break;
case '<':
out += '&lt;';
break;
case '>':
out += '&gt;';
break;
default:
if (ch <= ' ') {
out += '&nbsp;';
}
else {
out += ch;
}
break;
else if (ch.charCodeAt(0) > 255) {
innerHTML += "<span class=\"xterm-normal-char\">" + ch + "</span>";
}
if (ch_width === 2) {
out += '</span>';
else {
switch (ch) {
case '&':
innerHTML += '&amp;';
break;
case '<':
innerHTML += '&lt;';
break;
case '>':
innerHTML += '&gt;';
break;
default:
if (ch <= ' ') {
innerHTML += '&nbsp;';
}
else {
innerHTML += ch;
}
break;
}
}
attr = data;
}
if (attr !== this._terminal.defAttr) {
out += '</span>';
if (innerHTML && !currentElement) {
currentElement = this._spanElementObjectPool.acquire();
}
this._terminal.children[y].innerHTML = out;
if (currentElement) {
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
currentElement = null;
}
this._terminal.children[y].appendChild(documentFragment);
}

@@ -196,0 +226,0 @@ if (parent) {

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

var Browser = require("./utils/Browser");
var Mouse_1 = require("./utils/Mouse");
var document = (typeof window != 'undefined') ? window.document : null;

@@ -469,3 +470,5 @@ var WRITE_BUFFER_PAUSE_THRESHOLD = 5;

Terminal.prototype.updateCharSizeCSS = function () {
this.charSizeStyleElement.textContent = '.xterm-wide-char{width:' + (this.charMeasure.width * 2) + 'px;}';
this.charSizeStyleElement.textContent =
".xterm-wide-char{width:" + this.charMeasure.width * 2 + "px;}" +
(".xterm-normal-char{width:" + this.charMeasure.width + "px;}");
};

@@ -477,3 +480,3 @@ Terminal.prototype.bindMouse = function () {

button = getButton(ev);
pos = getCoords(ev);
pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos)

@@ -495,3 +498,3 @@ return;

var button = pressed, pos;
pos = getCoords(ev);
pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos)

@@ -635,34 +638,2 @@ return;

}
function getCoords(ev) {
var x, y, w, h, el;
if (ev.pageX == null)
return;
x = ev.pageX;
y = ev.pageY;
el = self.element;
while (el && el !== self.document.documentElement) {
x -= el.offsetLeft;
y -= el.offsetTop;
el = 'offsetParent' in el
? el.offsetParent
: el.parentNode;
}
x = Math.ceil(x / self.charMeasure.width);
y = Math.ceil(y / self.charMeasure.height);
if (x < 0)
x = 0;
if (x > self.cols)
x = self.cols;
if (y < 0)
y = 0;
if (y > self.rows)
y = self.rows;
x += 32;
y += 32;
return {
x: x,
y: y,
type: 'wheel'
};
}
on(el, 'mousedown', function (ev) {

@@ -823,3 +794,4 @@ if (!self.mouseEvents)

this.refreshEnd = this.y;
this.parser.parse(data);
var state = this.parser.parse(data);
this.parser.setState(state);
this.updateRange(this.y);

@@ -826,0 +798,0 @@ this.refresh(this.refreshStart, this.refreshEnd);

{
"name": "xterm",
"description": "Full xterm terminal, in your browser",
"version": "2.6.0",
"version": "2.7.0",
"ignore": [

@@ -6,0 +6,0 @@ "demo",

@@ -56,10 +56,7 @@ /**

public emit(type): void {
public emit(type: string, ...args: any[]): void {
if (!this._events[type]) {
return;
}
let args = Array.prototype.slice.call(arguments, 1);
let obj = this._events[type];
for (let i = 0; i < obj.length; i++) {

@@ -66,0 +63,0 @@ obj[i].apply(this, args);

@@ -19,1 +19,12 @@ import { assert } from 'chai';

});
describe('evaluatePastedTextProcessing', function () {
it('should replace carriage return + line feed with line feed on windows', function () {
const pastedText = 'foo\r\nbar\r\n',
processedText = Clipboard.prepareTextForTerminal(pastedText, false),
windowsProcessedText = Clipboard.prepareTextForTerminal(pastedText, true);
assert.equal(processedText, 'foo\r\nbar\r\n');
assert.equal(windowsProcessedText, 'foo\nbar\n');
});
});

@@ -42,2 +42,13 @@ /**

/**
* Prepares text to be pasted into the terminal by normalizing the line endings
* @param text The pasted text that needs processing before inserting into the terminal
*/
export function prepareTextForTerminal(text: string, isMSWindows: boolean): string {
if (isMSWindows) {
return text.replace(/\r?\n/g, '\n');
}
return text;
}
/**
* Binds copy functionality to the given terminal.

@@ -72,4 +83,7 @@ * @param {ClipboardEvent} ev The original copy event to be handled

let dispatchPaste = function(text) {
text = prepareTextForTerminal(text, term.browser.isMSWindows);
term.handler(text);
term.textarea.value = '';
term.emit('paste', text);
return term.cancel(ev);

@@ -76,0 +90,0 @@ };

@@ -184,3 +184,3 @@ /**

*/
public parse(data: string) {
public parse(data: string): ParserState {
let l = data.length, j, cs, ch, code, low;

@@ -475,2 +475,4 @@

if (ch === C0.ESC) this._position++;
let pt;
let valid: boolean;

@@ -485,4 +487,4 @@ switch (this._terminal.prefix) {

case '$q':
let pt = this._terminal.currentParam
, valid = false;
pt = this._terminal.currentParam;
valid = false;

@@ -532,5 +534,4 @@ switch (pt) {

case '+q':
// TODO: Don't declare pt twice
/*let*/ pt = this._terminal.currentParam
, valid = false;
pt = this._terminal.currentParam;
valid = false;

@@ -570,2 +571,3 @@ this._terminal.send(C0.ESC + 'P' + +valid + '+r' + pt + C0.ESC + '\\');

}
return this._state;
}

@@ -572,0 +574,0 @@

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

import { ITerminal } from './Interfaces';
import { DomElementObjectPool } from './utils/DomElementObjectPool';

@@ -34,2 +35,4 @@ /**

private _spanElementObjectPool = new DomElementObjectPool('span');
constructor(private _terminal: ITerminal) {

@@ -41,2 +44,3 @@ // Figure out whether boldness affects

}
this._spanElementObjectPool = new DomElementObjectPool('span');

@@ -123,5 +127,4 @@ // TODO: Pull more DOM interactions into Renderer.constructor, element for

private _refresh(start: number, end: number): void {
let x, y, i, line, out, ch, ch_width, width, data, attr, bg, fg, flags, row, parent, focused = document.activeElement;
// If this is a big refresh, remove the terminal rows from the DOM for faster calculations
let parent;
if (end - start >= this._terminal.rows / 2) {

@@ -134,4 +137,4 @@ parent = this._terminal.element.parentNode;

width = this._terminal.cols;
y = start;
let width = this._terminal.cols;
let y = start;

@@ -144,14 +147,10 @@ if (end >= this._terminal.rows) {

for (; y <= end; y++) {
row = y + this._terminal.ydisp;
let row = y + this._terminal.ydisp;
line = this._terminal.lines.get(row);
if (!line || !this._terminal.children[y]) {
// Continue if the line is not available, this means a resize is currently in progress
continue;
}
out = '';
let line = this._terminal.lines.get(row);
if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp)
&& this._terminal.cursorState
&& !this._terminal.cursorHidden) {
let x;
if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp) &&
this._terminal.cursorState &&
!this._terminal.cursorHidden) {
x = this._terminal.x;

@@ -162,46 +161,72 @@ } else {

attr = this._terminal.defAttr;
i = 0;
let attr = this._terminal.defAttr;
for (; i < width; i++) {
if (!line[i]) {
// Continue if the character is not available, this means a resize is currently in progress
const documentFragment = document.createDocumentFragment();
let innerHTML = '';
let currentElement;
// Return the row's spans to the pool
while (this._terminal.children[y].children.length) {
const child = this._terminal.children[y].children[0];
this._terminal.children[y].removeChild(child);
this._spanElementObjectPool.release(<HTMLElement>child);
}
for (let i = 0; i < width; i++) {
// TODO: Could data be a more specific type?
let data: any = line[i][0];
const ch = line[i][1];
const ch_width: any = line[i][2];
if (!ch_width) {
continue;
}
data = line[i][0];
ch = line[i][1];
ch_width = line[i][2];
if (!ch_width)
continue;
if (i === x) data = -1;
if (i === x) {
data = -1;
}
if (data !== attr) {
if (attr !== this._terminal.defAttr) {
out += '</span>';
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
currentElement = null;
}
if (data !== this._terminal.defAttr) {
if (innerHTML && !currentElement) {
currentElement = this._spanElementObjectPool.acquire();
}
if (currentElement) {
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
}
currentElement = this._spanElementObjectPool.acquire();
if (data === -1) {
out += '<span class="reverse-video terminal-cursor">';
currentElement.classList.add('reverse-video', 'terminal-cursor');
} else {
let classNames = [];
let bg = data & 0x1ff;
let fg = (data >> 9) & 0x1ff;
let flags = data >> 18;
bg = data & 0x1ff;
fg = (data >> 9) & 0x1ff;
flags = data >> 18;
if (flags & FLAGS.BOLD) {
if (!brokenBold) {
classNames.push('xterm-bold');
currentElement.classList.add('xterm-bold');
}
// See: XTerm*boldColors
if (fg < 8) fg += 8;
if (fg < 8) {
fg += 8;
}
}
if (flags & FLAGS.UNDERLINE) {
classNames.push('xterm-underline');
currentElement.classList.add('xterm-underline');
}
if (flags & FLAGS.BLINK) {
classNames.push('xterm-blink');
currentElement.classList.add('xterm-blink');
}

@@ -211,11 +236,13 @@

if (flags & FLAGS.INVERSE) {
/* One-line variable swap in JavaScript: http://stackoverflow.com/a/16201730 */
bg = [fg, fg = bg][0];
// Should inverse just be before the
// above boldColors effect instead?
if ((flags & 1) && fg < 8) fg += 8;
let temp = bg;
bg = fg;
fg = temp;
// Should inverse just be before the above boldColors effect instead?
if ((flags & 1) && fg < 8) {
fg += 8;
}
}
if (flags & FLAGS.INVISIBLE) {
classNames.push('xterm-hidden');
currentElement.classList.add('xterm-hidden');
}

@@ -240,14 +267,8 @@

if (bg < 256) {
classNames.push('xterm-bg-color-' + bg);
currentElement.classList.add(`xterm-bg-color-${bg}`);
}
if (fg < 256) {
classNames.push('xterm-color-' + fg);
currentElement.classList.add(`xterm-color-${fg}`);
}
out += '<span';
if (classNames.length) {
out += ' class="' + classNames.join(' ') + '"';
}
out += '>';
}

@@ -258,25 +279,28 @@ }

if (ch_width === 2) {
out += '<span class="xterm-wide-char">';
// Wrap wide characters so they're sized correctly. It's more difficult to release these
// from the object pool so just create new ones via innerHTML.
innerHTML += `<span class="xterm-wide-char">${ch}</span>`;
} else if (ch.charCodeAt(0) > 255) {
// Wrap any non-wide unicode character as some fonts size them badly
innerHTML += `<span class="xterm-normal-char">${ch}</span>`;
} else {
switch (ch) {
case '&':
innerHTML += '&amp;';
break;
case '<':
innerHTML += '&lt;';
break;
case '>':
innerHTML += '&gt;';
break;
default:
if (ch <= ' ') {
innerHTML += '&nbsp;';
} else {
innerHTML += ch;
}
break;
}
}
switch (ch) {
case '&':
out += '&amp;';
break;
case '<':
out += '&lt;';
break;
case '>':
out += '&gt;';
break;
default:
if (ch <= ' ') {
out += '&nbsp;';
} else {
out += ch;
}
break;
}
if (ch_width === 2) {
out += '</span>';
}

@@ -286,7 +310,15 @@ attr = data;

if (attr !== this._terminal.defAttr) {
out += '</span>';
if (innerHTML && !currentElement) {
currentElement = this._spanElementObjectPool.acquire();
}
if (currentElement) {
if (innerHTML) {
currentElement.innerHTML = innerHTML;
innerHTML = '';
}
documentFragment.appendChild(currentElement);
currentElement = null;
}
this._terminal.children[y].innerHTML = out;
this._terminal.children[y].appendChild(documentFragment);
}

@@ -303,4 +335,3 @@

// if bold is broken, we can't
// use it in the terminal.
// If bold is broken, we can't use it in the terminal.
function checkBoldBroken(terminal) {

@@ -307,0 +338,0 @@ const document = terminal.ownerDocument;

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

import { CHARSETS } from './Charsets';
import { getRawByteCoords } from './utils/Mouse';

@@ -764,3 +765,5 @@ /**

Terminal.prototype.updateCharSizeCSS = function() {
this.charSizeStyleElement.textContent = '.xterm-wide-char{width:' + (this.charMeasure.width * 2) + 'px;}';
this.charSizeStyleElement.textContent =
`.xterm-wide-char{width:${this.charMeasure.width * 2}px;}` +
`.xterm-normal-char{width:${this.charMeasure.width}px;}`
}

@@ -792,3 +795,3 @@

// get mouse coordinates
pos = getCoords(ev);
pos = getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos) return;

@@ -821,3 +824,3 @@

pos = getCoords(ev);
pos = getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows);
if (!pos) return;

@@ -997,46 +1000,2 @@

// mouse coordinates measured in cols/rows
function getCoords(ev) {
var x, y, w, h, el;
// ignore browsers without pageX for now
if (ev.pageX == null) return;
x = ev.pageX;
y = ev.pageY;
el = self.element;
// should probably check offsetParent
// but this is more portable
while (el && el !== self.document.documentElement) {
x -= el.offsetLeft;
y -= el.offsetTop;
el = 'offsetParent' in el
? el.offsetParent
: el.parentNode;
}
// convert to cols/rows
x = Math.ceil(x / self.charMeasure.width);
y = Math.ceil(y / self.charMeasure.height);
// be sure to avoid sending
// bad positions to the program
if (x < 0) x = 0;
if (x > self.cols) x = self.cols;
if (y < 0) y = 0;
if (y > self.rows) y = self.rows;
// xterm sends raw bytes and
// starts at 32 (SP) for each.
x += 32;
y += 32;
return {
x: x,
y: y,
type: 'wheel'
};
}
on(el, 'mousedown', function(ev) {

@@ -1301,3 +1260,9 @@ if (!self.mouseEvents) return;

this.parser.parse(data);
// HACK: Set the parser state based on it's state at the time of return.
// This works around the bug #662 which saw the parser state reset in the
// middle of parsing escape sequence in two chunks. For some reason the
// state of the parser resets to 0 after exiting parser.parse. This change
// just sets the state back based on the correct return statement.
var state = this.parser.parse(data);
this.parser.setState(state);

@@ -1304,0 +1269,0 @@ this.updateRange(this.y);

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

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