New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

@node-ts/bus-workflow

Package Overview
Dependencies
Maintainers
1
Versions
62
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@node-ts/bus-workflow - npm Package Compare versions

Comparing version 0.2.3 to 0.3.0

src/test/final-task.ts

4

dist/workflow/decorators/handles.d.ts

@@ -6,3 +6,3 @@ import { Message } from '@node-ts/bus-messages';

import { WorkflowWithHandler } from './handler-workflow';
import { ClassConstructor } from '@node-ts/bus-core';
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core';
export declare const WORKFLOW_HANDLES_METADATA_KEY: unique symbol;

@@ -24,2 +24,2 @@ export declare class WorkflowHandlesMetadata {

*/
export declare function Handles<MessageType extends Message, WorkflowDataType extends WorkflowData, KeyType extends string, TargetType extends WorkflowWithHandler<MessageType, WorkflowDataType, KeyType> = WorkflowWithHandler<MessageType, WorkflowDataType, KeyType>>(messageConstructor: ClassConstructor<MessageType>, messageLookup: (message: MessageType) => string | undefined, workflowDataProperty: keyof WorkflowDataType & string): (target: TargetType, propertyKey: KeyType) => void;
export declare function Handles<MessageType extends Message, WorkflowDataType extends WorkflowData, KeyType extends string, TargetType extends WorkflowWithHandler<MessageType, WorkflowDataType, KeyType> = WorkflowWithHandler<MessageType, WorkflowDataType, KeyType>>(messageConstructor: ClassConstructor<MessageType>, messageLookup: (message: MessageType, messageOptions: MessageOptions) => string | undefined, workflowDataProperty: keyof WorkflowDataType & string): (target: TargetType, propertyKey: KeyType) => void;
import { Message } from '@node-ts/bus-messages';
import { WorkflowData } from './workflow-data';
import { MessageOptions } from '@node-ts/bus-core';
export declare class MessageWorkflowMapping<MessageType extends Message, WorkflowDataType extends WorkflowData> {
lookupMessage: (message: MessageType) => string | undefined;
lookupMessage: (message: MessageType, messageOptions?: MessageOptions) => string | undefined;
readonly workflowDataProperty: keyof WorkflowDataType & string;

@@ -11,3 +12,3 @@ /**

*/
constructor(lookupMessage: (message: MessageType) => string | undefined, workflowDataProperty: keyof WorkflowDataType & string);
constructor(lookupMessage: (message: MessageType, messageOptions?: MessageOptions) => string | undefined, workflowDataProperty: keyof WorkflowDataType & string);
}
import { Persistence } from './persistence';
import { WorkflowData } from '../workflow-data';
import { ClassConstructor } from '@node-ts/bus-core';
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core';
import { MessageWorkflowMapping } from '../message-workflow-mapping';

@@ -17,5 +17,5 @@ import { Message } from '@node-ts/bus-messages';

initializeWorkflow<TWorkflowData extends WorkflowData>(workflowDataConstructor: ClassConstructor<TWorkflowData>, _: MessageWorkflowMapping<Message, WorkflowData>[]): Promise<void>;
getWorkflowData<WorkflowDataType extends WorkflowData, MessageType extends Message>(workflowDataConstructor: ClassConstructor<WorkflowDataType>, messageMap: MessageWorkflowMapping<MessageType, WorkflowDataType>, message: MessageType, includeCompleted?: boolean | undefined): Promise<WorkflowDataType[]>;
getWorkflowData<WorkflowDataType extends WorkflowData, MessageType extends Message>(workflowDataConstructor: ClassConstructor<WorkflowDataType>, messageMap: MessageWorkflowMapping<MessageType, WorkflowDataType>, message: MessageType, messageOptions: MessageOptions, includeCompleted?: boolean | undefined): Promise<WorkflowDataType[]>;
saveWorkflowData<WorkflowDataType extends WorkflowData>(workflowData: WorkflowDataType): Promise<void>;
length(workflowDataConstructor: ClassConstructor<WorkflowData>): number;
}

@@ -20,4 +20,4 @@ "use strict";

}
async getWorkflowData(workflowDataConstructor, messageMap, message, includeCompleted) {
const filterValue = messageMap.lookupMessage(message);
async getWorkflowData(workflowDataConstructor, messageMap, message, messageOptions, includeCompleted) {
const filterValue = messageMap.lookupMessage(message, messageOptions);
if (!filterValue) {

@@ -24,0 +24,0 @@ return [];

import { Message } from '@node-ts/bus-messages';
import { ClassConstructor } from '@node-ts/bus-core';
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core';
import { WorkflowData } from '../workflow-data';

@@ -32,3 +32,3 @@ import { MessageWorkflowMapping } from '../message-workflow-mapping';

*/
getWorkflowData<WorkflowDataType extends WorkflowData, MessageType extends Message>(workflowDataConstructor: ClassConstructor<WorkflowDataType>, messageMap: MessageWorkflowMapping<MessageType, WorkflowDataType>, message: MessageType, includeCompleted?: boolean): Promise<WorkflowDataType[]>;
getWorkflowData<WorkflowDataType extends WorkflowData, MessageType extends Message>(workflowDataConstructor: ClassConstructor<WorkflowDataType>, messageMap: MessageWorkflowMapping<MessageType, WorkflowDataType>, message: MessageType, messageOptions: MessageOptions, includeCompleted?: boolean): Promise<WorkflowDataType[]>;
/**

@@ -35,0 +35,0 @@ * Saves a new workflow data model or updates an existing one. Persistence implementations should take care

@@ -8,6 +8,7 @@ import { Message } from '@node-ts/bus-messages';

import { Persistence } from '../persistence';
import { MessageOptions } from '@node-ts/bus-core';
export declare class HandlesProxy<TMessage extends Message, TWorkflowData extends WorkflowData> extends WorkflowHandlerProxy<TMessage, TWorkflowData> {
private messageMapping;
constructor(handler: WorkflowHandlerFn<TMessage, TWorkflowData>, workflowDataConstructor: WorkflowDataConstructor<TWorkflowData>, messageMapping: MessageWorkflowMapping<TMessage, TWorkflowData>, persistence: Persistence, logger: Logger);
getWorkflowData(message: TMessage): Promise<TWorkflowData[]>;
getWorkflowData(message: TMessage, messageOptions: MessageOptions): Promise<TWorkflowData[]>;
}

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

}
async getWorkflowData(message) {
const searchValue = this.messageMapping.lookupMessage(message);
async getWorkflowData(message, messageOptions) {
const searchValue = this.messageMapping.lookupMessage(message, messageOptions);
if (!searchValue) {

@@ -19,3 +19,3 @@ this.logger.trace('Message mapper returned undefined and will not resolve to any workflow data.', {

}
return this.persistence.getWorkflowData(this.workflowDataConstructor, this.messageMapping, message);
return this.persistence.getWorkflowData(this.workflowDataConstructor, this.messageMapping, message, messageOptions);
}

@@ -22,0 +22,0 @@ }

import { Message } from '@node-ts/bus-messages';
import { WorkflowData } from '../workflow-data';
export declare type WorkflowHandlerFn<TMessage extends Message, TWorkflowData extends WorkflowData> = (message: TMessage, data: Readonly<TWorkflowData>) => Promise<Partial<TWorkflowData>> | Promise<void> | Partial<TWorkflowData> | void;
import { MessageOptions } from '@node-ts/bus-core';
export declare type WorkflowHandlerFn<TMessage extends Message, TWorkflowData extends WorkflowData> = (message: TMessage, data: Readonly<TWorkflowData>, messageOptions: MessageOptions) => Promise<Partial<TWorkflowData>> | Promise<void> | Partial<TWorkflowData> | void;
import { Message } from '@node-ts/bus-messages';
import { WorkflowData, WorkflowDataConstructor } from '../workflow-data';
import { Logger } from '@node-ts/logger-core';
import { Handler } from '@node-ts/bus-core';
import { Handler, MessageOptions } from '@node-ts/bus-core';
import { WorkflowHandlerFn } from './workflow-handler-fn';

@@ -15,5 +15,5 @@ import { Persistence } from '../persistence';

constructor(handler: WorkflowHandlerFn<TMessage, TWorkflowData>, workflowDataConstructor: WorkflowDataConstructor<TWorkflowData>, persistence: Persistence, logger: Logger);
handle(message: TMessage): Promise<void>;
abstract getWorkflowData(message: TMessage): Promise<TWorkflowData[]>;
handle(message: TMessage, messageOptions: MessageOptions): Promise<void>;
abstract getWorkflowData(message: TMessage, messageOptions: MessageOptions): Promise<TWorkflowData[]>;
private persist;
}

@@ -14,4 +14,4 @@ "use strict";

}
async handle(message) {
this.logger.debug('Getting workflow data for message', { message });
async handle(message, messageOptions) {
this.logger.debug('Getting workflow data for message', { message, messageOptions });
/*

@@ -21,3 +21,3 @@ Ensure that the workflow data fields are immutable by consumers to ensure modifications are done

*/
const workflowDataItems = await this.getWorkflowData(message);
const workflowDataItems = await this.getWorkflowData(message, messageOptions);
this.logger.debug('Workflow data retrieved', { workflowData: workflowDataItems, message });

@@ -30,3 +30,3 @@ if (!workflowDataItems.length) {

const immutableWorkflowData = Object.freeze(Object.assign({}, workflowData));
const workflowDataOutput = await this.handler(message, immutableWorkflowData);
const workflowDataOutput = await this.handler(message, immutableWorkflowData, messageOptions);
if (workflowDataOutput && workflowDataOutput.$status === workflow_data_1.WorkflowStatus.Discard) {

@@ -33,0 +33,0 @@ this.logger.debug('Workflow step is discarding state changes. State changes will not be persisted', { workflowId: immutableWorkflowData.$workflowId, workflowName: this.workflowDataConstructor.name });

{
"name": "@node-ts/bus-workflow",
"description": "A workflow engine for orchestrating logic flows in distributed applications.",
"version": "0.2.3",
"version": "0.3.0",
"license": "MIT",

@@ -24,3 +24,3 @@ "main": "./dist/index.js",

"devDependencies": {
"@node-ts/bus-core": "^0.2.2",
"@node-ts/bus-core": "^0.3.0",
"@node-ts/code-standards": "^0.0.10",

@@ -59,3 +59,3 @@ "@node-ts/logger-core": "^0.0.17",

],
"gitHead": "bacefae4e4f09c32a6337f6072910121a282ed21"
"gitHead": "5894011a1c2150aa25735267c9ef78dcaeb0cd70"
}

@@ -6,1 +6,2 @@ export * from './test-workflow-data'

export * from './run-task'
export * from './final-task'

@@ -9,2 +9,3 @@ import { Workflow } from '../workflow'

import { TaskRan } from './task-ran'
import { FinalTask } from './final-task'

@@ -30,6 +31,15 @@ @injectable()

async handleTaskRan (event: TaskRan): Promise<Partial<TestWorkflowData>> {
return this.complete({
eventValue: event.value
})
return {
property1: event.value
}
}
@Handles<FinalTask, TestWorkflowData, 'handleFinalTask'>(
FinalTask,
(_, messageOptions) => messageOptions.correlationId,
'$workflowId'
)
async handleFinalTask (_: FinalTask): Promise<Partial<TestWorkflowData>> {
return this.complete()
}
}

@@ -7,3 +7,3 @@ import { Message } from '@node-ts/bus-messages'

import { WorkflowWithHandler } from './handler-workflow'
import { ClassConstructor } from '@node-ts/bus-core'
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core'

@@ -42,3 +42,3 @@ export const WORKFLOW_HANDLES_METADATA_KEY = Symbol.for('node-ts/bus/workflow-handles-steps')

messageConstructor: ClassConstructor<MessageType>,
messageLookup: (message: MessageType) => string | undefined,
messageLookup: (message: MessageType, messageOptions: MessageOptions) => string | undefined,
workflowDataProperty: keyof WorkflowDataType & string

@@ -45,0 +45,0 @@ ): (target: TargetType, propertyKey: KeyType) => void {

import { Message } from '@node-ts/bus-messages'
import { WorkflowData } from './workflow-data'
import { MessageOptions } from '@node-ts/bus-core'

@@ -12,3 +13,3 @@ export class MessageWorkflowMapping<MessageType extends Message, WorkflowDataType extends WorkflowData> {

constructor (
public lookupMessage: (message: MessageType) => string | undefined,
public lookupMessage: (message: MessageType, messageOptions?: MessageOptions) => string | undefined,
readonly workflowDataProperty: keyof WorkflowDataType & string

@@ -15,0 +16,0 @@ ) {

@@ -7,2 +7,3 @@ import { InMemoryPersistence } from './in-memory-persistence'

import { Logger } from '@node-ts/logger-core'
import { MessageOptions } from '@node-ts/bus-core';

@@ -23,2 +24,4 @@ describe('InMemoryPersistence', () => {

describe('when getting workflow data', () => {
const messageOptions = new MessageOptions()
beforeEach(async () => {

@@ -43,3 +46,4 @@ const mapping = new MessageWorkflowMapping<TestCommand, TestWorkflowData>(

propertyMapping,
message
message,
messageOptions
)

@@ -64,3 +68,4 @@ })

unmatchedMapping,
new TestCommand('abc')
new TestCommand('abc'),
messageOptions
)

@@ -96,2 +101,4 @@ })

const workflowId = 'abc'
const messageOptions = new MessageOptions()
beforeEach(async () => {

@@ -115,3 +122,4 @@ const workflowData = new TestWorkflowData()

propertyMapping,
testCommand
testCommand,
messageOptions
)

@@ -118,0 +126,0 @@

import { Persistence } from './persistence'
import { WorkflowData, WorkflowStatus } from '../workflow-data'
import { ClassConstructor } from '@node-ts/bus-core'
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core'
import { MessageWorkflowMapping } from '../message-workflow-mapping'

@@ -39,5 +39,6 @@ import { Message } from '@node-ts/bus-messages'

message: MessageType,
messageOptions: MessageOptions,
includeCompleted?: boolean | undefined
): Promise<WorkflowDataType[]> {
const filterValue = messageMap.lookupMessage(message)
const filterValue = messageMap.lookupMessage(message, messageOptions)
if (!filterValue) {

@@ -44,0 +45,0 @@ return []

import { Message } from '@node-ts/bus-messages'
import { ClassConstructor } from '@node-ts/bus-core'
import { ClassConstructor, MessageOptions } from '@node-ts/bus-core'
import { WorkflowData } from '../workflow-data'

@@ -43,2 +43,3 @@ import { MessageWorkflowMapping } from '../message-workflow-mapping'

message: MessageType,
messageOptions: MessageOptions,
includeCompleted?: boolean

@@ -45,0 +46,0 @@ ): Promise<WorkflowDataType[]>

@@ -10,2 +10,3 @@ import { IMock, It, Mock, Times } from 'typemoq'

import { WorkflowStatus } from '../workflow-data'
import { MessageOptions } from '@node-ts/bus-core';

@@ -38,2 +39,3 @@ describe('HandlesProxy', () => {

let command: TestCommand
let messageOptions: MessageOptions
let dataInput: TestWorkflowData

@@ -44,2 +46,3 @@ let dataOutput: Partial<TestWorkflowData>

command = new TestCommand('value')
messageOptions = new MessageOptions()

@@ -54,3 +57,4 @@ dataInput = new TestWorkflowData()

mapping,
command
command,
messageOptions
)

@@ -62,7 +66,7 @@ )

handler
.setup(x => x(command, It.isObjectWith({...dataInput})))
.setup(x => x(command, It.isObjectWith({...dataInput}), messageOptions))
.returns(async () => dataOutput)
.verifiable(Times.once())
await sut.handle(command)
await sut.handle(command, messageOptions)
})

@@ -72,3 +76,3 @@

persistence.verify(
async x => x.getWorkflowData(TestWorkflowData, mapping, command),
async x => x.getWorkflowData(TestWorkflowData, mapping, command, messageOptions),
Times.once()

@@ -100,2 +104,3 @@ )

let comand: TestCommand
const messageOptions = new MessageOptions()

@@ -107,3 +112,3 @@ beforeEach(() => {

it('should return an empty set of workflow data', async () => {
const result = await sut.getWorkflowData(comand)
const result = await sut.getWorkflowData(comand, messageOptions)
expect(result).toHaveLength(0)

@@ -110,0 +115,0 @@ })

@@ -8,2 +8,3 @@ import { Message } from '@node-ts/bus-messages'

import { Persistence } from '../persistence'
import { MessageOptions } from '@node-ts/bus-core'

@@ -23,4 +24,4 @@ export class HandlesProxy<TMessage extends Message, TWorkflowData extends WorkflowData>

async getWorkflowData (message: TMessage): Promise<TWorkflowData[]> {
const searchValue = this.messageMapping.lookupMessage(message)
async getWorkflowData (message: TMessage, messageOptions: MessageOptions): Promise<TWorkflowData[]> {
const searchValue = this.messageMapping.lookupMessage(message, messageOptions)

@@ -38,5 +39,6 @@ if (!searchValue) {

this.messageMapping,
message
message,
messageOptions
)
}
}

@@ -8,2 +8,3 @@ import { IMock, It, Mock, Times } from 'typemoq'

import { WorkflowStatus } from '../workflow-data'
import { MessageOptions } from '@node-ts/bus-core'

@@ -33,2 +34,3 @@ describe('StartedByProxy', () => {

let command: TestCommand
const messageOptions = new MessageOptions()
let dataOutput: Partial<TestWorkflowData>

@@ -42,6 +44,6 @@

// tslint:disable-next-line:no-unsafe-any
.setup(x => x(command, It.isAny()))
.setup(x => x(command, It.isAny(), messageOptions))
.returns(async () => dataOutput)
await sut.handle(command)
await sut.handle(command, messageOptions)
})

@@ -53,3 +55,4 @@

command,
It.is((data: TestWorkflowData) => !!data && data.$version === 0 && data.$status === WorkflowStatus.Running)
It.is((data: TestWorkflowData) => !!data && data.$version === 0 && data.$status === WorkflowStatus.Running),
messageOptions
),

@@ -72,2 +75,3 @@ Times.once())

let command: TestCommand
const messageOptions = new MessageOptions()

@@ -80,3 +84,3 @@ beforeEach(async () => {

// tslint:disable-next-line:no-unsafe-any
.setup(x => x(command, It.isAny()))
.setup(x => x(command, It.isAny(), messageOptions))
.callback(() => {

@@ -87,3 +91,3 @@ dataOutput = { ...dataOutput, $status: WorkflowStatus.Complete }

await sut.handle(command)
await sut.handle(command, messageOptions)
})

@@ -90,0 +94,0 @@

import { Message } from '@node-ts/bus-messages'
import { WorkflowData } from '../workflow-data'
import { MessageOptions } from '@node-ts/bus-core'
export type WorkflowHandlerFn<TMessage extends Message, TWorkflowData extends WorkflowData> = (
message: TMessage,
data: Readonly<TWorkflowData>
data: Readonly<TWorkflowData>,
messageOptions: MessageOptions
) => Promise<Partial<TWorkflowData>> | Promise<void> | Partial<TWorkflowData> | void
import { Message } from '@node-ts/bus-messages'
import { WorkflowData, WorkflowDataConstructor, WorkflowStatus } from '../workflow-data'
import { Logger } from '@node-ts/logger-core'
import { Handler } from '@node-ts/bus-core'
import { Handler, MessageOptions } from '@node-ts/bus-core'
import { WorkflowHandlerFn } from './workflow-handler-fn'

@@ -24,4 +24,4 @@ import { Persistence } from '../persistence'

async handle (message: TMessage): Promise<void> {
this.logger.debug('Getting workflow data for message', { message })
async handle (message: TMessage, messageOptions: MessageOptions): Promise<void> {
this.logger.debug('Getting workflow data for message', { message, messageOptions })

@@ -32,3 +32,3 @@ /*

*/
const workflowDataItems = await this.getWorkflowData(message)
const workflowDataItems = await this.getWorkflowData(message, messageOptions)

@@ -44,3 +44,3 @@ this.logger.debug('Workflow data retrieved', { workflowData: workflowDataItems, message })

const immutableWorkflowData = Object.freeze({...workflowData})
const workflowDataOutput = await this.handler(message, immutableWorkflowData)
const workflowDataOutput = await this.handler(message, immutableWorkflowData, messageOptions)

@@ -79,3 +79,3 @@ if (workflowDataOutput && workflowDataOutput.$status === WorkflowStatus.Discard) {

abstract getWorkflowData (message: TMessage): Promise<TWorkflowData[]>
abstract getWorkflowData (message: TMessage, messageOptions: MessageOptions): Promise<TWorkflowData[]>

@@ -82,0 +82,0 @@ private async persist (data: TWorkflowData): Promise<void> {

@@ -55,3 +55,3 @@ import { Container } from 'inversify'

logger.verify(
l => l.error('Could not get handler for message from the IoC container.', It.isAny()),
l => l.error('Could not resolve handler from the IoC container.', It.isAny()),
Times.atLeastOnce()

@@ -58,0 +58,0 @@ )

import { Container } from 'inversify'
import { BusModule, Bus, BUS_SYMBOLS, ApplicationBootstrap } from '@node-ts/bus-core'
import { BusModule, Bus, BUS_SYMBOLS, ApplicationBootstrap, MessageOptions } from '@node-ts/bus-core'
import { Persistence } from './persistence'
import { BUS_WORKFLOW_SYMBOLS } from '../bus-workflow-symbols'
import { TestCommand, TestWorkflowData, TestWorkflow, TaskRan } from '../test'
import { TestCommand, TestWorkflowData, TestWorkflow, TaskRan, FinalTask } from '../test'
import { MessageWorkflowMapping } from './message-workflow-mapping'

@@ -64,2 +64,3 @@ import { sleep } from '../utility'

let workflowData: TestWorkflowData[]
const messageOptions = new MessageOptions()

@@ -70,3 +71,4 @@ beforeAll(async () => {

propertyMapping,
command
command,
messageOptions
)

@@ -85,3 +87,3 @@ })

const event = new TaskRan('abc')
let finalWorkflowData: TestWorkflowData[]
let nextWorkflowData: TestWorkflowData[]

@@ -92,6 +94,7 @@ beforeAll(async () => {

finalWorkflowData = await persistence.getWorkflowData<TestWorkflowData, TestCommand>(
nextWorkflowData = await persistence.getWorkflowData<TestWorkflowData, TestCommand>(
TestWorkflowData,
propertyMapping,
command,
messageOptions,
true

@@ -102,8 +105,30 @@ )

it('should handle that message', () => {
expect(finalWorkflowData).toHaveLength(1)
expect(nextWorkflowData).toHaveLength(1)
})
it('should mark the workflow as complete', () => {
const data = finalWorkflowData[0]
expect(data.$status).toEqual(WorkflowStatus.Complete)
describe('and then a final message arrives', () => {
const finalTask = new FinalTask()
let finalWorkflowData: TestWorkflowData[]
beforeAll(async () => {
await bus.publish(
finalTask,
{ correlationId: nextWorkflowData[0].$workflowId }
)
await sleep(CONSUME_TIMEOUT)
finalWorkflowData = await persistence.getWorkflowData<TestWorkflowData, TestCommand>(
TestWorkflowData,
propertyMapping,
command,
messageOptions,
true
)
})
it('should mark the workflow as complete', () => {
expect(finalWorkflowData).toHaveLength(1)
const data = finalWorkflowData[0]
expect(data.$status).toEqual(WorkflowStatus.Complete)
})
})

@@ -114,2 +139,3 @@ })

describe('when a workflow is completed in a StartedBy handler', () => {
const messageOptions = new MessageOptions()
const propertyMapping = new MessageWorkflowMapping<TestCommand, TestWorkflowStartedByCompletesData> (

@@ -125,2 +151,3 @@ cmd => cmd.property1,

command,
messageOptions,
true

@@ -136,2 +163,3 @@ )

describe('when a StartedBy handler returns a discardStep', () => {
const messageOptions = new MessageOptions()
const propertyMapping = new MessageWorkflowMapping<TestCommand, TestWorkflowStartedByDiscardData> (

@@ -147,2 +175,3 @@ cmd => cmd.property1,

command,
messageOptions,
true

@@ -149,0 +178,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

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