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

chromium-bidi

Package Overview
Dependencies
Maintainers
2
Versions
72
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

chromium-bidi - npm Package Compare versions

Comparing version 0.5.14 to 0.5.15

5

lib/cjs/bidiMapper/CommandProcessor.js

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

this.#scriptProcessor = new ScriptProcessor_js_1.ScriptProcessor(browsingContextStorage, realmStorage, preloadScriptStorage, logger);
this.#sessionProcessor = new SessionProcessor_js_1.SessionProcessor(eventManager);
this.#sessionProcessor = new SessionProcessor_js_1.SessionProcessor(eventManager, browserCdpClient);
this.#storageProcessor = new StorageProcessor_js_1.StorageProcessor(browserCdpClient, browsingContextStorage, logger);

@@ -72,3 +72,2 @@ // keep-sorted end

case 'session.end':
case 'session.new':
// TODO: Implement.

@@ -171,2 +170,4 @@ break;

// keep-sorted start block=yes
case 'session.new':
return await this.#sessionProcessor.create(command.params);
case 'session.status':

@@ -173,0 +174,0 @@ return this.#sessionProcessor.status();

8

lib/cjs/bidiMapper/domains/context/BrowsingContextImpl.js

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

const realm = await this.getOrCreateSandbox(undefined);
const originResult = await realm.callFunction(script, { type: 'undefined' }, [], false, "none" /* Script.ResultOwnership.None */, {}, false);
const originResult = await realm.callFunction(script, false);
(0, assert_js_1.assert)(originResult.type === 'success');

@@ -668,3 +668,3 @@ const origin = deserializeDOMRect(originResult.result);

return element instanceof Element;
}), { type: 'undefined' }, [clip.element], false, "none" /* Script.ResultOwnership.None */, {});
}), false, { type: 'undefined' }, [clip.element]);
if (result.type === 'exception') {

@@ -686,3 +686,3 @@ throw new protocol_js_1.NoSuchElementException(`Element '${clip.element.sharedId}' was not found`);

};
}), { type: 'undefined' }, [clip.element], false, "none" /* Script.ResultOwnership.None */, {});
}), false, { type: 'undefined' }, [clip.element]);
(0, assert_js_1.assert)(result.type === 'success');

@@ -877,3 +877,3 @@ const rect = deserializeDOMRect(result.result);

};
const locatorResult = await realm.callFunction(locatorDelegate.functionDeclaration, { type: 'undefined' }, locatorDelegate.argumentsLocalValues, false, "none" /* Script.ResultOwnership.None */, serializationOptions, false);
const locatorResult = await realm.callFunction(locatorDelegate.functionDeclaration, false, { type: 'undefined' }, locatorDelegate.argumentsLocalValues, "none" /* Script.ResultOwnership.None */, serializationOptions);
if (locatorResult.type !== 'success') {

@@ -880,0 +880,0 @@ this.#logger?.(BrowsingContextImpl.LOGGER_PREFIX, 'Failed locateNodesByLocator', locatorResult);

@@ -150,3 +150,13 @@ "use strict";

const context = this.#browsingContextStorage.getContext(params.context);
await context.handleUserPrompt(params);
try {
await context.handleUserPrompt(params);
}
catch (error) {
// Heuristically determine the error
// https://source.chromium.org/chromium/chromium/src/+/main:content/browser/devtools/protocol/page_handler.cc;l=1085?q=%22No%20dialog%20is%20showing%22&ss=chromium
if (error.message?.includes('No dialog is showing')) {
throw new protocol_js_1.NoSuchAlertException('No dialog is showing');
}
throw error;
}
return {};

@@ -153,0 +163,0 @@ }

@@ -41,3 +41,3 @@ /**

getContext(id: BrowsingContext.BrowsingContext): BrowsingContextImpl;
verifyContextsList(contexts: BrowsingContext.BrowsingContext[] | undefined): Set<BrowsingContextImpl>;
verifyTopLevelContextsList(contexts: BrowsingContext.BrowsingContext[] | undefined): Set<BrowsingContextImpl>;
}

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

}
verifyContextsList(contexts) {
verifyTopLevelContextsList(contexts) {
const foundContexts = new Set();

@@ -84,0 +84,0 @@ if (!contexts) {

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

const sandbox = await context.getOrCreateSandbox(undefined);
const result = await sandbox.callFunction(CALCULATE_IN_VIEW_CENTER_PT_DECL, { type: 'undefined' }, [element], false, "none" /* Script.ResultOwnership.None */, {});
const result = await sandbox.callFunction(CALCULATE_IN_VIEW_CENTER_PT_DECL, false, { type: 'undefined' }, [element]);
if (result.type === 'exception') {

@@ -48,3 +48,3 @@ throw new protocol_js_1.NoSuchElementException(`Origin element ${element.sharedId} was not found`);

static isMacOS = async (context) => {
const result = await (await context.getOrCreateSandbox(undefined)).callFunction(IS_MAC_DECL, { type: 'undefined' }, [], false, "none" /* Script.ResultOwnership.None */, {});
const result = await (await context.getOrCreateSandbox(undefined)).callFunction(IS_MAC_DECL, false);
(0, assert_js_1.assert)(result.type !== 'exception');

@@ -51,0 +51,0 @@ (0, assert_js_1.assert)(result.result.type === 'boolean');

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

return;
}), params.element, [{ type: 'number', value: params.files.length }], false, "none" /* Script.ResultOwnership.None */, {}, false);
}), false, params.element, [{ type: 'number', value: params.files.length }]);
}

@@ -110,3 +110,3 @@ catch {

this.dispatchEvent(new Event('change', { bubbles: true }));
}), params.element, [], false, "none" /* Script.ResultOwnership.None */, {}, false);
}), false, params.element);
return {};

@@ -120,3 +120,3 @@ }

return this.files?.item(index);
}), params.element, [{ type: 'number', value: 0 }], false, "root" /* Script.ResultOwnership.Root */, {}, false);
}), false, params.element, [{ type: 'number', value: 0 }], "root" /* Script.ResultOwnership.Root */);
(0, assert_js_1.assert)(result.type === 'success');

@@ -156,3 +156,3 @@ if (result.result.type !== 'object') {

}));
}), params.element, [], false, "none" /* Script.ResultOwnership.None */, {}, false);
}), false, params.element);
}

@@ -159,0 +159,0 @@ return {};

@@ -54,9 +54,9 @@ /**

count: number;
"__#89144@#x": number;
"__#89144@#y": number;
"__#89144@#time": number;
"__#89130@#x": number;
"__#89130@#y": number;
"__#89130@#time": number;
compare(context: any): boolean;
};
"__#89144@#DOUBLE_CLICK_TIME_MS": number;
"__#89144@#MAX_DOUBLE_CLICK_RADIUS": number;
"__#89130@#DOUBLE_CLICK_TIME_MS": number;
"__#89130@#MAX_DOUBLE_CLICK_RADIUS": number;
};

@@ -63,0 +63,0 @@ setClickCount(button: number, context: InstanceType<typeof PointerSource.ClickContext>): number;

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

const protocol_js_1 = require("../../../protocol/protocol.js");
const assert_js_1 = require("../../../utils/assert.js");
const NetworkUtils_js_1 = require("./NetworkUtils.js");

@@ -17,3 +16,3 @@ /** Dispatches Network domain commands. */

async addIntercept(params) {
this.#browsingContextStorage.verifyContextsList(params.contexts);
this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
const urlPatterns = params.urlPatterns ?? [];

@@ -36,3 +35,3 @@ const parsedUrlPatterns = NetworkProcessor.parseUrlPatterns(urlPatterns);

async continueRequest(params) {
const networkId = params.request;
const { url, method, headers, request: networkId } = params;
if (params.url !== undefined) {

@@ -44,7 +43,6 @@ NetworkProcessor.parseUrlString(params.url);

]);
const { url, method, headers } = params;
const requestHeaders = (0, NetworkUtils_js_1.cdpFetchHeadersFromBidiNetworkHeaders)(headers);
// TODO: Set / expand.
// ; Step 9. cookies
// ; Step 10. body
const requestHeaders = (0, NetworkUtils_js_1.cdpFetchHeadersFromBidiNetworkHeaders)(headers);
await request.continueRequest(url, method, requestHeaders);

@@ -102,5 +100,2 @@ return {};

password = credentials.password;
// TODO: This should be invalid argument exception.
// Spec may need to be updated.
(0, assert_js_1.assert)(credentials.type === 'password', `Credentials type ${credentials.type} must be 'password'`);
}

@@ -127,3 +122,3 @@ const response = (0, NetworkUtils_js_1.cdpAuthChallengeResponseFromBidiAuthContinueWithAuthAction)(params.action);

async provideResponse(params) {
const { statusCode, reasonPhrase, headers, body, request: networkId, } = params;
const { statusCode, reasonPhrase: responsePhrase, headers, body, request: networkId, } = params;
// TODO: Step 6

@@ -140,7 +135,31 @@ // https://w3c.github.io/webdriver-bidi/#command-network-continueResponse

]);
// We need to pass through if the request is already in
// AuthRequired phase
if (request.interceptPhase === "authRequired" /* Network.InterceptPhase.AuthRequired */) {
// We need to use `ProvideCredentials`
// As `Default` may cancel the request
await request.continueWithAuth({
response: 'ProvideCredentials',
});
return {};
}
// If we con't modify the response
// Just continue the request
if (!body && !headers) {
await request.continueRequest();
return {};
}
const responseCode = statusCode ?? request.statusCode ?? 200;
let parsedBody;
if (body?.type === 'string') {
parsedBody = btoa(body.value);
}
else if (body?.type === 'base64') {
parsedBody = body.value;
}
await request.provideResponse({
responseCode: statusCode ?? request.statusCode,
responsePhrase: reasonPhrase,
responseCode,
responsePhrase,
responseHeaders,
body: body?.value, // TODO: Differ base64 / string
body: parsedBody,
});

@@ -147,0 +166,0 @@ return {};

@@ -50,3 +50,3 @@ /**

/** Returns the HTTP status code associated with this request if any. */
get statusCode(): number;
get statusCode(): number | undefined;
}

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

(0, assert_js_1.assert)(this.#fetchId, 'Network Interception not set-up.');
this.#interceptPhase = undefined;
await this.cdpClient.sendCommand('Fetch.failRequest', {

@@ -209,2 +208,3 @@ requestId: this.#fetchId,

});
this.#interceptPhase = undefined;
}

@@ -266,3 +266,2 @@ onRequestPaused(event) {

(0, assert_js_1.assert)(this.#fetchId, 'Network Interception not set-up.');
this.#interceptPhase = undefined;
await this.cdpClient.sendCommand('Fetch.continueRequest', {

@@ -277,2 +276,3 @@ requestId: this.#fetchId,

});
this.#interceptPhase = undefined;
}

@@ -282,3 +282,2 @@ /** @see https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#method-continueResponse */

(0, assert_js_1.assert)(this.#fetchId, 'Network Interception not set-up.');
this.#interceptPhase = undefined;
await this.cdpClient.sendCommand('Fetch.continueResponse', {

@@ -290,2 +289,3 @@ requestId: this.#fetchId,

});
this.#interceptPhase = undefined;
}

@@ -297,3 +297,2 @@ /** @see https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#method-continueWithAuth */

(0, assert_js_1.assert)(this.#fetchId, 'Network Interception not set-up.');
this.#interceptPhase = undefined;
await this.cdpClient.sendCommand('Fetch.continueWithAuth', {

@@ -303,2 +302,3 @@ requestId: this.#fetchId,

});
this.#interceptPhase = undefined;
}

@@ -308,3 +308,2 @@ /** @see https://chromedevtools.github.io/devtools-protocol/tot/Fetch/#method-provideResponse */

(0, assert_js_1.assert)(this.#fetchId, 'Network Interception not set-up.');
this.#interceptPhase = undefined;
await this.cdpClient.sendCommand('Fetch.fulfillRequest', {

@@ -315,4 +314,5 @@ requestId: this.#fetchId,

responseHeaders,
...(body ? { body: btoa(body) } : {}), // TODO: Double-check if btoa usage is correct.
body,
});
this.#interceptPhase = undefined;
}

@@ -330,5 +330,3 @@ get #context() {

this.#response.extraInfo?.statusCode ??
this.#response.info?.status ??
-1 // TODO: Throw an exception or use some other status code?
);
this.#response.info?.status);
}

@@ -391,3 +389,3 @@ #emitEvent(getEvent) {

protocol: this.#response.info?.protocol ?? '',
status: this.statusCode,
status: this.statusCode ?? -1, // TODO: Throw an exception or use some other status code?
statusText: this.#response.info?.statusText ||

@@ -394,0 +392,0 @@ this.#response.paused?.responseStatusText ||

@@ -49,3 +49,3 @@ /**

abstract get realmInfo(): Script.RealmInfo;
evaluate(expression: string, awaitPromise: boolean, resultOwnership: Script.ResultOwnership, serializationOptions: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
evaluate(expression: string, awaitPromise: boolean, resultOwnership?: Script.ResultOwnership, serializationOptions?: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
protected initialize(): void;

@@ -62,3 +62,3 @@ /**

stringifyObject(cdpRemoteObject: Protocol.Runtime.RemoteObject): Promise<string>;
callFunction(functionDeclaration: string, thisLocalValue: Script.LocalValue, argumentsLocalValues: Script.LocalValue[], awaitPromise: boolean, resultOwnership: Script.ResultOwnership, serializationOptions: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
callFunction(functionDeclaration: string, awaitPromise: boolean, thisLocalValue?: Script.LocalValue, argumentsLocalValues?: Script.LocalValue[], resultOwnership?: Script.ResultOwnership, serializationOptions?: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
deserializeForCdp(localValue: Script.LocalValue): Promise<Protocol.Runtime.CallArgument>;

@@ -65,0 +65,0 @@ disown(handle: Script.Handle): Promise<void>;

@@ -42,13 +42,2 @@ "use strict";

}
if (cdpValue.result.type === 'object') {
switch (cdpValue.result.subtype) {
case 'generator':
case 'iterator':
bidiValue.type = cdpValue.result.subtype;
delete bidiValue['value'];
break;
default:
// Intentionally left blank.
}
}
return bidiValue;

@@ -124,3 +113,3 @@ }

}
async evaluate(expression, awaitPromise, resultOwnership, serializationOptions, userActivation = false) {
async evaluate(expression, awaitPromise, resultOwnership = "none" /* Script.ResultOwnership.None */, serializationOptions = {}, userActivation = false) {
const cdpEvaluateResult = await this.cdpClient.sendCommand('Runtime.evaluate', {

@@ -239,3 +228,5 @@ contextId: this.executionContextId,

}
async callFunction(functionDeclaration, thisLocalValue, argumentsLocalValues, awaitPromise, resultOwnership, serializationOptions, userActivation = false) {
async callFunction(functionDeclaration, awaitPromise, thisLocalValue = {
type: 'undefined',
}, argumentsLocalValues = [], resultOwnership = "none" /* Script.ResultOwnership.None */, serializationOptions = {}, userActivation = false) {
const callFunctionAndSerializeScript = `(...args) => {

@@ -242,0 +233,0 @@ function callFunction(f, args) {

@@ -17,3 +17,3 @@ /**

*/
import { type EmptyResult, Script } from '../../../protocol/protocol';
import { type EmptyResult, type Script } from '../../../protocol/protocol';
import type { LoggerFn } from '../../../utils/log';

@@ -20,0 +20,0 @@ import type { BrowsingContextStorage } from '../context/BrowsingContextStorage';

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

async addPreloadScript(params) {
const contexts = this.#browsingContextStorage.verifyContextsList(params.contexts);
const contexts = this.#browsingContextStorage.verifyTopLevelContextsList(params.contexts);
const preloadScript = new PreloadScript_1.PreloadScript(params, this.#logger);

@@ -49,13 +49,9 @@ this.#preloadScriptStorage.add(preloadScript);

async removePreloadScript(params) {
const bidiId = params.script;
const scripts = this.#preloadScriptStorage.find({
id: bidiId,
});
const { script: id } = params;
const scripts = this.#preloadScriptStorage.find({ id });
if (scripts.length === 0) {
throw new protocol_1.NoSuchScriptException(`No preload script with BiDi ID '${bidiId}'`);
throw new protocol_1.NoSuchScriptException(`No preload script with id '${id}'`);
}
await Promise.all(scripts.map((script) => script.remove()));
this.#preloadScriptStorage.remove({
id: bidiId,
});
this.#preloadScriptStorage.remove({ id });
return {};

@@ -65,11 +61,7 @@ }

const realm = await this.#getRealm(params.target);
return await realm.callFunction(params.functionDeclaration, params.this ?? {
type: 'undefined',
}, // `this` is `undefined` by default.
params.arguments ?? [], // `arguments` is `[]` by default.
params.awaitPromise, params.resultOwnership ?? "none" /* Script.ResultOwnership.None */, params.serializationOptions ?? {}, params.userActivation ?? false);
return await realm.callFunction(params.functionDeclaration, params.awaitPromise, params.this, params.arguments, params.resultOwnership, params.serializationOptions, params.userActivation);
}
async evaluate(params) {
const realm = await this.#getRealm(params.target);
return await realm.evaluate(params.expression, params.awaitPromise, params.resultOwnership ?? "none" /* Script.ResultOwnership.None */, params.serializationOptions ?? {}, params.userActivation ?? false);
return await realm.evaluate(params.expression, params.awaitPromise, params.resultOwnership, params.serializationOptions, params.userActivation);
}

@@ -76,0 +68,0 @@ async disown(params) {

@@ -38,3 +38,3 @@ /**

evaluate(expression: string, awaitPromise: boolean, resultOwnership: Script.ResultOwnership, serializationOptions: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
callFunction(functionDeclaration: string, thisLocalValue: Script.LocalValue, argumentsLocalValues: Script.LocalValue[], awaitPromise: boolean, resultOwnership: Script.ResultOwnership, serializationOptions: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
callFunction(functionDeclaration: string, awaitPromise: boolean, thisLocalValue: Script.LocalValue, argumentsLocalValues: Script.LocalValue[], resultOwnership: Script.ResultOwnership, serializationOptions: Script.SerializationOptions, userActivation?: boolean): Promise<Script.EvaluateResult>;
}

@@ -132,7 +132,7 @@ "use strict";

}
async callFunction(functionDeclaration, thisLocalValue, argumentsLocalValues, awaitPromise, resultOwnership, serializationOptions, userActivation) {
async callFunction(functionDeclaration, awaitPromise, thisLocalValue, argumentsLocalValues, resultOwnership, serializationOptions, userActivation) {
await this.#browsingContextStorage
.getContext(this.#browsingContextId)
.targetUnblockedOrThrow();
return await super.callFunction(functionDeclaration, thisLocalValue, argumentsLocalValues, awaitPromise, resultOwnership, serializationOptions, userActivation);
return await super.callFunction(functionDeclaration, awaitPromise, thisLocalValue, argumentsLocalValues, resultOwnership, serializationOptions, userActivation);
}

@@ -139,0 +139,0 @@ }

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

*/
import type { CdpClient } from '../../../cdp/CdpClient.js';
import type { BidiPlusChannel } from '../../../protocol/chromium-bidi.js';

@@ -23,6 +24,7 @@ import type { EmptyResult, Session } from '../../../protocol/protocol.js';

#private;
constructor(eventManager: EventManager);
constructor(eventManager: EventManager, browserCdpClient: CdpClient);
status(): Session.StatusResult;
create(_params: Session.NewParameters): Promise<Session.NewResult>;
subscribe(params: Session.SubscriptionRequest, channel?: BidiPlusChannel): Promise<EmptyResult>;
unsubscribe(params: Session.SubscriptionRequest, channel?: BidiPlusChannel): Promise<EmptyResult>;
}

@@ -22,4 +22,6 @@ "use strict";

#eventManager;
constructor(eventManager) {
#browserCdpClient;
constructor(eventManager, browserCdpClient) {
this.#eventManager = eventManager;
this.#browserCdpClient = browserCdpClient;
}

@@ -29,2 +31,21 @@ status() {

}
async create(_params) {
// Since mapper exists, there is a session already.
// Still the mapper can handle capabilities for us.
// Currently, only Puppeteer calls here but, eventually, every client
// should delegrate capability processing here.
const version = await this.#browserCdpClient.sendCommand('Browser.getVersion');
return {
sessionId: 'unknown',
capabilities: {
acceptInsecureCerts: false,
browserName: version.product,
browserVersion: version.revision,
platformName: '',
setWindowRect: false,
webSocketUrl: '',
userAgent: version.userAgent,
},
};
}
async subscribe(params, channel = null) {

@@ -31,0 +52,0 @@ await this.#eventManager.subscribe(params.events, params.contexts ?? [null], channel);

@@ -1263,3 +1263,3 @@ /**

export declare namespace Script {
type RemoteValue = Script.PrimitiveProtocolValue | Script.SymbolRemoteValue | Script.ArrayRemoteValue | Script.ObjectRemoteValue | Script.FunctionRemoteValue | Script.RegExpRemoteValue | Script.DateRemoteValue | Script.MapRemoteValue | Script.SetRemoteValue | Script.WeakMapRemoteValue | Script.WeakSetRemoteValue | Script.IteratorRemoteValue | Script.GeneratorRemoteValue | Script.ErrorRemoteValue | Script.ProxyRemoteValue | Script.PromiseRemoteValue | Script.TypedArrayRemoteValue | Script.ArrayBufferRemoteValue | Script.NodeListRemoteValue | Script.HtmlCollectionRemoteValue | Script.NodeRemoteValue | Script.WindowProxyRemoteValue;
type RemoteValue = Script.PrimitiveProtocolValue | Script.SymbolRemoteValue | Script.ArrayRemoteValue | Script.ObjectRemoteValue | Script.FunctionRemoteValue | Script.RegExpRemoteValue | Script.DateRemoteValue | Script.MapRemoteValue | Script.SetRemoteValue | Script.WeakMapRemoteValue | Script.WeakSetRemoteValue | Script.GeneratorRemoteValue | Script.ErrorRemoteValue | Script.ProxyRemoteValue | Script.PromiseRemoteValue | Script.TypedArrayRemoteValue | Script.ArrayBufferRemoteValue | Script.NodeListRemoteValue | Script.HtmlCollectionRemoteValue | Script.NodeRemoteValue | Script.WindowProxyRemoteValue;
}

@@ -1354,9 +1354,2 @@ export declare namespace Script {

export declare namespace Script {
type IteratorRemoteValue = {
type: 'iterator';
handle?: Script.Handle;
internalId?: Script.InternalId;
};
}
export declare namespace Script {
type GeneratorRemoteValue = {

@@ -1363,0 +1356,0 @@ type: 'generator';

{
"name": "chromium-bidi",
"version": "0.5.14",
"version": "0.5.15",
"description": "An implementation of the WebDriver BiDi protocol for Chromium implemented as a JavaScript layer translating between BiDi and CDP, running inside a Chrome tab.",

@@ -168,3 +168,3 @@ "scripts": {

"debug": "4.3.4",
"devtools-protocol": "0.0.1273771",
"devtools-protocol": "0.0.1275388",
"eslint": "8.57.0",

@@ -171,0 +171,0 @@ "eslint-config-prettier": "9.1.0",

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 too big to display

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

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