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

amplify-prompts

Package Overview
Dependencies
Maintainers
1
Versions
194
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

amplify-prompts - npm Package Compare versions

Comparing version 2.0.1-alpha.61 to 2.0.1-alpha.69

1

lib/flags.d.ts
export declare const isDebug: boolean;
export declare const isSilent: boolean;
export declare const isYes: boolean;
export declare const isInteractiveShell: boolean;
//# sourceMappingURL=flags.d.ts.map

3

lib/flags.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isYes = exports.isSilent = exports.isDebug = void 0;
exports.isInteractiveShell = exports.isYes = exports.isSilent = exports.isDebug = void 0;
exports.isDebug = process.argv.includes('--debug');
exports.isSilent = process.argv.includes('--silent');
exports.isYes = !!['--yes', '-y'].find(yesFlag => process.argv.includes(yesFlag));
exports.isInteractiveShell = process.stdin.isTTY;
//# sourceMappingURL=flags.js.map

@@ -12,3 +12,3 @@ import { Validator } from './validators';

};
declare type MaybeAvailableHiddenInputOption<RS extends ReturnSize> = RS extends 'many' ? {} : {
declare type MaybeAvailableHiddenInputOption<RS extends ReturnSize> = RS extends 'many' ? unknown : {
hidden?: boolean;

@@ -24,6 +24,6 @@ };

};
declare type MultiSelectMinimun<RS extends ReturnSize> = RS extends 'one' ? {} : {
declare type MultiSelectMinimum<RS extends ReturnSize> = RS extends 'one' ? unknown : {
pickAtLeast?: number;
};
declare type MultiSelectMaximum<RS extends ReturnSize> = RS extends 'one' ? {} : {
declare type MultiSelectMaximum<RS extends ReturnSize> = RS extends 'one' ? unknown : {
pickAtMost?: number;

@@ -54,5 +54,5 @@ };

declare type PromptReturn<RS extends ReturnSize, T> = RS extends 'many' ? T[] : T;
declare type PickOptions<RS extends ReturnSize, T> = ReturnSizeOption<RS> & InitialSelectionOption<RS, T> & MultiSelectMaximum<RS> & MultiSelectMinimun<RS>;
declare type PickOptions<RS extends ReturnSize, T> = ReturnSizeOption<RS> & InitialSelectionOption<RS, T> & MultiSelectMaximum<RS> & MultiSelectMinimum<RS>;
declare type InputOptions<RS extends ReturnSize, T> = ReturnSizeOption<RS> & ValidateValueOption & InitialValueOption<T> & MaybeOptionalTransformOption<T> & MaybeAvailableHiddenInputOption<RS>;
export {};
//# sourceMappingURL=prompter.d.ts.map

@@ -28,5 +28,5 @@ "use strict";

const actions = __importStar(require("enquirer/lib/combos"));
const chalk_1 = __importDefault(require("chalk"));
const flags_1 = require("./flags");
const printer_1 = require("./printer");
const chalk_1 = __importDefault(require("chalk"));
class AmplifyPrompter {

@@ -55,3 +55,6 @@ constructor(prompter = enquirer_1.prompt, print = printer_1.printer) {

format: value => (submitted ? (value ? 'yes' : 'no') : ''),
onSubmit: () => (submitted = true),
onSubmit: () => {
submitted = true;
return true;
},
initial,

@@ -68,5 +71,3 @@ });

}
else {
throw new Error(`Cannot prompt for [${message}] when '--yes' flag is set`);
}
throw new Error(`Cannot prompt for [${message}] when '--yes' flag is set`);
}

@@ -88,5 +89,3 @@ const validator = (opts.returnSize === 'many' ? validateEachWith(opts.validate) : opts.validate);

}
else {
return result;
}
return result;
};

@@ -161,6 +160,11 @@ this.pick = async (message, choices, ...options) => {

}
else {
return choiceValueMap.get(result);
return choiceValueMap.get(result);
};
const prompterShim = ((opts) => {
if (flags_1.isInteractiveShell) {
return prompter(opts);
}
};
throw new Error(`Cannot prompt for [${opts.message}] in a non-interactive shell`);
});
this.prompter = prompterShim;
}

@@ -167,0 +171,0 @@ }

{
"name": "amplify-prompts",
"version": "2.0.1-alpha.61+eff77da6a",
"version": "2.0.1-alpha.69+0909769dc",
"description": "Utility functions for Amplify CLI terminal I/O",

@@ -51,3 +51,3 @@ "main": "lib/index.js",

},
"gitHead": "eff77da6a9a26f3529bce8448a8243a0c44c746b"
"gitHead": "0909769dc64c83bcb5e91e79156db2f6ec60ac85"
}

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

import { prompt } from 'enquirer';
import { byValue, byValues, prompter } from '../prompter';
import { prompt } from 'enquirer';
import * as flags from '../flags';

@@ -9,3 +9,3 @@

const flags_mock = flags as jest.Mocked<Writeable<typeof flags>>;
const flagsMock = flags as jest.Mocked<Writeable<typeof flags>>;

@@ -16,7 +16,8 @@ jest.mock('enquirer', () => ({

const prompt_mock = prompt as jest.MockedFunction<typeof prompt>;
const promptMock = prompt as jest.MockedFunction<typeof prompt>;
beforeEach(() => {
beforeEach(async () => {
flagsMock.isYes = false;
flagsMock.isInteractiveShell = true;
jest.clearAllMocks();
flags_mock.isYes = false;
});

@@ -26,14 +27,21 @@

it('returns true if yes flag set', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
expect(await prompter.confirmContinue()).toBe(true);
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});
it('returns prompt response by default', async () => {
prompt_mock.mockResolvedValueOnce({ result: true });
promptMock.mockResolvedValueOnce({ result: true });
expect(await prompter.confirmContinue()).toBe(true);
prompt_mock.mockResolvedValueOnce({ result: false });
promptMock.mockResolvedValueOnce({ result: false });
expect(await prompter.confirmContinue()).toBe(false);
});
it('throws error if non-interactive shell', async () => {
flagsMock.isInteractiveShell = false;
await expect(() => prompter.confirmContinue()).rejects.toThrowErrorMatchingInlineSnapshot(
'"Cannot prompt for [Do you want to continue?] in a non-interactive shell"',
);
});
});

@@ -43,11 +51,19 @@

it('returns default value if yes flag set', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
expect(await prompter.yesOrNo('test message', false)).toBe(false);
expect(await prompter.yesOrNo('test message', true)).toBe(true);
expect(promptMock).not.toBeCalled();
});
it('returns prompt response by default', async () => {
prompt_mock.mockResolvedValueOnce({ result: true });
promptMock.mockResolvedValueOnce({ result: true });
expect(await prompter.yesOrNo('test message', false)).toBe(true);
});
it('throws error if non-interactive shell', async () => {
flagsMock.isInteractiveShell = false;
await expect(() => prompter.yesOrNo('test message')).rejects.toThrowErrorMatchingInlineSnapshot(
'"Cannot prompt for [test message] in a non-interactive shell"',
);
});
});

@@ -57,12 +73,19 @@

it('throws if yes flag set and no initial value', async () => {
flags_mock.isYes = true;
expect(() => prompter.input('test message')).rejects.toThrowErrorMatchingInlineSnapshot(
`"Cannot prompt for [test message] when '--yes' flag is set"`,
flagsMock.isYes = true;
await expect(() => prompter.input('test message')).rejects.toThrowErrorMatchingInlineSnapshot(
"\"Cannot prompt for [test message] when '--yes' flag is set\"",
);
});
it('throws if non-interactive shell and yes flag false', async () => {
flagsMock.isInteractiveShell = false;
await expect(() => prompter.input('test message')).rejects.toThrowErrorMatchingInlineSnapshot(
'"Cannot prompt for [test message] in a non-interactive shell"',
);
});
it('returns initial value without prompt if yes flag set', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
expect(await prompter.input('test message', { initial: 'initial value' })).toEqual('initial value');
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});

@@ -72,3 +95,3 @@

const result = 'this is the result';
prompt_mock.mockResolvedValueOnce({ result });
promptMock.mockResolvedValueOnce({ result });
expect(await prompter.input('test message')).toEqual(result);

@@ -80,12 +103,11 @@ });

const transformedValue = 'transformed value';
prompt_mock.mockResolvedValueOnce({ result: promptResponse });
expect(await prompter.input('test message', { transform: input => transformedValue })).toEqual(transformedValue);
promptMock.mockResolvedValueOnce({ result: promptResponse });
expect(await prompter.input('test message', { transform: _ => transformedValue })).toEqual(transformedValue);
});
it('transforms each input part separately when "many" specified', async () => {
prompt_mock.mockResolvedValueOnce({ result: ['10', '20'] });
expect(await prompter.input<'many'>('test message', { returnSize: 'many', transform: input => `${input}suffix` })).toEqual([
'10suffix',
'20suffix',
]);
promptMock.mockResolvedValueOnce({ result: ['10', '20'] });
expect(
await prompter.input<'many'>('test message', { returnSize: 'many', transform: input => `${input}suffix` }),
).toEqual(['10suffix', '20suffix']);
});

@@ -96,37 +118,44 @@ });

it('throws if yes flag set and multiple options provided', async () => {
flags_mock.isYes = true;
expect(() => prompter.pick('test message', ['opt1', 'opt2'])).rejects.toThrowErrorMatchingInlineSnapshot(
`"Cannot prompt for [test message] when '--yes' flag is set"`,
flagsMock.isYes = true;
await expect(() => prompter.pick('test message', ['opt1', 'opt2'])).rejects.toThrowErrorMatchingInlineSnapshot(
"\"Cannot prompt for [test message] when '--yes' flag is set\"",
);
});
it('throws if non-interactive shell and yes flag false', async () => {
flagsMock.isInteractiveShell = false;
await expect(() => prompter.pick('test message', ['opt1', 'opt2'])).rejects.toThrowErrorMatchingInlineSnapshot(
'"Cannot prompt for [test message] in a non-interactive shell"',
);
});
it('returns single option when yes flag set if only one option is provided', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
expect(await prompter.pick('test message', ['opt1'])).toEqual('opt1');
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});
it('returns initial selection if specified when yes flag is set', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
const result = await prompter.pick<'many'>('test message', ['opt1', 'opt2', 'opt3'], { returnSize: 'many', initial: [1, 2] });
expect(result).toEqual(['opt2', 'opt3']);
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});
it('computes selection index using selection function', async () => {
prompt_mock.mockResolvedValueOnce({ result: 'opt2' });
promptMock.mockResolvedValueOnce({ result: 'opt2' });
await prompter.pick('test message', ['opt1', 'opt2', 'opt3'], { initial: byValue('opt2') });
expect((prompt_mock.mock.calls[0][0] as any).initial).toBe(1);
expect((promptMock.mock.calls[0][0] as any).initial).toBe(1);
});
it('returns initial selection using selection function when yes flag is set', async () => {
flags_mock.isYes = true;
flagsMock.isYes = true;
const result = await prompter.pick('test message', ['opt1', 'opt2', 'opt3'], { initial: byValue('opt2') });
expect(result).toBe('opt2');
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});
it('throws if no choices provided', async () => {
expect(() => prompter.pick('test message', [])).rejects.toThrowErrorMatchingInlineSnapshot(
`"No choices provided for prompt [test message]"`,
await expect(() => prompter.pick('test message', [])).rejects.toThrowErrorMatchingInlineSnapshot(
'"No choices provided for prompt [test message]"',
);

@@ -137,7 +166,7 @@ });

expect(await prompter.pick('test message', ['only option'])).toEqual('only option');
expect(prompt_mock.mock.calls.length).toBe(0);
expect(promptMock.mock.calls.length).toBe(0);
});
it('returns selected item', async () => {
prompt_mock.mockResolvedValueOnce({ result: 'first opt' });
promptMock.mockResolvedValueOnce({ result: 'first opt' });
expect(await prompter.pick('test message', ['first opt', 'second opt'])).toEqual('first opt');

@@ -148,29 +177,36 @@ });

const mockResult = ['val1', 'val3'];
prompt_mock.mockResolvedValueOnce({ result: mockResult });
expect(await prompter.pick<'many'>('test message', ['val1', 'val2', 'val3'], { returnSize: 'many' })).toEqual(mockResult);
promptMock.mockResolvedValueOnce({ result: mockResult });
expect(
await prompter.pick<'many'>('test message', ['val1', 'val2', 'val3'], { returnSize: 'many' }),
).toEqual(mockResult);
});
it('returns array of single item if only one choice specified and must pick at least 1', async () => {
expect(await prompter.pick<'many'>('test message', ['hello'], { returnSize: 'many', pickAtLeast: 1 })).toEqual(['hello']);
expect(prompt_mock).toHaveBeenCalledTimes(0);
expect(
await prompter.pick<'many'>('test message', ['hello'], { returnSize: 'many', pickAtLeast: 1 }),
).toEqual(['hello']);
expect(promptMock).toHaveBeenCalledTimes(0);
});
it('returns array of all choices if must pick at lest that many options', async () => {
expect(await prompter.pick<'many'>('test message', ['hello', 'hey'], { returnSize: 'many', pickAtLeast: 3 })).toEqual(['hello', 'hey']);
expect(prompt_mock).toHaveBeenCalledTimes(0);
expect(
await prompter.pick<'many'>('test message', ['hello', 'hey'], { returnSize: 'many', pickAtLeast: 3 }),
).toEqual(['hello', 'hey']);
expect(promptMock).toHaveBeenCalledTimes(0);
});
it('prompts for selection when only one option with returnSize as many', async () => {
prompt_mock.mockResolvedValueOnce({ result: ['hello'] });
expect(await prompter.pick<'many'>('test message', ['hello'], { returnSize: 'many' })).toEqual(['hello']);
expect(prompt_mock).toHaveBeenCalled();
promptMock.mockResolvedValueOnce({ result: ['hello'] });
expect(
await prompter.pick<'many'>('test message', ['hello'], { returnSize: 'many' }),
).toEqual(['hello']);
expect(promptMock).toHaveBeenCalled();
});
it('prompts for selection when pick at least is less than options length', async () => {
prompt_mock.mockResolvedValueOnce({ result: ['hello', 'hey'] });
expect(await prompter.pick<'many'>('test message', ['hello', 'hey', 'hi'], { returnSize: 'many', pickAtLeast: 2 })).toEqual([
'hello',
'hey',
]);
expect(prompt_mock).toHaveBeenCalled();
promptMock.mockResolvedValueOnce({ result: ['hello', 'hey'] });
expect(
await prompter.pick<'many'>('test message', ['hello', 'hey', 'hi'], { returnSize: 'many', pickAtLeast: 2 }),
).toEqual(['hello', 'hey']);
expect(promptMock).toHaveBeenCalled();
});

@@ -207,4 +243,5 @@ });

it('uses the equals function if specified', () => {
// eslint-disable-next-line spellcheck/spell-checker
expect(byValues(['a', 'aa'], (a, b) => a.length === b.length)(['bbbb', 'bb', 'bbb', 'b']).sort()).toEqual([1, 3]);
});
});

@@ -15,1 +15,6 @@ /**

export const isYes = !!['--yes', '-y'].find(yesFlag => process.argv.includes(yesFlag));
/**
* Set to true if stdin is a TTY (interactive shell)
*/
export const isInteractiveShell = process.stdin.isTTY;

@@ -6,6 +6,6 @@ import { prompt } from 'enquirer';

import * as actions from 'enquirer/lib/combos';
import { isYes } from './flags';
import chalk from 'chalk';
import { isYes, isInteractiveShell } from './flags';
import { Validator } from './validators';
import { printer } from './printer';
import chalk from 'chalk';

@@ -16,3 +16,14 @@ /**

class AmplifyPrompter implements Prompter {
constructor(private readonly prompter: typeof prompt = prompt, private readonly print: typeof printer = printer) {}
constructor(private readonly prompter: typeof prompt = prompt, private readonly print: typeof printer = printer) {
// construct a shim on top of enquirer to throw an error if it is called when stdin is non-interactive
// enquirer does not export its PromptOptions type and this package does not depend on amplify-cli-core so using 'any' as the input type
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const prompterShim = ((opts: any) => {
if (isInteractiveShell) {
return prompter(opts);
}
throw new Error(`Cannot prompt for [${opts.message}] in a non-interactive shell`);
}) as typeof prompt;
this.prompter = prompterShim;
}

@@ -23,3 +34,3 @@ /**

*/
confirmContinue = async (message: string = 'Do you want to continue?') => {
confirmContinue = async (message = 'Do you want to continue?'): Promise<boolean> => {
if (isYes) {

@@ -35,3 +46,3 @@ return true;

*/
yesOrNo = async (message: string, initial: boolean = true) => {
yesOrNo = async (message: string, initial = true): Promise<boolean> => {
if (isYes) {

@@ -43,3 +54,3 @@ return initial;

private yesOrNoCommon = async (message: string, initial: boolean) => {
private yesOrNoCommon = async (message: string, initial: boolean): Promise<boolean> => {
let submitted = false;

@@ -50,4 +61,8 @@ const { result } = await this.prompter<{ result: boolean }>({

message,
// eslint-disable-next-line no-nested-ternary
format: value => (submitted ? (value ? 'yes' : 'no') : ''),
onSubmit: () => (submitted = true),
onSubmit: () => {
submitted = true;
return true;
},
initial,

@@ -61,3 +76,4 @@ });

* By default the input is a string, but can be any type.
* If the type is not a string, the transform function is required to map the prompt response (which is always a string) to the expected return type
* If the type is not a string, the transform function is required to map the prompt response (which is always a string)
* to the expected return type
*

@@ -72,3 +88,3 @@ * If a ReturnSize of 'many' is specified, then the input is treated as a comma-delimited list and returned as an array.

*/
input = async <RS extends ReturnSize = 'one', T = string>(message: string, ...options: MaybeOptionalInputOptions<RS, T>) => {
input = async <RS extends ReturnSize = 'one', T = string>(message: string, ...options: MaybeOptionalInputOptions<RS, T>): Promise<PromptReturn<RS, T>> => {
const opts = options?.[0] ?? ({} as InputOptions<RS, T>);

@@ -78,5 +94,4 @@ if (isYes) {

return opts.initial as PromptReturn<RS, T>;
} else {
throw new Error(`Cannot prompt for [${message}] when '--yes' flag is set`);
}
throw new Error(`Cannot prompt for [${message}] when '--yes' flag is set`);
}

@@ -87,2 +102,3 @@

const { result } = await this.prompter<{ result: RS extends 'many' ? string[] : string }>({
// eslint-disable-next-line no-nested-ternary
type: 'hidden' in opts && opts.hidden ? 'invisible' : opts.returnSize === 'many' ? 'list' : 'input',

@@ -101,8 +117,8 @@ name: 'result',

if (Array.isArray(result)) {
// eslint-disable-next-line @typescript-eslint/ban-types
return (await Promise.all(result.map(async part => (opts.transform as Function)(part) as T))) as unknown as PromptReturn<RS, T>;
}
return opts.transform(result as string) as unknown as PromptReturn<RS, T>;
} else {
return result as unknown as PromptReturn<RS, T>;
}
return result as unknown as PromptReturn<RS, T>;
};

@@ -136,6 +152,6 @@

// map string[] choices into GenericChoice<T>[]
const genericChoices: GenericChoice<T>[] =
typeof choices[0] === 'string'
? ((choices as string[]).map(choice => ({ name: choice, value: choice })) as unknown as GenericChoice<T>[]) // this assertion is safe because the choice array can only be a string[] if the generic type is a string
: (choices as GenericChoice<T>[]);
const genericChoices: GenericChoice<T>[] = typeof choices[0] === 'string'
// this assertion is safe because the choice array can only be a string[] if the generic type is a string
? ((choices as string[]).map(choice => ({ name: choice, value: choice })) as unknown as GenericChoice<T>[])
: (choices as GenericChoice<T>[]);

@@ -176,4 +192,7 @@ const initialIndexes = initialOptsToIndexes(

// enquirer does not clear the stdout buffer on TSTP (Ctrl + Z) so this listener maps it to process.exit() which will clear the buffer
// This does mean that the process can't be resumed, but enquirer errors when trying to resume the process anyway because it can't reattach to the TTY buffer
const sigTstpListener = () => process.exit();
// This does mean that the process can't be resumed, but enquirer errors when trying to resume the process anyway because it can't
// reattach to the TTY buffer
// eslint-disable-next-line spellcheck/spell-checker
const sigTstpListener = (): void => process.exit();
// eslint-disable-next-line spellcheck/spell-checker
process.once('SIGTSTP', sigTstpListener);

@@ -194,2 +213,3 @@ ({ result } = await this.prompter<{ result: RS extends 'many' ? string[] : string }>({

initial: initialIndexes,
// eslint-disable-next-line spellcheck/spell-checker
// there is a typo in the .d.ts file for this field -- muliple -> multiple

@@ -222,2 +242,3 @@ // eslint-disable-next-line @typescript-eslint/ban-ts-comment

// remove the TSTP listener
// eslint-disable-next-line spellcheck/spell-checker
process.removeListener('SIGTSTP', sigTstpListener);

@@ -228,6 +249,5 @@ }

return result.map(item => choiceValueMap.get(item) as T) as PromptReturn<RS, T>;
} else {
// result is a string
return choiceValueMap.get(result as string) as PromptReturn<RS, T>;
}
// result is a string
return choiceValueMap.get(result as string) as PromptReturn<RS, T>;
};

@@ -244,6 +264,5 @@ }

*/
export const byValues =
<T>(selection: T[], equals: EqualsFunction<T> = defaultEquals): MultiFilterFunction<T> =>
(choices: T[]) =>
selection.map(sel => choices.findIndex(choice => equals(choice, sel))).filter(idx => idx >= 0);
export const byValues = <T>(selection: T[], equals: EqualsFunction<T> = defaultEquals): MultiFilterFunction<T> => (
choices: T[],
) => selection.map(sel => choices.findIndex(choice => equals(choice, sel))).filter(idx => idx >= 0);

@@ -256,8 +275,6 @@ /**

*/
export const byValue =
<T>(selection: T, equals: EqualsFunction<T> = defaultEquals): SingleFilterFunction<T> =>
(choices: T[]) => {
const idx = choices.findIndex(choice => equals(choice, selection));
return idx < 0 ? undefined : idx;
};
export const byValue = <T>(selection: T, equals: EqualsFunction<T> = defaultEquals): SingleFilterFunction<T> => (choices: T[]) => {
const idx = choices.findIndex(choice => equals(choice, selection));
return idx < 0 ? undefined : idx;
};

@@ -288,3 +305,3 @@ const validateEachWith = (validator?: Validator) => async (input: string[]) => {

const defaultEquals = <T>(a: T, b: T) => a === b;
const defaultEquals = <T>(a: T, b: T): boolean => a === b;

@@ -311,3 +328,3 @@ type Prompter = {

type MaybeAvailableHiddenInputOption<RS extends ReturnSize> = RS extends 'many'
? {}
? unknown
: {

@@ -331,4 +348,4 @@ hidden?: boolean;

type MultiSelectMinimun<RS extends ReturnSize> = RS extends 'one'
? {}
type MultiSelectMinimum<RS extends ReturnSize> = RS extends 'one'
? unknown
: {

@@ -339,3 +356,3 @@ pickAtLeast?: number;

type MultiSelectMaximum<RS extends ReturnSize> = RS extends 'one'
? {}
? unknown
: {

@@ -390,3 +407,3 @@ pickAtMost?: number;

MultiSelectMaximum<RS> &
MultiSelectMinimun<RS>;
MultiSelectMinimum<RS>;

@@ -393,0 +410,0 @@ type InputOptions<RS extends ReturnSize, T> = ReturnSizeOption<RS> &

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